Rendre générique un traitement sur une table interne

Rendre générique un traitement sur une table interne

Messagede jcmartin01 » 16 Janvier 2012, 21:42

Bonjour,
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.
jcmartin01
Posteur débutant
Posteur débutant
 
Messages: 3
Inscription: 16 Janvier 2012, 21:39

Re: Rendre générique un traitement sur une table interne

Messagede thoul » 17 Janvier 2012, 11:49

Bonjour,

Intéressante question.
Mais avant de répondre à certains points, il me semble important de soulever le problème le plus important, la dernière question de ton post: L'objectif est de supprimer certaines entrées dans une table internes en fonction de conditions "dynamiques" et l'instruction ABAP de DELETE sur une table interne ne permet pas de conditionnement dynamique sur cette instruction, comme il l'est précisé dans l'aide
You can specify any logical expression log_exp after WHERE, for which the first operand of each individual comparison is a component of the internal table. This enables all logical expression with the exception of IS ASSIGNED, ISREQUESTED, and IS SUPPLIED. The dynamic specification of components using character-type data objects in parentheses is not supported here. All rows for which the logical expression is true are deleted"


Il doit donc y avoir un moyen pour supprimer les entrées de table interne, encore faut-il le trouver... Si ce moyen n'existe pas, le traitement générique dont il est question perd sa raison d'être. Il faut peut être simplement changer son fusil d'épaule en ne sélectionnant dans la table cible T_VBAP, que des entrées existantes dans T_VBAK lors du select... si cela est possible, tout dépend du contexte

Néanmoins, je me suis penché sur les problèmes rencontré sur le code fourni:
- Pourquoi ai je dû écrire <lfs_comp_wa>-length / 2 (le divisé par 2 m'étonne)
-->Je ne sais pas répondre au "pourquoi diviser par 2" mais pourquoi utiliser la methode cl_alv_table_create=>create_dynamic_table qui oblige à constituer un fieldcatalog avec descriptif des zones (qui est la source de ton problème) alors qu'en une instruction plus simple, tu peut créer dynamiquement une nouvelle table interne sans avoir à créer de Fieldcatalog (et donc sans se poser la question ;) )
Code: Tout sélectionner
....
   l_descr_ref ?= cl_abap_typedescr=>describe_by_data( <table_reference_fields> ).
   lg_tabledescr = cl_abap_tabledescr=>create( p_line_type  = l_descr_ref ).
   CREATE DATA lgt_tab TYPE HANDLE lg_tabledescr.
   ASSIGN lgt_tab->* TO <table_reference_copy>.

  <table_reference_copy>[] = p_reference[].
....


- 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])
-->dans les paramètres du perform, on dispose du nom de la table interne de reference et du nom de la zone servant à la sélection. En utilisant les même classes que celles utilisées tout au long du traitement, on peut donc déduire les caractéristiques de la zone en question sans avoir besoin de préciser sa référence "du dictionnaire"
Code: Tout sélectionner
...
  lcl_table ?= cl_abap_typedescr=>describe_by_data( <table_reference_copy> ).
  lcl_struc ?= lcl_table->get_table_line_type( ).
...
  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 ?= lcl_struc->describe_by_name( p_zone ).
  INSERT gw_component INTO TABLE gt_components.

  MOVE 'HIGH' TO gw_component-name.
  gw_component-type ?= lcl_struc->describe_by_name( p_zone ).
  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_tabledescr ?= cl_abap_tabledescr=>create( p_line_type  = gr_structdescr ).

  CREATE DATA gr_tab TYPE HANDLE gr_tabledescr.
  ASSIGN gr_tab->* TO <fs_tab>.
...


Enfin, voici la totalité du code (en ajoutant quelques commentaires sur les étapes du traitement) que j'ai adapté de ta source qui devrait être "portable" sur un autre environnement que le mien
Code: Tout sélectionner
FORM test USING p_reference TYPE STANDARD TABLE
                p_travail TYPE STANDARD TABLE
                p_zone TYPE fieldname.
  FIELD-SYMBOLS <table_reference> TYPE STANDARD TABLE.
  FIELD-SYMBOLS <table_reference_copy> TYPE STANDARD TABLE.
  FIELD-SYMBOLS <table_travail> TYPE STANDARD TABLE.
  FIELD-SYMBOLS <table_reference_fields> TYPE ANY.
  DATA lgs_struct TYPE REF TO data.
  DATA lgt_tab 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.
  DATA lg_tabledescr TYPE REF TO cl_abap_tabledescr.

*_1) creation d'une copie de la table de référence, filtrée sur
*____les valeurs de la zone de traitement P_ZONE
*_1-a)constitution des 2 tables internes
  ASSIGN p_reference TO <table_reference>.
  ASSIGN p_travail TO <table_travail>.

*_1-b)creation d'une table interne copie de la table de référence
*_____et suppression des doublons sur la zone de "selection"
  CREATE DATA lgs_struct LIKE LINE OF <table_reference>.
  ASSIGN lgs_struct->* TO <table_reference_fields>.
  l_descr_ref ?= cl_abap_typedescr=>describe_by_data( <table_reference_fields> ).
  lg_tabledescr = cl_abap_tabledescr=>create( p_line_type  = l_descr_ref ).
  CREATE DATA lgt_tab TYPE HANDLE lg_tabledescr.
  ASSIGN lgt_tab->* TO <table_reference_copy>.

  <table_reference_copy>[] = p_reference[].
  SORT <table_reference_copy> BY (p_zone).
  DELETE ADJACENT DUPLICATES FROM <table_reference_copy> COMPARING (p_zone).

*_2) constitution du range des valeurs contenue dans la table de reference
  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 .

*_2-a)recuperation du descriptif de la "zone de comparaison"
*_____et de la liste des zones de la table interne
  DATA: lcl_table TYPE REF TO cl_abap_tabledescr,
        lcl_struc TYPE REF TO cl_abap_structdescr,
        lcl_data TYPE REF TO cl_abap_datadescr,
        lt_fields TYPE abap_compdescr_tab,
        ls_fields TYPE abap_compdescr.

  lcl_table ?= cl_abap_typedescr=>describe_by_data( <table_reference_copy> ).
  lcl_struc ?= lcl_table->get_table_line_type( ).
  lcl_data ?= lcl_struc->describe_by_name( p_zone ).
  lt_fields = lcl_struc->components.

*_2-b)creation du range des valeurs existantes pour la zone de "selection"
*_____dans la table de reference
  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 ?= lcl_struc->describe_by_name( p_zone ).
  INSERT gw_component INTO TABLE gt_components.

  MOVE 'HIGH' TO gw_component-name.
  gw_component-type ?= lcl_struc->describe_by_name( p_zone ).
  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_tabledescr ?= cl_abap_tabledescr=>create( p_line_type  = gr_structdescr ).

  CREATE DATA gr_tab TYPE HANDLE gr_tabledescr.
  ASSIGN gr_tab->* TO <fs_tab>.

*_2-c)chargement des valeurs de la zone de "selection" existants dans la
*_____table de reference (prealablement copiée et filtrée)
  LOOP AT <table_reference_copy> ASSIGNING <ls_tab>.
    DO.
      ASSIGN COMPONENT sy-index OF STRUCTURE <ls_tab> TO <field>.
      IF sy-subrc IS INITIAL.
        clear ls_fields.
        READ TABLE lt_fields INTO ls_fields INDEX sy-index.
        IF ls_fields-name EQ p_zone.
          MOVE 'IEQ' TO <fs_wa>+0(3).
          MOVE <field> TO <fs_wa>+3.
          APPEND <fs_wa> TO <fs_tab>.
          EXIT.
        ENDIF.
      ELSE.
        EXIT.
      ENDIF.
    ENDDO.
  ENDLOOP.

*_3) Suppression des données de la table de travail, le critère d'exclusion
*____etant la non existence de la valeur de la zone de "selection"
*____dans la table de reference
*  DELETE <table_travail>.
ENDFORM.
thomas
'si il n'y a pas de solution, c'est qu'il n'y a pas de problème'
Avatar de l’utilisateur
thoul
Posteur confirmé
Posteur confirmé
 
Messages: 62
Inscription: 26 Juillet 2010, 10:56

Re: Rendre générique un traitement sur une table interne

Messagede thoul » 10 Février 2012, 11:50

Bonjour,

Dans ma réponse précédente, j'indiquais que le code mis en place n'avait de sens que si on pouvait effectuer un DELETE "dynamique" des données.

Voici donc la totalité du code concernant le perform complété des instructions de suppression des données et, en cadeau, la totalité du programme permettant de tester la solution, avec constitution d'un jeu d'essai.
Code: Tout sélectionner
*&---------------------------------------------------------------------*
*& Report  ZTHO1
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*
REPORT ztho1 NO STANDARD PAGE HEADING.
TYPES: BEGIN OF ty_head,
         anln1 TYPE anla-anln1,
       END OF ty_head.
TYPES: BEGIN OF ty_item,
         anln1 TYPE anla-anln1,
         anln2 TYPE anla-anln2,
       END OF ty_item.

DATA: t_head TYPE TABLE OF ty_head,
      s_head TYPE ty_head,
      t_item TYPE TABLE OF ty_item,
      s_item TYPE ty_item.
DATA w_loop(12) TYPE n.

*Chargement des 2 tables internes avec données de test
w_loop = 2.
WHILE w_loop LE 5.
  s_head-anln1 = w_loop.
  APPEND s_head TO t_head.
  ADD 1 TO w_loop.
ENDWHILE.

CLEAR w_loop.
WHILE w_loop LE 5.
  s_item-anln1 = w_loop.
  s_item-anln2 = 0.
  APPEND s_item TO t_item.
  s_item-anln2 = 1.
  APPEND s_item TO t_item.
  ADD 1 TO w_loop.
ENDWHILE.

*affichage des données avant traitement
WRITE / 'Avant traitement'.
LOOP AT t_item INTO s_item.
  WRITE / s_item.
ENDLOOP.

PERFORM test USING t_head
                   t_item
                   'ANLN1'.

*affichage des données après traitement
WRITE / 'Apres traitement'.
LOOP AT t_item INTO s_item.
  WRITE / s_item.
ENDLOOP.

*&---------------------------------------------------------------------*
*&      Form  test
*&---------------------------------------------------------------------*
FORM test USING p_reference TYPE STANDARD TABLE
                p_travail TYPE STANDARD TABLE
                p_zone TYPE fieldname.
  FIELD-SYMBOLS <table_reference> TYPE STANDARD TABLE.
  FIELD-SYMBOLS <table_reference_copy> TYPE STANDARD TABLE.
  FIELD-SYMBOLS <table_travail> TYPE STANDARD TABLE.
  FIELD-SYMBOLS <table_reference_fields> TYPE ANY.
  DATA lgs_struct TYPE REF TO data.
  DATA lgt_tab 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.
  DATA lg_tabledescr TYPE REF TO cl_abap_tabledescr.

*_1) creation d'une copie de la table de référence, filtrée sur
*____les valeurs de la zone de traitement P_ZONE
*_1-a)constitution des 2 tables internes
  ASSIGN p_reference TO <table_reference>.
  ASSIGN p_travail TO <table_travail>.

*_1-b)creation d'une table interne copie de la table de référence
*_____et suppression des doublons sur la zone de "selection"
  CREATE DATA lgs_struct LIKE LINE OF <table_reference>.
  ASSIGN lgs_struct->* TO <table_reference_fields>.
  l_descr_ref ?= cl_abap_typedescr=>describe_by_data( <table_reference_fields> ).
  lg_tabledescr = cl_abap_tabledescr=>create( p_line_type  = l_descr_ref ).
  CREATE DATA lgt_tab TYPE HANDLE lg_tabledescr.
  ASSIGN lgt_tab->* TO <table_reference_copy>.

  <table_reference_copy>[] = p_reference[].
  SORT <table_reference_copy> BY (p_zone).
  DELETE ADJACENT DUPLICATES FROM <table_reference_copy> COMPARING (p_zone).

*_2) constitution du range des valeurs contenue dans la table de reference
  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 .

*_2-a)recuperation du descriptif de la "zone de comparaison"
*_____et de la liste des zones de la table interne
  DATA: lcl_table TYPE REF TO cl_abap_tabledescr,
        lcl_struc TYPE REF TO cl_abap_structdescr,
        lcl_data TYPE REF TO cl_abap_datadescr,
        lt_fields TYPE abap_compdescr_tab,
        ls_fields TYPE abap_compdescr.

  lcl_table ?= cl_abap_typedescr=>describe_by_data( <table_reference_copy> ).
  lcl_struc ?= lcl_table->get_table_line_type( ).
  lcl_data ?= lcl_struc->describe_by_name( p_zone ).
  lt_fields = lcl_struc->components.

*_2-b)creation du range des valeurs existantes pour la zone de "selection"
*_____dans la table de reference
  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 ?= lcl_struc->describe_by_name( p_zone ).
  INSERT gw_component INTO TABLE gt_components.

  MOVE 'HIGH' TO gw_component-name.
  gw_component-type ?= lcl_struc->describe_by_name( p_zone ).
  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_tabledescr ?= cl_abap_tabledescr=>create( p_line_type  = gr_structdescr ).

  CREATE DATA gr_tab TYPE HANDLE gr_tabledescr.
  ASSIGN gr_tab->* TO <fs_tab>.

*_2-c)chargement des valeurs de la zone de "selection" existants dans la
*_____table de reference (prealablement copiée et filtrée)
  LOOP AT <table_reference_copy> ASSIGNING <ls_tab>.
    DO.
      ASSIGN COMPONENT sy-index OF STRUCTURE <ls_tab> TO <field>.
      IF sy-subrc IS INITIAL.
        CLEAR ls_fields.
        READ TABLE lt_fields INTO ls_fields INDEX sy-index.
        IF ls_fields-name EQ p_zone.
          MOVE 'IEQ' TO <fs_wa>+0(3).
          MOVE <field> TO <fs_wa>+3.
          APPEND <fs_wa> TO <fs_tab>.
          EXIT.
        ENDIF.
      ELSE.
        EXIT.
      ENDIF.
    ENDDO.
  ENDLOOP.

*_3) Suppression des données de la table de travail, le critère d'exclusion
*____etant la non existence de la valeur de la zone de "selection"
*____dans la table de reference
*  DELETE <table_travail> WHERE zone IN <fs_tab>.
  FIELD-SYMBOLS <structure_travail> TYPE ANY.
  FIELD-SYMBOLS <zone> TYPE ANY.
  DATA lw_nom_zone(60) TYPE c.

  LOOP AT <table_travail> ASSIGNING <structure_travail>.
    CONCATENATE '<STRUCTURE_TRAVAIL>-' p_zone INTO lw_nom_zone.
    ASSIGN (lw_nom_zone) TO <zone>.
    IF sy-subrc IS INITIAL.
      IF <zone> NOT IN <fs_tab>.
        DELETE <table_travail> INDEX sy-tabix.
      ENDIF.
    ENDIF.
  ENDLOOP.
ENDFORM.                    "test
thomas
'si il n'y a pas de solution, c'est qu'il n'y a pas de problème'
Avatar de l’utilisateur
thoul
Posteur confirmé
Posteur confirmé
 
Messages: 62
Inscription: 26 Juillet 2010, 10:56


Retourner vers ABAP

Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 0 invités

cron