首页 文章

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

提问于
浏览
15

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

例如,请考虑以下代码:

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

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

2 回答

  • -1

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

    Do not use DELETE lt_itab INDEX sy-tabix. 如果您使用的支票,改变 sy-tabix 的副作用(例如,查找在检查表中的一些项 - 或调用功能模块/方法,它这样做)内的一些说法,你最终会删错了线 .

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

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


    编辑:重申"defined result":删除当前行 . 没有"continuing with the next line" - 加上 INTO var 你实际上 copied 整行进入你的变量 . 该变量赢得了't be touched, it'与该表不同步 . 这可能是故意的 - 系统无法知道这一点 . 如果您使用字段符号,它将是 UNASSIGNED ,这可能是您的意图 - 然后可能不是 .

  • 18

    试试这个:

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

相关问题