2020-08-19 02:01发布
加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)
嗨,
在启动Loop并实现业务逻辑之前,我想用相同的字符聚合内部表中的行。
我尝试使用"循环收集"将行从Itab1移到Itab2,这可以很好地工作,但是会花费太多时间。
我的要求是在我的逻辑在主循环中启动之前准备好内部表,以便容易汇总所有值。 我们有功能模块吗?
请提供任何可能的解决方案。
谢谢
>>我尝试使用"循环收集"将行从Itab1移到Itab2,这可以很好地工作,但是花费太多时间。
您可以显示编码和数据定义以及定义" 很多时间"是什么意思? 您有多少行数据,聚合后有多少行,这需要多长时间,什么时间可以接受?
因为您不清楚需要做什么,所以我假设以下内容:
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语句。
希望有所帮助。
Quynh Doan Manh 当然,断言"最有效的方法是在数据库级别执行... "仅当数据来自数据库时才是正确的,我的意思是,如果数据来自其他媒体,请不要将其写入数据库以进行聚合;-)
,我看不到 为什么在没有看到原始代码的情况下,LOOP AT GROUP BY比COLLECT更快。 COLLECT非常快。 这取决于整个算法。
hk ,请继续处理您的未解决问题。
您是否希望合并内部表或数据库结果? 大多数答案说明了如何执行SELECT,但是您谈到的是内部表。 我有点迷路。
如果是数据库:是否可以创建CDS视图? 合并数据库中的数据,您将获得更好的性能。
如果它是内部表,那么您具有非常老的R/2代码块:
my_index = 1。 循环itab1 ... 做。 读取itab2索引my_index。 如果sy-subrc ne 0。 出口。 万一。 如果itab1键> itab2键。 my_index = my_index + 1。 elseif itab1键等于itab2键。 "过程 elseif itab1键和itab2键。 出口。 万一。 恩多。 结束循环。
使用标准表, COLLECT 使用其自己的临时哈希表,除非使用另一条语句来初始化该表(编辑:例如APPEND,INSERT和最终MODIFY,它们然后会使该临时哈希表无效;仅在CLEAR之后才对其进行重新验证/REFRESH)。
也许OP代码仅共享部分代码(因为它看起来不完全是实际的代码,因为还有一个额外的ENDLOOP)。
编辑:无论如何,就像迈克尔一样 注意,SAP不建议将COLLECT与STANDARD内部表一起使用(至少7.31起)。 但是它仍然可以用于排序和哈希表。
嘿,香港
您尝试过吗?
按字段1升序排序SORT lt_tab
在lt_tab处循环进入ls_tab
在新字段1
总和
处使用。
ENDloop。
让我知道它是否有效
致谢
Vinita
SELECT ... ENDSELECT不应该使用 。
特别是因为OP似乎有大量数据。
规则1:一次全部获取
规则2:如果可能的话,让数据库已经对数据进行操作。 p>
您尝试过这个吗?
最多设置5个标签!
>>我尝试使用"循环收集"将行从Itab1移到Itab2,这可以很好地工作,但是花费太多时间。
您可以显示编码和数据定义以及定义" 很多时间"是什么意思? 您有多少行数据,聚合后有多少行,这需要多长时间,什么时间可以接受?
因为您不清楚需要做什么,所以我假设以下内容:
1。 如果可能,让数据库已经进行聚合。 数据库系统非常了解性能,因此,要传输到SAP的数据也更少。
2。 如果由于某种原因无法进行数据库聚合,则需要使用基于SORTED或HASHED表的COLLECT语句,该表还具有两个键字段作为键。
ABAP文档对STANDARD表的说明如下:
>>规则
>>不要用行集合填充标准表
>>仅使用语句 收集具有唯一键的哈希表或排序表。
>>不要再将其用于标准表。
对于您的问题,您可以按以下方式进行操作:
这是ABAP文档所说的方法:
>> COLLECT仅在要创建真正唯一或压缩的内部表时才使用。
>>在这种情况下,COLLECT可以极大地提高性能。
>>如果不需要唯一性或压缩性,或者由于其他原因保证了唯一性,则应改用INSERT语句。
希望有所帮助。
# p#Quynh Doan Manh 当然,断言"最有效的方法是在数据库级别执行... "仅当数据来自数据库时才是正确的,我的意思是,如果数据来自其他媒体,请不要将其写入数据库以进行聚合;-)
,我看不到 为什么在没有看到原始代码的情况下,LOOP AT GROUP BY比COLLECT更快。 COLLECT非常快。 这取决于整个算法。
hk ,请继续处理您的未解决问题。
a)为什么在您显示的代码中出现第三个ENDLOOP而没有开始的LOOP,所以如果您的代码编译了,您的代码片段中就会缺少代码,这会使社区更难检测到您遇到的性能问题 )您是否尝试对ITAB使用HASHED和SORTED表,因为强烈建议在使用COLLECT语句时使用此表: 。 Y_SOURCE_FIELDS初始大小为0的数据ITAB类型表,带有唯一键GL_ACCOUNT FISCPER。
您是否希望合并内部表或数据库结果? 大多数答案说明了如何执行SELECT,但是您谈到的是内部表。 我有点迷路。
如果是数据库:是否可以创建CDS视图? 合并数据库中的数据,您将获得更好的性能。
如果它是内部表,那么您具有非常老的R/2代码块:
使用标准表, COLLECT 使用其自己的临时哈希表,除非使用另一条语句来初始化该表(编辑:例如APPEND,INSERT和最终MODIFY,它们然后会使该临时哈希表无效;仅在CLEAR之后才对其进行重新验证/REFRESH)。
也许OP代码仅共享部分代码(因为它看起来不完全是实际的代码,因为还有一个额外的ENDLOOP)。
编辑:无论如何,就像迈克尔一样 注意,SAP不建议将COLLECT与STANDARD内部表一起使用(至少7.31起)。 但是它仍然可以用于排序和哈希表。
嘿,香港
您尝试过吗?
按字段1升序排序SORT lt_tab
在lt_tab处循环进入ls_tab
在新字段1
总和
处使用。
ENDloop。
让我知道它是否有效
致谢
Vinita
SELECT ... ENDSELECT不应该使用 。
特别是因为OP似乎有大量数据。
规则1:一次全部获取
规则2:如果可能的话,让数据库已经对数据进行操作。 p>
嘿,香港
您尝试过这个吗?
按字段1升序排序SORT lt_tab
在lt_tab处循环进入ls_tab
在新字段1
总和
处使用。
ENDloop。
让我知道它是否有效
致谢
Vinita
一周热门 更多>