在 SAP Fiori CDS(Core Data Services)场景下,内表(如 List/Table)如果有几万条数据,通常前端只会分页加载部分数据。用户点击“全选”时,默认只会选中当前已加载到前端的数据,未加载的数据不会被选中。
处理方案
如果你想在“全选”时抓取所有数据(包括未加载的),常见做法如下:
1. 后端全选
- 在“全选”操作时,不直接依赖前端已加载的数据,而是将全选操作的条件(如筛选条件、搜索条件等)传递到后端。
- 后端根据条件查询所有符合条件的数据(即使未加载到前端),然后返回所有数据的主键或ID列表。
2. 前端处理方式
- “全选”按钮只需记录当前筛选条件和全选状态,不需要把所有数据都加载到前端。
- 后续如“批量操作”时,将筛选条件或ID列表传给后端,由后端处理。
具体需求
后端接收前端给的筛选条件,可能数多值。加入筛选条件是 tplnr 和 swerk这两个字段,CDS视图是zgpmc_bspgl 我该如何写后端
你可以在 ABAP 后端通过 CDS 视图 zgpmc_bspgl 和动态 WHERE 条件来实现批量筛选。假设你用的是 OData 服务(如 SEGW 或 RAP),下面给出两种常见实现方式:
1. 传统 OData(SEGW)方式
在 DPC_EXT 类的 GET_ENTITYSET 方法里处理筛选条件:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
* filepath: ZCL_XXX_DPC_EXT.abap * ...existing code... METHOD zgpmc_bspglset_get_entityset. DATA: lt_filter_select_options TYPE /iwbep/t_mgw_select_option, lt_result TYPE TABLE OF zgpmc_bspgl. " 获取筛选条件 io_tech_request_context->get_filter_select_options( IMPORTING et_filter_select_options = lt_filter_select_options ). " 构建动态 WHERE DATA(lv_where) = ''. LOOP AT lt_filter_select_options INTO DATA(ls_option). CASE ls_option-property. WHEN 'TPLNR'. " 多值拼接 LOOP AT ls_option-select_options INTO DATA(ls_sel). CONCATENATE lv_where 'AND tplnr IN (' '''' ls_sel-low '''' ')' INTO lv_where SEPARATED BY space. ENDLOOP. WHEN 'SWERK'. LOOP AT ls_option-select_options INTO DATA(ls_sel). CONCATENATE lv_where 'AND swerk IN (' '''' ls_sel-low '''' ')' INTO lv_where SEPARATED BY space. ENDLOOP. ENDCASE. ENDLOOP. " 查询CDS视图 SELECT * FROM zgpmc_bspgl WHERE (lv_where) INTO TABLE lt_result. " 返回数据 copy_data_to_ref( EXPORTING is_data = lt_result CHANGING cr_data = er_entityset ). ENDMETHOD. * ...existing code... |
2. RAP(ABAP RESTful Application Programming Model)
RAP 框架会自动将筛选条件映射到 CDS 视图的 WHERE 子句,无需手动拼接。你只需在 CDS 视图里定义好字段,前端传递的筛选条件会自动生效:
CDS 示例:
|
1 2 3 4 5 6 7 |
@AbapCatalog.sqlViewName: 'ZBSPGL' define view zgpmc_bspgl as select from your_table { key tplnr, key swerk, ... // 其他字段 } |
前端 OData 请求示例:
|
1 |
/sap/opu/odata/sap/your_srv/zgpmc_bspglSet?$filter=tplnr eq 'xxx' and swerk eq 'yyy' |
RAP 会自动处理多值筛选(如 in、eq、ne、等),无需你手动拼接。
总结一下
RAP/CDS:直接用 CDS 视图,筛选条件自动生效。
SEGW:需手动解析筛选条件并拼接 WHERE。


