簡體   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