Search code examples
abapinternal-tables

The simplest and most concise way to delete a row?


Is there any simplest/fastest way for below code:

DATA:   lv_knuma_ag  LIKE STANDARD TABLE OF zta_fg_hdr WITH HEADER LINE.
RANGES: lr_knuma_ag  FOR  zta_fg_hdr-knuma_ag.

"Select `knuma_ag` and save it to internal table `lv_knuma_ag`
LOOP AT li_promo.
  SELECT dest~knuma_ag
    FROM zta_fg_dest AS dest
    INNER JOIN zta_s_d_xkunnr AS xkunnr ON xkunnr~zcd_dest EQ dest~zcd_dest
    APPENDING CORRESPONDING FIELDS OF TABLE lv_knuma_ag
    WHERE dest~knuma_ag EQ li_promo-knuma_ag
          AND xkunnr~xkunnr EQ gi_vl-vkbur.
ENDLOOP.

"Insert `lv_knuma_ag` onto ranges table `lr_knuma_ag`
LOOP AT lv_knuma_ag.
  lr_knuma_ag-sign   = 'I'.
  lr_knuma_ag-option = 'EQ'.
  lr_knuma_ag-low    = lv_knuma_ag-knuma_ag.
  lr_knuma_ag-high   = space.
  APPEND lr_knuma_ag.
ENDLOOP.

"Delete row in `li_promo` where `knuma_ag` is in ranges table `lr_knuma_ag`
IF NOT lr_knuma_ag IS INITIAL.
  DELETE li_promo WHERE knuma_ag IN lr_knuma_ag.
ENDIF.

As you see on the code, it contains twice loop to only fill the ranges table. I would like to make it only one, is it possible? Thanks.


Solution

  • Yes, it should be possible to achieve this without flooding your DBMS with possibly thousands of queries:

    DATA: lt_knuma_ag_hash TYPE HASHED TABLE OF insert_type_of_knuma_ag_here WITH UNIQUE KEY TABLE_table_line.
    
    IF li_promo[] IS NOT INITIAL.
      SELECT DISTINCT knuma_ag
        FROM zta_fg_dest
        INTO TABLE lt_knuma_ag_hash
        FOR ALL ENTRIES IN li_promo
        WHERE knuma_ag = li_promo-knuma_ag.
    ENDIF.
    
    LOOP AT li_promo ASSIGNING <li_promo>.
      READ TABLE lt_knuma_ag_hash TRANSPORTING NO FIELDS WITH TABLE KEY table_line = <li_promo>-knuma_ag.
      IF sy-subrc = 0.
        DELETE li_promo.
      ENDIF.
    ENDLOOP.