我可以安全地删除活动行,而在一个内部表的循环?
作为示例,考虑以下代码:
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.
删除这样的记录是安全的吗?还是这个逻辑不像预期的那样运行?
我是否应该将行的唯一标识符存储在临时tab中,并在循环后运行DELETE lt_itab WHERE
?
我认为除当前迭代中加载的记录之外的其他记录的删除操作肯定会导致问题,但我不确定这是否有效,更不用说良好的实践了。
是否安全很大程度上取决于你的编码技巧。它有一个已定义的结果,由您来正确地使用这些命令。如果循环中的DELETE
语句之后没有发生任何其他事情,则通常是安全的。您可以在删除后立即发出CONTINUE
语句以确保是这种情况。
不要使用DELETE lt_itab INDEX sy-tabix
.如果你在检查中使用一些改变sy-tabix
作为副作用的语句(例如,在检查表中查找某些条目-或调用这样做的函数模块/方法),你将最终删除错误的行。
请注意,您可以在示例中简单地使用语句DELETE lt_itab.
,因为要删除的行是当前行。
如果你的表可以有多个相同的行,你的第二个变量DELETE lt_itab FROM ls_wa.
将删除所有的行,而不仅仅是当前的行——是否有意这样做取决于你的需求。
EDIT:重申"defined result":当前行被删除。没有"继续下一行"——通过添加INTO var
,实际上将整行复制到变量中。这个变量不会被触碰,它只是与表不同步。这可能是故意的——系统无法知道这一点。如果您使用一个字段符号,它将是UNASSIGNED
,这可能是您想要的,但也可能不是。
试试这个:
GET CURSOR LINE SY-CUROW .
DELETE ST_MAT INDEX SY-CUROW.