17

我可以在遍历内部表时安全地删除活动行吗?

例如,考虑以下代码:

LOOP AT lt_itab INTO ls_wa.
    IF [...] . " A check that can't be done inside a 'DELETE lt_itab WHERE'
        DELETE lt_itab INDEX sy-tabix
        " OR
        DELETE lt_itab FROM ls_wa.
    ENDIF.
ENDLOOP.

删除这样的记录是否安全,或者这种逻辑不会按预期运行?

我是否应该将行的唯一标识符存储在临时 itab 中并DELETE lt_itab WHERE在循环后运行?

我假设对当前迭代中加载的记录以外的记录进行删除操作肯定会导致问题,但我不确定这是否有效,更不用说好的做法了。

4

2 回答 2

25

它是否安全在很大程度上取决于您的编码技能。它有一个明确的结果,正确使用这些命令取决于您。DELETE如果在循环中的语句之后没有发生任何其他事情,通常是安全的。您可以CONTINUE在删除后立即发布声明以确保确实如此。

不要使用DELETE lt_itab INDEX sy-tabix. 如果您在检查中使用某些语句sy-tabix作为副作用而更改(例如,在检查表中查找某些条目 - 或调用执行此操作的功能模块/方法),您最终将删除错误的行。

请注意,您可以简单地使用DELETE lt_itab.示例中的语句,因为要删除的行是当前行。

如果您的表格可以有多个相同的行,则您的第二个变体DELETE lt_itab FROM ls_wa.将删除所有这些行,而不仅仅是当前行 - 是否有意取决于您的要求。


编辑:重申“定义的结果”:删除当前行。没有“继续下一行” - 除了INTO var您实际上将整行复制到您的变量中。该变量不会被触及,它只是与表格不同步。这可能是故意的——系统无法知道这一点。如果您改用字段符号,它将是UNASSIGNED,这 - 再次 - 可能是您想要的 - 然后又可能不是。

于 2014-05-13T13:30:25.370 回答
-3

试试这个:

GET CURSOR LINE SY-CUROW .
DELETE ST_MAT INDEX SY-CUROW.
于 2018-04-16T01:27:54.120 回答