登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

原来为了你

我的人生就是要一次次的超越

 
 
 

日志

 
 
 
 

For All Entries 还该不该用?  

2011-04-28 14:22:06|  分类: ABAP基础知识 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

REPORT   z_test_for_all_entris.

TYPESBEGIN OF typ1,
        vbeln   
LIKE vbak-vbeln,
        posnr   
LIKE vbap-posnr,
        kbmeng  
LIKE vbap-kbmeng,
        netpr   
LIKE vbap-netpr,
        waerk   
LIKE vbap-waerk,
        knumv   
LIKE vbak-knumv,
        faksk   
LIKE vbak-faksk,
        auart   
LIKE vbak-auart,
        erdat   
LIKE vbak-erdat,
        sonum   
LIKE vbfa-sonum,
        posnn   
LIKE vbfa-posnn,
        bezei   
LIKE tvakt-bezei,
        bstkd   
LIKE vbkd-bstkd,
       
END OF typ1.
DATAitab1 TYPE TABLE OF typ1 WITH HEADER LINE.

*---参照表:用于for all entries
TYPESBEGIN OF typ2,
        vbeln 
LIKE likp-vbeln,
        posnr 
LIKE lips-posnr,
       
END OF typ2.
DATAitab2 TYPE TABLE OF typ2 WITH HEADER LINE.

SELECT vbeln posnr
  
INTO CORRESPONDING FIELDS OF TABLE itab2
  
FROM lips UP TO 100 ROWS.

*---方法1
SELECT  b~vbeln
        b
~posnr
        b
~kbmeng
        b
~netpr
        b
~waerk
        b
~kpein

        a
~knumv
        a
~faksk
        a
~auart
        a
~erdat

        
c~vbeln AS sonum
        
c~posnn

        d
~bezei

        e
~bstkd
  
INTO CORRESPONDING FIELDS OF TABLE itab1
  
FROM vbak AS a
  INNER 
JOIN vbap   AS ON b~vbeln a~vbeln
  INNER 
JOIN vbfa   AS c ON c~vbelv a~vbeln AND c~posnv b~posnr
  INNER 
JOIN tvakt  AS ON a~auart d~auart
  INNER 
JOIN vbkd   AS ON e~vbeln a~vbeln
  
FOR ALL ENTRIES IN itab2
  
WHERE c~vbeln itab2-vbeln
    
AND c~posnn itab2-posnr
    
AND c~vbtyp_n 'J' OR c~vbtyp_n 'H' OR c~vbtyp_n 'T' ).

LOOP AT itab1.
  
READ TABLE itab2 WITH KEY vbeln itab1-vbeln posnr itab1-posnn.
  
IF sy-subrc 0.
    
DELETE itab1.
  
ENDIF.
ENDLOOP.

*---方法2
SELECT  b~vbeln
        b
~posnr
        b
~kbmeng
        b
~netpr
        b
~waerk
        b
~kpein

        a
~knumv
        a
~faksk
        a
~auart
        a
~erdat

        
c~vbeln AS sonum
        
c~posnn

        d
~bezei

        e
~bstkd
  
INTO CORRESPONDING FIELDS OF TABLE itab1
  
FROM vbak AS a
  INNER 
JOIN vbap   AS ON b~vbeln a~vbeln
  INNER 
JOIN vbfa   AS c ON c~vbelv a~vbeln AND c~posnv b~posnr
  INNER 
JOIN tvakt  AS ON a~auart d~auart
  INNER 
JOIN vbkd   AS ON e~vbeln a~vbeln
  
WHERE c~vbtyp_n 'J' OR c~vbtyp_n 'H' OR c~vbtyp_n 'T' ).

LOOP AT itab1.
  
READ TABLE itab2 WITH KEY vbeln itab1-vbeln posnr itab1-posnn.
  
IF sy-subrc 0.
    
DELETE itab1.
  
ENDIF.
ENDLOOP.

*se30可以看到方法1比方法2花的时间多了几倍,而且用st05可以看到方法1的语句被分成了多句,如果数据量更大的话,运行时间将难以忍受。
*但是,如果一个数据库表数据量大的话,方法2也是不可取的。这时我们可以用range来代替for all entries:

IF len_ran1 > 9995."len_ran1 ran1 的长度,用in range取数时range 的长度不能超过9996.
  
RANGES ran2 FOR table1-field1.
  
DATAl_count TYPE i.
  
CLEAR l_count.

  
LOOP AT ran1.
    l_count 
l_count + 1.
    
MOVE-CORRESPONDING ran1 TO ran2.
    
APPEND ran2.
    
CLEAR ran2.
    
IF  l_count > 9000 OR sy-tabix len_ran1.
      
CLEAR t_itab_temp.
      
SELECT *  INTO CORRESPONDING FIELDS OF TABLE t_itab_temp
        
FROM table1
        
WHERE field1 IN ran2.
      
APPEND LINES OF t_itab_temp TO t_itab.
      
CLEAR ran2[].
      l_count 
0.
    
ENDIF.
  
ENDLOOP.

ELSE.
  
SELECT *  INTO CORRESPONDING FIELDS OF TABLE t_itab
   
FROM table1
   
WHERE field1 IN ran1.
ENDIF.

*---------------------- 参考小例 ------------------------
REPORT   z_test_for_all_entris.

TYPESBEGIN OF typ_vbak,
        vbeln 
LIKE vbak-vbeln,
        vkorg 
LIKE vbak-vkorg,
        kunnr 
LIKE vbak-kunnr,
       
END OF typ_vbak.
DATAgt_vbak TYPE TABLE OF typ_vbak.
DATAgt_vbak_temp TYPE TABLE OF typ_vbak WITH HEADER LINE.

SELECT vbeln
  
INTO CORRESPONDING FIELDS OF TABLE gt_vbak_temp
  
FROM vbak
  
WHERE auart 'ZBV1'.

*---Ranges,较快
RANGESr_vbeln FOR vbak-vbeln.
LOOP AT gt_vbak_temp .
  r_vbeln
-sign 'I'.
  r_vbeln
-option 'EQ'.
  r_vbeln
-low gt_vbak_temp-vbeln.
  
APPEND r_vbeln.
ENDLOOP.
SELECT vbeln
 vkorg
 kunnr
 
INTO CORRESPONDING FIELDS OF TABLE gt_vbak
 
FROM vbak
 
WHERE vbeln IN r_vbeln.

*---for all entries,较慢
*select vbeln
*  vkorg
*  kunnr
*  into corresponding fields of table gt_vbak
*  from vbak
*  for all entries in gt_vbak_temp
*  where vbeln = gt_vbak_temp-vbeln.

  评论这张
 
阅读(589)| 评论(1)

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018