楼主: yexin168

内表中的处理问题

[复制链接]
论坛徽章:
11
2009新春纪念徽章
日期:2009-01-04 14:52:28ITPUB元老
日期:2009-04-11 21:27:42生肖徽章2007版:牛
日期:2009-06-08 00:31:34
21#
发表于 2009-5-21 13:17 | 只看该作者
原帖由 rosefish 于 2009-5-21 11:50 发表

“程序 = 算法 + 数据结构”
上面这个算法非常好,我觉得这是实现楼主需求的最佳算法。另外我想补充几点数据结构或者说是ABAP语法的看法:
1. loop itab 在ABAP中的语句是loop at itab.
2. end at 在ABAP中是一个关键字endat.
3. at new f. at end of f. 要考虑f前面的字段。比如内表的字段是f1,f2,...fn. 如果使用at new f2这样的语句,结果会被f1影响。详细情况请debug。
4. at end of f.语句执行后,f后面的字段值会丢失(变成*)。
因此,要用楼上的算法写一个完整的程序实现楼主的需求,可能需要解决上面的几个问题。


小鱼眼还真尖。
所以,还是我的一个程序是对的,要用last_value保存一下。

使用道具 举报

回复
论坛徽章:
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
22#
 楼主| 发表于 2009-5-22 09:41 | 只看该作者
原帖由 awarecan 于 2009-5-21 10:14 发表
可能连last_value都不用声明,在at end of key里直接用itab也行。

data itab type table of xxx.
data found.

sort itab by key date.
loop itab.
  at new key.
    clear found.
  end at.

  if found is initial.
    if itab-date >= 200903.
      itab is your need
      found = 'X'.
    endif.
  endif.

  at end of key.
    if found is initial.
      itab is your need
    endif.
  end at.
endloop.


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

使用道具 举报

回复
论坛徽章:
11
2009新春纪念徽章
日期:2009-01-04 14:52:28ITPUB元老
日期:2009-04-11 21:27:42生肖徽章2007版:牛
日期:2009-06-08 00:31:34
23#
发表于 2009-5-22 09:46 | 只看该作者
原帖由 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.    这样可以吗?   谢谢~~


不可以。

可以

loop

  at new MATNR
  end at

  at new WERKS
  end at

  at new LGORT
  end at

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
24#
发表于 2009-5-22 11:02 | 只看该作者
所以对于他的需求来说,我写的还是有点好处的。大众化的。

使用道具 举报

回复
论坛徽章:
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
25#
发表于 2009-5-22 11:02 | 只看该作者
自恋下,嘿嘿

使用道具 举报

回复
论坛徽章:
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
26#
 楼主| 发表于 2009-5-22 13:30 | 只看该作者
呵呵,fengleihen  应该有写过关于MCHB ,或者mard 等的表的需求吧。
他们的取数逻辑就是这样的。。
比如MCHB 就要根据  MATNR WERKS LGORT CHARG 来确定唯一值....
     用了多几个loop后,ABAP 的执行效率很慢的..
我现在在测试awarecan  提供给我的方法,看看执行效果如果。。呵呵..

使用道具 举报

回复
论坛徽章:
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
27#
发表于 2009-5-22 13:47 | 只看该作者
原帖由 yexin168 于 2009-5-22 13:30 发表
呵呵,fengleihen  应该有写过关于MCHB ,或者mard 等的表的需求吧。
他们的取数逻辑就是这样的。。
比如MCHB 就要根据  MATNR WERKS LGORT CHARG 来确定唯一值....
     用了多几个loop后,ABAP 的执行效率很慢的..
我现在在测试awarecan  提供给我的方法,看看执行效果如果。。呵呵..

按理来说,我的执行效率要好点,因为一开始删除了重复项,loop 总表数目减少,
并且每次找对象值运行loop只有一条数据。

使用道具 举报

回复
论坛徽章:
11
2009新春纪念徽章
日期:2009-01-04 14:52:28ITPUB元老
日期:2009-04-11 21:27:42生肖徽章2007版:牛
日期:2009-06-08 00:31:34
28#
发表于 2009-5-22 14:09 | 只看该作者
原帖由 fengleihen 于 2009-5-22 13:47 发表

按理来说,我的执行效率要好点,因为一开始删除了重复项,loop 总表数目减少,
并且每次找对象值运行loop只有一条数据。


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

使用道具 举报

回复
论坛徽章:
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
29#
 楼主| 发表于 2009-5-22 15:07 | 只看该作者
你的算法会反复的做sort好不好,不要耗费时间么?
另外 loop at where,如果不是where的不是left aligned key,也是要full table scan的,至少是O(n/2)。
再想想吧

这样吧。。我把我写的程序贴上来,帮我看看,那种方式效率高,因为真的速度很慢。。

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
       AND  LFGJA <= P_LFGJA .

    SELECT
       LFGJA
       LFMON
       WERKS
       LGORT
       MATNR
       LABST AS KALAB  "非限制
       INSME AS KAINS  "质检
       SPEME AS KASPE  "冻结
     APPENDING CORRESPONDING FIELDS OF TABLE  GTD_003
     FROM MARDH
     WHERE WERKS  IN S_WERKS
     AND   MATNR  IN S_MATNR
     AND   LGORT  IN S_LGORT
       AND  LFGJA <= P_LFGJA .

LOOP AT GTD_003.
      CONCATENATE GTD_003-LFGJA  GTD_003-LFMON INTO  GTD_003-PYEAR.  “把年度和月份合并处理
      MODIFY GTD_003.
    ENDLOOP.

  SORT GTD_003 BY  MATNR WERKS LGORT PYEAR DESCENDING .

GTD_000[] = GTD_003[].

  DELETE ADJACENT DUPLICATES FROM GTD_000 COMPARING MATNR WERKS LGORT.

LOOP AT GTD_000 ASSIGNING <GTD_000>.
      SORT GTD_003 BY  MATNR WERKS LGORT PYEAR ASCENDING.
      LOOP AT GTD_003  WHERE WERKS = <GTD_000>-WERKS AND  LGORT = <GTD_000>-LGORT AND MATNR = <GTD_000>-MATNR  AND PYEAR >= GDF_SPMON  .
        EXIT.
      ENDLOOP.
      IF SY-SUBRC <> 0.
        LOOP AT GTD_003  WHERE WERKS = <GTD_000>-WERKS AND  LGORT = <GTD_000>-LGORT AND MATNR = <GTD_000>-MATNR  AND PYEAR < GDF_SPMON  .
          EXIT.
        ENDLOOP.

        IF SY-SUBRC = 0 .
          MOVE-CORRESPONDING GTD_003 TO GTD_KC.
          APPEND GTD_KC.
          CLEAR GTD_KC.
        ENDIF.
      ELSE.
        MOVE-CORRESPONDING GTD_003 TO GTD_KC.
        APPEND GTD_KC.
        CLEAR GTD_KC.
      ENDIF.

    ENDLOOP.
这个是用的是f 的方法来写的... 出来的结果看了下,应该是对的..


下面用另外一位兄弟的做法:少了 GTD_000 这个内表循环
DATA : FOUND TYPE C  .
    DATA LAST_VALUE LIKE LINE OF GTD_003.

    LOOP AT  GTD_003 .
      AT NEW  MATNR.
        AT NEW WERKS.
          AT NEW LGORT.
              CLEAR FOUND .
              CLEAR LAST_VALUE.
            ENDAT .
          ENDAT .
        ENDAT .

      IF FOUND IS INITIAL .
        IF GTD_003-PYEAR = GDF_SPMON  .
          MOVE-CORRESPONDING GTD_003 TO GTD_KC.
        APPEND GTD_KC.
        CLEAR GTD_KC.
          FOUND = 'X'.

        ELSEIF GTD_002-PYEAR > GDF_SPMON.
           MOVE-CORRESPONDING GTD_003 TO GTD_KC.
        APPEND GTD_KC.
        CLEAR GTD_KC.
          FOUND = 'X'.
        ELSE.
          LAST_VALUE = GTD_003.

        ENDIF.
      ENDIF.

      AT END OF MATNR.
        AT END OF WERKS.
          AT END OF LGORT.
              IF FOUND IS INITIAL.
                MOVE-CORRESPONDING LAST_VALUE TO GTD_KC.
                APPEND GTD_KC.
                CLEAR: GTD_KC,LAST_VALUE.
              ENDIF.
          ENDAT.
        ENDAT.
      ENDAT.
    ENDLOOP.
这个出来结果是有点问题的。 这个还要进一步处理,否则没办法根据MATNR WERKS 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
30#
 楼主| 发表于 2009-5-22 15:13 | 只看该作者
我想能在select 的时候就把这个逻辑实现了应该速度最快把..

使用道具 举报

回复

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

本版积分规则 发表回复

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