Bonjour,
j'avais fini par écrire ce qui suit.
Cela permet de générer le fieldcatalog pour un ALV à partir d'une table standard.
Il n'est plus besoin de
- définir une structure dans le DDIC (avec la colonne TABSTYLE pour les couleurs et les styles.)
- faire un REUSE_FIELDCATALOG_MERGE,
Il suffit, avant le
grid->set_table_for_first_display
De faire un
gt_fieldcat = grid->generate_fieldcat_from_ddic( t_outtab ). " grid est une surcharge de CL_GUI_ALV_GRID
Avec
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79
|
METHOD generate_fieldcat_from_ddic.
REFRESH fieldcat.
DATA s_fieldcat LIKE LINE OF fieldcat.
FIELD-SYMBOLS <gt_alv> TYPE ANY TABLE.
ASSIGN pt_outtab TO <gt_alv>. " Créer une référence vers la table
FIELD-SYMBOLS <gs_alv> TYPE any.
DATA gs_alv TYPE REF TO data.
CREATE DATA gs_alv LIKE LINE OF <gt_alv>.
ASSIGN gs_alv->* TO <gs_alv>. " GS_ALV aura donc la structure d'une ligne de cette table
DATA ls_components TYPE abap_compdescr.
DATA comp_ref TYPE REF TO cl_abap_typedescr.
FIELD-SYMBOLS <comp> TYPE any.
TYPES: BEGIN OF ty_f,
fieldname TYPE abap_compdescr-name,
rollname TYPE dd03m-rollname,
END OF ty_f.
DATA t_f TYPE TABLE OF ty_f.
DATA s_f LIKE LINE OF t_f.
DATA descr_ref TYPE REF TO cl_abap_structdescr. " Pour pouvoir consulter les composants d'une ligne de cette table
descr_ref ?= cl_abap_typedescr=>describe_by_data( <gs_alv> ).
LOOP AT descr_ref->components INTO ls_components.
ASSIGN COMPONENT ls_components-name OF STRUCTURE <gs_alv> TO <comp>.
CLEAR s_f.
" Version 1 : avec cl_abap_typedesc
comp_ref = cl_abap_typedescr=>describe_by_data( <comp> ).
s_f-fieldname = ls_components-name.
s_f-rollname = comp_ref->absolute_name+6. " C'est ici qu'on trouve le type : absolute_name vaut /TYPE=VBELN_VA
" Version 2 : j'aurais pu faire ainsi
" describe field un help-id data(hlp).
" split hlp at '-' into s_f-fieldname s_f-rollname.
APPEND s_f TO t_f.
ENDLOOP.
CHECK t_f IS NOT INITIAL. " t_f contient la liste des colonnes avec le type de donnée de chacune
DATA t_dd03m TYPE TABLE OF dd03m. " Cette partie permet de créer un fielcat à partir des colonnes qu'on a trouvées
DATA s_dd03m LIKE LINE OF t_dd03m.
REFRESH t_dd03m.
SELECT * FROM dd03m
INTO TABLE t_dd03m
FOR ALL ENTRIES IN t_f
WHERE rollname = t_f-rollname
AND ddlanguage = sy-langu.
SORT t_dd03m BY rollname.
LOOP AT t_f INTO s_f.
CLEAR s_dd03m.
READ TABLE t_dd03m
INTO s_dd03m
WITH KEY rollname = s_f-rollname
BINARY SEARCH.
CHECK sy-subrc IS INITIAL.
MOVE-CORRESPONDING s_dd03m TO s_fieldcat.
s_fieldcat-fieldname = s_f-fieldname.
APPEND s_fieldcat TO fieldcat.
ENDLOOP.
CLEAR s_fieldcat. " Et on ajoute la colonne TABSTYLE pour pouvoir gérer les couleurs
s_fieldcat-fieldname = 'TABSTYLE'.
s_fieldcat-ref_table = 'WTY_PNV_DYNPRO_ALV'.
s_fieldcat-ref_field = 'STYL'.
s_fieldcat-no_out = 'X'.
APPEND s_fieldcat TO fieldcat.
ENDMETHOD. |
On peut toujours parcourir le gt_fieldcat obtenu pour mettre à jour les noms des colonnes, l'ordre, la longueur d'ffichage
ou bien l'employer directement dans le set_table_for_first_display.
Qu'en pensez vous ?
Simon
Partager