1
votes

Obtenez des composants de la structure DDIC avec des inclusions

J'utilise cl_abap_structdescr->get_components pour obtenir une liste de champs dans une structure. Cela fonctionne bien lorsque je l'utilise sur des types de structure déclarés localement, mais lorsque je l'utilise sur des structures DDIC, cela ne me donne pas les résultats attendus.

Exemple reproductible:

TYPES: BEGIN OF gty_outtab,
  infty TYPE infty,
  uname TYPE uname,
  bdate TYPE datum,
  btime TYPE uzeit,
  pernr TYPE pernr_d,
  opera TYPE hr_opera,
  begda TYPE begda,
  endda TYPE endda,
END OF gty_outtab.

DATA: lr_infty_structdescr  TYPE REF TO cl_abap_structdescr,
      lr_outtab_structdescr TYPE REF TO cl_abap_structdescr,
      lt_outtab_components  TYPE STANDARD TABLE OF abap_componentdescr,
      lt_infty_components   TYPE STANDARD TABLE OF abap_componentdescr.

" works as expected
lr_outtab_structdescr ?= cl_abap_structdescr=>describe_by_name( 'GTY_OUTTAB' ).
lt_outtab_components = lr_outtab_structdescr->get_components( ).

" doesn't work as expected
lr_infty_structdescr ?= cl_abap_structdescr=>describe_by_name( 'P0008' ).
lt_infty_components = lr_infty_structdescr->get_components( ).

BREAK-POINT.

Résultats:

Ce n'est pas grave pour GTY_OUTTAB:

entrez la description de l'image ici

Il n'y a que deux champs pour P0008 bien qu'il contienne beaucoup plus de champs (voir ci-dessous):

entrez la description de l'image ici

J'ai déjà essayé d'utiliser cl_abap_typedescr place et j'ai recherché sur cl_abap_typedescr , mais chaque code que je trouve en ligne ressemble au mien?

Voici la définition de P0008 qui contient de nombreux champs comme vous pouvez le voir:

Structure DDIC P0008 dans l'affichage hiérarchique SE11


0 commentaires

4 Réponses :


3
votes

Bien sûr, après avoir posté ceci, j'ai trouvé la raison pour laquelle (fil allemand) . Apparemment, si la structure donnée contient des structures incluses, alors get_components ne les get_components pas. Trois solutions ont été suggérées dans le fil de discussion et elles fonctionnent toutes très bien pour moi. Comme je n'ai besoin que des noms de champ des structures, j'utiliserai l'option 1.

DATA: lt_infty_complist1 TYPE abap_compdescr_tab,
      lt_infty_complist2 TYPE STANDARD TABLE OF fieldname,
      lt_infty_complist3 TYPE abap_component_tab.

" 1 - get full fieldname list, but with barely any typedescription
lt_infty_complist1 = lr_infty_structdescr->components.

" 2 - get full fieldname list of DDIC structures, but without typedescription
SELECT fieldname
  FROM dd03l
  INTO TABLE lt_infty_complist2
 WHERE tabname = 'P0008'.

DELETE lt_infty_complist2 WHERE table_line = '.INCLU--AP'
                             OR table_line = '.INCLUDE'.

" 3 - get full component list 
" function code from: https://www.abapforum.com/forum/viewtopic.php?f=18&p=59840)
PERFORM return_components USING lr_infty_structdescr CHANGING lt_infty_complist3.


0 commentaires

1
votes

La méthode GET_RTTS_FOR_LOCAL_TABLE de la classe d'assistance CL_CACS_RTTS_HELPER semble faire exactement ce que vous voulez et ce qui manque à votre option 1

CALL METHOD cl_cacs_rtts_helper=>get_rtts_for_local_structure
  EXPORTING
    id_tabname = 'P0008'
  receiving
    ro_data    = DATA(ro_struct)
.

Il récupère tous les composants d'une structure dans un objet de données de référence et comprend également des types absolus:

entrez la description de l'image ici


2 commentaires

Merci, cela semble très pratique. Je vais marquer ceci comme la réponse, mais je ne peux pas le faire comme ça, car cette classe n'existe pas sur ma version (ABAP 700, pas de packages d'amélioration).


Oui, il n'existe pas non plus sur mon 700 SP05 nu, mais existe sur 740 EHP7 SP04. Il semble qu'il ait été introduit quelque part entre 7,31 et 7,40.



1
votes

Dans la même classe, il existe la méthode get field list, qui peut être suffisante.

 METHODS recursive_get_components
      IMPORTING
        io_structdescr       TYPE REF TO cl_abap_structdescr
      RETURNING
        VALUE(rt_components) TYPE abap_component_tab.


METHOD recursive_get_components.
    DATA:
      lo_incl_stru TYPE REF TO cl_abap_structdescr,
      lt_incl_comp TYPE abap_component_tab,
      l_curr_index TYPE i.

    FIELD-SYMBOLS: <comp>      LIKE LINE OF rt_components,
                   <incl_comp> LIKE LINE OF lt_incl_comp.


    rt_components = io_structdescr->get_components( ).

    LOOP AT rt_components ASSIGNING <comp>.
      IF <comp>-as_include = 'X'.
        lo_incl_stru ?= <comp>-type.  " not the include struc type
        l_curr_index = sy-tabix.      " and the index it is to be included
        DELETE rt_components INDEX l_curr_index.

        lt_incl_comp = recursive_get_components( io_structdescr =  lo_incl_stru  ).
        LOOP AT lt_incl_comp ASSIGNING <incl_comp>.
          INSERT <incl_comp> INTO rt_components INDEX l_curr_index.
          l_curr_index = l_curr_index + 1.
        ENDLOOP.
      ENDIF.

    ENDLOOP.


  ENDMETHOD.

Si cela ne suffit pas ... essayez

data: lo_incl_stru TYPE REF TO cl_abap_structdescr,
       lt_field_list TYPE ddfields.

    lt_field_list =  lo_incl_stru->get_ddic_field_list( p_including_substructres = abap_true ).


1 commentaires

Merci pour cette belle méthode récursive!



1
votes

Il existe une méthode sur cl_abap_structdescr appelée get_included_view () qui va développer les structures incluses


1 commentaires

Merci, c'est exactement ce que je voulais, et c'était juste devant mes yeux tout le temps, haha