在ABAP中是否有替代'at new'的?

问题描述:

我有一个解决方案,其中包括我想省略的LOOP。所以我想知道,你是否知道更好的方法来做到这一点。在ABAP中是否有替代'at new'的?

我的目标是通过内部按字母顺序排序的标准表进行循环。这个表有两列:一个名字和一个表格,我们称之为子表格。对于每个子表我想做一些东西(在我的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 name+0(1) 

,而不是

AT NEW first_letter 

,但偏移和长度不得。

你看,我必须包含这第一个循环来添加另一列到我的表中,这是不必要的,因为没有新的信息。

另外,我对其他解决方案很感兴趣,因为后来出于各种原因遇到了框架问题。不同的方式来做到这一点也可以帮助我。

我很高兴听到有关此任何想法!我无法找到与此相关的在这里计算器什么,但我可能没有使用最佳的搜索字词;)

+0

您正在使用哪种NetWeaver版本? – 2017-10-19 08:47:47

+0

我使用SAP Logon 750. – Ela

+1

SAP登录版本无关紧要,我们需要SAP_BASIS/SAP_ABA版本(系统 - >状态) – vwegert

为什么不使用一个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. 
+0

我不知道为什么不! – Ela

也许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. 
+1

谢谢。然而,我认为'group by'只能与'select'一起用于数据库。但我对内部表感兴趣。我错了吗? 它的优点是不必声明一个额外的类型。但是,又是一个循环。 – Ela

+0

@Ela'GROUP BY'在'LOOP'上也是有效的语法,并按我在我的回答中提出的方式工作。至少在NetWeaver上> 7.4 – 2017-10-19 12:28:52

+0

是的,你是对的! – Ela