有两个内部表:IT_TAB1(假设N条记录),I T_TAB2(假设M条记录)。
I T_TAB1的结构如下
ID BUKRS BELNR DMBTR
001 A001 1000000010 10000
002 A001 1000000020 20000
…… …… …… ……
I T_TAB2的结构如下
BUKRS BELNR
A001 1000000010
A001 1000000050
…… ……
要求是根据内部表ITAB2对内部表ITAB1进行删除处理,ITAB1中BELNR项与ITAB2中BELNR项相同的全部删除掉,该事例中所得结果应为:
I T_TAB1的结构如下
ID BUKRS BELNR DMBTR
002 A001 1000000020 20000
…… …… …… ……
方法一:循环套循环
外层循环IT_TAB2,里层循环IT_TAB1。
此种方法被一般ABAP开发规约所禁止。
三种方法中,执行时间排第二。
方法二:利用RANGE TABLE
将IT_TAB2导入RANGE TABLE,
在条件中使用IN语句来删除IT_TAB1.
此种方法,由于RANGE TABLE的做成使用了一回循环,
再加上用IN 语句删除,相当于使用了两次循环,所以速度比较慢,
三种方法中,执行时间排第三。
另外此法只适用于比较项目(例如IT_TAB2-BELNR)只有一项时,
而且,作为比较项目的该项值被反复使用时(假设还有内部表IT_TAB3,IT_TAB4…都需要根据IT_TAB2中的BELNR项来作相应处理时),
采用该法,才更显效率。
如果比较项目为复数项时,请使用其他两种方法。
方法三:并行算法
使用该算法,要事先对两个内部表进行排序,
然后两层循环嵌套,
外层是IT_TAB2,里层是IT_TAB1。
与方法一不同的是,
方法一的执行次数为(N * M),方法三的执行次数为( N + M )。
所以该方法在三种方法中,执行时间排第一。
但使用该算法有一个条件限制,
就是IT_TAB1中的记录一定要在IT_TAB2所包含的记录范围内。
嵌套循环时推荐尽可能使用该平行算法。
该法缺点是:1.使用限制条件要判断准确。
2.代码可读性差。
![](http://www.sapsh.com/bbsxp/images/upfile/2006-3/200632591713.jpg)
*&---------------------------------------------------------------------* *& 作成者 : KONGXIANGSHUAI *& 作成日 : 2006/03/20 *& 機能概要 : *& 内部テーブルIT_TAB2により、内部テーブルIT_TAB1から *& 同じのレコードを削除する例。 *&---------------------------------------------------------------------* REPORT ZZTEST4 NO STANDARD PAGE HEADING. *----------------------------------------------------------------------* * 構造宣言 *----------------------------------------------------------------------* * 内部テーブル1 TYPES: BEGIN OF T_TAB1, ID TYPE I, "番号 BUKRS TYPE BSID-BUKRS, "会社コード BELNR TYPE BSID-BELNR, "会計伝票番号 DMBTR TYPE BSID-DMBTR, "国内通貨額 END OF T_TAB1. * 内部テーブル2 TYPES: BEGIN OF T_TAB2, BUKRS TYPE BSID-BUKRS, "会社コード BELNR TYPE BSID-BELNR, "会計伝票番号 END OF T_TAB2. *----------------------------------------------------------------------* * 内部テーブルと項目列宣言 *----------------------------------------------------------------------* * 内部テーブル1 DATA : IT_TAB1 TYPE STANDARD TABLE OF T_TAB1 INITIAL SIZE 0, WA_TAB1 TYPE T_TAB1. * 内部テーブル2 DATA : IT_TAB2 TYPE STANDARD TABLE OF T_TAB2 INITIAL SIZE 0, WA_TAB2 TYPE T_TAB2. * 方法1用 DATA : IT_TAB11 TYPE STANDARD TABLE OF T_TAB1 INITIAL SIZE 0, WA_TAB11 TYPE T_TAB1. * 方法2用 DATA : IT_TAB12 TYPE STANDARD TABLE OF T_TAB1 INITIAL SIZE 0, WA_TAB12 TYPE T_TAB1. * 方法3用 DATA : IT_TAB13 TYPE STANDARD TABLE OF T_TAB1 INITIAL SIZE 0, WA_TAB13 TYPE T_TAB1. * RANGES TABLE RANGES IT_BELNR FOR BSID-BELNR. DATA WA_BELNR LIKE IT_BELNR. *----------------------------------------------------------------------* * 変数宣言 *----------------------------------------------------------------------* DATA : V_T1 TYPE I, "RUNTIME1 V_T2 TYPE I, "RUNTIME2 V_TIME1 TYPE I, "方法1RUNTIME V_TIME2 TYPE I, "方法2RUNTIME V_TIME3 TYPE I. "方法3RUNTIME *----------------------------------------------------------------------* * START-OF-SELECTION *----------------------------------------------------------------------* START-OF-SELECTION. * テストデータの設定 PERFORM FRM_SET_DATA. * テスト処理 PERFORM FRM_EDIT_DATA. * 結果の出力 PERFORM FRM_OUTPUT_DATA. *&---------------------------------------------------------------------* *& Form FRM_SET_DATA *&---------------------------------------------------------------------* * テストデータの設定 *----------------------------------------------------------------------* * --> なし * <-- なし *----------------------------------------------------------------------* FORM FRM_SET_DATA. * 内部テーブル1のデータの設定 CLEAR WA_TAB1. WA_TAB1-ID = 1. WA_TAB1-BUKRS = 'A001'. WA_TAB1-BELNR = '1000000010'. WA_TAB1-DMBTR = 10000. APPEND WA_TAB1 TO IT_TAB1. CLEAR WA_TAB1. WA_TAB1-ID = 2. WA_TAB1-BUKRS = 'A001'. WA_TAB1-BELNR = '1000000020'. WA_TAB1-DMBTR = 20000. APPEND WA_TAB1 TO IT_TAB1. CLEAR WA_TAB1. WA_TAB1-ID = 3. WA_TAB1-BUKRS = 'A001'. WA_TAB1-BELNR = '1000000030'. WA_TAB1-DMBTR = 30000. APPEND WA_TAB1 TO IT_TAB1. CLEAR WA_TAB1. WA_TAB1-ID = 4. WA_TAB1-BUKRS = 'A001'. WA_TAB1-BELNR = '1000000040'. WA_TAB1-DMBTR = 40000. APPEND WA_TAB1 TO IT_TAB1. CLEAR WA_TAB1. WA_TAB1-ID = 5. WA_TAB1-BUKRS = 'A001'. WA_TAB1-BELNR = '1000000050'. WA_TAB1-DMBTR = 10000. APPEND WA_TAB1 TO IT_TAB1. CLEAR WA_TAB1. WA_TAB1-ID = 6. WA_TAB1-BUKRS = 'A001'. WA_TAB1-BELNR = '1000000060'. WA_TAB1-DMBTR = 20000. APPEND WA_TAB1 TO IT_TAB1. CLEAR WA_TAB1. WA_TAB1-ID = 7. WA_TAB1-BUKRS = 'A001'. WA_TAB1-BELNR = '1000000070'. WA_TAB1-DMBTR = 30000. APPEND WA_TAB1 TO IT_TAB1. CLEAR WA_TAB1. WA_TAB1-ID = 8. WA_TAB1-BUKRS = 'A001'. WA_TAB1-BELNR = '1000000080'. WA_TAB1-DMBTR = 40000. APPEND WA_TAB1 TO IT_TAB1. * 内部テーブル2のデータの設定 CLEAR WA_TAB2. WA_TAB2-BUKRS = 'A001'. WA_TAB2-BELNR = '1000000010'. APPEND WA_TAB2 TO IT_TAB2. CLEAR WA_TAB2. WA_TAB2-BUKRS = 'A001'. WA_TAB2-BELNR = '1000000030'. APPEND WA_TAB2 TO IT_TAB2. ENDFORM. "FRM_SET_DATA *&---------------------------------------------------------------------* *& Form FRM_EDIT_DATA *&---------------------------------------------------------------------* * テスト処理 *----------------------------------------------------------------------* * --> なし * <-- なし *----------------------------------------------------------------------* FORM FRM_EDIT_DATA. SORT IT_TAB1 ASCENDING BY BELNR. SORT IT_TAB2 ASCENDING BY BELNR. * 方法1 IT_TAB11 = IT_TAB1. GET RUN TIME FIELD V_T1. "実行時間比較用 SORT IT_TAB11 ASCENDING BY BELNR. LOOP AT IT_TAB2 INTO WA_TAB2. LOOP AT IT_TAB11 INTO WA_TAB11 WHERE BELNR = WA_TAB2-BELNR. DELETE TABLE IT_TAB11 FROM WA_TAB11. ENDLOOP. ENDLOOP. GET RUN TIME FIELD V_T2. "実行時間比較用 V_TIME1 = V_T2 - V_T1. "実行時間 * 方法2 IT_TAB12 = IT_TAB1. GET RUN TIME FIELD V_T1. "実行時間比較用 SORT IT_TAB12 ASCENDING BY BELNR. LOOP AT IT_TAB2 INTO WA_TAB2. WA_BELNR-LOW = WA_TAB2-BELNR. WA_BELNR-SIGN = 'I'. WA_BELNR-OPTION = 'EQ'. APPEND WA_BELNR TO IT_BELNR. ENDLOOP. DELETE IT_TAB12 WHERE BELNR IN IT_BELNR. GET RUN TIME FIELD V_T2. "実行時間比較用 V_TIME2 = V_T2 - V_T1. "実行時間 * 方法3 IT_TAB13 = IT_TAB1. SORT IT_TAB13 ASCENDING BY BELNR. GET RUN TIME FIELD V_T1. "実行時間比較用 DATA V_I TYPE I. V_I = 1. LOOP AT IT_TAB2 INTO WA_TAB2. LOOP AT IT_TAB13 INTO WA_TAB13 FROM V_I. IF WA_TAB13-BELNR = WA_TAB2-BELNR. DELETE TABLE IT_TAB13 FROM WA_TAB13. V_I = V_I + 1. ELSE. EXIT. ENDIF. ENDLOOP. ENDLOOP. GET RUN TIME FIELD V_T2. "実行時間比較用 V_TIME3 = V_T2 - V_T1. "実行時間 ENDFORM. "FRM_EDIT_DATA *&---------------------------------------------------------------------* *& Form FRM_OUTPUT_DATA *&---------------------------------------------------------------------* * 結果の出力 *----------------------------------------------------------------------* * --> なし * <-- なし *----------------------------------------------------------------------* FORM FRM_OUTPUT_DATA. WRITE '内部テーブル1'. LOOP AT IT_TAB1 INTO WA_TAB1. WRITE : / WA_TAB1-ID, WA_TAB1-BUKRS, WA_TAB1-BELNR, WA_TAB1-DMBTR. ENDLOOP. ULINE. WRITE '内部テーブル2'. LOOP AT IT_TAB2 INTO WA_TAB2. WRITE : / WA_TAB2-BUKRS, WA_TAB2-BELNR. ENDLOOP. ULINE. WRITE : '方法1の結果', 'RUNTIME:', V_TIME1. LOOP AT IT_TAB11 INTO WA_TAB11. WRITE : / WA_TAB11-ID, WA_TAB11-BUKRS, WA_TAB11-BELNR, WA_TAB11-DMBTR. ENDLOOP. ULINE. WRITE : '方法2の結果', 'RUNTIME:', V_TIME2. LOOP AT IT_TAB12 INTO WA_TAB12. WRITE : / WA_TAB12-ID, WA_TAB12-BUKRS, WA_TAB12-BELNR, WA_TAB12-DMBTR. ENDLOOP. ULINE. WRITE : '方法3の結果', 'RUNTIME:', V_TIME3. LOOP AT IT_TAB13 INTO WA_TAB13. WRITE : / WA_TAB13-ID, WA_TAB13-BUKRS, WA_TAB13-BELNR, WA_TAB13-DMBTR. ENDLOOP. ENDFORM. "FRM_OUTPUT_DATA