在循环内部表时,我可以安全地删除活动行吗?
例如,请考虑以下代码:
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.
Run Code Online (Sandbox Code Playgroud)
删除这样的记录是否安全,或者这种逻辑不按预期行事?
我应该在临时itab中存储行的唯一标识符并DELETE lt_itab WHERE在循环后运行吗?
我假设对当前迭代中加载的记录以外的记录执行删除操作肯定会引起问题,但我不确定这是否是有效的,更不用说是好的做法.
vwe*_*ert 19
是否安全在很大程度上取决于您的编码技巧.它有一个定义的结果,您可以正确使用这些命令.如果DELETE在循环中的语句之后没有其他任何事情发生,通常是安全的.您可以CONTINUE在删除后立即发出声明,以确保是这种情况.
不要用DELETE lt_itab INDEX sy-tabix.如果您在检查中使用某些语句sy-tabix作为副作用更改(例如,在检查表中查找某些条目 - 或调用功能模块/方法),您将最终删除错误的行.
请注意,您可以简单地使用DELETE lt_itab.示例中的语句,因为要删除的行是当前行.
如果您的表可以有多个相同的行,那么您的第二个变体DELETE lt_itab FROM ls_wa.将删除所有这些行,而不仅仅是当前行 - 这是否取决于您的要求.
编辑:重申"定义结果":删除当前行.没有"继续下一行" - 添加INTO var实际上将整行复制到变量中.该变量不会被触及,它与表格不同步.这可能是故意的 - 系统无法知道这一点.如果你使用一个字段符号,它将是UNASSIGNED- 再次 - 可能是你想要的 - 然后再也许不是.