在内部表B中查找内部表A中不存在的行

2020-08-25 14:21发布

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


专家们,

我有两个内部表。

只是为了阐明我的观点。 我正在举一个例子:

内部表A包含10个条目,内部表B包含12个条目。

表A和B有10个共同的条目。 现在,我对B中而不是A中的2个条目感兴趣。

我正在使用以下方法:

在这里,我只是从B中删除A中存在的条目。

将LOOP AT 放入
删除 WHERE(Where_Condition)。
ENDLOOP。

但是效率不高。 因此,您能建议我采取任何有效的方法来实现这一目标吗?

我还要动态创建上述where条件。

任何帮助将不胜感激。

谢谢

Partish

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


专家们,

我有两个内部表。

只是为了阐明我的观点。 我正在举一个例子:

内部表A包含10个条目,内部表B包含12个条目。

表A和B有10个共同的条目。 现在,我对B中而不是A中的2个条目感兴趣。

我正在使用以下方法:

在这里,我只是从B中删除A中存在的条目。

将LOOP AT 放入
删除 WHERE(Where_Condition)。
ENDLOOP。

但是效率不高。 因此,您能建议我采取任何有效的方法来实现这一目标吗?

我还要动态创建上述where条件。

任何帮助将不胜感激。

谢谢

Partish

付费偷看设置
发送
7条回答
Tong__Ming
1楼-- · 2020-08-25 14:47

在大多数情况下,嵌套内部表操作的问题是通过线性搜索访问内部表,从而导致 O(n ^ 2) 时间复杂度,对于大量记录而言,这是非常糟糕的。 这也适用于DELETE。

可以通过仔细选择表类型/表键来避免这种情况,例如,将表B定义为具有DELETE语句可以使用的主键的排序表。

但是,如果您正在建立动态的WHERE条件-正如您提到的-这可能涉及RTTS的使用。

追夢秋陽
2楼-- · 2020-08-25 14:51

Hello Partish,

不想在循环内编写delete stmt,那么在这种情况下-在表B中再创建一列,并为表A的每个类似记录为其设置值。可以用值'X'来表示。

然后在主循环之外,您只需编写delete语句并从表B中删除记录,该表的该列的值为X。因此,您现在只剩下2个条目。

BR/Himayat

暮风yp
3楼-- · 2020-08-25 14:53

您可以在一个表上循环,然后读取另一个表,然后使用sy-subrc检查执行操作。

说您可以执行以下操作

排序表B。

将tableA循环到Wa_tableA中。 (如果有条件,请使用关键字" where" .........)

使用键field1_tableB = wa_tableA-field1 field2_tableB = wa_tableA-field2 ......将表B读取到wa_tableB中...

如果sy-subrc <> 0。

找不到记录

否则。

(记录在两个表中)

endif。

您可以查找语法。希望这会有所帮助

哎,真难
4楼-- · 2020-08-25 14:53

这也不是最佳性能,因为您使用的是标准表。

SAP小黑
5楼-- · 2020-08-25 14:51

您好@ 平民主义者

我没有使用任何标准表

我使用了我创建的ztables。

此致

DINESH KUMAR M

Haoba3210
6楼-- · 2020-08-25 14:47

Hello Partish,

尝试一下

类型:st_zkds01的开始,
mandt类型zkds01-mandt,
num1类型zkds01-num1,
st_zkds01的结尾。


类型:st_zkds012的开始,
mandt类型zkds012-mandt,
num1类型zkds012-num1,
st_zkds012的结尾。


数据:st_1 st_zkds01的类型表,
wa_1 st_zkds012的类型表,
wa_2 st_zkds012的类型表。


选择开始。/p>


选择*从zkds01进入表it_1。
选择*从zkds012进入表it_2。


DATA lv_data TYPE num1。


在it_2上进入wa_2。


DATA(标志)=0。
将表_1读入wa_1中,键num1 = wa_2-num1。
如果sy-subrc =0。
标志=1。
ENDIF
IF标志=0。
写:/wa_2-num1。
ENDIF。

ENDLOOP。

一周热门 更多>