Question

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.

Was it helpful?

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.
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top