两内表关联删除操作

ZZ "http://moonfly2004.javaeye.com/blog/204663"


有两个内部表: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.代码可读性差。

 
*&---------------------------------------------------------------------*
*& 作成者   : 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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值