SAP ABAP 语句性能对比

获取内表部分字段

         从一个内表抽取部分字段到另一个内表,要求字段名相同。

方法一:循环添加;

方法二:MOVE-CORRESPONDING ITAB1[] TO ITAB2[]

 

DATA:BEGIN OF GS_OUT,
  EBELN LIKE EKPO-EBELN,
  EBELP LIKE EKPO-EBELP,
  MATNR LIKE EKPO-MATNR,
  MENGE TYPE DECIMALS 3,
  END OF GS_OUT.

DATA GT_OUT LIKE STANDARD TABLE OF GS_OUT.

DATA:BEGIN OF GS_EBN,
  EBELN LIKE EKPO-EBELN,
  EBELP LIKE EKPO-EBELP,
  END OF GS_EBN.

DATA GT_EBN LIKE STANDARD TABLE OF GS_EBN.

DATAT1 TYPE P,
      T2 TYPE P,
      TC TYPE P,
      T3 TYPE P,
      T4 TYPE P,
      TN TYPE P.

SELECT EBELN EBELP MATNR MENGE INTO TABLE GT_OUT
  
UP TO 100000 ROWS
  FROM MSEG.
  .
GET RUN TIME FIELD T1.
LOOP AT GT_OUT INTO GS_OUT.
  MOVE-CORRESPONDING GS_OUT TO GS_EBN.
  APPEND GS_EBN TO GT_EBN.
ENDLOOP.
GET RUN TIME FIELD T2.
T3 T2 T1.

WRITE:/'方法一:','运行时间:',T3.

REFRESH GT_EBN.
GET RUN TIME FIELD T1.
MOVE-CORRESPONDING GT_OUT[] TO GT_EBN[].
GET RUN TIME FIELD T2.
T3 T2 T1.

WRITE:/'方法二:','运行时间:',T3.

IF SY-SUBRC 0.

ENDIF.

 

修改内表

         ASSIGNING 与 MODIFY 修改。

DATA:BEGIN OF GS_OUT,
  EBELN LIKE EKPO-EBELN,
  EBELP LIKE EKPO-EBELP,
  MATNR LIKE EKPO-MATNR,
  MENGE TYPE DECIMALS 3,
  END OF GS_OUT.

DATA GT_OUT LIKE STANDARD TABLE OF GS_OUT.

DATA:BEGIN OF GS_EBN,
  EBELN LIKE EKPO-EBELN,
  EBELP LIKE EKPO-EBELP,
  END OF GS_EBN.

DATA GT_EBN LIKE STANDARD TABLE OF GS_EBN.
DATAT1 TYPE P,
      T2 TYPE P,
      TC TYPE P,
      T3 TYPE P,
      T4 TYPE P,
      TN TYPE P.

SELECT EBELN EBELP MATNR MENGE INTO TABLE GT_OUT
  
UP TO 100000 ROWS
  FROM MSEG.
  .
GET RUN TIME FIELD T1.
LOOP AT GT_OUT INTO GS_OUT.
   GS_OUT-MENGE 0.
   MODIFY GT_OUT FROM GS_OUT.
ENDLOOP.
GET RUN TIME FIELD T2.
T3 T2 T1.
WRITE:/'方法一:','运行时间:',T3.

GET RUN TIME FIELD T1.
FIELD-SYMBOLS:<FL> LIKE GS_OUT.
LOOP AT GT_OUT ASSIGNING <FL>.
   <FL>-MENGE 0.
ENDLOOP.
GET RUN TIME FIELD T2.
T3 T2 T1.
WRITE:/'方法二:','运行时间:',T3.

 

 

 

 

 

READ TABLE

         READ TABLE语句,分别读取HASHTABLE方式与BINARY SEARCH方式。

DATA:BEGIN OF GS_OUT,
  EBELN LIKE EKPO-EBELN,
  EBELP LIKE EKPO-EBELP,
  MATNR LIKE EKPO-MATNR,
  MENGE TYPE DECIMALS 3,
  END OF GS_OUT.

DATA GT_OUT LIKE STANDARD TABLE OF GS_OUT." WITH KEY MATNR.

DATA:BEGIN OF GS_EBN,
  MATNR LIKE MSEG-MATNR,
  MENGV TYPE DECIMALS 3,
  END OF GS_EBN.

DATA GT_EBN LIKE STANDARD TABLE OF GS_EBN WITH KEY MATNR.
DATA HST_EBN LIKE HASHED TABLE OF GS_EBN WITH UNIQUE KEY MATNR.


DATA CL_TYPEDESCR TYPE REF TO CL_ABAP_TYPEDESCR.
DATAT1 TYPE P,
      T2 TYPE P,
      TC TYPE P,
      T3 TYPE P,
      T4 TYPE P,
      TN TYPE P.


SELECT EBELN EBELP MATNR MENGE INTO TABLE GT_OUT
  
UP TO 100000 ROWS
  FROM MSEG.
  .
MOVE-CORRESPONDING GT_OUT[] TO GT_EBN[].
SORT GT_EBN.
DELETE ADJACENT DUPLICATES FROM GT_EBN.
SORT GT_EBN.
HST_EBN[] GT_EBN[].


GET RUN TIME FIELD T1.

LOOP AT GT_OUT INTO GS_OUT.
  READ TABLE GT_EBN INTO GS_EBN WITH KEY MATNR GS_OUT-MATNR BINARY SEARCH.
ENDLOOP.
GET RUN TIME FIELD T2.
T3 T2 T1.

WRITE:/'方法一:','运行时间:',T3.


GET RUN TIME FIELD T1.
LOOP AT GT_OUT INTO GS_OUT.
  READ TABLE HST_EBN INTO GS_EBN WITH KEY MATNR GS_OUT-MATNR.
ENDLOOP.
GET RUN TIME FIELD T2.
T3 T2 T1.

WRITE:/'方法二:','运行时间:',T3.

IF SY-SUBRC 0.

ENDIF.

      注:HASHTABLE BINARY SEARCH读取快得多,但时,HASHTABLE中定义的关键字段在读取时必须全部用到,否则不起作用。

 

 

 

 

循环内表

方法一:根据关键字段读取;

方法二:根据行索引读取。

DATA:t_mseg LIKE STANDARD TABLE OF mseg WITH HEADER LINE.
SELECT INTO TABLE t_mseg UP TO 100000 ROWS
  FROM mseg.

DATAt1 TYPE i,
      t2 TYPE i,
      t3 TYPE i.
DATA:BEGIN OF ls_mat,
       matnr TYPE mseg-matnr,
     END OF ls_mat.
DATA lt_mat LIKE STANDARD TABLE OF ls_mat.

MOVE-CORRESPONDING t_mseg[] TO lt_mat[].
SORT lt_mat.
DELETE ADJACENT DUPLICATES FROM lt_mat.

*--循环读取,根据关键字段 物料号
GET RUN TIME FIELD t1.
LOOP AT lt_mat INTO ls_mat.
  LOOP AT t_mseg ASSIGNING FIELD-SYMBOL(<w_mseg>WHERE matnr ls_mat-matnr.
    <w_mseg>-menge 0.
  ENDLOOP.
ENDLOOP.
GET RUN TIME FIELD t2.
t3 t2 t1.

WRITE:/ t3.

*--循环读取,根据物料号行索引
CLEAR :t1,t2,t3.
DATA lv_tabix TYPE i.
GET RUN TIME FIELD t1.
SORT t_mseg BY matnr.
LOOP AT lt_mat INTO ls_mat.
  READ TABLE t_mseg WITH KEY matnr ls_mat-matnr TRANSPORTING NO FIELDS BINARY SEARCH.
  IF sy-subrc 0.
    lv_tabix sy-tabix.
  ELSE.
    CONTINUE.
  ENDIF.
  LOOP AT t_mseg ASSIGNING FIELD-SYMBOL(<f_mseg>FROM lv_tabix.
    IF <f_mseg>-matnr <> ls_mat-matnr.
      EXIT.
    ENDIF.
    <f_mseg>-menge 0.
  ENDLOOP.
ENDLOOP.
GET RUN TIME FIELD t2.
t3 t2 t1.

WRITE:/ t3.

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值