设为首页 收藏本站
查看: 1364|回复: 0

[经验分享] SAP ABAP将大数据量排序后输入到内表

[复制链接]

尚未签到

发表于 2015-9-21 09:22:15 | 显示全部楼层 |阅读模式
  要向内表读入3百50万条数据,如果一次读入就会产生运行错误,错误提示为,没有内存对于扩展
内表。 我考虑使用SELECT...INTO TABLE...PACKAGE SIZE 和ENDSELECT来解决这个问题,每次比
如只让10000条数据读入。第二次再让10000条数据读入等等。 现在我有个问题,对于3百50万 条
数据最后输出是应该有顺序的。 但是每次SELECT和ENDSELECT之中只能对10000条数据进行排序,
第二次循环又有10000条新的,并且代替了老的10000,这样导致了只能对内表的10000条数据进行
排序。
You might do your sorting upon the database side.
Here are my two "forms" for your reference. If they don't work for you, mind letting
me take a look at your code here?
*&---------------------------------------------------------------------*
*&      Form  implicit_cursor
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM implicit_cursor.
DATA lt_billing TYPE TABLE OF zbilling.
SELECT * FROM zbilling INTO TABLE lt_billing
   PACKAGE SIZE pk_size
     WHERE vbeln   IN vbeln
       AND aubel   IN aubel
       AND erfdate IN erfdate
       AND fkdat   IN fkdat
      ORDER BY aubel aupos augrp erfdate DESCENDING erftime DESCENDING.
   PERFORM process_data TABLES lt_billing.
ENDSELECT.
ENDFORM.                    "implicit_cursor
*&---------------------------------------------------------------------*
*&      Form  explicit_cursor
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM explicit_cursor.
DATA a_cursor TYPE cursor.
DATA lt_billing TYPE TABLE OF zbilling.
OPEN CURSOR a_cursor FOR
   SELECT * FROM zbilling
     WHERE vbeln   IN vbeln
       AND aubel   IN aubel
       AND erfdate IN erfdate
       AND fkdat   IN fkdat
       ORDER BY aubel aupos augrp erfdate DESCENDING erftime DESCENDING.
CHECK sy-subrc = 0.
DO.
   FETCH NEXT CURSOR a_cursor INTO TABLE lt_billing
     PACKAGE SIZE pk_size.
   IF sy-subrc <> 0.
     EXIT.  " done Fetch
   ENDIF.
   PERFORM process_data TABLES lt_billing.
ENDDO.
CLOSE CURSOR a_cursor.
ENDFORM.                    "explicit_cursor

谢谢你的回复。请看我的部分代码:
loop at g_t_grid into wa_g_t_grid.
   s_grid-y = wa_g_t_grid-y.
   s_grid-x = wa_g_t_grid-x.
   s_grid-data = wa_g_t_grid-data.
   if s_grid-data(1) = m1.                   "删除冒号
   shift s_grid-data.
   endif.
   INSERT INTO zubpgrid VALUES  s_grid.   "运行错误在这里,以前我是直接把3百50万
数据插入到内表,现在我想用一个数据库来代替.
endloop.
refresh g_t_grid.
CLEAR s_grid.
SELECT * FROM zubpgrid INTO TABLE ii_grid PACKAGE SIZE 10000."这里从数据库倒入到内
表,并且限制每次的数量.
SORT ii_grid BY y.
LOOP AT ii_grid.
    at new y.                         "行号
     refresh i_quellzeile.
   endat.                            "new y

   i_quellzeile-x    = ii_grid-x.
   i_quellzeile-data = ii_grid-data.
   append i_quellzeile.
   at end of y.
.....对属于同个行号的信息进行汇总.
ENDSELECT.
在这个案例中我觉得不需要cursor 和 fetch; 现在我需要整个内表都是有循序的,我想只要在
select后面加上order by y 就可以了.不只到是否正确.但是对于AT NEW y and AT END OF
y,应该在加入if语句,因为每次只要10000条数据进来,在下一次10000可能还有相同
Y 的信息.
请shaw1236帮我看看.谢谢.
==>在这个案例中我觉得不需要cursor 和 fetch; 现在我需要整个内表都是有循序的,我想只要
在select后面加上order by y 就可以了.不只到是否正确.
[Shaw1236] Yes. I think so. No explicit cursor is need.
I am not sure that you are able to loop table "ii_grid" by using "at new y" and "at
end of y" due to the package restriction. Can you simply use "on change of ii_grid-
y" after sorting(order by) data from the database?
  
下面是引用shaw1236于2008-4-7 19:20发表的回复::
==>在这个案例中我觉得不需要cursor 和 fetch; 现在我需要整个内表都是有循序的,我想只要
在select后面加上order by y 就可以了.不只到是否正确.
[Shaw1236] Yes. I think so. No explicit cursor is need.
I am not sure that you are able to loop table "ii_grid" by using "at new y" and "at
.......

What's the length of each row? I think you will be fine. Probably you need check the
table technical setting and monitor the table space.

Hi,
each row consists of x(int4 10), y( int4 10) and data(Char 73). I have set the
information about table technical Setting eg. Maximum data entries:
1,900,000 to 3,800,000
I am not sure if  an error for inserting in Databank table occurs?

3500000 * (10 + 10 + 73) is roughly 310MB.
I think you will be fine. Ensure the table buffer is turned off. Just curious why
you save so much data into a z-table.
Maximum data entries: 1,900,000 to 3,800,000 is only a threshold number, which won't
absolutely block the size growing.
  转自:http://11643599.blog.hexun.com/37289101_d.html

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-116541-1-1.html 上篇帖子: SAP SD订价条件技术分析 下篇帖子: SAP交货单过账自动生产采购订单、采购订单自动收货入库
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表