2020-09-01 06:26发布
点击此处---> 群内免费提供SAP练习系统(在群公告中)加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)是否可以对从动态表引用中取消引用... 显示全部
加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)
是否可以对从动态表引用中取消引用的表字段符号使用"组循环"?
FIELD-SYMBOLS 类型标准表。 FIELD-SYMBOLS 类型任意。
ASSIGN ir_data-> *至。创建数据lo_data类似于的行。 ASSIGN lo_data-> * TO 。
将LOOP AT 放入 GROUP BY (type = -kurst)。 (type =无效,因为没有 结构且没有组件库斯特(Kurst)
好! 这是一个非常有趣的代码,我以前从未见过! :)
使用此编码,可以揭示LOOP GROUP BY的内核逻辑:内部表上存在第一个内核循环,在该循环中针对每一行调用该方法,其结果分组为 临时表,然后在该临时表上发生第二个内核循环,并执行LOOP内部的代码。
如果内部表太大,我担心性能。 可以通过保存先前的结果(请注意ASSIGN COMPONENT 1比ASSIGN COMPONENT'MATNR'快一倍)来优化算法。
另一种性能更高的解决方案是不使用LOOP GROUP BY,而是这样做 一种更苛刻的方法:使用RTTC创建仅包含所需组件的临时HASHED表, = CORRESPONDING#(itab DISCARDING DUPLICATES),然后在中循环:
TYPES: 开始ty_sflight, carrid TYPE轻型-carrid, connid TYPE sflight-connid, ty_sflight结束。 数据: lt_sflight ty_sflight的类型标准表, r_type_table类型参考cl_abap_tabledescr, r_data_tab TYPE REF TO数据。 字段符号: TYPE ANY TABLE。 选择开始。 lt_sflight = VALUE#( (carrid ='AA'connid = 1) (carrid ='LH'connid = 1) (carrid ='AA'connid = 2) (carrid ='LH'connid = 3))。 r_type_table = cl_abap_tabledescr => create( p_line_type = cl_abap_structdescr =>创建( p_components = VALUE#( (name ='CARRID'type = CAST#(cl_abap_datadescr => describe_by_name('SFLIGHT-CARRID')))) (名称='CONNID'类型= CAST#(cl_abap_datadescr => describe_by_name('SFLIGHT-CONNID'))))))))。 创建数据r_data_tab类型句柄r_type_table。 ASSIGN r_data_tab-> * TO 。 = lt_sflight。 FIELD-SYMBOLS 类型哈希表。 r_type_table = cl_abap_tabledescr => create( p_line_type = cl_abap_structdescr =>创建( p_components = VALUE#( (名称='CARRID'类型= CAST#(cl_abap_datadescr => describe_by_name('SFLIGHT-CARRID'))))) p_table_kind = cl_abap_tabledescr => tablekind_hashed p_unique = abap_true p_key_kind = cl_abap_tabledescr => keydefkind_tableline)。 创建数据r_data_tab类型句柄r_type_table。 ASSIGN r_data_tab-> * TO 。 =对应的#( DISCARDING DUPLICATES)。 在处分配字段符号()。 将结构的组件1分配给FIELD-SYMBOL()。 cl_demo_output => write(| Group-{} |)。 结局。 cl_demo_output => display()。
最多设置5个标签!
好! 这是一个非常有趣的代码,我以前从未见过! :)
使用此编码,可以揭示LOOP GROUP BY的内核逻辑:内部表上存在第一个内核循环,在该循环中针对每一行调用该方法,其结果分组为 临时表,然后在该临时表上发生第二个内核循环,并执行LOOP内部的代码。
如果内部表太大,我担心性能。 可以通过保存先前的结果(请注意ASSIGN COMPONENT 1比ASSIGN COMPONENT'MATNR'快一倍)来优化算法。
另一种性能更高的解决方案是不使用LOOP GROUP BY,而是这样做 一种更苛刻的方法:使用RTTC创建仅包含所需组件的临时HASHED表, = CORRESPONDING#(itab DISCARDING DUPLICATES),然后在中循环:
一周热门 更多>