Loops 在新的子字符串访问?

Loops 在新的子字符串访问?,loops,substring,abap,Loops,Substring,Abap,我有一个解决方案,包括一个循环,我想备用。所以我想知道,你是否知道更好的方法 我的目标是遍历一个按字母顺序排序的内部标准表。这个表有两列:一个名称和一个表,我们称之为子表。对于我想做的每一个子表,在我的xml框架中打开一个xml页面 现在,每个子表都有一个对应的名称。我想根据这个名字的第一个字母对子表进行分组,意思是,把这些子表的页面放在一个主页上-每个字符对应一个主页-。通过对子表进行分组,我的意思是,在表中循环时,我希望根据子表名称的第一个字母对其进行不同的处理 到目前为止,我提出了以下解决

我有一个解决方案,包括一个循环,我想备用。所以我想知道,你是否知道更好的方法

我的目标是遍历一个按字母顺序排序的内部标准表。这个表有两列:一个名称和一个表,我们称之为子表。对于我想做的每一个子表,在我的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.
而不是

AT NEW first_letter
,但不允许偏移和长度

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

此外,我还对其他解决方案感兴趣,因为后来由于不同的原因,我在使用该框架时遇到了麻烦。另一种方法也可能对我有所帮助

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

在这种情况下,通过在循环中添加组可以帮助您:

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.
在这种情况下,通过循环中的加法分组可能会对您有所帮助:

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.

为什么不使用IF比较

data: lf_prev_first_letter(1) type c.

loop at lt_table assigning <ls_table>.
    if <ls_table>-name(1) <> lf_prev_first_letter. "=AT NEW
       "do something
       lf_prev_first_letter = <ls_table>-name(1).
    endif.
endloop.

为什么不使用IF比较

data: lf_prev_first_letter(1) type c.

loop at lt_table assigning <ls_table>.
    if <ls_table>-name(1) <> lf_prev_first_letter. "=AT NEW
       "do something
       lf_prev_first_letter = <ls_table>-name(1).
    endif.
endloop.

您使用哪个NetWeaver版本?我使用SAP Logon 750。SAP登录版本不相关,我们需要SAP\u BASIS/SAP\u ABA版本系统->statusComponent版本是SAP SOLUTION MANAGER 7.1。您使用哪个NetWeaver版本?我使用SAP Logon 750。SAP登录版本不相关,我们需要SAP基础/SAP ABA版本系统->状态组件版本是SAP SOLUTION MANAGER 7.1。谢谢。然而,我认为“分组依据”只能与“选择”一起用于数据库。但我对内部表格感兴趣。我错了吗?它的优点是不必声明其他类型。然而,这是另一个循环。@Ela GROUP BY也是循环的有效语法,它的工作原理与我在回答中提出的相同。至少在NetWeaver>7.4通道上。然而,我认为“分组依据”只能与“选择”一起用于数据库。但我对内部表格感兴趣。我错了吗?它的优点是不必声明其他类型。然而,这是另一个循环。@Ela GROUP BY也是循环的有效语法,它的工作原理与我在回答中提出的相同。至少在NetWeaver>7.4上,我不知道为什么不能!我不知道为什么不!