如何聚合内部表而没有循环并收集?

2020-08-19 02:01发布

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


嗨,

在启动Loop并实现业务逻辑之前,我想用相同的字符聚合内部表中的行。

我尝试使用"循环收集"将行从Itab1移到Itab2,这可以很好地工作,但是会花费太多时间。

我的要求是在我的逻辑在主循环中启动之前准备好内部表,以便容易汇总所有值。 我们有功能模块吗?

请提供任何可能的解决方案。

谢谢

(11.4 kB)

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


嗨,

在启动Loop并实现业务逻辑之前,我想用相同的字符聚合内部表中的行。

我尝试使用"循环收集"将行从Itab1移到Itab2,这可以很好地工作,但是会花费太多时间。

我的要求是在我的逻辑在主循环中启动之前准备好内部表,以便容易汇总所有值。 我们有功能模块吗?

请提供任何可能的解决方案。

谢谢

(11.4 kB)
付费偷看设置
发送
14条回答
粗暴的香蕉
1楼 · 2020-08-19 02:41.采纳回答

>>我尝试使用"循环收集"将行从Itab1移到Itab2,这可以很好地工作,但是花费太多时间。

您可以显示编码和数据定义以及定义" 很多时间"是什么意思? 您有多少行数据,聚合后有多少行,这需要多长时间,什么时间可以接受?

因为您不清楚需要做什么,所以我假设以下内容:

  • 您要么从数据库表中获取数据(请参阅1.中带有选项a。和b。),要么从其他输入中将数据获取到内部表中(请参见2。)
  • 您目前拥有 在内部表1中,两个"非唯一键字段"(例如,多个" 00001830"和" 50000844"条目)和另一个十进制值(例如,50,232.00)
  • 在内部表2中,您需要 键字段是唯一的(例如," 00001830"和" 50000844"只有一个条目),并且您希望共享相同键字段的所有值字段的总和

1。 如果可能,让数据库已经进行聚合。 数据库系统非常了解性能,因此,要传输到SAP的数据也更少。

"选项a。
 SELECT key1 key2 sum(value)
   从dbtable
   INTO TABLE sumtable"必须已经使用字段key1,key2,value进行定义
   在哪里(子句)
   GROUP BY key1 key2。


 "选项b。
 选择key1,key2,sum(value)作为sumvalue
   从dbtable
   到表@DATA(sumtable)
   在哪里(子句)
   GROUP BY key1,key2。
 

2。 如果由于某种原因无法进行数据库聚合,则需要使用基于SORTED或HASHED表的COLLECT语句,该表还具有两个键字段作为键。
ABAP文档对STANDARD表的说明如下:

>>规则
>>不要用行集合填充标准表
>>仅使用语句 收集具有唯一键的哈希表或排序表。
>>不要再将其用于标准表。

对于您的问题,您可以按以下方式进行操作:

"结构yourstructure包含字段key1,key2,value
 您的结构的数据不可分割的类型表。
 带有唯一键key1 key2的结构的数据可汇总类型哈希表。
 字段符号键入您的结构。

 环在不可分配的处。
  将收集到可汇总表中。
 ENDLOOP。

这是ABAP文档所说的方法:

>> COLLECT仅在要创建真正唯一或压缩的内部表时才使用。
>>在这种情况下,COLLECT可以极大地提高性能。
>>如果不需要唯一性或压缩性,或者由于其他原因保证了唯一性,则应改用INSERT语句。

希望有所帮助。

# p#

Quynh Doan Manh 当然,断言"最有效的方法是在数据库级别执行... "仅当数据来自数据库时才是正确的,我的意思是,如果数据来自其他媒体,请不要将其写入数据库以进行聚合;-)

,我看不到 为什么在没有看到原始代码的情况下,LOOP AT GROUP BY比COLLECT更快。 COLLECT非常快。 这取决于整个算法。

樱桃小丸子0093
2楼-- · 2020-08-19 02:36

这是并行游标编码! 爱它。
但实际上与OP问题关系不大,因为他需要从table1中创建table2。 并行游标浏览两个填充的表。

一周热门 更多>