在一个销售订单查询应用中,页面上真正方便业务人员理解的筛选条件,往往是国家、销售组织、公司代码、工厂或责任人,而底层销售订单表保存的却可能只是业务伙伴编号、地址编号、内部组织编号或其他技术键值。以按买方所在国家查询销售订单为例,业务人员输入的是Germany,销售订单数据源里却没有买方国家字段,只有buyer_id。买方所属国家保存在业务伙伴主数据中。若完全交给前端处理,SAPUI5 或其他 OData 客户端需要先查询德国境内的业务伙伴,再取得所有业务伙伴编号,随后拼接针对Buyer字段的过滤条件,最终才能查询销售订单。这种实现会把数据关系、过滤规则和调用顺序泄漏到消费端。前端不仅要理解业务伙伴模型,还要承担多次请求、异常处理、过滤条件长度控制以及数据一致性问题。一旦另一个应用也需要相同逻辑,开发团队又会重新实现一遍。ABAP CDS 提供的单值过滤器派生,正是为这类场景准备的。@Consumption.derivation可以把主实体某个元素的过滤值,从另一个 CDS 实体中动态派生出来。消费端只负责提交容易理解的业务条件,SADL 或分析运行时负责读取查找实体、取得结果元素,再把这些结果作为主实体的过滤条件。SAP 官方文档将提供派生值的 CDS 实体称为look-up entity,也就是查找实体。销售订单场景中的两层数据模型示例中的主实体名为C_SalesOrdersCountries,它对外提供销售订单信息,并声明输入参数p_country
从国家参数到买方编号,深入理解 ABAP CDS 单值过滤器派生机制
在一个销售订单查询应用中,页面上真正方便业务人员理解的筛选条件,往往是国家、销售组织、公司代码、工厂或责任人,而底层销售订单表保存的却可能只是业务伙伴编号、地址编号、内部组织编号或其他技术键值。以按买方所在国家查询销售订单为例,业务人员输入的是Germany,销售订单数据源里却没有买方国家字段,只有buyer_id。买方所属国家保存在业务伙伴主数据中。若完全交给前端处理,SAPUI5 或其他 OData 客户端需要先查询德国境内的业务伙伴,再取得所有业务伙伴编号,随后拼接针对Buyer字段的过滤条件,最终才能查询销售订单。这种实现会把数据关系、过滤规则和调用顺序泄漏到消费端。前端不仅要理解业务伙伴模型,还要承担多次请求、异常处理、过滤条件长度控制以及数据一致性问题。一旦另一个应用也需要相同逻辑,开发团队又会重新实现一遍。ABAP CDS 提供的单值过滤器派生,正是为这类场景准备的。@Consumption.derivation可以把主实体某个元素的过滤值,从另一个 CDS 实体中动态派生出来。消费端只负责提交容易理解的业务条件,SADL 或分析运行时负责读取查找实体、取得结果元素,再把这些结果作为主实体的过滤条件。SAP 官方文档将提供派生值的 CDS 实体称为look-up entity,也就是查找实体。销售订单场景中的两层数据模型示例中的主实体名为C_SalesOrdersCountries,它对外提供销售订单信息,并声明输入参数p_country