[UTIL] Utilitaire de chargement/déchargement/vidage de table (spécifique)

[UTIL] Utilitaire de chargement/déchargement/vidage de table (spécifique)

Messagede thoul » 27 Juillet 2010, 08:42

Voici le code d'un petit utilitaire permettant de décharger/charger/vider le contenu d'une table transparente (manipulation limitée aux tables spécifiques, pour éviter les bétises, petites ou grosses).
Assez pratique pour remettre à niveau des tables dans les divers environnements.

Le déchargement se fait à destination d'un fichier texte avec séparateur de champ (choix du séparateur dans l'écran de sélection), les données extraites étant les données brutes sans formatage/routine de conversion
Le chargement se fait à partir d'un fichier texte avec séparateur de champ, les données étant les données brutes, le programme ne contenant aucun formatage/routine de conversion
La suppression entraine le vidage total de la table sélectionnée.

C'est assez basique, dans le code comme dans les fonctionnalités, les améliorations/évolutions/corrections sont donc les bienvenues

Code: Tout sélectionner
*&---------------------------------------------------------------------
*& Report Z_UTIL_TABLE                                                     
*&                                                                                     
*&---------------------------------------------------------------------
* Dév.   Date        Description                                             
*-----------------------------------------------------------------------
REPORT z_util_table NO STANDARD PAGE HEADING.
DATA w_cpt TYPE i.
DATA w_err TYPE i.
DATA w_lus TYPE i.

DATA: w_ans(1) TYPE c.
DATA: s_line(3000) TYPE c. "Ligne de travail pour transfert des donnees
*TI des données sortantes
DATA: t_line LIKE TABLE OF s_line.
DATA: w_p(40) TYPE c.
DATA: w_d(10) TYPE c.
DATA: w_type(1) TYPE c.
DATA: wa_dd02l TYPE dd02l.
DATA t_table TYPE REF TO data.
DATA s_table_line TYPE REF TO data.
*field-symbols
FIELD-SYMBOLS: <table> TYPE STANDARD TABLE.
FIELD-SYMBOLS: <wa> TYPE ANY.
FIELD-SYMBOLS: <concat> TYPE ANY.
FIELD-SYMBOLS: <split> TYPE ANY.

*ecran de sélection
SELECTION-SCREEN BEGIN OF BLOCK bloc WITH FRAME.
PARAMETERS: p_table TYPE tabname16 OBLIGATORY.
SELECTION-SCREEN SKIP.
PARAMETERS: p_file LIKE rlgrap-filename
                   DEFAULT 'C:\Temp\table.txt' OBLIGATORY.
PARAMETERS: p_sep(1) TYPE c DEFAULT '|' OBLIGATORY.  "séparateur de champs
SELECTION-SCREEN BEGIN OF BLOCK bloc2.
PARAMETERS: p_down RADIOBUTTON GROUP gr1.
PARAMETERS: p_load RADIOBUTTON GROUP gr1 DEFAULT 'X' ,
            p_dele RADIOBUTTON GROUP gr1.
SELECTION-SCREEN END OF BLOCK bloc2.
SELECTION-SCREEN END OF BLOCK bloc.

AT SELECTION-SCREEN ON p_table.
  IF p_table(1) NE 'Z' AND
     p_table(1) NE 'Y'.
    SET CURSOR FIELD 'P_TABLE'.
    MESSAGE 'La table ne peut être qu''une spécifique' TYPE 'E'.
  ENDIF.
  SELECT SINGLE tabname FROM dd02l INTO wa_dd02l
                        WHERE tabname EQ p_table.
  IF NOT sy-subrc IS INITIAL.
    SET CURSOR FIELD 'P_TABLE'.
    MESSAGE 'LA table n''existe pas dans le système' TYPE 'E'.
  ENDIF.

START-OF-SELECTION.
  CREATE DATA t_table TYPE TABLE OF (p_table).
  CREATE DATA s_table_line TYPE (p_table).
  ASSIGN t_table->* TO  <table>.
  ASSIGN s_table_line->* TO <wa>.

  IF p_down EQ 'X'.
*___lecture des données de la table
    PERFORM get_data.
*___si la table des données concaténées n'est pas vide
    IF NOT t_line[] IS INITIAL.
      PERFORM ouverture_fichier_output USING p_file.
    ELSE.
      WRITE: /5 'Aucune donnée extraite de la table', p_table.
    ENDIF.
  ELSEIF p_load EQ 'X'.
*ouverture du fichier entrant
    PERFORM ouverture_fichier_input USING p_file.
    PERFORM split_data.
    IF sy-subrc IS INITIAL.
      WRITE: /5 'Entrées lues du fichier' , p_file,52 ' : ', 69 w_lus.
      WRITE: /5 'Entrées insérées dans la table ', p_table,52 ' : ', 69 w_cpt.
      WRITE: /5 'Erreurs lors insertion ds table', p_table,52 ' : ', 69 w_err.
    ENDIF.

*suppression
  ELSEIF p_dele EQ 'X'.
    CALL FUNCTION 'POPUP_TO_CONFIRM'
     EXPORTING
      titlebar                    = 'Suppression entrées'
*   DIAGNOSE_OBJECT             = ' '
    text_question               = 'Etes-vous sur de vouloir supprimer les entrées de table?'
    text_button_1               = 'Oui'
    icon_button_1               = 'ICON_OKAY'
    text_button_2               = 'Non'
    icon_button_2               = 'ICON_CANCEL '
*   DEFAULT_BUTTON              = '1'
    display_cancel_button       = ''
*   USERDEFINED_F1_HELP         = ' '
*   START_COLUMN                = 25
*   START_ROW                   = 6
*   POPUP_TYPE                  =
*   IV_QUICKINFO_BUTTON_1       = ' '
*   IV_QUICKINFO_BUTTON_2       = ' '
  IMPORTING
    answer                      = w_ans
* TABLES
*   PARAMETER                   =
  EXCEPTIONS
    text_not_found              = 1
    OTHERS                      = 2.
    IF w_ans EQ '1'.
      DELETE FROM (p_table).
      IF sy-subrc IS INITIAL.
        WRITE: /5 'Entrées supprimées dans la table', p_table.
      ENDIF.
    ENDIF.
  ENDIF.
*&---------------------------------------------------------------------*
*&      Form  OUVERTURE_FICHIER_INPUT
*&---------------------------------------------------------------------*
FORM ouverture_fichier_input USING p_file.
  DATA lv_filename TYPE string.

  lv_filename = p_file.
  CALL FUNCTION 'GUI_UPLOAD'               
      EXPORTING
        filename                = lv_filename
      TABLES
        data_tab                = t_line
      EXCEPTIONS
        conversion_error        = 1
        file_open_error         = 2
        file_read_error         = 3
        invalid_table_width     = 4
        invalid_type            = 5
        no_batch                = 6
        unknown_error           = 7
        gui_refuse_filetransfer = 8
        OTHERS                  = 9.

  IF sy-subrc <> 0.
    MESSAGE e000(zsncf)
       WITH 'Erreur à l''ouverture du fichier en entrée' DISPLAY LIKE 'I'.
    EXIT.
  ENDIF.
ENDFORM.                    " OUVERTURE_FICHIER_INPUT
*&---------------------------------------------------------------------*
*&      Form  OUVERTURE_FICHIER_OUTPUT
*&---------------------------------------------------------------------*
FORM ouverture_fichier_output USING p_file.
  DATA l_file TYPE string.

  l_file = p_file.
  CALL FUNCTION 'GUI_DOWNLOAD'
  EXPORTING
     filename         = l_file
     filetype         = 'ASC'
*    mode             = ' '
     write_field_separator = ';'
*  IMPORTING
*    filelength       = l_filelength
  TABLES
      data_tab         = t_line
  EXCEPTIONS
      file_write_error        = 1
      no_batch                = 2
      gui_refuse_filetransfer = 3
      invalid_type            = 4
      no_authority            = 5
      unknown_error           = 6
      header_not_allowed      = 7
      separator_not_allowed   = 8
      filesize_not_allowed    = 9
      header_too_long         = 10
      dp_error_create         = 11
      dp_error_send           = 12
      dp_error_write          = 13
      unknown_dp_error        = 14
      access_denied           = 15
      dp_out_of_memory        = 16
      disk_full               = 17
      dp_timeout              = 18
      file_not_found          = 19
      dataprovider_exception  = 20
      control_flush_error     = 21.
  IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
            WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ELSE.
    WRITE: /5 'Entrées de', p_table,'transmises au fichier', 55 ':',69 w_cpt.
  ENDIF.

ENDFORM.                    " OUVERTURE_FICHIER_OUTPUT
*&---------------------------------------------------------------------*
*&      Form  GET_DATA
*&---------------------------------------------------------------------*
FORM get_data .
  SELECT * FROM (p_table) INTO TABLE <table>.

  LOOP AT <table> INTO <wa>.
    CLEAR s_line.
    DO.
      ASSIGN COMPONENT sy-index OF STRUCTURE <wa> TO <concat>.
      IF sy-subrc IS INITIAL.
*_______pour les champs de pack, on le transfère ds un champ
*_______caractere pour permettre la concatenation
        DESCRIBE FIELD <concat> TYPE w_type.
        IF w_type EQ 'P'.
          w_p = <concat>.
          SHIFT w_p LEFT DELETING LEADING space.
          CONCATENATE s_line w_p INTO s_line SEPARATED BY p_sep.
        ELSEIF w_type EQ 'D'.
          w_d = <concat>.
          CONCATENATE s_line w_d INTO s_line SEPARATED BY p_sep.
        ELSE.
          CONCATENATE s_line <concat> INTO s_line SEPARATED BY p_sep.
        ENDIF.
      ELSE.
        IF NOT s_line IS INITIAL.
*_________suppression du separateur de debut de chaine
          SHIFT s_line LEFT.
          APPEND s_line TO t_line.
          ADD 1 TO w_cpt.
        ENDIF.
        EXIT.
      ENDIF.
    ENDDO.
  ENDLOOP.
ENDFORM.                    " GET_DATA
*&---------------------------------------------------------------------*
*&      Form  SPLIT_DATA
*&---------------------------------------------------------------------*
FORM split_data.
  CLEAR w_cpt.
  CLEAR w_err.
  CLEAR w_lus.

  LOOP AT t_line INTO s_line.
    ADD 1 TO w_lus.
    CLEAR <wa>.
    DO.
      ASSIGN COMPONENT sy-index OF STRUCTURE <wa> TO <split>.
      IF sy-subrc IS INITIAL.
*_______pour les zones de types p de la structure, on charge dans une
*_______variable de travail de type c puis on transfère vers la zone
        CLEAR w_type.
        DESCRIBE FIELD <split> TYPE w_type.
        IF w_type EQ 'P'.
          CLEAR w_p.
          SPLIT s_line AT p_sep INTO w_p s_line.
          <split> = w_p.
        ELSEIF w_type EQ 'D'.
          CLEAR w_d.
          SPLIT s_line AT p_sep INTO w_d s_line.
          <split> = w_d.
        ELSE.
          SPLIT s_line AT p_sep INTO <split> s_line.
        ENDIF.
      ELSE.
*_______append des valeurs dans la TI
        IF NOT <wa> IS INITIAL.
          INSERT (p_table) FROM <wa>.
          IF sy-subrc IS INITIAL.
            ADD 1 TO w_cpt.
          ELSE.
            ADD 1 TO w_err.
          ENDIF.
        ENDIF.
        EXIT.
      ENDIF.
    ENDDO.
  ENDLOOP.
ENDFORM.                    " SPLIT_DATA
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: [UTIL] Utilitaire de chargement/déchargement/vidage de table (spécifique)

Messagede thoul » 10 Septembre 2010, 08:54

Suite à des remarques pertinentes d'un membre du forum, voici une nouvelle version du programme contenant les évolutions suivantes:

-Lors du télédéchargement, la première ligne du fichier sortant reprend le nom des champs extraits
-Le chemin du fichier up/download possède désormais une aide à la saisie avec fenêtre de navigation sur le poste de travail

Code: Tout sélectionner
REPORT z_util_table NO STANDARD PAGE HEADING.

DATA w_cpt TYPE i.
DATA w_err TYPE i.
DATA w_lus TYPE i.

DATA: w_ans(1) TYPE c.
DATA: s_line(3000) TYPE c. "Ligne de travail pour transfert des donnees
*TI des données sortantes
DATA: t_line LIKE TABLE OF s_line.
DATA: w_p(40) TYPE c.
DATA: w_d(10) TYPE c.
DATA: w_type(1) TYPE c.
DATA: wa_dd02l TYPE dd02l.
DATA t_table TYPE REF TO data.
DATA s_table_line TYPE REF TO data.
DATA wt_path TYPE filetable.
DATA w_user_action TYPE i.
DATA w_rc TYPE i.
DATA w_concat(200) TYPE c.

*field-symbols
FIELD-SYMBOLS: <table> TYPE STANDARD TABLE.
FIELD-SYMBOLS: <wa> TYPE ANY.
FIELD-SYMBOLS: <concat> TYPE ANY.
FIELD-SYMBOLS: <split> TYPE ANY.

*ecran de sélection
SELECTION-SCREEN BEGIN OF BLOCK bloc WITH FRAME.
PARAMETERS: p_table TYPE ddobjname OBLIGATORY.
SELECTION-SCREEN SKIP.
PARAMETERS: p_file TYPE string
                   DEFAULT 'C:\Temp\table.txt' LOWER CASE.
PARAMETERS: p_sep(1) TYPE c DEFAULT '|' OBLIGATORY.  "séparateur de champs
SELECTION-SCREEN BEGIN OF BLOCK bloc2.
PARAMETERS p_down RADIOBUTTON GROUP gr1.
PARAMETERS p_load RADIOBUTTON GROUP gr1 DEFAULT 'X'.
PARAMETERS p_dele RADIOBUTTON GROUP gr1.
SELECTION-SCREEN END OF BLOCK bloc2.
SELECTION-SCREEN END OF BLOCK bloc.

AT SELECTION-SCREEN ON p_table.
  IF p_table(1) NE 'Z' AND
     p_table(1) NE 'Y'.
    SET CURSOR FIELD 'P_TABLE'.
    MESSAGE 'La table ne peut être qu''une spécifique' TYPE 'E'.
  ENDIF.
  SELECT SINGLE tabname FROM dd02l INTO wa_dd02l
                        WHERE tabname EQ p_table.
  IF NOT sy-subrc IS INITIAL.
    SET CURSOR FIELD 'P_TABLE'.
    MESSAGE 'LA table n''existe pas dans le système' TYPE 'E'.
  ENDIF.

AT SELECTION-SCREEN.
  IF p_load EQ 'X' OR
     p_down EQ 'X'.
    IF p_file IS INITIAL.
      MESSAGE 'Veuillez renseigner le chemin de fichier' TYPE 'E' DISPLAY LIKE 'I'.
    ENDIF.
  ENDIF.

AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file.
  CALL METHOD cl_gui_frontend_services=>file_open_dialog
    EXPORTING
      window_title            = 'Recherche fichier'
      default_filename        = 'table.txt'
    CHANGING
      file_table              = wt_path
      rc                      = w_rc
      user_action             = w_user_action
    EXCEPTIONS
      file_open_dialog_failed = 1
      cntl_error              = 2
      error_no_gui            = 3
      not_supported_by_gui    = 4
      OTHERS                  = 5.
  IF w_user_action = cl_gui_frontend_services=>action_cancel.
    CLEAR p_file.
  ELSE.
    LOOP AT wt_path INTO p_file.
      EXIT.
    ENDLOOP.
  ENDIF.

START-OF-SELECTION.
  CREATE DATA t_table TYPE TABLE OF (p_table).
  CREATE DATA s_table_line TYPE (p_table).
  ASSIGN t_table->* TO  <table>.
  ASSIGN s_table_line->* TO <wa>.

  IF p_down EQ 'X'.
*___lecture des données de la table
    PERFORM get_data.
*___si la table des données concaténées n'est pas vide
    IF NOT t_line[] IS INITIAL.
      PERFORM ouverture_fichier_output USING p_file.
    ELSE.
      CONCATENATE 'Aucune donnée extraite de la table' p_table INTO w_concat SEPARATED BY space.
      WRITE: /5 w_concat.
    ENDIF.
  ELSEIF p_load EQ 'X'.
*ouverture du fichier entrant
    PERFORM ouverture_fichier_input USING p_file.
    PERFORM split_data.
    IF sy-subrc IS INITIAL.
      CONCATENATE 'Entrées lues du fichier' p_file INTO w_concat SEPARATED BY space.
      WRITE: /5 w_concat, 52 ' : ', 69 w_lus.
      CONCATENATE 'Entrées insérées dans la table ' p_table INTO w_concat SEPARATED BY space.
      WRITE: /5 w_concat, 52 ' : ', 69 w_cpt.
      CONCATENATE 'Erreurs lors insertion ds table' p_table INTO w_concat SEPARATED BY space.
      WRITE: /5 w_concat, 52 ' : ', 69 w_err.
    ENDIF.
*    ENDIF.
*suppression
  ELSEIF p_dele EQ 'X'.
    CALL FUNCTION 'POPUP_TO_CONFIRM'
     EXPORTING
      titlebar                    = 'Suppression entrées'
*   DIAGNOSE_OBJECT             = ' '
    text_question               = 'Etes-vous sur de vouloir supprimer les entrées de table?'
    text_button_1               = 'Oui'
    icon_button_1               = 'ICON_OKAY'
    text_button_2               = 'Non'
    icon_button_2               = 'ICON_CANCEL '
*   DEFAULT_BUTTON              = '1'
    display_cancel_button       = ''
*   USERDEFINED_F1_HELP         = ' '
*   START_COLUMN                = 25
*   START_ROW                   = 6
*   POPUP_TYPE                  =
*   IV_QUICKINFO_BUTTON_1       = ' '
*   IV_QUICKINFO_BUTTON_2       = ' '
  IMPORTING
    answer                      = w_ans
* TABLES
*   PARAMETER                   =
  EXCEPTIONS
    text_not_found              = 1
    OTHERS                      = 2.
    IF w_ans EQ '1'.
      DELETE FROM (p_table).
      IF sy-subrc IS INITIAL.
        CONCATENATE 'Entrées supprimées dans la table' p_table INTO w_concat SEPARATED BY space.
        WRITE: /5 w_concat.
      ENDIF.
    ENDIF.
  ENDIF.
*&---------------------------------------------------------------------*
*&      Form  OUVERTURE_FICHIER_INPUT
*&---------------------------------------------------------------------*
FORM ouverture_fichier_input USING p_file.
  DATA lv_filename TYPE string.
  CALL FUNCTION 'GUI_UPLOAD'
    EXPORTING
      filename                = p_file
    TABLES
      data_tab                = t_line
    EXCEPTIONS
      conversion_error        = 1
      file_open_error         = 2
      file_read_error         = 3
      invalid_table_width     = 4
      invalid_type            = 5
      no_batch                = 6
      unknown_error           = 7
      gui_refuse_filetransfer = 8
      OTHERS                  = 9.

  IF sy-subrc <> 0.
    MESSAGE 'Erreur à l''ouverture du fichier en entrée' TYPE 'E' DISPLAY LIKE 'I'.
    EXIT.
  ENDIF.
ENDFORM.                    " OUVERTURE_FICHIER_INPUT
*&---------------------------------------------------------------------*
*&      Form  OUVERTURE_FICHIER_OUTPUT
*&---------------------------------------------------------------------*
FORM ouverture_fichier_output USING p_file.
  DATA l_file TYPE string.

  l_file = p_file.
  CALL FUNCTION 'GUI_DOWNLOAD'
  EXPORTING
     filename         = l_file
     filetype         = 'ASC'
*    mode             = ' '
     write_field_separator = ';'
*  IMPORTING
*    filelength       = l_filelength
  TABLES
      data_tab         = t_line
  EXCEPTIONS
      file_write_error        = 1
      no_batch                = 2
      gui_refuse_filetransfer = 3
      invalid_type            = 4
      no_authority            = 5
      unknown_error           = 6
      header_not_allowed      = 7
      separator_not_allowed   = 8
      filesize_not_allowed    = 9
      header_too_long         = 10
      dp_error_create         = 11
      dp_error_send           = 12
      dp_error_write          = 13
      unknown_dp_error        = 14
      access_denied           = 15
      dp_out_of_memory        = 16
      disk_full               = 17
      dp_timeout              = 18
      file_not_found          = 19
      dataprovider_exception  = 20
      control_flush_error     = 21.
  IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
            WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ELSE.
    CLEAR w_concat.
    CONCATENATE 'Entrées de' p_table 'transmises au fichier' INTO w_concat SEPARATED BY space.
    WRITE: /5 w_concat, 55 ':',69 w_cpt.
  ENDIF.

ENDFORM.                    " OUVERTURE_FICHIER_OUTPUT
*&---------------------------------------------------------------------*
*&      Form  GET_DATA
*&---------------------------------------------------------------------*
FORM get_data.
  DATA: BEGIN OF lt_dd03p  OCCURS 0.
          INCLUDE STRUCTURE dd03p.
  DATA: END OF lt_dd03p.
*Recup de la structure de table
  CALL FUNCTION 'DDIF_TABL_GET'
    EXPORTING
      name      = p_table
      langu     = sy-langu
    TABLES
      dd03p_tab = lt_dd03p.

  SELECT * FROM (p_table) INTO TABLE <table>.

  LOOP AT <table> INTO <wa>.
    CLEAR s_line.
*___transmission des noms de colonnes de la table
    AT FIRST.
      LOOP AT lt_dd03p.
        CONCATENATE s_line lt_dd03p-fieldname INTO s_line
                    SEPARATED BY p_sep.
      ENDLOOP.
      IF NOT s_line IS INITIAL.
*_______suppression du separateur de debut de chaine
        SHIFT s_line LEFT.
*_______chargement dans la table des données exportées
        APPEND s_line TO t_line.
        CLEAR s_line.
      ENDIF.
    ENDAT.
    DO.
      ASSIGN COMPONENT sy-index OF STRUCTURE <wa> TO <concat>.
      IF sy-subrc IS INITIAL.
*_______pour les champs de pack, on le transfère ds un champ
*_______caractere pour permettre la concatenation
        DESCRIBE FIELD <concat> TYPE w_type.
        IF w_type EQ 'P'.
          w_p = <concat>.
          SHIFT w_p LEFT DELETING LEADING space.
          CONCATENATE s_line w_p INTO s_line SEPARATED BY p_sep.
        ELSEIF w_type EQ 'D'.
          w_d = <concat>.
          CONCATENATE s_line w_d INTO s_line SEPARATED BY p_sep.
        ELSE.
          CONCATENATE s_line <concat> INTO s_line SEPARATED BY p_sep.
        ENDIF.
      ELSE.
        IF NOT s_line IS INITIAL.
*_________suppression du separateur de debut de chaine
          SHIFT s_line LEFT.
          APPEND s_line TO t_line.
          ADD 1 TO w_cpt.
        ENDIF.
        EXIT.
      ENDIF.
    ENDDO.
  ENDLOOP.
ENDFORM.                    " GET_DATA
*&---------------------------------------------------------------------*
*&      Form  SPLIT_DATA
*&---------------------------------------------------------------------*
FORM split_data.
  CLEAR w_cpt.
  CLEAR w_err.
  CLEAR w_lus.

  LOOP AT t_line INTO s_line.
    ADD 1 TO w_lus.
    CLEAR <wa>.
    DO.
      ASSIGN COMPONENT sy-index OF STRUCTURE <wa> TO <split>.
      IF sy-subrc IS INITIAL.
*_______pour les zones de types p de la structure, on charge dans une
*_______variable de travail de type c puis on transfère vers la zone
        CLEAR w_type.
        DESCRIBE FIELD <split> TYPE w_type.
        IF w_type EQ 'P'.
          CLEAR w_p.
          SPLIT s_line AT p_sep INTO w_p s_line.
          <split> = w_p.
        ELSEIF w_type EQ 'D'.
          CLEAR w_d.
          SPLIT s_line AT p_sep INTO w_d s_line.
          <split> = w_d.
        ELSE.
          SPLIT s_line AT p_sep INTO <split> s_line.
        ENDIF.
      ELSE.
*_______append des valeurs dans la TI
        IF NOT <wa> IS INITIAL.
          INSERT (p_table) FROM <wa>.
          IF sy-subrc IS INITIAL.
            ADD 1 TO w_cpt.
          ELSE.
            ADD 1 TO w_err.
          ENDIF.
        ENDIF.
        EXIT.
      ENDIF.
    ENDDO.
  ENDLOOP.
ENDFORM.                    " SPLIT_DATA
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: [UTIL] Utilitaire de chargement/déchargement/vidage de table (spécifique)

Messagede thoul » 05 Mai 2011, 10:32

Voici une nouvelle version du programme avec les évolutions suivantes:

-restitution du nombre de ligne supprimées lors du vidage d'une table
-possibilité d'intégrer un fichier avec/sans 1ere ligne d'en-tête
-évolution sur traitement des zones non character-like.
L'ancienne version utilisait des zones "tampon" character-like pour pouvoir effectuer les split/concatenate, ces zones étant de longueurs fixes (pas dynamiques et potentiellement pas adaptées à certains champs).
Le nouveau programme détecte les zones n'étant pas de type char, et créé dynamiquement une zone char-like de longueur adéquat pour gérer le split/concatenate.

La prochaine évolution portera sur la restitution en ALV des erreurs d'intégration survenues lors d'un chargement de table.

Toutes vos remarques/demandes d'évo ou évolutions sont évidemment les bienvenues

Code: Tout sélectionner
*&---------------------------------------------------------------------*
*& Report Z_UTIL_TABLE                                                 *
*&                                                                     *
*&---------------------------------------------------------------------*
* Dév.   Date        Description                                       *
*----------------------------------------------------------------------*
* THE   05.02.10     Création du prog de chargement/vidage table spé   *
*----------------------------------------------------------------------*
REPORT z_util_table NO STANDARD PAGE HEADING.

DATA w_cpt TYPE i.
DATA w_err TYPE i.
DATA w_lus TYPE i.

DATA: w_ans(1) TYPE c.
DATA: s_line(3000) TYPE c. "Ligne de travail pour transfert des donnees
*TI des données sortantes
DATA: t_line LIKE TABLE OF s_line.
DATA: w_type(1) TYPE c.
DATA: wa_dd02l TYPE dd02l.                                  "#EC NEEDED
DATA t_table TYPE REF TO data.
DATA s_table_line TYPE REF TO data.
DATA wt_path TYPE filetable.
DATA w_user_action TYPE i.
DATA w_rc TYPE i.
DATA w_concat(200) TYPE c.

*field-symbols
FIELD-SYMBOLS: <table> TYPE STANDARD TABLE.
FIELD-SYMBOLS: <wa> TYPE ANY.
FIELD-SYMBOLS: <concat> TYPE ANY.
FIELD-SYMBOLS: <split> TYPE ANY.

*ecran de sélection
SELECTION-SCREEN BEGIN OF BLOCK bloc WITH FRAME.
PARAMETERS: p_table TYPE ddobjname OBLIGATORY.
SELECTION-SCREEN SKIP.
PARAMETERS: p_file TYPE string
                   DEFAULT 'C:\Temp\table.txt' LOWER CASE MODIF ID fil.
PARAMETERS: p_sep(1) TYPE c DEFAULT '|' MODIF ID fil.  "séparateur de champs
SELECTION-SCREEN BEGIN OF BLOCK bloc2.
PARAMETERS p_down RADIOBUTTON GROUP gr1 USER-COMMAND ck1.
PARAMETERS p_load RADIOBUTTON GROUP gr1 DEFAULT 'X'.
PARAMETERS p_dele RADIOBUTTON GROUP gr1.
SELECTION-SCREEN END OF BLOCK bloc2.
SELECTION-SCREEN END OF BLOCK bloc.

AT SELECTION-SCREEN ON p_table.
  IF p_table(1) NE 'Z' AND
     p_table(1) NE 'Y'.
    SET CURSOR FIELD 'P_TABLE'.
    MESSAGE 'La table ne peut être qu''une spécifique' TYPE 'E'.
  ENDIF.
  SELECT tabname UP TO 1 ROWS FROM dd02l INTO wa_dd02l-tabname
                              WHERE tabname EQ p_table.
  ENDSELECT.
  IF NOT sy-subrc IS INITIAL.
    SET CURSOR FIELD 'P_TABLE'.
    MESSAGE 'La table n''existe pas dans le système' TYPE 'E'.
  ENDIF.

AT SELECTION-SCREEN OUTPUT.
  LOOP AT SCREEN.
    IF screen-group1 EQ 'FIL'.
      IF p_down EQ 'X' OR
         p_load EQ 'X' .
        screen-input = 1.
        MODIFY SCREEN.
      ELSE.
        screen-input = 0.
        MODIFY SCREEN.
      ENDIF.
    ENDIF.
  ENDLOOP.

AT SELECTION-SCREEN ON RADIOBUTTON GROUP gr1.
  IF p_load EQ 'X' OR
     p_down EQ 'X'.
    IF p_file IS INITIAL.
      MESSAGE 'Veuillez renseigner le chemin de fichier' TYPE 'E' DISPLAY LIKE 'I'.
    ENDIF.
    IF p_sep IS INITIAL.
      MESSAGE 'Veuillez renseigner le séparateur de zones' TYPE 'E' DISPLAY LIKE 'I'.
    ENDIF.
  ENDIF.

AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file.
  CALL METHOD cl_gui_frontend_services=>file_open_dialog
    EXPORTING
      window_title            = 'Recherche fichier'
      default_filename        = 'table.txt'
    CHANGING
      file_table              = wt_path
      rc                      = w_rc
      user_action             = w_user_action
    EXCEPTIONS
      file_open_dialog_failed = 1
      cntl_error              = 2
      error_no_gui            = 3
      not_supported_by_gui    = 4
      OTHERS                  = 5.
  IF w_user_action = cl_gui_frontend_services=>action_cancel.
    CLEAR p_file.
  ELSE.
    LOOP AT wt_path INTO p_file.
      EXIT.
    ENDLOOP.
  ENDIF.

START-OF-SELECTION.
  CREATE DATA t_table TYPE TABLE OF (p_table).
  CREATE DATA s_table_line TYPE (p_table).
  ASSIGN t_table->* TO  <table>.
  ASSIGN s_table_line->* TO <wa>.

  IF p_down EQ 'X'.
*___lecture des données de la table
    PERFORM get_data.
*___si la table des données concaténées n'est pas vide
    IF NOT t_line[] IS INITIAL.
      PERFORM ouverture_fichier_output USING p_file.
    ELSE.
      CONCATENATE 'Aucune donnée extraite de la table' p_table INTO w_concat SEPARATED BY space.
      WRITE: /5 w_concat.
    ENDIF.
  ELSEIF p_load EQ 'X'.
*ouverture du fichier entrant
    PERFORM ouverture_fichier_input USING p_file.
    PERFORM split_data.
    IF sy-subrc IS INITIAL.
      w_concat = 'Entrées lues du fichier'.
      WRITE: /5 w_concat, 52 ' : ', 69 w_lus.
      CONCATENATE 'Entrées insérées dans la table ' p_table INTO w_concat SEPARATED BY space.
      WRITE: /5 w_concat, 52 ' : ', 69 w_cpt.
      CONCATENATE 'Erreurs lors insertion ds table' p_table INTO w_concat SEPARATED BY space.
      WRITE: /5 w_concat, 52 ' : ', 69 w_err.
    ENDIF.
*    ENDIF.
*suppression
  ELSEIF p_dele EQ 'X'.
    CALL FUNCTION 'POPUP_TO_CONFIRM'
     EXPORTING
      titlebar                    = 'Suppression entrées'
*   DIAGNOSE_OBJECT             = ' '
    text_question               = 'Etes-vous sur de vouloir supprimer les entrées de table?'
    text_button_1               = 'Oui'
    icon_button_1               = 'ICON_OKAY'
    text_button_2               = 'Non'
    icon_button_2               = 'ICON_CANCEL '
*   DEFAULT_BUTTON              = '1'
    display_cancel_button       = ''
*   USERDEFINED_F1_HELP         = ' '
*   START_COLUMN                = 25
*   START_ROW                   = 6
*   POPUP_TYPE                  =
*   IV_QUICKINFO_BUTTON_1       = ' '
*   IV_QUICKINFO_BUTTON_2       = ' '
  IMPORTING
    answer                      = w_ans
* TABLES
*   PARAMETER                   =
  EXCEPTIONS
    text_not_found              = 1
    OTHERS                      = 2.
    IF sy-subrc IS INITIAL.
      IF w_ans EQ '1'.
        DELETE FROM (p_table).
        IF sy-subrc IS INITIAL.
          CONCATENATE 'Entrées supprimées table' p_table INTO w_concat SEPARATED BY space.
          WRITE: /5 w_concat, 52 ' : ', 69 sy-dbcnt.
        ENDIF.
      ENDIF.
    ENDIF.
  ENDIF.
*&---------------------------------------------------------------------*
*&      Form  OUVERTURE_FICHIER_INPUT
*&---------------------------------------------------------------------*
FORM ouverture_fichier_input USING p_file TYPE string.
  DATA lv_filename TYPE string.
  CALL FUNCTION 'GUI_UPLOAD'
    EXPORTING
      filename                = p_file
    TABLES
      data_tab                = t_line
    EXCEPTIONS
      file_open_error         = 1
      file_read_error         = 2
      no_batch                = 3
      gui_refuse_filetransfer = 4
      invalid_type            = 5
      no_authority            = 6
      unknown_error           = 7
      bad_data_format         = 8
      header_not_allowed      = 9
      separator_not_allowed   = 10
      header_too_long         = 11
      unknown_dp_error        = 12
      access_denied           = 13
      dp_out_of_memory        = 14
      disk_full               = 15.
  IF sy-subrc <> 0.
    MESSAGE e000(zsncf)
       WITH 'Erreur à l''ouverture du fichier en entrée' DISPLAY LIKE 'I'.
    EXIT.
  ELSE.
*___le fichier contient il des données d'en-tête
    CLEAR w_ans.
    CALL FUNCTION 'POPUP_TO_CONFIRM'
     EXPORTING
      titlebar                    = 'Fichier avec En-tête'
*     DIAGNOSE_OBJECT             = ' '
      text_question               = 'Le fichier contient-il un en-tete en premiere ligne?'
      text_button_1               = 'Oui'
      icon_button_1               = 'ICON_OKAY'
      text_button_2               = 'Non'
      icon_button_2               = 'ICON_CANCEL '
*     DEFAULT_BUTTON              = '1'
      display_cancel_button       = ''
*     USERDEFINED_F1_HELP         = ' '
*     START_COLUMN                = 25
*     START_ROW                   = 6
*     POPUP_TYPE                  =
*     IV_QUICKINFO_BUTTON_1       = ' '
*     IV_QUICKINFO_BUTTON_2       = ' '
    IMPORTING
      answer                      = w_ans
*   TABLES
*     PARAMETER                   =
    EXCEPTIONS
      text_not_found              = 1
      OTHERS                      = 2.
    IF sy-subrc IS INITIAL.
      IF w_ans EQ '1'.
        DELETE t_line INDEX 1.
      ENDIF.
    ENDIF.
  ENDIF.
ENDFORM.                    " OUVERTURE_FICHIER_INPUT
*&---------------------------------------------------------------------*
*&      Form  OUVERTURE_FICHIER_OUTPUT
*&---------------------------------------------------------------------*
FORM ouverture_fichier_output USING p_file TYPE string.
  DATA l_file TYPE string.

  l_file = p_file.
  CALL FUNCTION 'GUI_DOWNLOAD'
  EXPORTING
     filename         = l_file
     filetype         = 'ASC'
*    mode             = ' '
     write_field_separator = ';'
*  IMPORTING
*    filelength       = l_filelength
  TABLES
      data_tab         = t_line
  EXCEPTIONS
      file_write_error        = 1
      no_batch                = 2
      gui_refuse_filetransfer = 3
      invalid_type            = 4
      no_authority            = 5
      unknown_error           = 6
      header_not_allowed      = 7
      separator_not_allowed   = 8
      filesize_not_allowed    = 9
      header_too_long         = 10
      dp_error_create         = 11
      dp_error_send           = 12
      dp_error_write          = 13
      unknown_dp_error        = 14
      access_denied           = 15
      dp_out_of_memory        = 16
      disk_full               = 17
      dp_timeout              = 18
      file_not_found          = 19
      dataprovider_exception  = 20
      control_flush_error     = 21.
  IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
            WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ELSE.
    CLEAR w_concat.
    CONCATENATE 'Entrées de' p_table 'transmises au fichier' INTO w_concat SEPARATED BY space.
    WRITE: /5 w_concat, 55 ':',69 w_cpt.
  ENDIF.

ENDFORM.                    " OUVERTURE_FICHIER_OUTPUT
*&---------------------------------------------------------------------*
*&      Form  GET_DATA
*&---------------------------------------------------------------------*
FORM get_data.
  DATA lt_dd03p TYPE TABLE OF dd03p.
  DATA ls_dd03p LIKE LINE OF lt_dd03p.
  DATA lw_length TYPE i.
  DATA lw_w TYPE REF TO data.
  FIELD-SYMBOLS <ls> TYPE c.

*Recup de la structure de table
  CALL FUNCTION 'DDIF_TABL_GET'
    EXPORTING
      name      = p_table
      langu     = sy-langu
    TABLES
      dd03p_tab = lt_dd03p.

  SELECT * FROM (p_table) INTO TABLE <table>.

  LOOP AT <table> INTO <wa>.
    CLEAR s_line.
*___transmission des noms de colonnes de la table
    AT FIRST.
      LOOP AT lt_dd03p INTO ls_dd03p.
        CONCATENATE s_line ls_dd03p-fieldname INTO s_line
                    SEPARATED BY p_sep.
      ENDLOOP.
      IF NOT s_line IS INITIAL.
*_______suppression du separateur de debut de chaine
        SHIFT s_line LEFT.
*_______chargement dans la table des données exportées
        APPEND s_line TO t_line.
        CLEAR s_line.
      ENDIF.
    ENDAT.
    DO.
      ASSIGN COMPONENT sy-index OF STRUCTURE <wa> TO <concat>.
      IF sy-subrc IS INITIAL.
*_______traitement des champs character-like
        DESCRIBE FIELD <concat> TYPE w_type LENGTH lw_length IN BYTE MODE.
        IF w_type EQ 'C' OR
           w_type EQ 'D' OR
           w_type EQ 'N'.
          CONCATENATE s_line <concat> INTO s_line SEPARATED BY p_sep.
        ELSE.
*_________pour les champs non char-like (qui ne supporte pas la concatenation),
*_________on créé un champ char-like de longueur = longueur du champ actuel + 5 positions
*_________pour être sur de ne pas tronquer l'info. c'est ce champ char like qui va recevoir l'info
*_________et va servir à la concatenation
          lw_length = lw_length + 5.
          CLEAR lw_w.
          CREATE DATA lw_w TYPE c LENGTH lw_length.
          ASSIGN lw_w->* TO <ls>.
          IF sy-subrc IS INITIAL.
            <ls> = <concat>.
            SHIFT <ls> LEFT DELETING LEADING space.
            CONCATENATE s_line <ls> INTO s_line SEPARATED BY p_sep.
          ENDIF.
        ENDIF.
      ELSE.
        IF NOT s_line IS INITIAL.
*_________suppression du separateur de debut de chaine
          SHIFT s_line LEFT.
          APPEND s_line TO t_line.
          ADD 1 TO w_cpt.
        ENDIF.
        EXIT.
      ENDIF.
    ENDDO.
  ENDLOOP.
ENDFORM.                    " GET_DATA
*&---------------------------------------------------------------------*
*&      Form  SPLIT_DATA
*&---------------------------------------------------------------------*
FORM split_data.
  DATA lw_w TYPE REF TO data.
  FIELD-SYMBOLS <ls> TYPE c.
  DATA lw_length TYPE i.

  CLEAR w_cpt.
  CLEAR w_err.
  CLEAR w_lus.

  LOOP AT t_line INTO s_line.
    ADD 1 TO w_lus.
    CLEAR <wa>.
    DO.
      ASSIGN COMPONENT sy-index OF STRUCTURE <wa> TO <split>.
      IF sy-subrc IS INITIAL.
*_______pour les zones de types p de la structure, on charge dans une
*_______variable de travail de type c puis on transfère vers la zone
        CLEAR: w_type,
               lw_length.
        DESCRIBE FIELD <split> TYPE w_type LENGTH lw_length IN BYTE MODE.
        IF w_type EQ 'C' OR
           w_type EQ 'N' OR
           w_type EQ 'D'.
          SPLIT s_line AT p_sep INTO <split> s_line.
        ELSE.
*_________pour les champs non char-like (qui ne supporte pas le split),
*_________on créé un champ char-like de longueur = longueur du champ actuel + 5 positions
*_________pour être sur de ne pas tronquer l'info. c'est ce champ char like qui va recevoir l'info
*_________du split puis la transférer vers la zone finale au typage 'correct'
          lw_length = lw_length + 5.
          CLEAR lw_w.
          CREATE DATA lw_w TYPE c LENGTH lw_length.
          ASSIGN lw_w->* TO <ls>.
          IF sy-subrc IS INITIAL.
            SPLIT s_line AT p_sep INTO <ls> s_line.
            <split> = <ls>.
          ENDIF.
        ENDIF.
      ELSE.
*_______append des valeurs dans la TI
        IF NOT <wa> IS INITIAL.
          INSERT (p_table) FROM <wa>.
          IF sy-subrc IS INITIAL.
            ADD 1 TO w_cpt.
          ELSE.
            ADD 1 TO w_err.
          ENDIF.
        ENDIF.
        EXIT.
      ENDIF.
    ENDDO.
  ENDLOOP.
ENDFORM.                    " SPLIT_DATA
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: [UTIL] Utilitaire de chargement/déchargement/vidage de table (spécifique)

Messagede thoul » 30 Mai 2011, 16:35

Comme promis, voici une nouvelle version du programme contenant l'évolution suivante:
-Ajout d'un Compte-rendu des lignes erronées lors d'un chargement de table. Une grille ALV reprend les lignes du fichier ayant rencontré une erreur lors de l'insertion.

Cette évolution n'a pas de grande utilité, elle est juste un prétexte à l'utilisation d'une table interne définie dynamiquement et sa restitution en ALV.

Volontairement, la grille ALV de restitution n'est pas en ALV OO (mais avec la bonne vieille fonction REUSE_ALV_GRID_DISPLAY) de façon à pouvoir copier/coller le code directement et qu'il soit opérationnel tel que, l'ALV OO nécessitant la définition d'un dynpro (difficilement transmissible par le texte... même si le contenu de ce genre d'écran est plutôt minimal).

Code: Tout sélectionner
*&---------------------------------------------------------------------*
*& Report Z_UTIL_TABLE                                                 *
*&                                                                     *
*&---------------------------------------------------------------------*
* Dév.   Date        Description                                       *
*----------------------------------------------------------------------*
* THOUL  05.02.10       Création prog de chargement/vidage table spé   *
*----------------------------------------------------------------------*
REPORT z_util_table NO STANDARD PAGE HEADING.
TYPE-POOLS: slis.
DATA w_cpt TYPE i.
DATA w_err TYPE i.
DATA w_lus TYPE i.

DATA: w_ans(1) TYPE c.
DATA: s_line(3000) TYPE c. "Ligne de travail pour transfert des donnees
*TI des données sortantes
DATA: t_line LIKE TABLE OF s_line.
DATA: w_type(1) TYPE c.
DATA: wa_dd02l TYPE dd02l.                                  "#EC NEEDED
DATA t_table TYPE REF TO data.
DATA s_table_line TYPE REF TO data.
DATA wt_path TYPE filetable.
DATA w_user_action TYPE i.
DATA w_rc TYPE i.
DATA w_concat(200) TYPE c.
DATA: t_fieldcat_fm TYPE slis_t_fieldcat_alv, "fieldcatalog pour FM REUSE_ALV_GRID_DISPLAY
      s_layout_fm TYPE slis_layout_alv.   "layout options pour FM REUSE_ALV_GRID_DISPLAY
DATA t_excluding TYPE slis_t_extab.

*field-symbols
FIELD-SYMBOLS: <table> TYPE STANDARD TABLE.
FIELD-SYMBOLS: <wa> TYPE ANY.
FIELD-SYMBOLS: <concat> TYPE ANY.
FIELD-SYMBOLS: <split> TYPE ANY.
FIELD-SYMBOLS <t_errors> TYPE STANDARD TABLE. "table des erreurs de traitement

*ecran de sélection
SELECTION-SCREEN BEGIN OF BLOCK bloc WITH FRAME.
PARAMETERS: p_table TYPE ddobjname OBLIGATORY.
SELECTION-SCREEN SKIP.
PARAMETERS: p_file TYPE string
                   DEFAULT 'C:\Temp\table.txt' LOWER CASE MODIF ID fil.
PARAMETERS: p_sep(1) TYPE c DEFAULT '|' MODIF ID fil.  "séparateur de champs
SELECTION-SCREEN BEGIN OF BLOCK bloc2.
PARAMETERS p_down RADIOBUTTON GROUP gr1 USER-COMMAND ck1.
PARAMETERS p_load RADIOBUTTON GROUP gr1 DEFAULT 'X'.
PARAMETERS p_dele RADIOBUTTON GROUP gr1.
SELECTION-SCREEN END OF BLOCK bloc2.
SELECTION-SCREEN END OF BLOCK bloc.

AT SELECTION-SCREEN ON p_table.
  IF p_table(1) NE 'Z' AND
     p_table(1) NE 'Y'.
    SET CURSOR FIELD 'P_TABLE'.
    MESSAGE 'La table ne peut être qu''une spécifique' TYPE 'E'.
  ENDIF.
  SELECT tabname UP TO 1 ROWS FROM dd02l INTO wa_dd02l-tabname
                              WHERE tabname EQ p_table.
  ENDSELECT.
  IF NOT sy-subrc IS INITIAL.
    SET CURSOR FIELD 'P_TABLE'.
    MESSAGE 'La table n''existe pas dans le système' TYPE 'E'.
  ENDIF.

AT SELECTION-SCREEN OUTPUT.
  LOOP AT SCREEN.
    IF screen-group1 EQ 'FIL'.
      IF p_down EQ 'X' OR
         p_load EQ 'X' .
        screen-input = 1.
        MODIFY SCREEN.
      ELSE.
        screen-input = 0.
        MODIFY SCREEN.
      ENDIF.
    ENDIF.
  ENDLOOP.

AT SELECTION-SCREEN ON RADIOBUTTON GROUP gr1.
  IF p_load EQ 'X' OR
     p_down EQ 'X'.
    IF p_file IS INITIAL.
      MESSAGE 'Veuillez renseigner le chemin de fichier' TYPE 'E' DISPLAY LIKE 'I'.
    ENDIF.
    IF p_sep IS INITIAL.
      MESSAGE 'Veuillez renseigner le séparateur de zones' TYPE 'E' DISPLAY LIKE 'I'.
    ENDIF.
  ENDIF.

AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file.
  CALL METHOD cl_gui_frontend_services=>file_open_dialog
    EXPORTING
      window_title            = 'Recherche fichier'
      default_filename        = 'table.txt'
    CHANGING
      file_table              = wt_path
      rc                      = w_rc
      user_action             = w_user_action
    EXCEPTIONS
      file_open_dialog_failed = 1
      cntl_error              = 2
      error_no_gui            = 3
      not_supported_by_gui    = 4
      OTHERS                  = 5.
  IF w_user_action = cl_gui_frontend_services=>action_cancel.
    CLEAR p_file.
  ELSE.
    LOOP AT wt_path INTO p_file.
      EXIT.
    ENDLOOP.
  ENDIF.

START-OF-SELECTION.
  CREATE DATA t_table TYPE TABLE OF (p_table).
  CREATE DATA s_table_line TYPE (p_table).
  ASSIGN t_table->* TO  <table>.
  ASSIGN s_table_line->* TO <wa>.

  IF p_down EQ 'X'.
*___lecture des données de la table
    PERFORM get_data.
*___si la table des données concaténées n'est pas vide
    IF NOT t_line[] IS INITIAL.
      PERFORM ouverture_fichier_output USING p_file.
    ELSE.
      CONCATENATE 'Aucune donnée extraite de la table' p_table INTO w_concat SEPARATED BY space.
      WRITE: /5 w_concat.
    ENDIF.
  ELSEIF p_load EQ 'X'.
*ouverture du fichier entrant
    PERFORM ouverture_fichier_input USING p_file.
    PERFORM split_data.
    IF <t_errors>[] IS INITIAL.
      w_concat = 'Entrées lues du fichier'.
      WRITE: /5 w_concat, 52 ' : ', 69 w_lus.
      CONCATENATE 'Entrées insérées dans la table ' p_table INTO w_concat SEPARATED BY space.
      WRITE: /5 w_concat, 52 ' : ', 69 w_cpt.
    ELSE.
      PERFORM prepare_field_catalog.
      PERFORM exclude_fcode_cr TABLES t_excluding.
      PERFORM display_alv_grid.
    ENDIF.

*    ENDIF.
*suppression
  ELSEIF p_dele EQ 'X'.
    CALL FUNCTION 'POPUP_TO_CONFIRM'
     EXPORTING
      titlebar                    = 'Suppression entrées'
*   DIAGNOSE_OBJECT             = ' '
    text_question               = 'Etes-vous sur de vouloir supprimer les entrées de table?'
    text_button_1               = 'Oui'
    icon_button_1               = 'ICON_OKAY'
    text_button_2               = 'Non'
    icon_button_2               = 'ICON_CANCEL '
*   DEFAULT_BUTTON              = '1'
    display_cancel_button       = ''
*   USERDEFINED_F1_HELP         = ' '
*   START_COLUMN                = 25
*   START_ROW                   = 6
*   POPUP_TYPE                  =
*   IV_QUICKINFO_BUTTON_1       = ' '
*   IV_QUICKINFO_BUTTON_2       = ' '
  IMPORTING
    answer                      = w_ans
* TABLES
*   PARAMETER                   =
  EXCEPTIONS
    text_not_found              = 1
    OTHERS                      = 2.
    IF sy-subrc IS INITIAL.
      IF w_ans EQ '1'.
        DELETE FROM (p_table).
        IF sy-subrc IS INITIAL.
          CONCATENATE 'Entrées supprimées table' p_table
          INTO w_concat SEPARATED BY space.
          WRITE: /5 w_concat, 52 ' : ', 69 sy-dbcnt.
        ENDIF.
      ENDIF.
    ENDIF.
  ENDIF.
*&---------------------------------------------------------------------*
*&      Form  OUVERTURE_FICHIER_INPUT
*&---------------------------------------------------------------------*
FORM ouverture_fichier_input USING p_file TYPE string.
  CALL FUNCTION 'GUI_UPLOAD'
    EXPORTING
      filename                = p_file
    TABLES
      data_tab                = t_line
    EXCEPTIONS
      file_open_error         = 1
      file_read_error         = 2
      no_batch                = 3
      gui_refuse_filetransfer = 4
      invalid_type            = 5
      no_authority            = 6
      unknown_error           = 7
      bad_data_format         = 8
      header_not_allowed      = 9
      separator_not_allowed   = 10
      header_too_long         = 11
      unknown_dp_error        = 12
      access_denied           = 13
      dp_out_of_memory        = 14
      disk_full               = 15.
  IF sy-subrc <> 0.
    MESSAGE 'Erreur à l''ouverture du fichier en entrée'
            TYPE 'E' DISPLAY LIKE 'I'.
    EXIT.
  ELSE.
    IF sy-batch EQ ''.
*_____le fichier contient il des données d'en-tête
      CLEAR w_ans.
      CALL FUNCTION 'POPUP_TO_CONFIRM'
       EXPORTING
        titlebar                    = 'Fichier avec En-tête'
*       DIAGNOSE_OBJECT             = ' '
        text_question               = 'Le fichier contient-il un en-tete en premiere ligne?'
        text_button_1               = 'Oui'
        icon_button_1               = 'ICON_OKAY'
        text_button_2               = 'Non'
        icon_button_2               = 'ICON_CANCEL '
*       DEFAULT_BUTTON              = '1'
        display_cancel_button       = ''
*       USERDEFINED_F1_HELP         = ' '
*       START_COLUMN                = 25
*       START_ROW                   = 6
*       POPUP_TYPE                  =
*       IV_QUICKINFO_BUTTON_1       = ' '
*       IV_QUICKINFO_BUTTON_2       = ' '
      IMPORTING
        answer                      = w_ans
*     TABLES
*       PARAMETER                   =
      EXCEPTIONS
        text_not_found              = 1
        OTHERS                      = 2.
      IF sy-subrc IS INITIAL.
        IF w_ans EQ '1'.
          DELETE t_line INDEX 1.
        ENDIF.
      ENDIF.
    ENDIF.
  ENDIF.
ENDFORM.                    " OUVERTURE_FICHIER_INPUT
*&---------------------------------------------------------------------*
*&      Form  OUVERTURE_FICHIER_OUTPUT
*&---------------------------------------------------------------------*
FORM ouverture_fichier_output USING p_file TYPE string.
  DATA l_file TYPE string.

  l_file = p_file.
  CALL FUNCTION 'GUI_DOWNLOAD'
  EXPORTING
     filename         = l_file
     filetype         = 'ASC'
*    mode             = ' '
     write_field_separator = ';'
*  IMPORTING
*    filelength       = l_filelength
  TABLES
      data_tab         = t_line
  EXCEPTIONS
      file_write_error        = 1
      no_batch                = 2
      gui_refuse_filetransfer = 3
      invalid_type            = 4
      no_authority            = 5
      unknown_error           = 6
      header_not_allowed      = 7
      separator_not_allowed   = 8
      filesize_not_allowed    = 9
      header_too_long         = 10
      dp_error_create         = 11
      dp_error_send           = 12
      dp_error_write          = 13
      unknown_dp_error        = 14
      access_denied           = 15
      dp_out_of_memory        = 16
      disk_full               = 17
      dp_timeout              = 18
      file_not_found          = 19
      dataprovider_exception  = 20
      control_flush_error     = 21.
  IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
            WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ELSE.
    CLEAR w_concat.
    CONCATENATE 'Entrées de' p_table 'transmises au fichier'
    INTO w_concat SEPARATED BY space.
    WRITE: /5 w_concat, 55 ':',69 w_cpt.
  ENDIF.

ENDFORM.                    " OUVERTURE_FICHIER_OUTPUT
*&---------------------------------------------------------------------*
*&      Form  GET_DATA
*&---------------------------------------------------------------------*
FORM get_data.
  DATA lt_dd03p TYPE TABLE OF dd03p.
  DATA ls_dd03p LIKE LINE OF lt_dd03p.
  DATA lw_length TYPE i.
  DATA lw_w TYPE REF TO data.
  FIELD-SYMBOLS <ls> TYPE c.

*Recup de la structure de table
  CALL FUNCTION 'DDIF_TABL_GET'
    EXPORTING
      name      = p_table
      langu     = sy-langu
    TABLES
      dd03p_tab = lt_dd03p.

  SELECT * FROM (p_table) INTO TABLE <table>.

  LOOP AT <table> INTO <wa>.
    CLEAR s_line.
*___transmission des noms de colonnes de la table
    AT FIRST.
      LOOP AT lt_dd03p INTO ls_dd03p.
        CONCATENATE s_line ls_dd03p-fieldname INTO s_line
                    SEPARATED BY p_sep.
      ENDLOOP.
      IF NOT s_line IS INITIAL.
*_______suppression du separateur de debut de chaine
        SHIFT s_line LEFT.
*_______chargement dans la table des données exportées
        APPEND s_line TO t_line.
        CLEAR s_line.
      ENDIF.
    ENDAT.
    DO.
      ASSIGN COMPONENT sy-index OF STRUCTURE <wa> TO <concat>.
      IF sy-subrc IS INITIAL.
*_______traitement des champs character-like
        DESCRIBE FIELD <concat> TYPE w_type LENGTH lw_length IN BYTE MODE.
        IF w_type EQ 'C' OR
           w_type EQ 'D' OR
           w_type EQ 'N'.
          CONCATENATE s_line <concat> INTO s_line SEPARATED BY p_sep.
        ELSE.
*_________pour les champs non char-like (qui ne supporte pas la concatenation),
*_________on créé un champ char-like de longueur = longueur du champ actuel + 5 positions
*_________pour être sur de ne pas tronquer l'info. c'est ce champ char like qui va recevoir l'info
*_________et va servir à la concatenation
          lw_length = lw_length + 5.
          CLEAR lw_w.
          CREATE DATA lw_w TYPE c LENGTH lw_length.
          ASSIGN lw_w->* TO <ls>.
          IF sy-subrc IS INITIAL.
            <ls> = <concat>.
            SHIFT <ls> LEFT DELETING LEADING space.
            CONCATENATE s_line <ls> INTO s_line SEPARATED BY p_sep.
          ENDIF.
        ENDIF.
      ELSE.
        IF NOT s_line IS INITIAL.
*_________suppression du separateur de debut de chaine
          SHIFT s_line LEFT.
          APPEND s_line TO t_line.
          ADD 1 TO w_cpt.
        ENDIF.
        EXIT.
      ENDIF.
    ENDDO.
  ENDLOOP.
ENDFORM.                    " GET_DATA
*&---------------------------------------------------------------------*
*&      Form  SPLIT_DATA
*&---------------------------------------------------------------------*
FORM split_data.
  DATA lw_w TYPE REF TO data.
  FIELD-SYMBOLS <ls> TYPE c.
  DATA lw_length TYPE i.

  CLEAR w_cpt.
  CLEAR w_err.
  CLEAR w_lus.

  LOOP AT t_line INTO s_line.
    ADD 1 TO w_lus.
    CLEAR <wa>.
    DO.
      ASSIGN COMPONENT sy-index OF STRUCTURE <wa> TO <split>.
      IF sy-subrc IS INITIAL.
*_______pour les zones de types p de la structure, on charge dans une
*_______variable de travail de type c puis on transfère vers la zone
        CLEAR: w_type,
               lw_length.
        DESCRIBE FIELD <split> TYPE w_type LENGTH lw_length IN BYTE MODE.
        IF w_type EQ 'C' OR
           w_type EQ 'N' OR
           w_type EQ 'D'.
          SPLIT s_line AT p_sep INTO <split> s_line.
        ELSE.
*_________pour les champs non char-like (qui ne supporte pas le split),
*_________on créé un champ char-like de longueur = longueur du champ actuel + 5 positions
*_________pour être sur de ne pas tronquer l'info. c'est ce champ char like qui va recevoir l'info
*_________du split puis la transférer vers la zone finale au typage 'correct'
          lw_length = lw_length + 5.
          CLEAR lw_w.
          CREATE DATA lw_w TYPE c LENGTH lw_length.
          ASSIGN lw_w->* TO <ls>.
          IF sy-subrc IS INITIAL.
            SPLIT s_line AT p_sep INTO <ls> s_line.
            <split> = <ls>.
          ENDIF.
        ENDIF.
      ELSE.
*_______append des valeurs dans la TI
        IF NOT <wa> IS INITIAL.
          INSERT (p_table) FROM <wa>.
          IF sy-subrc IS INITIAL.
            ADD 1 TO w_cpt.
          ELSE.
            ADD 1 TO w_err.
            IF w_err EQ 1.
              PERFORM create_ti_error.
            ENDIF.
            PERFORM load_error USING <wa>.
          ENDIF.
        ENDIF.
        EXIT.
      ENDIF.
    ENDDO.
  ENDLOOP.
ENDFORM.                    " SPLIT_DATA
*&---------------------------------------------------------------------*
*&      Form CREATE_TI_ERROR                                           *
*&---------------------------------------------------------------------*
*       création dynamique de la table des erreurs                     *
*----------------------------------------------------------------------*
FORM create_ti_error.
  DATA lg_typedescr TYPE REF TO cl_abap_typedescr.
  DATA lg_structdescr TYPE REF TO cl_abap_structdescr.
  DATA lt_components TYPE abap_compdescr_tab.
  DATA ls_components TYPE abap_compdescr.
  DATA ls_fc TYPE lvc_s_fcat.
  DATA lt_fc TYPE lvc_t_fcat. "field catalog de la TI des données au format interne SAP
  DATA dy_table TYPE REF TO data.

  lg_typedescr = cl_abap_tabledescr=>describe_by_name( p_table ).
  lg_structdescr ?= lg_typedescr.
  lt_components[] = lg_structdescr->components[].
  LOOP AT lt_components INTO ls_components.
    CLEAR ls_fc.
    ls_fc-fieldname = ls_components-name.
    ls_fc-inttype = ls_components-type_kind.
    ls_fc-intlen = ls_components-length.
    ls_fc-decimals = ls_components-decimals.
    APPEND ls_fc TO lt_fc.
  ENDLOOP.
  IF NOT lt_fc[] IS INITIAL.
*_____creation dynamique de la table interne des erreurs
    CALL METHOD cl_alv_table_create=>create_dynamic_table
      EXPORTING
        it_fieldcatalog  = lt_fc
        i_length_in_byte = 'X'
      IMPORTING
        ep_table         = dy_table.
    ASSIGN dy_table->* TO <t_errors>.
  ENDIF.
ENDFORM.                    " CREATE_TI_ERROR
*&---------------------------------------------------------------------*
*&      Form  LOAD_ERROR
*&---------------------------------------------------------------------*
FORM load_error USING wa TYPE any.
  APPEND wa TO <t_errors>.
ENDFORM.                    " LOAD_ERROR
*&---------------------------------------------------------------------*
*&      Form PREPARE_FIELD_CATALOG                                     *
*&---------------------------------------------------------------------*
FORM prepare_field_catalog.
  DATA lw_objname TYPE ddobjname.
  DATA lt_dd03p TYPE TABLE OF dd03p.
  DATA ls_dd03p TYPE dd03p.
  DATA ls_fieldcat TYPE slis_fieldcat_alv.
*_preparation de l'affichage
  s_layout_fm-zebra = 'X'.

*_récupération des infos d'une table
  lw_objname = p_table.
  CALL FUNCTION 'DDIF_TABL_GET'
    EXPORTING
      name      = lw_objname
      langu     = sy-langu
    TABLES
      dd03p_tab = lt_dd03p.
  SORT lt_dd03p BY position.

*_constitution du field catalog
  REFRESH t_fieldcat_fm.
  LOOP AT lt_dd03p INTO ls_dd03p.
    CLEAR ls_fieldcat.
    ls_fieldcat-tabname = ls_dd03p-tabname.
    ls_fieldcat-fieldname = ls_dd03p-fieldname.
    ls_fieldcat-seltext_l = ls_dd03p-ddtext.
    ls_fieldcat-key = ls_dd03p-keyflag.
    IF ls_dd03p-keyflag EQ 'X'.
      ls_fieldcat-fix_column = 'X'.
    ENDIF.
    ls_fieldcat-outputlen = ls_dd03p-outputlen.
    APPEND ls_fieldcat TO t_fieldcat_fm.
  ENDLOOP.
ENDFORM.                    " PREPARE_FIELD_CATALOG
*&---------------------------------------------------------------------*
*&      Form EXCLUDE_FCODE_CR                                          *
*&---------------------------------------------------------------------*
FORM exclude_fcode_cr TABLES pt_excluding TYPE slis_t_extab.
  DATA ls_excluding LIKE LINE OF pt_excluding.

  CLEAR pt_excluding[].
*_suppression Excel
  ls_excluding-fcode = '&VEXCEL'.
  APPEND ls_excluding TO pt_excluding.
*_suppression traitement de texte
  ls_excluding-fcode = '&AQW'.
  APPEND ls_excluding TO pt_excluding.
*_suppression envoi par mail
  ls_excluding-fcode = '%SL'.
  APPEND ls_excluding TO pt_excluding.
*_affichage graphique
  ls_excluding-fcode = '&GRAPH'.
  APPEND ls_excluding TO pt_excluding.
*_info ALV
  ls_excluding-fcode = '&INFO'.
  APPEND ls_excluding TO pt_excluding.
ENDFORM.                    " EXCLUDE_FCODE_CR
*&---------------------------------------------------------------------*
*&      Form HEARDER_CR_FM                                             *
*&---------------------------------------------------------------------*
FORM header_cr_fm.                                          "#EC CALLED
  DATA: lt_header TYPE slis_t_listheader,
        ls_header TYPE slis_listheader.
  ls_header-typ  = 'H'.
  ls_header-info = 'Compte-rendu d''exécution'.
  APPEND ls_header TO lt_header.

  CLEAR ls_header.
  ls_header-typ  = 'S'.
  WRITE: 'Enregistrements lus:' TO ls_header-info+0(25),
         w_lus TO ls_header-info+25.
  APPEND ls_header TO lt_header.

  CLEAR ls_header.
  ls_header-typ  = 'S'.
  WRITE: 'Enregistrements traités:' TO ls_header-info+0(25),
         w_cpt TO ls_header-info+25.
  APPEND ls_header TO lt_header.

  CLEAR ls_header.
  ls_header-typ  = 'S'.
  WRITE: 'Enregistrements erronés:' TO ls_header-info+0(25),
         w_err TO ls_header-info+25.
  APPEND ls_header TO lt_header.

  CALL FUNCTION 'REUSE_ALV_COMMENTARY_WRITE'
    EXPORTING
      it_list_commentary = lt_header.
*     I_LOGO                   =
*     I_END_OF_LIST_GRID       =
*     I_ALV_FORM               =

ENDFORM.                    "header_cr_fm
*&---------------------------------------------------------------------*
*&      Form DISPLAY_ALV_GRID                                          *
*&---------------------------------------------------------------------*
FORM display_alv_grid.
*_affichage de la grille ALV
  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
   EXPORTING
*    I_INTERFACE_CHECK                 = ' '
*    I_BYPASSING_BUFFER                = ' '
*    I_BUFFER_ACTIVE                   = ' '
     i_callback_program                = sy-repid
*    I_CALLBACK_PF_STATUS_SET          = ' '
*    I_CALLBACK_USER_COMMAND           = ' '
     i_callback_top_of_page            = 'HEADER_CR_FM'
*    I_CALLBACK_HTML_TOP_OF_PAGE       = ' '
*    I_CALLBACK_HTML_END_OF_LIST       = ' '
*    I_STRUCTURE_NAME                  =
*    I_BACKGROUND_ID                   = ' '
     i_grid_title                      = 'Erreurs survenues lors du traitement'
*    I_GRID_SETTINGS                   =
     is_layout                         = s_layout_fm
     it_fieldcat                       = t_fieldcat_fm
     it_excluding                      = t_excluding
*    IT_SPECIAL_GROUPS                 =
*    IT_SORT                           =
*    IT_FILTER                         =
*    IS_SEL_HIDE                       =
*    I_DEFAULT                         = 'X'
     i_save                            = ''
*    IS_VARIANT                        =
*    IT_EVENTS                         =
*    IT_EVENT_EXIT                     =
*    IS_PRINT                          =
*    IS_REPREP_ID                      =
*    i_screen_start_column             =
*    i_screen_start_line               =
*    I_SCREEN_END_COLUMN               = 0
*    I_SCREEN_END_LINE                 = 0
*    I_HTML_HEIGHT_TOP                 = 0
*    I_HTML_HEIGHT_END                 = 0
*    IT_ALV_GRAPHICS                   =
*    IT_HYPERLINK                      =
*    IT_ADD_FIELDCAT                   =
*    IT_EXCEPT_QINFO                   =
*    IR_SALV_FULLSCREEN_ADAPTER        =
*  IMPORTING
*    E_EXIT_CAUSED_BY_CALLER           =
*    ES_EXIT_CAUSED_BY_USER            =
   TABLES
     t_outtab                          = <t_errors>
   EXCEPTIONS
     program_error                     = 1
     OTHERS                            = 2.
  IF NOT sy-subrc IS INITIAL.
  ENDIF.
ENDFORM.                    " DISPLAY_ALV_GRID
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: [UTIL] Utilitaire de chargement/déchargement/vidage de table (spécifique)

Messagede thoul » 05 Janvier 2015, 14:36

Bonjour à tous,
Voici une nouvelle version du petit utilitaire de chargement/déchargement/purge des tables spécifiques avec les évolutions suivantes:

-Gestion des zones de table avec routines de conversion: Dans le cas d'un chargement de table dont certaines zones contiennent une routine de conversion, le programme convertit la valeur provenant du fichier en format interne SAP à l'aide de la routine avant d'enregistrer les données en Base.

-Gestion du mandant: En cas de téléchargement vers une table mandant-dépendant, le fichier entrant doit contenir la colonne mandant mais le contenu de cette colonne n'est pas pris en compte. Le programme renseigne la valeur du mandant sur lequel le traitement est exécuté
-Gestion du séparateur tabulation et du format fixe: ces options étant utilisables autant au télédéchargement qu'au téléchargement

-Gestion de la mise à jour en Base: Il est possible de lancer le téléchargement sur une table contenant djà des données. Le traitement contrôle alors si l'entrée est déjà existante avant de faire une insertiont en Base ou une Mise à jour de la ligne déjà présente

-Gestion du Compte-rendu de traitement: Un compte-rendu est systématiquement affiché en fin de traitement, en format grille ALV. L'en-tete contient le CR d'exécution (Nbre de lignes lues, traitées, erronées, supprimées) et la grille contient les potentielles lignes en erreur lors du traitement, avec le colonnage repris de la table spécifique en cours de traitement et une colonne MESSAGE contenant l'erreur rencontrée.
L'affichage ALV est géré par une Grille en ALV OO utilisant la classe SALV (pas de création de dynpro, affichage ALV fullscreen)

-Getion des exceptions lors de la MàJ en Base: Traitement de certaines exceptions lors des instructions INSERT et UPDATE. Prise en compte de ces exceptions en tant qu'erreurs dans le CR d'exécution

Evidemment, si vous avez des remarques/retours à faire sur le sujet, n'hésitez pas, le forum est fait (aussi) pour cela.

Une dernière précision enfin
L'ensemble des textes en dur ont été supprimés au profit de symboles de textes (pour les rendre gérables en traduction). L'affichage ALV nécessite aussi la création d'un statut SALV_STANDARD (que j'ai pour ma part copié du statut STANDARD_FULLSCREEN du programme SAPLKKBL)
Pour ces raisons (et peut-être d'autres inconnues), le programme n'est pas totalement "portable" par un simple copié/collé du code. Les libellés, messages d'erreur manqueront et, si on n'affecte pas le statut qui va bien, le CR d'exécution n'aura pas de boutons de navigations.
Si vous n'arrivez pas à vous débrouiller avec cela, n'hésitez pas à me contacter en MP. Je vous transmettrais : Soit la "grille" des symboles de texte à ajouter dans votre programme, soit le fichier SAPLINK à intégrer (et pour le coup, plus rien à faire!!)


Thomas

Code: Tout sélectionner
*&---------------------------------------------------------------------*
*& Report Z_UTIL_TABLE_COPY                                            *
*&                                                                     *
*&---------------------------------------------------------------------*
* Dév.   Date        Description                                       *
*----------------------------------------------------------------------*
* THO   05.02.2010   Creation                                          *
*----------------------------------------------------------------------*
REPORT z_util_table NO STANDARD PAGE HEADING.
*_TYPES
TYPES: BEGIN OF ty_primarykey,
         fieldname TYPE dd03l-fieldname,
       END OF ty_primarykey.
*Structure containing processing error messages
*the structure field has to be named like c_message_fieldname value
*Doing so, internal table for errors <TA_ERRORS> could be easily filled
*with the error message (using move-corresponding)
TYPES: BEGIN OF ty_message,
         message TYPE bapiret2-message,
       END OF ty_message.

*_Structures and internal tables
DATA st_message TYPE ty_message.
DATA st_line(3000) TYPE c. "work area for up/downloading data
DATA ta_line LIKE TABLE OF st_line.
DATA st_dd02l TYPE dd02l.                                   "#EC NEEDED
DATA st_dd02v TYPE dd02v.
DATA ta_table TYPE REF TO data.
DATA st_table_line TYPE REF TO data.
DATA ta_path TYPE filetable.
DATA ta_primarykey TYPE TABLE OF ty_primarykey.
DATA st_primarykey LIKE LINE OF ta_primarykey.
DATA st_struc TYPE REF TO data.

*_Variables
DATA v_ans(1) TYPE c.
DATA v_type(1) TYPE c.
DATA v_user_action TYPE i.
DATA v_rc TYPE i.
DATA v_text TYPE string.
DATA v_cpt TYPE i.
DATA v_err TYPE i.
DATA v_lus TYPE i.

*_Constants
CONSTANTS c_message_fieldname TYPE fieldname VALUE 'MESSAGE'.
CONSTANTS c_default_filename TYPE string VALUE 'table.txt'.

*_Field-symbols
FIELD-SYMBOLS <table> TYPE STANDARD TABLE.
FIELD-SYMBOLS <structure> TYPE ANY.
FIELD-SYMBOLS <wa> TYPE ANY.
FIELD-SYMBOLS <wa2> TYPE ANY. "second work area with processed table lookalike structure
FIELD-SYMBOLS <concat> TYPE ANY.
FIELD-SYMBOLS <split> TYPE ANY.
FIELD-SYMBOLS <ta_errors> TYPE STANDARD TABLE. "Internal Table for processing errors
FIELD-SYMBOLS <st_errors> TYPE ANY.            "Structure for processing errors

*_Classes
DATA gr_content TYPE REF TO cl_salv_form_element.

*_Selection-screen
SELECTION-SCREEN BEGIN OF BLOCK bloc WITH FRAME.
SELECTION-SCREEN BEGIN OF BLOCK bl1 WITH FRAME TITLE text-t31.
PARAMETERS: p_table TYPE ddobjname MATCHCODE OBJECT dd_dbtb_16.
SELECTION-SCREEN SKIP.
SELECTION-SCREEN BEGIN OF BLOCK bloc2.
PARAMETERS p_down RADIOBUTTON GROUP gr1 USER-COMMAND ck1 DEFAULT 'X'.
PARAMETERS p_updt RADIOBUTTON GROUP gr1.
PARAMETERS p_dele RADIOBUTTON GROUP gr1.
SELECTION-SCREEN END OF BLOCK bloc2.
SELECTION-SCREEN END OF BLOCK bl1.
SELECTION-SCREEN SKIP.

SELECTION-SCREEN BEGIN OF BLOCK bl2 WITH FRAME TITLE text-t32.
PARAMETERS: p_file TYPE string
                   DEFAULT 'C:\' LOWER CASE MODIF ID fil.
SELECTION-SCREEN SKIP.
SELECTION-SCREEN BEGIN OF BLOCK bloc3.
PARAMETERS p_fix RADIOBUTTON GROUP gr USER-COMMAND ck2 MODIF ID sep .
PARAMETERS p_tab RADIOBUTTON GROUP gr MODIF ID sep DEFAULT 'X' .
PARAMETERS p_other RADIOBUTTON GROUP gr MODIF ID sep.
PARAMETERS: p_sep(1) TYPE c DEFAULT '|' MODIF ID sep.  "field separator
SELECTION-SCREEN END OF BLOCK bloc3.
SELECTION-SCREEN END OF BLOCK bl2.
SELECTION-SCREEN END OF BLOCK bloc.

*_EVENTS
AT SELECTION-SCREEN ON p_table.
  IF sy-ucomm NE 'CK1' AND
     sy-ucomm NE 'CK2'.
    IF p_table(1) NE 'Z' AND
       p_table(1) NE 'Y'.
      SET CURSOR FIELD 'P_TABLE'.
      MESSAGE text-t04 TYPE 'E'.
    ENDIF.
    CLEAR st_dd02l.
    SELECT tabname UP TO 1 ROWS FROM dd02l INTO st_dd02l-tabname
                                WHERE tabname EQ p_table.
    ENDSELECT.
    IF NOT sy-subrc IS INITIAL.
      SET CURSOR FIELD 'P_TABLE'.
      MESSAGE text-t05 TYPE 'E'.
    ENDIF.
  ENDIF.

AT SELECTION-SCREEN ON RADIOBUTTON GROUP gr1.
  IF p_dele EQ 'X'.
    SET CURSOR FIELD 'P_DELE'.
    PERFORM check_entries USING p_table.
  ELSEIF p_down EQ 'X'.
    SET CURSOR FIELD 'P_DOWN'.
    PERFORM check_entries USING p_table.
  ENDIF.

AT SELECTION-SCREEN OUTPUT.
  LOOP AT SCREEN.
    IF screen-group1 EQ 'FIL' OR
       screen-group1 EQ 'SEP'.
      IF p_down EQ 'X' OR
         p_updt EQ 'X' .
        screen-input = 1.
        screen-invisible = 0.
        MODIFY SCREEN.
      ELSE.
        screen-input = 0.
        screen-invisible = 1.
        MODIFY SCREEN.
      ENDIF.
    ENDIF.
    IF screen-name CP '*P_SEP*'.
      IF p_tab EQ 'X' OR
         p_fix EQ 'X'.
        screen-input = 0.
        screen-invisible = 1.
*        screen-required  = 0.
        MODIFY SCREEN.
      ENDIF.
    ENDIF.
  ENDLOOP.

AT SELECTION-SCREEN.
  IF p_updt EQ 'X' OR
     p_down EQ 'X'.
    IF p_table IS INITIAL.
      SET CURSOR FIELD 'P_TABLE'.
      MESSAGE text-t06 TYPE 'E' DISPLAY LIKE 'I'.
    ENDIF.
    IF p_file IS INITIAL.
      SET CURSOR FIELD 'P_FILE'.
      MESSAGE text-t07 TYPE 'E' DISPLAY LIKE 'I'.
    ENDIF.
    IF p_other EQ 'X' AND
       p_sep IS INITIAL.
      SET CURSOR FIELD 'P_SEP'.
      MESSAGE text-t08 TYPE 'E' DISPLAY LIKE 'I'.
    ENDIF.
  ENDIF.
  IF p_dele EQ 'X'.
    IF p_table IS INITIAL.
      p_dele = ''.
      p_updt = 'X'.
      SET CURSOR FIELD 'P_TABLE'.
      MESSAGE text-t09 TYPE 'E' DISPLAY LIKE 'I'.
    ENDIF.
  ENDIF.

*_Search Help for local file
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file.
  CLEAR v_text.
  v_text = text-t19.
  CALL METHOD cl_gui_frontend_services=>file_open_dialog
    EXPORTING
      window_title            = v_text
      default_filename        = c_default_filename
    CHANGING
      file_table              = ta_path
      rc                      = v_rc
      user_action             = v_user_action
    EXCEPTIONS
      file_open_dialog_failed = 1
      cntl_error              = 2
      error_no_gui            = 3
      not_supported_by_gui    = 4
      OTHERS                  = 5.
  IF v_user_action = cl_gui_frontend_services=>action_cancel.
    CLEAR p_file.
  ELSE.
    LOOP AT ta_path INTO p_file.
      EXIT.
    ENDLOOP.
  ENDIF.

START-OF-SELECTION.
*_Get table designation
  CLEAR st_dd02v.
  CALL FUNCTION 'DDIF_TABL_GET'
    EXPORTING
      name                = p_table
*     STATE               = 'A'
      langu               = sy-langu
    IMPORTING
*     GOTSTATE            =
      dd02v_wa            = st_dd02v
*     DD09L_WA            =
*   TABLES
*     DD03P_TAB           =
*     DD05M_TAB           =
*     DD08V_TAB           =
*     DD12V_TAB           =
*     DD17V_TAB           =
*     DD35V_TAB           =
*     DD36M_TAB           =
    EXCEPTIONS
      illegal_input       = 1
      OTHERS              = 2.
  IF NOT sy-subrc IS INITIAL.
    CLEAR v_text.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
            WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4
            INTO v_text.
  ENDIF.

*_get Tabulation field-separator
  IF p_tab EQ 'X'.
    p_sep = cl_abap_char_utilities=>horizontal_tab.
  ENDIF.

  CREATE DATA ta_table TYPE TABLE OF (p_table).
  CREATE DATA st_table_line TYPE (p_table).
  ASSIGN ta_table->* TO  <table>.
  ASSIGN st_table_line->* TO <wa>.
  ASSIGN st_table_line->* TO <wa2>.

  IF <ta_errors> IS ASSIGNED.
    UNASSIGN <ta_errors>.
  ENDIF.
  IF <st_errors> IS ASSIGNED.
    UNASSIGN <st_errors>.
  ENDIF.

*DOWLOADING data into local file
  IF p_down EQ 'X'.
*___get table data
    PERFORM get_data.
*___if IT is filled
    IF NOT ta_line[] IS INITIAL.
      PERFORM ouverture_fichier_output USING p_file.
    ENDIF.
*___display ALV
    PERFORM alv_header CHANGING gr_content.
    PERFORM display_alv_grid.

*UPDATING data from local file
  ELSEIF p_updt EQ 'X'.
*___open incoming file
    PERFORM ouverture_fichier_input USING p_file.
*___read data and update DB table
    PERFORM split_data.
*___display ALV
    PERFORM alv_header CHANGING gr_content.
    PERFORM display_alv_grid.

*DELETING data from DB table
  ELSEIF p_dele EQ 'X'.
    PERFORM dele_table.
  ENDIF.
*&---------------------------------------------------------------------*
*&      Form OUVERTURE_FICHIER_INPUT                                   *
*&---------------------------------------------------------------------*
FORM ouverture_fichier_input USING p_file TYPE string.
  CALL FUNCTION 'GUI_UPLOAD'
    EXPORTING
      filename                = p_file
    TABLES
      data_tab                = ta_line
    EXCEPTIONS
      file_open_error         = 1
      file_read_error         = 2
      no_batch                = 3
      gui_refuse_filetransfer = 4
      invalid_type            = 5
      no_authority            = 6
      unknown_error           = 7
      bad_data_format         = 8
      header_not_allowed      = 9
      separator_not_allowed   = 10
      header_too_long         = 11
      unknown_dp_error        = 12
      access_denied           = 13
      dp_out_of_memory        = 14
      disk_full               = 15.
  IF sy-subrc <> 0.
    MESSAGE text-t16
            TYPE 'E' DISPLAY LIKE 'I'.
    EXIT.
  ELSE.
    IF sy-batch EQ ''.
*_____Is the file containing header?
      CLEAR v_ans.
      CALL FUNCTION 'POPUP_TO_CONFIRM'
       EXPORTING
        titlebar                    = text-t17
*       DIAGNOSE_OBJECT             = ' '
        text_question               = text-t18
        text_button_1               = text-t28
        icon_button_1               = 'ICON_OKAY'
        text_button_2               = text-t29
        icon_button_2               = 'ICON_CANCEL '
*       DEFAULT_BUTTON              = '1'
        display_cancel_button       = ''
*       USERDEFINED_F1_HELP         = ' '
*       START_COLUMN                = 25
*       START_ROW                   = 6
*       POPUP_TYPE                  =
*       IV_QUICKINFO_BUTTON_1       = ' '
*       IV_QUICKINFO_BUTTON_2       = ' '
      IMPORTING
        answer                      = v_ans
*     TABLES
*       PARAMETER                   =
      EXCEPTIONS
        text_not_found              = 1
        OTHERS                      = 2.
      IF sy-subrc IS INITIAL.
        IF v_ans EQ '1'.
          DELETE ta_line INDEX 1.
        ENDIF.
      ENDIF.
    ENDIF.
  ENDIF.
ENDFORM.                    " OUVERTURE_FICHIER_INPUT
*&---------------------------------------------------------------------*
*&      Form OUVERTURE_FICHIER_OUTPUT                                  *
*&---------------------------------------------------------------------*
FORM ouverture_fichier_output USING p_file TYPE string.
  DATA l_file TYPE string.

  l_file = p_file.
  CALL FUNCTION 'GUI_DOWNLOAD'
  EXPORTING
      filename         = l_file
      filetype         = 'ASC'
*     mode             = ' '
*     write_field_separator =
*   IMPORTING
*     filelength       = l_filelength
  TABLES
      data_tab         = ta_line
  EXCEPTIONS
      file_write_error        = 1
      no_batch                = 2
      gui_refuse_filetransfer = 3
      invalid_type            = 4
      no_authority            = 5
      unknown_error           = 6
      header_not_allowed      = 7
      separator_not_allowed   = 8
      filesize_not_allowed    = 9
      header_too_long         = 10
      dp_error_create         = 11
      dp_error_send           = 12
      dp_error_write          = 13
      unknown_dp_error        = 14
      access_denied           = 15
      dp_out_of_memory        = 16
      disk_full               = 17
      dp_timeout              = 18
      file_not_found          = 19
      dataprovider_exception  = 20
      control_flush_error     = 21.
  IF sy-subrc <> 0.
    PERFORM create_ti_error USING 'X'.
    CLEAR v_text.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
            WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4 INTO v_text.
    PERFORM load_error USING <wa>
                             v_text.
  ENDIF.

ENDFORM.                    " OUVERTURE_FICHIER_OUTPUT
*&---------------------------------------------------------------------*
*&      Form GET_DATA                                                  *
*&---------------------------------------------------------------------*
FORM get_data.
  DATA lt_dd03p TYPE TABLE OF dd03p.
  DATA ls_dd03p LIKE LINE OF lt_dd03p.
  DATA lv_w TYPE REF TO data.
  DATA lv_length TYPE i.
  FIELD-SYMBOLS <ls> TYPE c.
  FIELD-SYMBOLS <structure> TYPE ANY.

*_get table structure
  CALL FUNCTION 'DDIF_TABL_GET'
    EXPORTING
      name      = p_table
      langu     = sy-langu
    TABLES
      dd03p_tab = lt_dd03p.
*_get table data
  SELECT * FROM (p_table) INTO TABLE <table>.

  IF p_fix EQ 'X'.
*___dynamic creation of table strucure with
*___character type fields only
    PERFORM create_structure TABLES lt_dd03p
                             USING p_table.
    ASSIGN st_struc->* TO <structure>.
*___fill character type strucure with data entries
    IF <structure> IS ASSIGNED.
      LOOP AT <table> INTO <wa>.
        CLEAR: <structure>,
               st_line.
        MOVE-CORRESPONDING <wa> TO <structure>.
        st_line = <structure>.

        APPEND st_line TO ta_line.
        IF sy-subrc IS INITIAL.
          ADD 1 TO v_cpt.
        ENDIF.
      ENDLOOP.
    ELSE.
      ADD 1 TO v_err.
      IF v_err EQ 1.
        PERFORM create_ti_error USING 'X'.
      ENDIF.
      CLEAR v_text.
      v_text = text-t03.
      PERFORM load_error USING <wa>
                               v_text.
    ENDIF.
  ELSEIF p_tab EQ 'X' OR
         p_other EQ 'X'.
    LOOP AT <table> INTO <wa>.
      CLEAR st_line.
*_____get columns names
      AT FIRST.
        LOOP AT lt_dd03p INTO ls_dd03p.
          CONCATENATE st_line ls_dd03p-fieldname INTO st_line
                      SEPARATED BY p_sep.
        ENDLOOP.
        IF NOT st_line IS INITIAL.
*_________delete first separator
          SHIFT st_line LEFT.
*_________fill the downloaded IT
          APPEND st_line TO ta_line.
          CLEAR st_line.
        ENDIF.
      ENDAT.
      DO.
        ASSIGN COMPONENT sy-index OF STRUCTURE <wa> TO <concat>.
        IF sy-subrc IS INITIAL.
          CLEAR ls_dd03p.
          READ TABLE lt_dd03p INTO ls_dd03p INDEX sy-index.
*_________character-like field processing
          IF ls_dd03p-inttype EQ 'C' OR
             ls_dd03p-inttype EQ 'D' OR
             ls_dd03p-inttype EQ 'N'.
            CONCATENATE st_line <concat> INTO st_line SEPARATED BY p_sep.
          ELSE.
*___________not character-like fields (can't be concatened)
*___________a similar character-like field is created (same length)
*___________it receive the data instead of the "real" one and
*___________is use for concatenation
            lv_length = ls_dd03p-leng.
            CLEAR lv_w.
            CREATE DATA lv_w TYPE c LENGTH lv_length.
            ASSIGN lv_w->* TO <ls>.
            IF sy-subrc IS INITIAL.
              <ls> = <concat>.
              SHIFT <ls> LEFT DELETING LEADING space.
              CONCATENATE st_line <ls> INTO st_line SEPARATED BY p_sep.
            ENDIF.
          ENDIF.
        ELSE.
          IF NOT st_line IS INITIAL.
*___________delete first separator
            SHIFT st_line LEFT.
            APPEND st_line TO ta_line.
            ADD 1 TO v_cpt.
          ENDIF.
          EXIT.
        ENDIF.
      ENDDO.
    ENDLOOP.
  ENDIF.
ENDFORM.                    " GET_DATA
*&---------------------------------------------------------------------*
*&      Form SPLIT_DATA                                                *
*&---------------------------------------------------------------------*
FORM split_data.
  DATA lv_w TYPE REF TO data.
  FIELD-SYMBOLS <ls> TYPE c.
  DATA lv_length TYPE i.
  DATA lt_dd03p TYPE TABLE OF dd03p.
  DATA ls_dd03p LIKE LINE OF lt_dd03p.
  DATA lv_mandt_key(1) TYPE c.
  DATA oref  TYPE REF TO cx_root.
  DATA lv_funcname TYPE tfdir-funcname.
  CONSTANTS lc_conv(25) TYPE c VALUE 'CONVERSION_EXIT_'.
  CONSTANTS lc_input(10) TYPE c VALUE '_INPUT'.

  CLEAR v_cpt.
  CLEAR v_err.
  CLEAR v_lus.

*_check if table is Client dependant
*_(MANDT field as the first primary key field)
  CALL FUNCTION 'DDIF_TABL_GET'
    EXPORTING
      name                = p_table
*     STATE               = 'A'
*     LANGU               = ' '
*   IMPORTING
*     GOTSTATE            =
*     DD02V_WA            =
*     DD09L_WA            =
    TABLES
      dd03p_tab           = lt_dd03p
*     DD05M_TAB           =
*     DD08V_TAB           =
*     DD12V_TAB           =
*     DD17V_TAB           =
*     DD35V_TAB           =
*     DD36M_TAB           =
    EXCEPTIONS
      illegal_input       = 1
      OTHERS              = 2.
  IF sy-subrc EQ 0.
    READ TABLE lt_dd03p INTO ls_dd03p INDEX 1.
*___Is the first field 'MANDT'?
*___Is it primary key?
    IF sy-subrc IS INITIAL.
      IF ls_dd03p-fieldname EQ 'MANDT' AND
         ls_dd03p-keyflag EQ 'X'.
        lv_mandt_key = 'X'.
      ENDIF.
    ENDIF.
*___get primary key list for processed table
    CLEAR: ta_primarykey[].
    LOOP AT lt_dd03p INTO ls_dd03p
                     WHERE keyflag EQ 'X'.
      CLEAR st_primarykey.
      st_primarykey-fieldname = ls_dd03p-fieldname.
      APPEND st_primarykey TO ta_primarykey.
    ENDLOOP.
  ELSE.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
            WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ENDIF.

*_fixed format processing
  IF p_fix EQ 'X'.
*___dynamic creation of table strucure with
*___character type fields only
    PERFORM create_structure TABLES lt_dd03p
                             USING p_table.
    ASSIGN st_struc->* TO <structure>.
    IF <structure> IS ASSIGNED.
      LOOP AT ta_line INTO st_line.
        ADD 1 TO v_lus.

        <structure> = st_line.
        CLEAR <wa>.
        MOVE-CORRESPONDING <structure> TO <wa>.

*_______process conversion exits for eligible fields
        DO.
          ASSIGN COMPONENT sy-index OF STRUCTURE <wa> TO <split>.
          IF sy-subrc IS INITIAL.
            CLEAR ls_dd03p.
            READ TABLE lt_dd03p INTO ls_dd03p INDEX sy-index.
            IF NOT ls_dd03p-convexit IS INITIAL.
              CONCATENATE lc_conv
                          ls_dd03p-convexit
                          lc_input
                          INTO lv_funcname.
*_____________does the conversion exit exist?
              SELECT SINGLE funcname FROM tfdir
                                     INTO lv_funcname
                                     WHERE funcname EQ lv_funcname.
              IF sy-subrc IS INITIAL.
*_______________if so, submit conversion exit
                CALL FUNCTION lv_funcname
                  EXPORTING
                    input  = <split>
                  IMPORTING
                    output = <split>.
              ENDIF.
            ENDIF.
          ELSE.
            EXIT.
          ENDIF.
        ENDDO.

        IF NOT <wa> IS INITIAL.
          PERFORM insert_to_table.
        ENDIF.
      ENDLOOP.
    ELSE.
      ADD 1 TO v_err.
      IF v_err EQ 1.
        PERFORM create_ti_error USING 'X'.
      ENDIF.
      CLEAR v_text.
      v_text = text-t03.
      PERFORM load_error USING <wa>
                               v_text.
    ENDIF.
  ELSEIF p_tab EQ 'X' OR
         p_other EQ 'X'.
    LOOP AT ta_line INTO st_line.
      ADD 1 TO v_lus.

*_____check if field separator is found
      FIND FIRST OCCURRENCE OF p_sep IN st_line.
      IF NOT sy-subrc IS INITIAL.
        ADD 1 TO v_err.
        IF v_err EQ 1.
          PERFORM create_ti_error USING space.
        ENDIF.

        CLEAR v_text.
        IF p_tab EQ 'X'.
          CONCATENATE text-t30
                      'Tab'
                      INTO v_text
                      SEPARATED BY space.
        ELSEIF p_other EQ 'X'.
          CONCATENATE text-t30
                      p_sep
                      INTO v_text
                      SEPARATED BY space.
        ENDIF.
        PERFORM load_error USING <wa>
                                 v_text.
        CONTINUE.
      ENDIF.

      CLEAR <wa>.
      DO.
        ASSIGN COMPONENT sy-index OF STRUCTURE <wa> TO <split>.
        IF sy-subrc IS INITIAL.
          CLEAR: v_type,
                 lv_length.
          DESCRIBE FIELD <split> TYPE v_type LENGTH lv_length IN BYTE MODE.
*_________character like fields
          IF v_type EQ 'C' OR
             v_type EQ 'N' OR
             v_type EQ 'D'.
            SPLIT st_line AT p_sep INTO <split> st_line.
*___________if table is client dependant
*___________client value doesn't come from file but
*___________is forced with current Client value
            IF sy-index EQ 1 AND
               lv_mandt_key EQ 'X'.
              <split> = sy-mandt.
              CLEAR lv_mandt_key.
            ENDIF.
          ELSE.
*___________not character-like fields (can't be concatened)
*___________a similar character-like field is created (length = length + 5) to be sure it will be large enough
*___________it receive the data instead of the "real" field and
*___________is use for concatenation
            lv_length = lv_length + 5.
            CLEAR lv_w.
            CREATE DATA lv_w TYPE c LENGTH lv_length.
            ASSIGN lv_w->* TO <ls>.
            IF sy-subrc IS INITIAL.
              SPLIT st_line AT p_sep INTO <ls> st_line.
*_____________exceptions management when transferring data to the "real" non character-like field
              CLEAR v_text.
              TRY.
                  <split> = <ls>.
                CATCH cx_sy_conversion_no_number
                      cx_sy_conversion_overflow
                      cx_sy_move_cast_error
                      INTO oref.
                  v_text = oref->get_text( ).
              ENDTRY.
              IF NOT v_text IS INITIAL.
                ADD 1 TO v_err.
                IF v_err EQ 1.
                  PERFORM create_ti_error USING space.
                ENDIF.
                PERFORM load_error USING <wa>
                                         v_text.
                EXIT.
              ENDIF.
            ENDIF.
          ENDIF.

*_________process conversion exits for eligible fields
          CLEAR ls_dd03p.
          READ TABLE lt_dd03p INTO ls_dd03p INDEX sy-index.
          IF NOT ls_dd03p-convexit IS INITIAL.
            CONCATENATE lc_conv
                        ls_dd03p-convexit
                        lc_input
                        INTO lv_funcname.
*___________Does the conversion exit exists?
            SELECT SINGLE funcname FROM tfdir
                                   INTO lv_funcname
                                   WHERE funcname EQ lv_funcname.
            IF sy-subrc IS INITIAL.
*_____________if so, submit conversion exit
              CALL FUNCTION lv_funcname
                EXPORTING
                  input  = <split>
                IMPORTING
                  output = <split>.
            ENDIF.
          ENDIF.

        ELSE.
*_________update database table
          IF NOT <wa> IS INITIAL.
            PERFORM insert_to_table.
          ENDIF.
          EXIT.
        ENDIF.
      ENDDO.
    ENDLOOP.
  ENDIF.
ENDFORM.                    " SPLIT_DATA
*&---------------------------------------------------------------------*
*&      Form CREATE_TI_ERROR                                           *
*&---------------------------------------------------------------------*
*      Dynamic creation of processing errors Internal table <TA_ERRORS>*
*----------------------------------------------------------------------*
* P_MESSAGE_ONLY-->This flag indicates ITable only needs 'MESSAGE' fld *
*                  Only use when the first error met stops the process *
*----------------------------------------------------------------------*
FORM create_ti_error USING p_message_only TYPE char01.
  DATA lr_typedescr TYPE REF TO cl_abap_typedescr.
  DATA lr_structdescr TYPE REF TO cl_abap_structdescr.
  DATA lt_components TYPE abap_compdescr_tab.
  DATA ls_components TYPE abap_compdescr.
  DATA lt_tab TYPE abap_component_tab.
  DATA ls_tab TYPE abap_componentdescr.
  DATA lr_tabledescr TYPE REF TO cl_abap_tabledescr.

  IF p_message_only IS INITIAL.
*___get field list from the processed table
    lr_typedescr = cl_abap_tabledescr=>describe_by_name( p_table ).
    lr_structdescr ?= lr_typedescr.
    lt_components[] = lr_structdescr->components[].
  ENDIF.

*_add 'Message' field to be filled with processing error messages
  CLEAR ls_components.
  ls_components-name = c_message_fieldname.
  ls_components-type_kind = 'C'.
  ls_components-length = 220.
  APPEND ls_components TO lt_components.

  LOOP AT lt_components INTO ls_components.
    ls_tab-name = ls_components-name.
    CASE ls_components-type_kind.
      WHEN cl_abap_datadescr=>typekind_string.
        ls_tab-type = cl_abap_elemdescr=>get_string( ).
      WHEN cl_abap_datadescr=>typekind_xstring.
        ls_tab-type = cl_abap_elemdescr=>get_xstring( ).
      WHEN cl_abap_datadescr=>typekind_int.
        ls_tab-type = cl_abap_elemdescr=>get_i( ).
      WHEN cl_abap_datadescr=>typekind_float.
        ls_tab-type = cl_abap_elemdescr=>get_f( ).
      WHEN cl_abap_datadescr=>typekind_date.
        ls_tab-type = cl_abap_elemdescr=>get_d( ).
      WHEN cl_abap_datadescr=>typekind_time.
        ls_tab-type = cl_abap_elemdescr=>get_t( ).
      WHEN cl_abap_datadescr=>typekind_char.
        ls_tab-type = cl_abap_elemdescr=>get_c( p_length = ls_components-length ).
      WHEN cl_abap_datadescr=>typekind_num.
        ls_tab-type = cl_abap_elemdescr=>get_n( p_length = ls_components-length ).
      WHEN cl_abap_datadescr=>typekind_hex.
        ls_tab-type = cl_abap_elemdescr=>get_x( p_length = ls_components-length ).
      WHEN cl_abap_datadescr=>typekind_packed.
        ls_tab-type = cl_abap_elemdescr=>get_p( p_length = ls_components-length
                                                p_decimals = ls_components-decimals ).
    ENDCASE.
    APPEND ls_tab TO lt_tab.
  ENDLOOP.

*_dynamic creation of processing errors Work Area and Internal Table
  IF <st_errors> IS ASSIGNED.
    UNASSIGN <st_errors>.
  ENDIF.
  lr_structdescr = cl_abap_structdescr=>create( lt_tab ).
  CREATE DATA st_struc TYPE HANDLE lr_structdescr.
  ASSIGN st_struc->* TO <st_errors>.

  IF <ta_errors> IS ASSIGNED.
    UNASSIGN <ta_errors>.
  ENDIF.
  lr_tabledescr = cl_abap_tabledescr=>create( p_line_type  = lr_structdescr ).
  CREATE DATA ta_table TYPE HANDLE lr_tabledescr.
  ASSIGN ta_table->* TO <ta_errors>.
ENDFORM.                    " CREATE_TI_ERROR
*&---------------------------------------------------------------------*
*&      Form LOAD_ERROR                                                *
*&---------------------------------------------------------------------*
FORM load_error USING wa TYPE any
                      p_message TYPE string.

  CLEAR st_message.
  st_message-message = p_message.

  IF <ta_errors> IS ASSIGNED.
    IF <st_errors> IS ASSIGNED.
      MOVE-CORRESPONDING wa TO <st_errors>.
      MOVE-CORRESPONDING st_message TO <st_errors>.
      IF NOT <st_errors> IS INITIAL.
        APPEND <st_errors> TO <ta_errors>.
      ENDIF.
    ENDIF.
  ENDIF.

ENDFORM.                    " LOAD_ERROR
*&---------------------------------------------------------------------*
*&      Form DISPLAY_ALV_GRID                                          *
*&---------------------------------------------------------------------*
FORM display_alv_grid.
  DATA lr_table TYPE REF TO cl_salv_table.
  DATA lr_columns TYPE REF TO cl_salv_columns.
  DATA lr_aggregations TYPE REF TO cl_salv_aggregations.
  DATA lo_columns TYPE REF TO cl_salv_columns_table.
  DATA lr_display TYPE REF TO cl_salv_display_settings.
  DATA lr_functions TYPE REF TO cl_salv_functions_list.
  DATA lr_oref TYPE REF TO cx_root.
  DATA lt_fieldcatalog TYPE lvc_t_fcat.
  DATA ls_fieldcatalog LIKE LINE OF lt_fieldcatalog.
  DATA lt_dd03p TYPE TABLE OF dd03p.
  DATA ls_dd03p LIKE LINE OF lt_dd03p.
  DATA lv_title TYPE lvc_title.

  IF <ta_errors> IS NOT ASSIGNED.
    PERFORM create_ti_error USING 'X'.
  ENDIF.

  TRY.
      cl_salv_table=>factory(
        IMPORTING
          r_salv_table = lr_table
        CHANGING
          t_table      = <ta_errors> ).
    CATCH cx_salv_msg INTO lr_oref.                     "#EC NO_HANDLER
      CLEAR v_text.
      v_text = lr_oref->get_text( ).
  ENDTRY.

*_set SALV_STANDARD status to ALV grid (copy of SAPLKKBL/STANDARD_FULLSCREEN status)
  lr_table->set_screen_status(
    pfstatus      =  'SALV_STANDARD'
    report        =  sy-repid
    set_functions = lr_table->c_functions_all ).
*_hide some standard ALV functions
  lr_functions = lr_table->get_functions( ).
  lr_functions->set_view_excel( abap_false ).
  lr_functions->set_export_wordprocessor( abap_false ).
  lr_functions->set_export_mail( abap_false ).
  lr_functions->set_export_send( abap_false ).
  lr_functions->set_export_html( abap_false ).
  lr_functions->set_print_preview( abap_false ).
  lr_functions->set_graphics( abap_false ).

* get aggregation
  lr_aggregations = lr_table->get_aggregations( ).

* get field catalog to set columns designations
  lo_columns = lr_table->get_columns( ).
  lr_columns = lr_table->get_columns( ).
  REFRESH lt_fieldcatalog.
  lt_fieldcatalog = cl_salv_controller_metadata=>get_lvc_fieldcatalog( r_columns = lo_columns
                                                                       r_aggregations = lr_aggregations ).

*_set ALV title
  lr_display = lr_table->get_display_settings( ).
  CLEAR v_text.
  lv_title = text-t26.
  lr_display->set_list_header( lv_title ).

*_get information of processed table to set columns designations in fieldcat
  REFRESH lt_dd03p.
  CALL FUNCTION 'DDIF_TABL_GET'
    EXPORTING
      name      = p_table
      langu     = sy-langu
    TABLES
      dd03p_tab = lt_dd03p.
  SORT lt_dd03p BY fieldname ASCENDING.

  LOOP AT lt_fieldcatalog INTO ls_fieldcatalog.
    CLEAR ls_dd03p.
    READ TABLE lt_dd03p INTO ls_dd03p
                        WITH KEY fieldname = ls_fieldcatalog-fieldname
                        BINARY SEARCH.
    IF sy-subrc IS INITIAL.
      MOVE-CORRESPONDING ls_dd03p TO ls_fieldcatalog.
      MODIFY lt_fieldcatalog FROM ls_fieldcatalog.
    ELSEIF ls_fieldcatalog-fieldname EQ c_message_fieldname.
      ls_fieldcatalog-scrtext_s = c_message_fieldname.
      ls_fieldcatalog-scrtext_m = c_message_fieldname.
      ls_fieldcatalog-scrtext_l = c_message_fieldname.
      MODIFY lt_fieldcatalog FROM ls_fieldcatalog.
    ENDIF.
  ENDLOOP.

*_set updated Field Catalog
  CALL METHOD cl_salv_controller_metadata=>set_lvc_fieldcatalog
    EXPORTING
      t_fieldcatalog = lt_fieldcatalog
      r_columns      = lo_columns
      r_aggregations = lr_aggregations.

*_optimize columns width
  lr_columns->set_optimize( 'X' ).
*_display ALV header
  lr_table->set_top_of_list( gr_content ).
*_display ALV
  lr_table->display( ).

ENDFORM.                    " DISPLAY_ALV_GRID
*&---------------------------------------------------------------------*
*&      Form CREATE_STRUCTURE                                          *
*&---------------------------------------------------------------------*
FORM create_structure TABLES pt_dd03p STRUCTURE dd03p
                      USING pv_table TYPE ddobjname.
  DATA lr_typedescr TYPE REF TO cl_abap_typedescr.
  DATA lr_structdescr TYPE REF TO cl_abap_structdescr.
  DATA lt_components TYPE abap_compdescr_tab.
  DATA lt_components_crea TYPE abap_component_tab.
  DATA ls_components_crea TYPE abap_componentdescr.
  DATA ls_components TYPE abap_compdescr.
  DATA lt_dd03p TYPE TABLE OF dd03p.
  DATA ls_dd03p TYPE dd03p.
  DATA lv_length TYPE i.
  DATA lv_text TYPE string.

  IF <structure> IS ASSIGNED.
    UNASSIGN <structure>.
  ENDIF.

*Recup de la structure de table
  lt_dd03p[] = pt_dd03p[].
  SORT lt_dd03p BY fieldname ASCENDING.

  lr_typedescr = cl_abap_tabledescr=>describe_by_name( pv_table ).
  lr_structdescr ?= lr_typedescr.
  lt_components[] = lr_structdescr->components[].
  LOOP AT lt_components INTO ls_components.
    ls_components_crea-name = ls_components-name.
    CLEAR lv_length.
    READ TABLE lt_dd03p INTO ls_dd03p
                        WITH KEY fieldname = ls_components-name
                        BINARY SEARCH.
    IF sy-subrc IS INITIAL.
      lv_length = ls_dd03p-leng.
    ELSE.
      ADD 1 TO v_err.
      IF v_err EQ 1.
        PERFORM create_ti_error USING space.
      ENDIF.
      CLEAR lv_text.
      lv_text = text-t02.
      PERFORM load_error USING <wa>
                               lv_text.
      EXIT.
    ENDIF.
    ls_components_crea-type = cl_abap_elemdescr=>get_c( p_length =  lv_length ).
    APPEND ls_components_crea TO lt_components_crea.
  ENDLOOP.

  lr_structdescr = cl_abap_structdescr=>create( lt_components_crea ).
  CREATE DATA st_struc TYPE HANDLE lr_structdescr.

  REFRESH lt_dd03p.
  CLEAR lt_dd03p.
ENDFORM.                    " CREATE_STRUCTURE
*&---------------------------------------------------------------------*
*&      Form INSERT_TO_TABLE                                           *
*&---------------------------------------------------------------------*
FORM insert_to_table.
  DATA lv_where_cond TYPE string.
  DATA lv_value TYPE string.
  DATA lv_text TYPE string.

  IF <split> IS ASSIGNED.
    UNASSIGN <split>.
  ENDIF.
  DO.
    ASSIGN COMPONENT sy-index OF STRUCTURE <wa> TO <split>.
    IF sy-subrc IS INITIAL.
      CLEAR st_primarykey.
      READ TABLE ta_primarykey INTO st_primarykey INDEX sy-index.
      IF sy-subrc IS INITIAL.
        IF sy-index EQ 1 AND
           st_primarykey-fieldname EQ 'MANDT'.
          CONTINUE.
        ENDIF.
        IF NOT lv_where_cond IS INITIAL.
          CONCATENATE lv_where_cond
                      'AND'
                      INTO lv_where_cond
                      SEPARATED BY space.
        ENDIF.
        CONCATENATE ''''
                    <split>
                    ''''
                    INTO lv_value.
        CONCATENATE lv_where_cond
                    st_primarykey-fieldname
                    'eq'
                    lv_value
                    INTO lv_where_cond
                    SEPARATED BY space.
      ELSE.
        EXIT.
      ENDIF.
    ENDIF.
  ENDDO.

  IF NOT lv_where_cond IS INITIAL.
    IF <wa2> IS ASSIGNED.
      SELECT SINGLE FOR UPDATE *
                    FROM (p_table)
                    INTO <wa2>
                    WHERE (lv_where_cond).
      IF sy-subrc IS INITIAL.
        UPDATE (p_table) FROM <wa>.
      ELSE.
        INSERT (p_table) FROM <wa>.
      ENDIF.
    ENDIF.
  ENDIF.

*_database update is OK
  IF sy-subrc IS INITIAL.
    ADD 1 TO v_cpt.
  ELSE.
*___database update is KO-->fill processing errors table with table entry and message
    ADD 1 TO v_err.
    CLEAR lv_text.
    lv_text = text-t01.

    IF v_err EQ 1.
      PERFORM create_ti_error USING space.
    ENDIF.
    PERFORM load_error USING <wa>
                             lv_text.
  ENDIF.

ENDFORM.                    " INSERT_TO_TABLE

*&---------------------------------------------------------------------*
*&      Form ALV_header                                                *
*&---------------------------------------------------------------------*
*      ALV header to display processing Report                         *
*----------------------------------------------------------------------*
*      -->CR_CONTENT ALV grid header                                   *
*----------------------------------------------------------------------*
FORM alv_header CHANGING cr_content TYPE REF TO cl_salv_form_element.
  DATA lr_grid TYPE REF TO cl_salv_form_layout_grid.
  DATA lr_grid_1 TYPE REF TO cl_salv_form_layout_grid.
  DATA lr_label TYPE REF TO cl_salv_form_label.
  DATA lr_text TYPE REF TO cl_salv_form_text.
  DATA lv_cpt_char(10) TYPE c.

  CREATE OBJECT lr_grid.

  IF p_down EQ 'X'.
    CLEAR v_text.
    CONCATENATE text-t20
                p_table
                '('
                st_dd02v-ddtext
                ')'
                INTO v_text
                SEPARATED BY space.
    lr_grid->create_header_information(
      row    = 1
      column = 1
      text    = v_text
      tooltip = v_text ).
*___new line
    lr_grid->add_row( ).

    lr_grid_1 = lr_grid->create_grid(
                  row    = 3
                  column = 1 ).

    CLEAR lv_cpt_char.
    WRITE v_cpt TO lv_cpt_char.

    CLEAR v_text.
    v_text = text-t21.
    lr_label = lr_grid_1->create_label(
      row     = 1
      column  = 1
      text    = v_text
      tooltip = v_text ).

    CLEAR lv_cpt_char.
    WRITE v_cpt TO lv_cpt_char.

    CLEAR v_text.
    v_text = lv_cpt_char.
    lr_text = lr_grid_1->create_text(
      row     = 1
      column  = 2
      text    = v_text
      tooltip = v_text ).

    lr_label->set_label_for( lr_text ).
  ELSEIF p_updt EQ 'X'.
    CLEAR v_text.
    CONCATENATE text-t22
                p_table
                '('
                st_dd02v-ddtext
                ')'
                INTO v_text
                SEPARATED BY space.
    lr_grid->create_header_information(
      row    = 1
      column = 1
      text    = v_text
      tooltip = v_text ).
*___new line
    lr_grid->add_row( ).

    lr_grid_1 = lr_grid->create_grid(
                  row    = 3
                  column = 1 ).

    CLEAR lv_cpt_char.
    WRITE v_cpt TO lv_cpt_char.

    CLEAR v_text.
    v_text = text-t11.
    lr_label = lr_grid_1->create_label(
      row     = 1
      column  = 1
      text    = v_text
      tooltip = v_text ).

*___number of read lines
    CLEAR lv_cpt_char.
    WRITE v_lus TO lv_cpt_char.

    CLEAR v_text.
    v_text = lv_cpt_char.
    lr_text = lr_grid_1->create_text(
      row     = 1
      column  = 2
      text    = v_text
      tooltip = v_text ).

*___nuber of processed lines
    CLEAR v_text.
    v_text = text-t12.
    lr_label = lr_grid_1->create_label(
      row     = 2
      column  = 1
      text    = v_text
      tooltip = v_text ).

    CLEAR lv_cpt_char.
    WRITE v_cpt TO lv_cpt_char.

    CLEAR v_text.
    v_text = lv_cpt_char.
    lr_text = lr_grid_1->create_text(
      row     = 2
      column  = 2
      text    = v_text
      tooltip = v_text ).

*___number of errors
    CLEAR v_text.
    v_text = text-t23.
    lr_label = lr_grid_1->create_label(
      row     = 3
      column  = 1
      text    = v_text
      tooltip = v_text ).

    CLEAR lv_cpt_char.
    WRITE v_err TO lv_cpt_char.

    CLEAR v_text.
    v_text = lv_cpt_char.
    lr_text = lr_grid_1->create_text(
      row     = 3
      column  = 2
      text    = v_text
      tooltip = v_text ).

    lr_label->set_label_for( lr_text ).
  ELSEIF p_dele EQ 'X'.
    CLEAR v_text.
    CONCATENATE text-t24
                p_table
                '('
                st_dd02v-ddtext
                ')'
                INTO v_text
                SEPARATED BY space.
    lr_grid->create_header_information(
      row    = 1
      column = 1
      text    = v_text
      tooltip = v_text ).
*___new line
    lr_grid->add_row( ).

    lr_grid_1 = lr_grid->create_grid(
                  row    = 3
                  column = 1 ).

    CLEAR lv_cpt_char.
    WRITE v_cpt TO lv_cpt_char.

    CLEAR v_text.
    v_text = text-t15.
    lr_label = lr_grid_1->create_label(
      row     = 1
      column  = 1
      text    = v_text
      tooltip = v_text ).

*___nonumber of deleted lines
    CLEAR lv_cpt_char.
    WRITE v_cpt TO lv_cpt_char.

    CLEAR v_text.
    v_text = lv_cpt_char.
    lr_text = lr_grid_1->create_text(
      row     = 1
      column  = 2
      text    = v_text
      tooltip = v_text ).
  ENDIF.

  cr_content = lr_grid.
ENDFORM.                    " alv_header
*&---------------------------------------------------------------------*
*&      Form DELE_TABLE                                                *
*&---------------------------------------------------------------------*
FORM dele_table.
  CLEAR v_ans.
  CALL FUNCTION 'POPUP_TO_CONFIRM'
   EXPORTING
    titlebar                  = text-t13
*   DIAGNOSE_OBJECT             = ' '
    text_question               = text-t14
    text_button_1               = text-t28
    icon_button_1               = 'ICON_OKAY'
    text_button_2               = 'Non'
    icon_button_2               = 'ICON_CANCEL '
*   DEFAULT_BUTTON              = '1'
    display_cancel_button       = ''
*   USERDEFINED_F1_HELP         = ' '
*   START_COLUMN                = 25
*   START_ROW                   = 6
*   POPUP_TYPE                  =
*   IV_QUICKINFO_BUTTON_1       = ' '
*   IV_QUICKINFO_BUTTON_2       = ' '
  IMPORTING
    answer                      = v_ans
* TABLES
*   PARAMETER                   =
  EXCEPTIONS
    text_not_found              = 1
    OTHERS                      = 2.
  IF sy-subrc IS INITIAL.
    IF v_ans EQ '1'.
      DELETE FROM (p_table).
      IF sy-subrc IS INITIAL.
        CLEAR v_cpt.
        v_cpt = sy-dbcnt.
      ELSE.
        PERFORM create_ti_error USING 'X'.
        CLEAR v_text.
        v_text = text-t25.
        PERFORM load_error USING <wa>
                                 v_text.
      ENDIF.
*_______affichage CR
      PERFORM alv_header CHANGING gr_content.
      PERFORM display_alv_grid.
    ENDIF.
  ENDIF.
ENDFORM.                    " DELE_TABLE
*&---------------------------------------------------------------------*
*&      Form CHECK_ENTRIES                                             *
*&---------------------------------------------------------------------*
FORM check_entries USING p_table TYPE ddobjname.
  IF NOT p_table IS INITIAL.
    SELECT COUNT( * ) FROM (p_table).
    IF NOT sy-subrc IS INITIAL.
      MESSAGE text-t27 TYPE 'E'.
    ENDIF.
  ENDIF.
ENDFORM.                    " CHECK_ENTRIES
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