如何修改标准非托管查询的筛选器行为(供应商列表Fiori应用场景)
如何修改标准非托管查询的筛选器行为(供应商列表Fiori应用场景)
我之前也碰到过非托管CDS查询的筛选逻辑定制难题,结合你的场景给你几个可行的方案,避开直接修改标准类的风险:
方案一:增强标准非托管查询的实现类(安全扩展方式)
虽然CL_FAP_SUPPLIER_LIST_V2是标准SAP类,但咱们可以通过ABAP的增强机制来修改它的筛选逻辑,不用动原始代码:
- 首先找到这个类里处理筛选条件的核心方法,比如
IF_FINB_QUERY~PROCESS或者专门处理WHERE子句的方法(可以用SE24查看类的接口和方法) - 给这个方法添加隐式增强或者找合适的显式增强点,在代码里判断:如果当前筛选的字段是你自定义的
INDUSTRIES,并且用户选择的操作符是EQ(等于),就把这个条件转换成包含匹配的逻辑——比如把INDUSTRIES = 'XXX'改成INDUSTRIES LIKE '%XXX%',或者直接用CONTAINS(INDUSTRIES, 'XXX') - 注意增强逻辑要加判断条件,只针对你的自定义字段生效,别影响其他标准字段的筛选行为
方案二:创建自定义托管CDS视图作为中间层(推荐)
因为非托管查询的注解限制太多,不如绕开它,自己建一个托管视图来承接筛选逻辑:
- 新建一个托管CDS视图
Z_C_SupplierList_Ext,以C_SupplierList为基础数据源,把所有需要的标准字段和你的INDUSTRIES字段都包含进来 - 在这个新视图的
INDUSTRIES字段上配置你之前尝试的注解:
这里因为是托管视图,之前的Gateway报错就不会出现了@ObjectModel.readOnly: true @ObjectModel.virtualElement:true @ObjectModel.virtualElementCalculatedBy: 'ABAP:ZCL_BUPA_INDUSTRIES_CALC_EXIT' @ObjectModel.filter.transformedBy: 'ABAP:ZCL_BUPA_INDUSTRIES_FILTER' - 修改Fiori应用的数据源配置,指向你新建的
Z_C_SupplierList_Ext视图
这个方案完全基于自定义扩展,不用碰标准代码,后续升级SAP版本也不容易受影响,是最稳妥的选择。
方案三:调整表函数的筛选逻辑
既然你的INDUSTRIES字段是从表函数取的,也可以在表函数里反向处理筛选条件:
- 在表函数的逻辑里,判断如果传入了针对
INDUSTRIES的EQ筛选值,不要直接匹配拼接后的字符串,而是去关联原始的供应商行业表,检查该供应商是否包含这个行业码 - 比如在表函数的WHERE子句里加:
EXISTS (SELECT 1 FROM <供应商行业表> s WHERE s.supplier = supplier_key AND s.industry_code = :filter_value) - 这样即使拼接字符串里有多个行业,只要包含用户输入的那个,就能被筛选出来
总结
优先推荐方案二,扩展性和维护性最好;如果不想改动Fiori应用的数据源,方案一的增强方式也能解决问题,但要注意增强代码的兼容性;方案三适合对表函数逻辑有控制权的场景。
备注:内容来源于stack exchange,提问作者Cutter
相关产品推荐
相关产品推荐

