ITPUB??ì3
新一届的微软MVP评选已经开始,欢迎各位推荐!
ITPUB论坛 » SAP R/3 » 系统开发及跨应用设置 » 请教:如何优化这段代码

标题: 请教:如何优化这段代码
离线 yougukeo
初级会员



精华贴数 0
个人空间 0
技术积分 96 (17175)
社区积分 0 (856734)
注册日期 2006-4-12
论坛徽章:0
      
      

发表于 2007-6-13 08:39 
请教:如何优化这段代码

DATA:
*        实际可用的订单数
        L_ACT_KWMENG LIKE VBAP-KWMENG,
*        实际发货过账数
        L_ACT_LFIMG LIKE LIPS-LFIMG,
*        已做交货单数
        L_LFIMG LIKE LIPS-LFIMG,
        SUBRC LIKE SY-SUBRC,
        L_UMREZ LIKE MARM-UMREZ VALUE 1.

  LOOP AT ITAB_VBAP.
    CLEAR: L_ACT_KWMENG, L_ACT_LFIMG, L_LFIMG.
    SUBRC = 4.

    LOOP AT ITAB_VBFA WHERE VBELV = ITAB_VBAP-VBELN
                        AND POSNV = ITAB_VBAP-POSNR.
*      已做交货单数量
      L_LFIMG = L_LFIMG + ITAB_VBFA-RFMNG.
*      实际发货过账数量
      READ TABLE ITAB_VBUK WITH KEY VBELN = ITAB_VBFA-VBELN.
      IF SY-SUBRC = 0.
        L_ACT_LFIMG = L_ACT_LFIMG + ITAB_VBFA-RFMNG.
      ENDIF.
    ENDLOOP.

    L_LFIMG = L_LFIMG * ITAB_VBAP-UMVKN / ITAB_VBAP-UMVKZ.
    L_ACT_LFIMG = L_ACT_LFIMG * ITAB_VBAP-UMVKN / ITAB_VBAP-UMVKZ.

    IF ITAB_VBAP-AUART+2(2) = 'ZD'.
      ITAB_VBAP-CMPRE = ITAB_VBAP-KZWI1 / ITAB_VBAP-KWMENG.
    ENDIF.

    IF ITAB_VBAP-ABGRU <> SPACE.
      ITAB_VBAP-KWMENG = L_LFIMG.
    ENDIF.

    IF ITAB_VBAP-KWMENG > L_ACT_LFIMG.
      SUBRC = 0.
    ENDIF.

    IF SUBRC = 0.
      MOVE-CORRESPONDING ITAB_VBAP TO ITAB_OUTPUT.
      ITAB_OUTPUT-LFIMG1 = L_LFIMG.
      ITAB_OUTPUT-LFIMG2 = L_ACT_LFIMG.
      ITAB_OUTPUT-WFIMG = ITAB_OUTPUT-KWMENG - L_ACT_LFIMG.
      ITAB_OUTPUT-KUNAG = ITAB_VBAP-KUNNR.
      ITAB_OUTPUT-KZWI1 = ITAB_VBAP-KWMENG * ITAB_VBAP-CMPRE.
      ITAB_OUTPUT-LFWI1 = ITAB_OUTPUT-LFIMG1 * ITAB_VBAP-CMPRE.
      ITAB_OUTPUT-LFWI2 = ITAB_OUTPUT-LFIMG2 * ITAB_VBAP-CMPRE.
      ITAB_OUTPUT-WFWI1 = ITAB_OUTPUT-WFIMG * ITAB_VBAP-CMPRE.
      PERFORM READ_DESC CHANGING ITAB_OUTPUT.
      APPEND ITAB_OUTPUT.
      CLEAR: ITAB_OUTPUT.
    ENDIF.
    CLEAR: ITAB_VBAP.
  ENDLOOP.

由于两次循环的数据量比较大,有没有更好的办法实现上面的累加呢,请各位大虾指教。


只看该作者    顶部
离线 sunkingpeng
初级会员



精华贴数 0
个人空间 0
技术积分 26 (44264)
社区积分 0 (159544)
注册日期 2004-9-17
论坛徽章:0
      
      

发表于 2007-6-13 10:11 
两个 loop 嵌套的循环是可以优化的

数据量小,嵌套的loop循环很方便,也是我们常用的方式,但是当数据量大了后,一般几十万条后,就会特别慢,如何优化呢,用一个loop循环,然后另外一个内表用 read table 。。。。,当天table要先按照关键字排序,然后用二分法查找,记住,这个是关键 (Binary Search )
这样就可以了,中间的逻辑控制一下,就是保证可能read 的这个内表中有一笔以上的数据满足要求的时候 ,read只能取出一条来,是吧,我们要让read 像loop一样取出所有的符合要求的条数,这样就做一个do  enddo。把read加在中间,用一个记数器,如果是第一次执行do,那么就用标准的read table with key 。。。这个判断条件,并且记住找到符合条件的当前指针位置,然后如果不是第一次执行do,那么就read table index+1,index是刚才我们记录的指针,然后根据关键字判断本次的读取的记录和第一次读取的记录的关键字是否一致,如果一致,那么本次读取的就是符合我们要求的,类似我用嵌套的loop的第2个loop中的符合条件第2条记录被找到,然后继续执行第3次do ,read table index+2,这样,第一次用二分法找到数据后,第2次第n次都是直接定位到需要的指针,
这样的方式比两个loop嵌套要快几十甚至几百倍。我实际的例子中,一个报表从几十分钟到十几秒的缩短,呵呵,你试试。


只看该作者    顶部
离线 yougukeo
初级会员



精华贴数 0
个人空间 0
技术积分 96 (17175)
社区积分 0 (856734)
注册日期 2006-4-12
论坛徽章:0
      
      

发表于 2007-6-13 10:34 
好的,实践一下去,非常感谢!


只看该作者    顶部
离线 yougukeo
初级会员



精华贴数 0
个人空间 0
技术积分 96 (17175)
社区积分 0 (856734)
注册日期 2006-4-12
论坛徽章:0
      
      

发表于 2007-6-13 13:51 
我做了一下,但是效果不太好,能不能给个例子呢?谢谢了


只看该作者    顶部
离线 awarecan
Instructor


精华贴数 0
个人空间 0
技术积分 1660 (1023)
社区积分 5 (15262)
注册日期 2003-8-5
论坛徽章:3
授权会员2008北京奥运纪念徽章:击剑生肖徽章2007版:龙   
      

发表于 2007-6-13 22:20 
LOOP AT ITAB_VBFA WHERE VBELV = ITAB_VBAP-VBELN
AND POSNV = ITAB_VBAP-POSNR.
* 已做交货单数量
L_LFIMG = L_LFIMG + ITAB_VBFA-RFMNG.
* 实际发货过账数量
READ TABLE ITAB_VBUK WITH KEY VBELN = ITAB_VBFA-VBELN.
IF SY-SUBRC = 0.
L_ACT_LFIMG = L_ACT_LFIMG + ITAB_VBFA-RFMNG.
ENDIF.
ENDLOOP.

看上去这个LOOP只是求累加,
那么,可不可以把这段代码放到大循环外面,用COLLECT先累加好,
再在大循环里面直接索引到累加的结果呢。


__________________
北京ABAP全日班,10/13开课

博彦科技 SAP授权培训伙伴 北京/上海/天津
010-82826580
021-51311836
只看该作者    顶部
 
    

相关内容


CopyRight 1999-2006 itpub.net All Right Reserved.
北京皓辰广域网络信息技术有限公司. 版权所有
E-mail:Webmaster@itpub.net
京ICP证:010037号 联系我们 法律顾问