楼主: yexin168

内表中的处理问题

[复制链接]
论坛徽章:
11
2009新春纪念徽章
日期:2009-01-04 14:52:28ITPUB元老
日期:2009-04-11 21:27:42生肖徽章2007版:牛
日期:2009-06-08 00:31:34
31#
发表于 2009-5-22 16:16 | 只看该作者
你都已经
CONCATENATE GTD_003-LFGJA  GTD_003-LFMON INTO  GTD_003-PYEAR.
了,就不能把MATNR WERKS LGORT也拼到一起做key么?

使用道具 举报

回复
论坛徽章:
8
授权会员
日期:2008-02-29 14:46:02生肖徽章2007版:猪
日期:2008-03-13 16:46:59奥运会纪念徽章:沙滩排球
日期:2008-08-28 17:37:39生肖徽章2007版:龙
日期:2009-04-16 20:53:16生肖徽章2007版:鼠
日期:2009-05-25 14:45:552011新春纪念徽章
日期:2011-02-18 11:42:472010广州亚运会纪念徽章:马术
日期:2011-03-30 09:25:572013年新春福章
日期:2013-02-25 14:51:24
32#
发表于 2009-5-22 17:10 | 只看该作者
连捡了两份钱,呵呵

sort可以用两个表来解决,至于loop遍历的问题没有试验过。
在找不到数据的时候,可能会全遍历。
还有为什么你要连接会计年度与会计期间呢?只要全部放在loop where里就行了
还有看你程序,似乎错了,物料跨年度的你错了
以下是我们经常写的方法。虽然不一定快,但是绝对正确撒
SELECT
        LFGJA
        LFMON
        WERKS
        LGORT
        MATNR
        LABST AS KALAB  "非限制
        INSME AS KAINS  "质检
        SPEME AS KASPE  "冻结
      INTO CORRESPONDING FIELDS OF TABLE  GTD_003
      FROM MARD
      WHERE WERKS  IN S_WERKS
      AND   MATNR  IN S_MATNR
      AND   LGORT  IN S_LGORT.
loop at GTD_003.
   IF GTD_003-LFGJA <  P_GJAHR OR
     ( GTD_003-LFGJA =  P_GJAHR AND
       GTD_003-LFMON <= P_MONAT ).
     结果数据
   else.
     待查数据。
     GTD_TEMP.
   endif.
endloop.
LOOP AT GTD_TEMP.
    SELECT
       LFGJA
       LFMON
       WERKS
       LGORT
       MATNR
       LABST AS KALAB  "非限制
       INSME AS KAINS  "质检
       SPEME AS KASPE  "冻结
     APPENDING CORRESPONDING FIELDS OF   GTD_TMP2
     FROM MARDH
          UP TO 1 ROWS
     WHERE WERKS  IN S_WERKS
     AND   MATNR  IN S_MATNR
     AND   LGORT  IN S_LGORT
      ( LFGJA >  P_GJAHR          OR
         ( LFGJA =  P_GJAHR          AND
           LFMON >= P_MONAT  ) )
        ORDER BY  LFGJA ASCENDING
                          LFMON ASCENDING.
     IF SY-SUBRC = 0.
       GTD_TMP2 对象数据
     else
        GTD_TEMP 对象数据
     ENDIF.       
     
ENDLOOP.

使用道具 举报

回复
论坛徽章:
121
紫蛋头
日期:2013-07-02 19:27:392014年新春福章
日期:2014-02-18 16:41:11马上有车
日期:2014-02-18 16:41:112014年世界杯参赛球队: 波黑
日期:2014-06-07 00:05:53喜羊羊
日期:2015-03-04 14:49:392015年新春福章
日期:2015-03-06 11:57:31
33#
发表于 2009-5-22 17:12 | 只看该作者
原帖由 awarecan 于 2009-5-22 14:09 发表


你的算法会反复的做sort好不好,不要耗费时间么?
另外 loop at where,如果不是where的不是left aligned key,也是要full table scan的,至少是O(n/2)。
再想想吧


原帖由 awarecan 于 2009-5-22 16:16 发表
你都已经
CONCATENATE GTD_003-LFGJA  GTD_003-LFMON INTO  GTD_003-PYEAR.
了,就不能把MATNR WERKS LGORT也拼到一起做key么?


使用道具 举报

回复
论坛徽章:
121
紫蛋头
日期:2013-07-02 19:27:392014年新春福章
日期:2014-02-18 16:41:11马上有车
日期:2014-02-18 16:41:112014年世界杯参赛球队: 波黑
日期:2014-06-07 00:05:53喜羊羊
日期:2015-03-04 14:49:392015年新春福章
日期:2015-03-06 11:57:31
34#
发表于 2009-5-22 17:14 | 只看该作者
原帖由 yexin168 于 2009-5-22 09:41 发表


谢谢awarecan  和rosefish  
我想问下:
at new key.
    clear found.
  end at.  这里的key 能否 是多个字段的结合呢?  还有 at end of key
比如 at new  MATNR WERKS LGORT CHARG.
         。。
         end.    这样可以吗?   谢谢~~

AT NEW不能跟多个字段,如果要用多个字段,试一下ON CHANGE OF吧

使用道具 举报

回复
论坛徽章:
11
2009新春纪念徽章
日期:2009-01-04 14:52:28ITPUB元老
日期:2009-04-11 21:27:42生肖徽章2007版:牛
日期:2009-06-08 00:31:34
35#
发表于 2009-5-22 18:56 | 只看该作者
在IDES上分别写了两个实现方法

数据量,MARD 20422条记录,MARDH 47324条记录

我的方法,耗时1.27秒,60%多的时间消耗在ABAP。

fengleihen的方法一,跑小数据量还行,跑全数据,超过500秒了,没出结果,实在无法忍受,喀嚓了

改成用两个sorted后的hashed table,用left-aligned key做loop,耗时142.86秒,99%以上的时间消耗在ABAP。

fengleihen的方法二,跑全数据,耗时54.47秒,98.3%的时间消耗在数据库。

我稍微修改了一下方法二,跑全数据,耗时1.11秒,79.4%的时间消耗在ABAP。

方法二修改:
LOOP AT GTD_TEMP.
    SELECT
       LFGJA
       LFMON
       WERKS
       LGORT
       MATNR
       LABST AS KALAB  "非限制
       INSME AS KAINS  "质检
       SPEME AS KASPE  "冻结
     APPENDING CORRESPONDING FIELDS OF   GTD_TMP2
     FROM MARDH
          UP TO 1 ROWS
     WHERE WERKS  IN S_WERKS
     AND   MATNR  IN S_MATNR
     AND   LGORT  IN S_LGORT
      ( LFGJA >  P_GJAHR          OR
         ( LFGJA =  P_GJAHR          AND
           LFMON >= P_MONAT  ) )
        ORDER BY  LFGJA ASCENDING
                          LFMON ASCENDING.
     IF SY-SUBRC = 0.
       GTD_TMP2 对象数据
     else
        GTD_TEMP 对象数据
     ENDIF.        
     
ENDLOOP.

改成

select * from mardh for all enteries in temp0
  into table temp2
  where 与方法二条件条件雷同

sort temp2 by LFGJA DESCENDING  LFMON DECENDING.
loop at temp0.
  read temp2 binary search
  if sy-subrc = 0.
       GTD_TMP2 对象数据  
  else.
        GTD_TEMP 对象数据
  endif
end loop.

使用道具 举报

回复
论坛徽章:
8
授权会员
日期:2008-02-29 14:46:02生肖徽章2007版:猪
日期:2008-03-13 16:46:59奥运会纪念徽章:沙滩排球
日期:2008-08-28 17:37:39生肖徽章2007版:龙
日期:2009-04-16 20:53:16生肖徽章2007版:鼠
日期:2009-05-25 14:45:552011新春纪念徽章
日期:2011-02-18 11:42:472010广州亚运会纪念徽章:马术
日期:2011-03-30 09:25:572013年新春福章
日期:2013-02-25 14:51:24
36#
发表于 2009-5-23 00:08 | 只看该作者
方法2中我的那条件错了,再次改正一下,
    WHERE WERKS  =GTD_TEMP-WERKS
     AND   MATNR  = GTD_TEMP-MATNR
     AND   LGORT  = GTD_TEMP-LGORT
感谢楼上做测试,学习了。

使用道具 举报

回复
论坛徽章:
5
祖国60周年纪念徽章
日期:2009-10-09 08:28:002010新春纪念徽章
日期:2010-01-04 08:33:082010新春纪念徽章
日期:2010-03-01 11:20:05暖羊羊
日期:2015-03-04 14:50:372015年新春福章
日期:2015-03-06 11:57:31
37#
 楼主| 发表于 2009-5-25 10:23 | 只看该作者
感谢感谢 awarecan  和   fengleihen  还有 rosefish   的专业指导....现在按照你们的方式在跑,速度真的快多了...而且出来的结果也是对的..再次表示感谢...  
   学习了...

使用道具 举报

回复
论坛徽章:
121
紫蛋头
日期:2013-07-02 19:27:392014年新春福章
日期:2014-02-18 16:41:11马上有车
日期:2014-02-18 16:41:112014年世界杯参赛球队: 波黑
日期:2014-06-07 00:05:53喜羊羊
日期:2015-03-04 14:49:392015年新春福章
日期:2015-03-06 11:57:31
38#
发表于 2009-5-25 11:58 | 只看该作者
学习

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表