2013-07-02 48 views
2

是否有下面的代碼的任何簡單的/最快的方式:最簡單的方法刪除行

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. 

當你在代碼中看到的,它包含了兩次循環,只有填寫範圍表。我想讓它只有一個,這可能嗎?謝謝。

+0

所以,你要選擇'ZTA_FG_DEST'行,其中的'KNUMA_AG'在兩個'LI_PROMO'和'LV_KNUMA_AG'? – vwegert

+0

@vwegert:不,我想刪除'li_promo'中的行,''knuma_ag'在'zta_fg_dest'中 –

回答

3

是的,這應該有可能實現這一目標而不可能是成千上萬的查詢充斥你的DBMS:

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. 
+0

嗨,感謝您的代碼。但是,在你的代碼中'lv_knuma_ag'是什麼?請參閱上面的更新.. –

+0

Ah ic,感謝您的代碼;) –