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


News