使用参考字段符号挑战在分组依据处循环

2020-09-01 06:26发布

         点击此处--->   EasySAP.com群内免费提供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)

         点击此处--->   EasySAP.com群内免费提供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)

付费偷看设置
发送
13条回答
吹牛啤
1楼-- · 2020-09-01 07:12

好的,我确实尝试过使用像下面这样的函数方法来编写动态组,这可能是容易出错的原因,因为我只考虑类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()。
 
何必丶何苦呢
2楼-- · 2020-09-01 07:03

请使用CODE按钮设置代码格式。

南山jay
3楼-- · 2020-09-01 07:02

嗨, Kenneth Murray

我认为您不能将GROUP BY用于通用表类型。 在将它用于GROUP BY之前,必须先定义表结构。

这是我的理解。 让我们看看是否有可能。 等待更多的专家回应。

致谢

GK

南山jay
4楼-- · 2020-09-01 07:17

我认为您可以尝试使用函数方法,就像我在主题

微wx笑
5楼-- · 2020-09-01 07:12

嗨,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')对数据(维度组)的引用升序。
梦想连接
6楼-- · 2020-09-01 07:20

好! 这是一个非常有趣的代码,我以前从未见过! :)

使用此编码,可以揭示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()。

一周热门 更多>