je cherche à rendre générique un traitement sur une table interne :
Voici l'idée :
"Supprimer de la table T_VBAP toutes les lignes qui n'existent pas dans T_VBAK en se basant sur la colonne VBELN"
Voir ci dessous : version non générique du traitement.
Je voudrais rendre cette routine générique.
L'appel ressemblera à :
PERFORM reduire USING t_vbak t_vbap 'VBELN' 'vbak-vbeln'.
avec le code qui suit.
Mes questions sont les suivantes :
- Pourquoi ai je dû écrire <lfs_comp_wa>-length / 2
(le divisé par 2 m'étonne)
- Comment pourrais je me passer du 4eme paramètre
(étant donné une table interne passée en paramètre ainsi que le nom (string) d'un champ de cette table interne,
je veux créer un RANGE OF [type de ce champ de la table interne])
- Comment rendre la derniere instruction générique également ?
(le DELETE t_vbap WHERE vbeln NOT IN <fs_tab>.)
- Etant en réalité débutant en ABAP, je suis partant pour toute idée d'optimisation de ce code.
Merci !
JC
Version Non Générique :
- Code: Tout sélectionner
FORM reduire.
DATA : liste_vbeln type range of vbak-vbeln,
line_vbeln TYPE LINE OF liste_vbeln,
lt_vbak TYPE TABLE OF ts_vbak,
lt_vbap TYPE ts_vbak.
lt_vbak = t_vbak.
SORT lt_vbak BY vbeln.
DELETE ADJACENT DUPLICATES FROM lt_vbak COMPARGIN vbeln.
line_vbeln-sign = 'I'.
line_vbeln-option = 'EQ'.
LOOP AT lt_vbak INTO ls_vbak.
line_vbeln-low = ls_vbak-vbeln.
APPEND line_vbeln TO liste_vbeln.
ENDLOOP.
IF liste_vbeln IS INITIAL.
CLEAR t_vbap.
ELSE.
DELETE t_vbap WHERE vbeln NOT IN liste_vbeln.
ENDIF.
ENDFORM.
Version Générique :
- Code: Tout sélectionner
FORM reduire USING p_reference STANDARD TABLE
p_travail TYPE STANDARD TABLE
column TYPE lvc_name
column_type TYPE string.
FIELD-SYMBOLS <table_reference> TYPE STANDARD TABLE.
FIELD-SYMBOLS <table_reference_copy> TYPE STANDARD TABLE.
ASSIGN p_reference to <table_reference>.
FIELD-SYMBOLS <table_travail> TYPE STANDARD TABLE.
ASSIGN p_travail to <table_travail>.
FIELD-SYMBOLS <table_reference_fields> TYPE ANY.
DATA gs_fldname TYPE REF TO DATA.
CREATE DATA gs_fldname LIKE LINE OF <table_reference>.
ASSIGN gs_fldname->* TO <table_reference_fields>.
DATA position TYPE i.
DATA dyn_table TYPE REF TO DATA.
DATA wa_fieldcat TYPE lvc_s_fcat.
DATA it_fieldcat TYPE lvc_t_fcat.
DATA table_reference_copy_pre TYPE REF TO DATA.
DATA l_descr_ref TYPE REF TO cl_abap_structdescr.
FIELD-SYMBOLS <ls_tab> TYPE ANY.
FIELD-SYMBOLS <field> TYPE ANY.
FIELD-SYMBOLS <lfs_comp_wa> TYPE abap_compdescr.
l_descr_ref ?= cl_abap_typedescr=>describe_by_data( <table_reference_fields> ).
LOOP AT l_descr_ref->components[] ASSIGNING <lfs_comp_wa>.
IF <lfs_comp_wa>-name = column.
position = sy-tabix.
ENDIF.
CLEAR wa_fieldcat.
wa_fieldcat-fieldname = <lfs_comp_wa>-name.
wa_fieldcat-datatype = <lfs_comp_wa>-type_kind.
wa_fieldcat-inttype = <lfs_comp_wa>-type_kind.
wa_fieldcat-intlen = <lfs_comp_wa>-length / 2.
wa_fieldcat-decimals = <lfs_comp_wa>-decimals.
APPEND wa_fieldcat TO it_fieldcat.
ENDLOOP.
CALL METHOD cl_alv_table_create=>create_dynamic_table
EXPORTING
it_fieldcatalog = it_fieldcat
IMPORTING
ep_table = table_reference_copy_pre.
ASSIGN table_reference_copy_pre->* TO <table_reference_copy>.
<table_reference_copy> = p_reference.
SORT <table_reference_copy> BY (column).
DELETE ADJACENT DUPLICATES FROM <table_reference> COMPARING (column).
DATA :
gr_structdescr TYPE REF TO cl_abap_structdescr,
gr_tabledescr TYPE REF TO cl_abap_tabledescr,
gr_datadescr TYPE REF TO cl_abap_datadescr,
gr_typedescr TYPE REF TO cl_abap_typedescr,
gt_components TYPE abap_component_tab,
gw_component TYPE LINE OF abap_component_tab,
gr_wa TYPE REF TO DATA,
gr_tab TYPE REF TO DATA.
FIELD-SYMBOLS :
<fs_wa> TYPE ANY,
<fs_tab> TYPE TABLE.
MOVE 'SIGN' to gw_component-name.
gw_component-type ?= cl_abap_elemdescr=>get_c( p_length = 1 ).
INSERT gw_component INTO TABLE gt_components.
MOVE 'OPTION' to gw_component-name.
gw_component-type ?= cl_abap_elemdescr=>get_c( p_length = 2 ).
INSERT gw_component INTO TABLE gt_components.
MOVE 'LOW' to gw_component-name.
gw_component-type ?= cl_abap_elemdescr=>describe_by_name( column_type ).
INSERT gw_component INTO TABLE gt_components.
MOVE 'HIGH' to gw_component-name.
gw_component-type ?= cl_abap_elemdescr=>describe_by_name( column_type ).
INSERT gw_component INTO TABLE gt_components.
gr_structdescr ?= cl_abap_structdescr=>create( gt_components ).
CREATE DATA gr_wa TYPE HANDLE gr_structdescr.
ASSIGN gr_wa->* to <fs_wa>.
gr_datadescr ?= gr_structdescr.
gr_tabledescr ?= cl_abap_tabledescr=>create( gr_datadescr ).
CREATE DATA gr_tab TYPE HANDLE gr_datadescr.
ASSIGN gr_tab->* TO <fs_tab>.
LOOP AT <table_reference> ASSIGNING <ls_tab>.
ASSIGN COMPONENT position OF STRUCTURE <ls_tab> to <field>.
CONCATENATE 'IEQ' <field> INTO <fs_wa>.
APPEND <fs_wa> TO <fs_tab>.
ENDLOOP.
DELETE t_vbap WHERE vbeln NOT IN <fs_tab>.
ENDFORM.



News