如何在ABAP CDS中实现NOT EXISTS逻辑?
简洁实现:单CDS视图搞定EKPO无MSEG过账记录的筛选
嘿,你完全不用搞两个CDS视图那么麻烦!其实CDS视图本身就支持NOT EXISTS语法,直接写一个视图就能实现你的需求,比拆分两个视图简洁多了。
直接可用的单CDS视图代码
@AbapCatalog.sqlViewName: 'Z_EKPO_NO_MSEG' @AbapCatalog.compiler.compareFilter: true @AccessControl.authorizationCheck: #CHECK @EndUserText.label: 'EKPO中无MSEG过账记录的采购订单行项目' define view Z_EKPO_NO_MSEG as select from ekpo { key ekpo.ebeln, key ekpo.ebelp, ekpo.matnr, ekpo.menge, ekpo.netpr } where not exists ( select from mseg where mseg.ebeln = ekpo.ebeln and mseg.ebelp = ekpo.ebelp )
为什么这个方案更优?
- 简洁性:把筛选逻辑直接整合在一个视图里,不需要额外创建“有MSEG记录”的中间视图,减少对象数量,维护更轻松。
- 可读性:逻辑一目了然,看视图代码就能直接理解是要取EKPO中没有对应MSEG过账的行项目,不用跳转到其他视图理解反集逻辑。
- 性能:和你用ABAP SQL的
NOT EXISTS逻辑一致,数据库层面会做高效的关联过滤,只要MSEG表的EBELN和EBELP字段有合适的索引(SAP标准表通常自带),查询效率不会有问题。
额外测试提示
如果需要验证结果,可以用这段ABAP代码查询视图:
SELECT * FROM Z_EKPO_NO_MSEG INTO TABLE @DATA(lt_ekpo_no_mseg).
内容的提问来源于stack exchange,提问作者RaTiO
相关产品推荐
相关产品推荐

