ABAP中有'at new'的替代方案吗?

Ela*_*Ela 0 string abap loops

我有一个包含LOOP的解决方案,我想备用.所以我想知道,你是否知道更好的方法.

我的目标是循环一个按字母顺序排列的内部标准表.这个表有两列:一个名字和一个表,我们称之为子表.对于每个子表我想做一些事情(在我的xml框架中打开一个xml页面).

现在,每个子表都有一个相应的名称.我想根据这个名字的第一个字母对子表进行分组(意思是,将这些子表的页面放在一个主页上 - 每个字符的主页面上).通过对子表进行分组,我的意思是,在循环遍历表时,我希望根据名称的第一个字母对子表进行不同的处理.

到目前为止,我想出了以下解决方案:

TYPES: BEGIN OF l_str_tables_extra,
        first_letter(1) TYPE c,
        name TYPE string,
        subtable TYPE REF TO if_table,
       END OF l_str_tables_extra.

DATA: ls_tables_extra TYPE l_str_tables_extra.
DATA: lt_tables_extra TYPE TABLE OF l_str_tables_extra.

FIELD-SYMBOLS: <ls_tables> TYPE str_table."Like LINE OF lt_tables.
FIELD-SYMBOLS: <ls_tables_extra> TYPE l_str_tables_extra.


*"--- PROCESSING LOGIC ------------------------------------------------
SORT lt_tables ASCENDING BY name.

"Add first letter column in order to use 'at new' later on
"This is the loop I would like to spare
LOOP AT lt_tables ASSIGNING <ls_tables>.
  ls_tables_extra-first_letter = <ls_tables>-name+0(1). "new column
  ls_tables_extra-name = <ls_tables>-name.
  ls_tables_extra-subtable = <ls_tables>-subtable.
 APPEND ls_tables_extra TO lt_tables_extra.
ENDLOOP.

LOOP AT lt_tables_extra ASSIGNING <ls_tables_extra>.
 AT NEW first_letter.
  "Do something with subtables with same first_letter.
 ENDAT.
ENDLOOP.
Run Code Online (Sandbox Code Playgroud)

我希望我能用

 AT NEW name+0(1)
Run Code Online (Sandbox Code Playgroud)

代替

AT NEW first_letter
Run Code Online (Sandbox Code Playgroud)

,但不允许偏移和长度.

你看,我必须包含第一个循环,以便在我的表中添加另一个列,这是不必要的,因为没有获得新的信息.

另外,我对其他解决方案很感兴趣,因为我后来因为不同的原因而遇到了框架问题.另外一种方法可以帮助我.

我很高兴听到有关此事的任何想法!我在stackoverflow上找不到与此相关的任何内容,但我可能使用了非最佳搜索词;)

小智 6

在这种情况下,也许GROUP BY增加LOOP可以帮助你:

LOOP AT i_tables
  INTO DATA(wa_line)
  " group lines by condition
  GROUP BY (
    " substring() because normal offset would be evaluated immediately
    name = substring( val = wa_line-name len = 1 )
  ) INTO DATA(o_group).

  " begin of loop over all tables starting with o_group-name(1)

  " loop over group object which contains 
  LOOP AT GROUP o_group
    ASSIGNING FIELD-SYMBOL(<fs_table>).
      " <fs_table> contains your table
  ENDLOOP.

  " end of loop

ENDLOOP.
Run Code Online (Sandbox Code Playgroud)