我可以在循环内部表时安全地删除活动行吗?
例如,请考虑以下代码:
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
?
我认为对当前迭代中加载的记录以外的记录执行删除操作肯定会引起问题,但我不确定这是否有效,更不用说是好的做法。
答案 0 :(得分:19)
是否安全在很大程度上取决于您的编码技巧。它有一个定义的结果,您可以正确使用这些命令。如果在循环中的DELETE
语句之后没有其他任何事情发生,通常是安全的。您可以在删除后立即发出CONTINUE
语句,以确保是这种情况。
请勿使用DELETE lt_itab INDEX sy-tabix
。如果您在支票中使用某个更改sy-tabix
作为副作用的语句(例如,在检查表中查找某些条目) - 或调用功能模块/方法,你将最终删除错误的行。
请注意,您可以在示例中使用语句DELETE lt_itab.
,因为要删除的行是当前行。
如果您的表格可以包含多个相同的行,那么您的第二个变体DELETE lt_itab FROM ls_wa.
将删除所有这些行,而不仅仅是当前行 - 这是否取决于您的要求。
编辑:重申“定义结果”:删除当前行。没有“继续使用下一行” - 添加INTO var
您实际上将整行重复到您的变量中。该变量不会被触及,它与表格不同步。这可能是故意的 - 系统无法知道这一点。如果您使用字段符号,它将是UNASSIGNED
,这可能是您的意图 - 然后可能不是。
答案 1 :(得分:-1)
试试这个:
GET CURSOR LINE SY-CUROW .
DELETE ST_MAT INDEX SY-CUROW.