一次性删除SAP Dynamic内部表行的任何选项,而不是循环/索引

2020-09-04 03:04发布

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

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


我有一个下面的代码,它需要超过1200万毫秒的时间来执行,

这是在用户命令处触发的,例如,用户选择第一级输出的所有记录(约30万条记录)以获取下一级的向下钻取报告,

A。 在按用户选择所有行的过程中,动态内部表的记录几乎少于300k,其中字段" BOX"标记为用户在第一个输出中选择的那些行的" X"

B。 然后程序选择动态内部表()与另一个标准内部表(GT_BSIS)进行比较(在动态内部表中标记为" X")的记录,该标准内部表的记录略多于300K,正在考虑(检查)另一个字段值(清除) 两个表的键值都应该相同,可以为1:N)

C。 然后将这些通用记录插入到第三标准内部表(GT_L2_DISP)中以进行进一步处理/显示,

分配上的环。 结构的
在gt_bsis上循环,其中clearing_key =
移动gt_bsisTO到gt_l2_disp。 br> ENDLOOP。

我希望我们有一个将动态内部表转换为标准内部表的简单解决方案,

那么提议的解决方案应该是:

1。 将动态内部表转换为标准内部表,例如OI_STD_TAB,

2。 从OI_STD_TAB删除记录,其中字段'BOX'<>'X',

3。 比较OI_STD_TAB的Clearing_key值,从GT_BSIS中删除记录,

4。 将余额记录从GT_BSIS(删除后)移至GT_L2_DISP,

感谢您的建议,

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

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


我有一个下面的代码,它需要超过1200万毫秒的时间来执行,

这是在用户命令处触发的,例如,用户选择第一级输出的所有记录(约30万条记录)以获取下一级的向下钻取报告,

A。 在按用户选择所有行的过程中,动态内部表的记录几乎少于300k,其中字段" BOX"标记为用户在第一个输出中选择的那些行的" X"

B。 然后程序选择动态内部表()与另一个标准内部表(GT_BSIS)进行比较(在动态内部表中标记为" X")的记录,该标准内部表的记录略多于300K,正在考虑(检查)另一个字段值(清除) 两个表的键值都应该相同,可以为1:N)

C。 然后将这些通用记录插入到第三标准内部表(GT_L2_DISP)中以进行进一步处理/显示,

分配上的环。 结构的
在gt_bsis上循环,其中clearing_key =
移动gt_bsisTO到gt_l2_disp。 br> ENDLOOP。

我希望我们有一个将动态内部表转换为标准内部表的简单解决方案,

那么提议的解决方案应该是:

1。 将动态内部表转换为标准内部表,例如OI_STD_TAB,

2。 从OI_STD_TAB删除记录,其中字段'BOX'<>'X',

3。 比较OI_STD_TAB的Clearing_key值,从GT_BSIS中删除记录,

4。 将余额记录从GT_BSIS(删除后)移至GT_L2_DISP,

感谢您的建议,

付费偷看设置
发送
7条回答
能不能别闹
1楼-- · 2020-09-04 03:56

我不知道您的ABAP版本,但是LOOP AT dynamicitab WHERE(动态条件)应该可以工作(从7.02版开始):

字段符号类型标准表。
 ...
 在分配字段符号()的地方(`BOX ='X'`)。

此外,您可以通过RTTC使用以下命令对内部表的动态创建进行性能测试。 基于BOX组件的非唯一索引。 内部表的填充将花费一些时间,但是循环会更快。

NB:DELETE不允许动态条件(至少为7.53)。

关于GT_BSIS ,请确保您具有一个以CLEARING_KEY作为第一个组件的索引。

编辑:我的答案使用的是7.40中的内联声明(FIELD-SYMBOL(...)),因为此语法可避免分散注意力,并确保焦点 在其他方面,重要的是。 您可以通过使用ABAP语句FIELD-SYMBOLS声明字段符号来手动将其重写为旧语法(例如,在字段符号上方可以声明FIELD-SYMBOLS TYPE ANY)。

Doze时光
2楼-- · 2020-09-04 04:04

Hello Quynh,谢谢您的答复,

根据您的查询:"如何在第一个屏幕中将X标记为? =>是用户从ALV输出中选择行,

能否请您提供一些有关"

如果您在第一个屏幕上使用ALV,我认为为GT_BSIS创建一个标记列并在on_changed_data上将其标记为X甚至更快,然后再将其删除则更快。"

当学会了学习
3楼-- · 2020-09-04 03:50

OK这样 用户可以从ALV中选择记录(我想您正在使用CL_GUI_ALV_GRID),然后可以处理事件DATA_CHANGED。

首先向表GT_BSIS中再添加一个列(例如MARK)

然后在内部处理方法中,为每个选定的记录编写逻辑以确定GT_BSIS的MA​​RK列的值。您可以检查演示:BCALV_GRID_EDIT以了解更多如何处理DATA_CHANGED事件。

在第二个屏幕上,删除数据 来自GT_BSIS,MARK =X。完成。

太Q了
4楼-- · 2020-09-04 04:01

是的,桑德拉,大约3个小时左右,

ZJXianG
5楼-- · 2020-09-04 04:01

非常感谢桑德拉,让 我可以尝试使用您有价值的输入,

当学会了学习
6楼-- · 2020-09-04 03:46

好,所以是ABAP 7.31。因此,您可以使用动态排序的内部表,也可以使用带有辅助排序键的标准DIT,如我所建议的那样

最初,您使用CL_ALV_TABLE_CREATE创建DIT() h是标准的,没有辅助密钥。 正如我所建议的,您可以做的就是通过使用以下代码来获取的行类型,并使用右键单击重新创建一个新表:

"  CL_ALV_TABLE_CREATE以获取dyn_itab并将其取消引用到。

 DATA(lr_table_descr)= CAST cl_abap_tabledescr(cl_abap_typedescr => describe_by_data())。
 DATA(lr_structdescr)= lr_table_descr-> get_table_line_type()。

 "在这里,您使用RTTC根据我最初解释的lr_structdescr来创建lr_table_descr,并带有一个密钥。

 现在,您可以使用密钥(lr_table_descr)将dyn_itab/重新创建为DIT,如下所示:
 创建数据dyn_itab类型句柄lr_table_descr。
 ASSIGN dyn_itab-> *至。
 ... 

一周热门 更多>