2020-09-01 06:26发布
加入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)
好的,我确实尝试过使用像下面这样的函数方法来编写动态组,这可能是容易出错的原因,因为我只考虑类c的结构:
CLASS zc1_dynamic_grp DEFINITION。 公共部分。 类别方法single_comp导入comp_name类型char30 结构类型数据 返回值(返回)TYPE字符串。 CLASS-METHODS serial_comp IMPORTING comp_names TYPE字符串 结构类型数据 返回值(返回)TYPE字符串。 CLASS-DATA r_type_struct类型参考cl_abap_structdescr。 ENDCLASS。 类别zc1_dynamic_grp实施。 方法single_comp。 r_type_struct?= cl_abap_typedescr => describe_by_data(struct)。 检查r_type_struct-> type_kind = cl_abap_typedescr => typekind_struct1" 或r_type_struct-> type_kind = cl_abap_typedescr => typekind_struct2。 "深 检查line_exists(r_type_struct-> components [name = comp_name])。 将结构体的line_index(r_type_struct-> components [name = comp_name])分配给FIELD-SYMBOL()。 return = 。 * r_type_elem?= cl_abap_typedescr => describe_by_data()。 * CREATE DATA返回类型句柄r_type_elem。 * ASSIGN return-> * TO FIELD-SYMBOL()。 * = 。 终结法。 方法serial_comp。 r_type_struct?= cl_abap_typedescr => describe_by_data(struct)。 检查r_type_struct-> type_kind = cl_abap_typedescr => typekind_struct1" 或r_type_struct-> type_kind = cl_abap_typedescr => typekind_struct2。 "深 做。 尝试。 DATA(comp_name)= segment(val = comp_names 索引= sy-index sep =`,`)。 检查line_exists(r_type_struct-> components [name = comp_name])。 将结构体的line_index(r_type_struct-> components [name = comp_name])分配给FIELD-SYMBOL()。 return = | {return} {} |。 捕捉cx_sy_strg_par_val。 出口。 ENDTRY。 ENDDO。 终结法。 ENDCLASS。 类型: ty_mara的开始, matnr TYPE matnr, mtart TYPE mtart, mbrsh TYPE mbrsh, matkl TYPE matkl, 结束于ty_mara。 数据: lt_mara ty_mara的类型标准表, lw_mara TYPE ty_mara。 数据: r_type_struct类型参考cl_abap_structdescr, r_type_table类型参考cl_abap_tabledescr, lt_comp_table TYPE cl_abap_structdescr => component_table, lw_comp_table TYPE abap_componentdescr。 数据: r_data_tab TYPE REF TO数据, r_data_str TYPE REF TO数据。 字段符号: TYPE ANY TABLE, TYPE任意。 选择开始。 lt_mara = VALUE#( (matnr = 1000 mtart ='FERT'mbrsh ='M'matkl ='SD01') (matnr = 1000 mtart ='FERT'mbrsh ='M'matkl ='SD01') (matnr = 1001 mtart ='AAAA'mbrsh ='M'matkl ='SD01') (matnr = 1001 mtart ='AAAA'mbrsh ='A'matkl ='SD01') (matnr = 1002 mtart ='BBBB'mbrsh ='A'matkl ='SD01') (matnr = 1003 mtart ='BBBB'mbrsh ='A'matkl ='SD01'))。 lw_comp_table-name ='MATNR'。 lw_comp_table-type?= cl_abap_datadescr => describe_by_name('MATNR')。 APPEND lw_comp_table至lt_comp_table。 lw_comp_table-name ='MTART'。 lw_comp_table-type?= cl_abap_datadescr => describe_by_name('MTART')。 APPEND lw_comp_table至lt_comp_table。 lw_comp_table-name ='MBRSH'。 lw_comp_table-type?= cl_abap_datadescr => describe_by_name('MBRSH')。 APPEND lw_comp_table至lt_comp_table。 lw_comp_table-name ='MATKL'。 lw_comp_table-type?= cl_abap_datadescr => describe_by_name('MATKL')。 APPEND lw_comp_table至lt_comp_table。 尝试。 r_type_struct = cl_abap_structdescr =>创建( p_components = lt_comp_table)。 捕捉cx_sy_table_creation。 ENDTRY。 尝试。 r_type_table = cl_abap_tabledescr => create( p_line_type = r_type_struct)。 捕捉cx_sy_table_creation。 ENDTRY。 创建数据: r_data_tab TYPE HANDLE r_type_table, r_data_str类型句柄r_type_struct。 ASSIGN:r_data_tab-> * TO , r_data_str-> *至。 = lt_mara。 在分配 GROUP BY zc1_dynamic_grp => single_comp(comp_name ='MATNR'struct = )中循环 升序分配字段符号()。 cl_demo_output => write(| Group-{} |)。 结局。 在分配 GROUP BY zc1_dynamic_grp => serial_comp(comp_names = | MATNR,MBRSH | struct = )中循环 升序分配字段符号()。 cl_demo_output => write(| Group-{} |)。 结局。 cl_demo_output => display()。
请使用CODE按钮设置代码格式。
嗨, Kenneth Murray
我认为您不能将GROUP BY用于通用表类型。 在将它用于GROUP BY之前,必须先定义表结构。
这是我的理解。 让我们看看是否有可能。 等待更多的专家回应。
致谢
GK
我认为您可以尝试使用函数方法,就像我在主题。
嗨,ABAP小组,看来这工作正常!
SAP_ABA 75A 0013 SAPK-75A13INSAPABA交叉应用程序组件非常强大! 挑战使用参考变量学习语法!
FIELD-SYMBOLS 类型标准表。 FIELD-SYMBOLS TYPE任意。 ASSIGN ir_data-> * TO 。 创建数据<_data>之类的lo_data类。 ASSIGN lo_data-> *至。 循环 INTO GROUP BY(类型=' -kurst' exdate =' -gdatu' srccur =' -fcurr' tgtcur =' -tcurr')对数据(维度组)的引用升序。
好! 这是一个非常有趣的代码,我以前从未见过! :)
使用此编码,可以揭示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个标签!
好的,我确实尝试过使用像下面这样的函数方法来编写动态组,这可能是容易出错的原因,因为我只考虑类c的结构:
请使用CODE按钮设置代码格式。
嗨, Kenneth Murray
我认为您不能将GROUP BY用于通用表类型。 在将它用于GROUP BY之前,必须先定义表结构。
这是我的理解。 让我们看看是否有可能。 等待更多的专家回应。
致谢
GK
我认为您可以尝试使用函数方法,就像我在主题。
嗨,ABAP小组,
看来这工作正常!
SAP_ABA 75A 0013 SAPK-75A13INSAPABA交叉应用程序组件
非常强大! 挑战使用参考变量学习语法!
好! 这是一个非常有趣的代码,我以前从未见过! :)
使用此编码,可以揭示LOOP GROUP BY的内核逻辑:内部表上存在第一个内核循环,在该循环中针对每一行调用该方法,其结果分组为 临时表,然后在该临时表上发生第二个内核循环,并执行LOOP内部的代码。
如果内部表太大,我担心性能。 可以通过保存先前的结果(请注意ASSIGN COMPONENT 1比ASSIGN COMPONENT'MATNR'快一倍)来优化算法。
另一种性能更高的解决方案是不使用LOOP GROUP BY,而是这样做 一种更苛刻的方法:使用RTTC创建仅包含所需组件的临时HASHED表, = CORRESPONDING#(itab DISCARDING DUPLICATES),然后在中循环:
一周热门 更多>