Abap 从循环中的内部表中删除当前行

Abap 从循环中的内部表中删除当前行,abap,internal-tables,Abap,Internal Tables,在内部表上循环时,是否可以安全地删除活动行 作为例子,考虑这个代码: 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. 删除这样

在内部表上循环时,是否可以安全地删除活动行

作为例子,考虑这个代码:

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\u itab WHERE


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

这是否安全主要取决于您的编码技能。它有一个已定义的结果,正确使用命令取决于您。如果在循环中的
DELETE
语句之后没有其他事情发生,通常是安全的。您可以在删除后立即发出
CONTINUE
语句,以确保情况属实

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

请注意,您只需在示例中使用语句
DELETE lt\u itab.
,因为要删除的行是当前行

如果您的表可以有多个相同的行,那么您的第二个变体
从ls_wa中删除lt_itab。
将删除所有行,而不仅仅是当前行-是否删除取决于您的要求


编辑:重复“定义结果”:删除当前行。没有“继续下一行”-将
添加到var
中,实际上是将整个行复制到变量中。该变量不会被触动,只是与表不同步。这可能是故意的——系统无法知道这一点。如果改为使用字段符号,它将是
未分配的
,这可能是您想要的,也可能不是

试试这个:

GET CURSOR LINE SY-CUROW .
DELETE ST_MAT INDEX SY-CUROW.

因此,您提到的定义结果是删除当前行,循环继续表的下一行,而不跳过行或过早结束?换句话说,当
delete。。。其中
不是一个选项,循环中不包含其他逻辑?我已经添加了一些关于“定义结果”的详细信息-但我想说是的,这是正确实现时的常见和良好实践。您好,只是一个备注问题-如果我删除的不是当前行,而是一些更随意的行,您的答案是否也有效?例如,在itab处循环赋值,其中cond=X。删除itab,其中id-id=id和cond X.ENDLOOP。谢谢大家!@基本上是的。一句话:如果您更改了当前正在迭代的数据集,最好确保您知道自己在做什么。通常,建议在没有任何列表处理信息(OP没有提供)的情况下使用
GET CURSOR line
,至少会产生误导,而且很可能是错误的。