ABAP 基础知识整单包含和排除查询

作者:ABAP技巧与实战 约 6 分钟阅读 更新日期:2025-03-02 1 年前更新 标签:ABAP, Data Engineering, MM, SD, 开发, 数据工程, 物料管理, 销售分销
ABAP 基础知识整单包含和排除查询 - 封面图
ABAP 基础知识整单包含和排除查询 - 封面图

原创 无峰 [ ABAP 技巧与实战 ](javascript:void\(0\);)

前言

SELECT-OPTIONS定义的选择条件是SAP提供的一个非常灵活的逻辑表达方式. 可以表达

包含逻辑( SIGN = I )

排除逻辑( SIGN = E )

但是这个逻辑表达是针对记录(明细行)的.项目中会碰到一些需求,需要针对整单查询的包含和排除逻辑

**本文主要介绍针对整单包含或排除明细字段查询条件的查询**

SELECT-OPTIONS
SELECT-OPTIONS允许表达一个复杂的逻辑:包含及排除(单值,范围,通配符,多单值,多通配符,多范围)
ABAP 基础知识整单包含和排除查询 - 封面图
ABAP 基础知识整单包含和排除查询 - 封面图
ABAP 基础知识整单包含和排除查询 - 封面图
ABAP 基础知识整单包含和排除查询 - 封面图

上述表达式翻译成WHERE 条件 如下. 可以看出, 包含的条件使用 OR 关联. 然后整体和排除的条件用AND 关联

ABAP 基础知识整单包含和排除查询 - 封面图
ABAP 基础知识整单包含和排除查询 - 封面图
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语句,达成目标

ABAP 基础知识整单包含和排除查询 - 封面图
ABAP 基础知识整单包含和排除查询 - 封面图
ABAP 基础知识整单包含和排除查询 - 封面图
ABAP 基础知识整单包含和排除查询 - 封面图

这个程序中使用了ALV显示程序多内表内容类

> 详见链接 无峰,公众号:ABAP 技巧与实战 [ SAP小技巧 CL_DEMO_OUTPUT优化_ALV输出

> ](https://mp.weixin.qq.com/s/ulPt67NsAx8IwUbT5Hk4EA?token=1151317667&lang=zh_CN)

总结

整单包含或排除特定物料或物料属性的查询需要通过 EXISTS(包含) NOT EXISTS(排除) 子句实现. 在使用排除时, 需要考虑清楚和SELECT-

OPTIONS的排除的关系. 逻辑会比较绕.

具体使用时,

选择屏幕要区分于通常的选择条件. 以便让用户明确这些选择条件和正常选择条件的差异 .

如下, 不启用和启用但不限制条件 等效. 但是不启用表达的意思更加明确.

ABAP 基础知识整单包含和排除查询 - 封面图
ABAP 基础知识整单包含和排除查询 - 封面图

** THE **

** END **

**约定**

如果你对这篇文章感兴趣,请帮忙点赞,在看,分享.

请微信联系管理员

syjf1976

sharry_xlp

Yannick_Duan

申请进入公众号讨论群提问或者参与话题讨论

ABAP技巧与实战

关于作者:ABAP技巧与实战

企业信息化与 SAP 技术顾问,长期专注 SAP ABAP、FI/CO、MM、SD 等模块的技术分享与实战经验总结。查看更多介绍

来源说明:本文内容由「ABAP基础知识整单包含和排除查询.md」整理生成,仅用于内部技术分享与学习交流。