[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 senior
Posteur senior
 
Messages: 25
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 senior
Posteur senior
 
Messages: 25
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 senior
Posteur senior
 
Messages: 25
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 senior
Posteur senior
 
Messages: 25
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