2017-10-19 56 views
0

我有一個解決方案,其中包括我想省略的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

回答

2

爲什麼不使用一個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

5

也許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