原创 无峰 [ ABAP 技巧与实战 ](javascript:void\(0\);)
一
前言
SELECT-OPTIONS定义的选择条件是SAP提供的一个非常灵活的逻辑表达方式. 可以表达包含逻辑( SIGN = I )
排除逻辑( SIGN = E )
但是这个逻辑表达是针对记录(明细行)的.项目中会碰到一些需求,需要针对整单查询的包含和排除逻辑
**本文主要介绍针对整单包含或排除明细字段查询条件的查询**
二
SELECT-OPTIONSSELECT-OPTIONS允许表达一个复杂的逻辑:包含及排除(单值,范围,通配符,多单值,多通配符,多范围)上述表达式翻译成WHERE 条件 如下. 可以看出, 包含的条件使用 OR 关联. 然后整体和排除的条件用AND 关联
SELECT-OPTIONS 使用的时候也很简单 ,如下语句WHERE MATNR IN S_MATNR
AND VBELN IN S_VBELN
**注意:** 使用时过多的单选条件可能会导致SQL语句报错: 因为这些单选条件会翻译成 字段名='值1' OR 字段名= '值2' .
每个数据库对于SQL语句都有字符数的上限,超过这个上限会导致SQL语句报错
三
常规需求和特殊需求
从中文语法上分析下面两句话的区别
• 查询包含特定物料的销售订单明细
• 查询包含特定物料的销售订单的明细
乍一眼看这句话似乎没有区别. 但是如果从语法上深究, 二者的宾语(查询的主体)是不一样的.
前一句的主体就是订单明细,定语:包含特定物料是用来限定订单明细.
后一句的主体是订单的明细, 定语包含特定物料是用来限定订单的.
后一句话也可以表达为 查询包含特定物料的销售订单的所有明细行 .这样就会去掉原语句中容易被误解的歧义.
同理,如下两句话的差异同上述表达
• 查询排除特定物料的销售订单明细
• 查询排除特定物料的销售订单的明细
**示例**
通过示例表达来说明上述表达式的查询的差异
订单 物料
1001 M01
1001 M02
1002 M02
1002 M03
1003 M04
1003 M05
包含物料M02的订单明细,结果集
1001 M02
1002 M02
包含物料M02的订单的明细(所有明细) ,结果集
1001 M01
1001 M02
1002 M02
1002 M03
排除物料M02的订单明细, 结果集
1001 M01
1002 M03
1003 M04
1003 M05
排除物料M02的订单的明细(所有明细),结果集
1003 M04
1003 M05
四
查询语句
假设 S_MATNR 的内容 是物料M02的包含限制 I EQ M02
包含物料M02的订单明细, 查询语句
SELECT 订单,物料 FROM 表 WHERE MATNR IN S_MATNR假设 S_MATNR 的内容 是物料M02的包含限制 I EQ M02
包含物料M02的订单的明细(所有明细) ,查询语句
SELECT 订单,物料 FROM 表 AS A WHERE EXISTS ( SELECT VBELN FROM 表 WHERE VBELN =A.VBEN AND MATNR IN S_MATNR )
假设 S_MATNR的内容 是物料M02的排除限制 E EQ M02
排除物料M02的订单明细, 查询语句
SELECT 订单,物料 FROM 表 WHERE MATNR IN S_MATNR假设 S_MATNR 的内容 是物料M02的包含限制 I EQ M02
排除物料M02的订单的明细,查询语句
SELECT 订单,物料 FROM 表 AS A WHERE NOT EXISTS ( SELECT VBELN FROM 表 WHERE VBELN =A.VBEN AND MATNR IN S_MATNR )
对于排除物料M02的订单的明细,下面的场景语句容易被误解.该语句无法达成预期
假设 S_MATNR的内容 是物料M02的排除限制 E EQ M02
SELECT 订单,物料 FROM 表 AS A WHERE EXISTS ( SELECT VBELN FROM 表 WHERE VBELN =A.VBEN AND MATNR IN S_MATNR )
五
示例程序
通过如下的示例程序测试上述SQL语句,达成目标
这个程序中使用了ALV显示程序多内表内容类
> 详见链接 无峰,公众号:ABAP 技巧与实战 [ SAP小技巧 CL_DEMO_OUTPUT优化_ALV输出
> ](https://mp.weixin.qq.com/s/ulPt67NsAx8IwUbT5Hk4EA?token=1151317667&lang=zh_CN)
六
总结
整单包含或排除特定物料或物料属性的查询需要通过 EXISTS(包含) NOT EXISTS(排除) 子句实现. 在使用排除时, 需要考虑清楚和SELECT-
OPTIONS的排除的关系. 逻辑会比较绕.
具体使用时,
选择屏幕要区分于通常的选择条件. 以便让用户明确这些选择条件和正常选择条件的差异 .
如下, 不启用和启用但不限制条件 等效. 但是不启用表达的意思更加明确.
** THE **
** END **
**约定**
如果你对这篇文章感兴趣,请帮忙点赞,在看,分享.
syjf1976
sharry_xlp
Yannick_Duan
申请进入公众号讨论群提问或者参与话题讨论