2017-10-19 4 views
0

J'ai une solution qui comprend une boucle que je voudrais épargner. Je me demande donc si vous connaissez une meilleure façon de le faire.Existe-t-il une alternative à 'at new' dans ABAP?

Mon but est de faire défiler une table standard interne classée par ordre alphabétique. Cette table a deux colonnes: un nom et une table, appelons-la sous-table. Pour chaque sous-table, je veux faire des choses (ouvrir une page xml dans mon environnement xml).

Maintenant, chaque sous-table a un nom correspondant. Je veux regrouper les sous-tables en fonction de la première lettre de ce nom (ce qui signifie, mettre les pages de ces sous-tables sur une page principale -une page principale pour chaque caractère-). Par regroupement de sous-tables, je veux dire, tout en bouclant la table, je veux traiter les sous-tables différemment selon la première lettre de leur nom.

Jusqu'à présent, je suis venu avec la solution suivante:

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. 

Je voudrais pouvoir utiliser

AT NEW name+0(1) 

au lieu de

AT NEW first_letter 

, mais les compensations et les longueurs ne sont pas autorisés .

Vous voyez, je dois inclure cette première boucle pour ajouter une autre colonne à ma table qui est un peu inutile car il n'y a pas de nouvelles informations gagnées.

En outre, je suis intéressé par d'autres solutions parce que j'ai des problèmes avec le cadre plus tard pour différentes raisons. Une façon différente de faire cela pourrait m'aider aussi.

Je suis heureux d'avoir des commentaires à ce sujet! Je ne pouvais pas trouver tout ce qui concerne ce ici sur stackoverflow, mais je pourrais avoir utilisé pas des termes de recherche optimales;)

+0

Quelle version de NetWeaver utilisez-vous? –

+0

J'utilise SAP Logon 750. – Ela

+1

La version SAP Logon n'est pas pertinente, nous avons besoin de la version SAP_BASIS/SAP_ABA (système -> état) – vwegert

Répondre

2

pourquoi ne pas utiliser une comparaison 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

Je ne sais pas pourquoi pas! – Ela

5

Peut-être l'ajout GROUP BY sur LOOP pourrait vous aider dans ce cas:

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

Merci. Pourtant, je pense que le «groupe par» fonctionne uniquement avec «sélectionner» pour les bases de données. Mais je suis intéressé par une table interne. Ai-je tort? Il a l'avantage de ne pas avoir à déclarer un type supplémentaire. Mais est une autre boucle néanmoins. – Ela

+0

@Ela 'GROUP BY' est aussi une syntaxe valide sur' LOOP' et fonctionne comme je l'ai proposé dans ma réponse. Au moins sur NetWeaver> 7.4 –

+0

Oui, vous avez raison! – Ela