具有子字符串访问权限的 AT NEW?
AT NEW with substring access?
我有一个解决方案,其中包含一个我想保留的 LOOP。所以我想知道,你是否知道更好的方法来做到这一点。
我的目标是循环遍历按字母顺序排序的内部标准 table。这个 table 有两列:一个 name 和一个 table,我们称它为 subtable。对于每个子 table 我想做一些事情(在我的 xml 框架中打开一个 xml 页面)。
现在,每个子table都有一个对应的名字。我想根据这个名字的第一个字母对子table进行分组(意思是,将这些子table的页面放在一个主页面上-每个字符一个主页面-)。通过分组 subtables 我的意思是,在遍历 table 时,我想根据其名称的第一个字母以不同方式处理 subtables。
到目前为止,我想出了以下解决方案:
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 name+0(1)
而不是
AT NEW first_letter
,但不允许偏移和长度。
你看,我必须包含第一个循环以向我的 table 添加另一列,这是不必要的,因为没有获得新信息。
此外,我对其他解决方案很感兴趣,因为后来由于各种原因我在框架方面遇到了麻烦。一种不同的方法也可能对我有帮助。
我很高兴听到对此的任何想法!我在 Whosebug 上找不到与此相关的任何内容,但我可能没有使用最佳搜索词 ;)
在这种情况下,LOOP
上的 GROUP BY
可能会对您有所帮助:
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.
我有一个解决方案,其中包含一个我想保留的 LOOP。所以我想知道,你是否知道更好的方法来做到这一点。
我的目标是循环遍历按字母顺序排序的内部标准 table。这个 table 有两列:一个 name 和一个 table,我们称它为 subtable。对于每个子 table 我想做一些事情(在我的 xml 框架中打开一个 xml 页面)。
现在,每个子table都有一个对应的名字。我想根据这个名字的第一个字母对子table进行分组(意思是,将这些子table的页面放在一个主页面上-每个字符一个主页面-)。通过分组 subtables 我的意思是,在遍历 table 时,我想根据其名称的第一个字母以不同方式处理 subtables。
到目前为止,我想出了以下解决方案:
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 name+0(1)
而不是
AT NEW first_letter
,但不允许偏移和长度。
你看,我必须包含第一个循环以向我的 table 添加另一列,这是不必要的,因为没有获得新信息。
此外,我对其他解决方案很感兴趣,因为后来由于各种原因我在框架方面遇到了麻烦。一种不同的方法也可能对我有帮助。
我很高兴听到对此的任何想法!我在 Whosebug 上找不到与此相关的任何内容,但我可能没有使用最佳搜索词 ;)
在这种情况下,LOOP
上的 GROUP BY
可能会对您有所帮助:
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.