繁体   English   中英

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

[英]Delete the current row from an internal table in a loop

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

例如,请考虑以下代码:

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吗?

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

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

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

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

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


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

尝试这个:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM