W Pub: ABAP Prog Propios MIG Tab 3

  1. REPORT z_upload_any_table.
  2.  
  3. PARAMETERS: p_tab  TYPE dd02l-tabname DEFAULT 'MY_TAB' OBLIGATORY.
  4. SELECTION-SCREEN BEGIN OF BLOCK b01 WITH FRAME.
  5.   PARAMETERS: p_datf   TYPE c LENGTH 10 OBLIGATORY DEFAULT 'DD/MM/YYYY',
  6.               p_header AS CHECKBOX DEFAULT 'X',
  7.               p_mandt  AS CHECKBOX DEFAULT 'X'.
  8. SELECTION-SCREEN END OF BLOCK b01.
  9. PARAMETERS: p_wipe AS CHECKBOX DEFAULT ' ',
  10.             p_test AS CHECKBOX DEFAULT 'X'.
  11. PARAMETERS: p_max TYPE tbmaxsel DEFAULT 0.
  12.  
  13.  
  14. CLASS z_csv_import DEFINITION.
  15. *--[
  16. *--[ From: https://blogs.sap.com/2015/04/04/tip-how-to-upload-csv-files-via-abap-easily/
  17. *--[
  18.   PUBLIC SECTION.
  19.  
  20.     DATA: modo_test   TYPE xfeld,
  21.           data_format TYPE string,
  22.           has_header  TYPE xfeld,
  23.           has_mandt   TYPE xfeld,
  24.           has_max     TYPE tbmaxsel.
  25.  
  26.     METHODS Constructor.
  27.  
  28.     METHODS load_csv_file
  29.       IMPORTING
  30.         VALUE(i_filename) TYPE String OPTIONAL.
  31.  
  32.     METHODS transform_csv_data
  33.       IMPORTING
  34.         VALUE(i_tablename) TYPE String.
  35.  
  36.     METHODS get_csv_data
  37.       IMPORTING
  38.         VALUE(i_tablename) TYPE String.
  39.  
  40.     METHODS set_data
  41.       IMPORTING VALUE(i_data) TYPE any
  42.       EXPORTING e_data        TYPE sy-datum.
  43.  
  44.   PROTECTED SECTION.
  45.  
  46.     DATA g_csv_data TYPE stringtab .
  47.     DATA g_error_flag TYPE abap_bool VALUE abap_false.
  48.     DATA g_tab_fields TYPE STANDARD TABLE OF String .
  49.  
  50.   PRIVATE SECTION.
  51.  
  52. ENDCLASS.
  53.  
  54.  
  55.  
  56. CLASS z_csv_import IMPLEMENTATION.
  57.  
  58.   METHOD set_data.
  59.  
  60.     FIND REGEX '[^A-Za-z0-9]' IN data_format MATCH OFFSET DATA(moff).
  61.     IF sy-subrc EQ 0 .
  62. *--[ Descrompimimos los valores
  63.       SPLIT i_data AT data_format+moff(1) INTO DATA(var_01)
  64.                                           DATA(var_02)
  65.                                           DATA(var_03).
  66.  
  67.       SPLIT data_format AT data_format+moff(1) INTO TABLE DATA(T_tab).
  68.  
  69.       LOOP AT t_tab INTO DATA(lin).
  70.         DATA(l) = 'var_0' && sy-tabix.
  71.         ASSIGN (l) TO FIELD-SYMBOL(<fs>).
  72.         IF lin CA 'dD'. e_data+6(2) = <fs>. ENDIF.
  73.         IF lin CA 'mM'. e_data+4(2) = <fs>. ENDIF.
  74.         IF lin CA 'yY'. e_data+0(4) = <fs>. ENDIF.
  75.       ENDLOOP.
  76.     ELSE.
  77.       e_data = i_data.
  78.     ENDIF.
  79.   ENDMETHOD.
  80.  
  81.   METHOD Constructor.
  82.     "-Begin-----------------------------------------------------------------
  83.  
  84.     CLEAR g_csv_data.
  85.  
  86.     "-End-------------------------------------------------------------------
  87.   ENDMETHOD.
  88.  
  89.  
  90.   METHOD get_csv_data.
  91.     "-Begin-----------------------------------------------------------------
  92.  
  93.     "-Structures----------------------------------------------------------
  94.     TYPES: BEGIN OF l_typ_Confrontation,
  95.              IntFieldName TYPE String,
  96.              IntFieldPos  TYPE i,
  97.              IntFieldTyp  TYPE String,
  98.              CSVFieldPos  TYPE i,
  99.              CSVFieldName TYPE String,
  100.            END OF l_typ_Confrontation.
  101.  
  102.     "-Variables-----------------------------------------------------------
  103.     DATA l_rda_data TYPE REF TO Data.
  104.     DATA l_rda_wa TYPE REF TO Data.
  105.     DATA l_rcl_descr_tab TYPE REF TO cl_abap_tabledescr.
  106.     DATA l_rcl_descr_struc TYPE REF TO cl_abap_structdescr.
  107.     DATA l_comp_descr TYPE abap_compdescr.
  108.     DATA l_tab_content TYPE STANDARD TABLE OF String.
  109.     DATA l_Line TYPE String VALUE ''.
  110.     DATA l_tab_confrontation TYPE STANDARD TABLE OF l_typ_Confrontation
  111.       WITH KEY CSVFieldPos.
  112.     DATA l_FieldName TYPE String VALUE ''.
  113.     DATA l_Content TYPE String VALUE ''.
  114.     DATA l_Conf TYPE l_typ_Confrontation.
  115.  
  116.     FIELD-SYMBOLS  <l_Table> TYPE STANDARD TABLE.
  117.     FIELD-SYMBOLS  <l_comp> TYPE Any.
  118.     FIELD-SYMBOLS  <l_wa> TYPE Any.
  119.  
  120.     "-Main----------------------------------------------------------------
  121.     IF g_csv_data IS NOT INITIAL AND g_error_flag = abap_false.
  122.  
  123.       "-Reference to Table----------------------------------------------
  124.       CREATE DATA l_rda_data TYPE STANDARD TABLE OF (i_tablename).
  125.       ASSIGN l_rda_data->* TO  <l_Table>.
  126.       "-Get Structure of Table------------------------------------------
  127.       l_rcl_descr_tab ?= cl_abap_typedescr=>describe_by_data(  <l_Table> ).
  128.       l_rcl_descr_struc ?= l_rcl_descr_tab->get_table_line_type( ).
  129.       "-Define Line of Table--------------------------------------------
  130.       CREATE DATA l_rda_wa LIKE LINE OF  <l_Table>.
  131.       ASSIGN l_rda_wa->* TO  <l_wa>.
  132.  
  133.       "-Compare Field Names of the Table with Headline of CSV-----------
  134.       "-
  135.       "- With this step is the position of the column indifferent. It
  136.       "- is only necessary that the field of the table and the column
  137.       "- of the CSV file must have the same name.
  138.       "-
  139.       "-----------------------------------------------------------------
  140.       LOOP AT l_rcl_descr_struc->components INTO l_comp_descr.
  141.         l_Conf-intfieldname = l_comp_descr-name.
  142.         l_Conf-intfieldpos = sy-tabix.
  143.         l_Conf-intfieldtyp = l_comp_descr-type_kind.
  144.         LOOP AT g_tab_fields INTO l_FieldName.
  145.           l_Conf-csvfieldpos = -1.
  146.           l_Conf-csvfieldname = 'UNKNOWN'.
  147.           IF l_comp_descr-name = l_FieldName.
  148.             l_Conf-csvfieldname = l_FieldName.
  149.             l_Conf-csvfieldpos = sy-tabix.
  150.             EXIT.
  151.           ENDIF.
  152.         ENDLOOP.
  153.         APPEND l_Conf TO l_tab_confrontation.
  154.       ENDLOOP.
  155.       DELETE l_tab_confrontation WHERE csvfieldpos = -1.
  156.       SORT l_tab_confrontation BY csvfieldpos.
  157.  
  158.       "-Copy Data-------------------------------------------------------
  159.       DATA(l_from) = COND #( WHEN has_header = abap_true THEN  2 ELSE 1 ).
  160.  
  161.       LOOP AT g_csv_data INTO l_Line FROM l_from.
  162.         SPLIT l_Line AT ';' INTO TABLE l_tab_content.
  163.         LOOP AT l_tab_content INTO l_Content.
  164.           CONDENSE l_Content.
  165.           READ TABLE l_tab_confrontation WITH KEY CSVFieldPos = sy-tabix
  166.             INTO l_Conf.
  167.           IF sy-subrc = 0.
  168.             ASSIGN COMPONENT l_Conf-intfieldname OF STRUCTURE  <l_wa>
  169.               TO  <l_comp>.
  170.             IF l_Conf-intfieldtyp = 'P'.
  171.               IF l_Content CA ','.
  172.                 REPLACE ALL OCCURRENCES OF '.' IN l_Content WITH ''.
  173.                 REPLACE ',' IN l_Content WITH '.'.
  174.               ENDIF.
  175.               <l_comp> = l_Content.
  176.             ELSEIF l_Conf-intfieldtyp = 'D'.
  177.  
  178.               set_data( EXPORTING i_data = l_Content
  179.                         IMPORTING e_data = <l_comp> ).
  180.  
  181.             ELSE.
  182.               <l_comp> = l_Content.
  183.             ENDIF.
  184.           ENDIF.
  185.         ENDLOOP.
  186.         APPEND  <l_wa> TO  <l_Table>.
  187.         CLEAR  <l_wa>.
  188.       ENDLOOP.
  189.  
  190.       "-Write Data into Table-------------------------------------------
  191.  
  192.       IF modo_test IS INITIAL.
  193.         INSERT (i_tablename) FROM TABLE  <l_Table>.
  194.       ELSE.
  195. *--[ Para ver que ha ido bien, sin ALV ni cosas raras, este programa es
  196. *--[ Para gente con conocimientos y con responsabilidad :D :D
  197.         DATA alv TYPE REF TO cl_salv_table.
  198.         TRY.
  199.             cl_salv_table=>factory(
  200.             IMPORTING
  201.               r_salv_table = alv
  202.             CHANGING
  203.               t_table      = <l_Table> ).
  204.           CATCH cx_salv_msg INTO DATA(message) .
  205.             " error handling
  206.         ENDTRY.
  207.         if has_max > 0.
  208.            has_max = lines( <l_Table> ).
  209.            message s398(00) with 'Muestra de' has_max ' registros.'.
  210.         endif.
  211.         alv->display( ).
  212.  
  213.       ENDIF.
  214.       IF sy-subrc  <> 0.
  215.         g_error_flag = abap_true.
  216.       ENDIF.
  217.  
  218.     ENDIF.
  219.  
  220.     "-End-------------------------------------------------------------------
  221.   ENDMETHOD.
  222.  
  223.  
  224.   METHOD load_csv_file.
  225.  
  226.     DATA: l_filename  TYPE string,
  227.           l_filetable TYPE filetable,
  228.           l_rc        TYPE i.
  229.  
  230.     "-  Begin-----------------------------------------------------------------
  231.     IF i_filename IS INITIAL.
  232.       CALL METHOD cl_gui_frontend_services=>file_open_dialog
  233.         EXPORTING
  234.           window_title            = 'Importar CSV'
  235. *         default_extension       =
  236. *         default_filename        =
  237. *         file_filter             =
  238. *         with_encoding           =
  239. *         initial_directory       =
  240.           multiselection          = ' '
  241.         CHANGING
  242.           file_table              = l_filetable
  243.           rc                      = l_rc
  244. *         user_action             =
  245. *         file_encoding           =
  246.         EXCEPTIONS
  247.           file_open_dialog_failed = 1
  248.           cntl_error              = 2
  249.           error_no_gui            = 3
  250.           not_supported_by_gui    = 4
  251.           OTHERS                  = 5.
  252.       IF sy-subrc NE 0 OR lines( l_filetable ) NE 1.
  253.         EXIT.
  254.       ELSE.
  255.         READ TABLE l_filetable INDEX 1 INTO DATA(l_file).
  256.         IF sy-subrc EQ 0.
  257.           l_filename = l_file-filename.
  258.         ELSE.
  259.           EXIT.
  260.         ENDIF.
  261.  
  262.       ENDIF.
  263.  
  264.     ELSE.
  265.       l_filename = i_filename.
  266.     ENDIF.
  267.  
  268.     l_Filename = l_filename.
  269.  
  270.     CALL FUNCTION 'GUI_UPLOAD'
  271.       EXPORTING
  272.         filename = l_FileName
  273.         filetype = 'ASC'
  274.       TABLES
  275.         data_tab = g_csv_data
  276.       EXCEPTIONS
  277.         OTHERS   = 1.
  278.     IF sy-subrc  <> 0.
  279.       g_error_flag = abap_true.
  280.     ENDIF.
  281.  
  282.     "-End-------------------------------------------------------------------
  283.   ENDMETHOD.
  284.  
  285.  
  286.   METHOD transform_csv_data.
  287.     "-Begin-----------------------------------------------------------------
  288.  
  289.     "-Variables-----------------------------------------------------------
  290.     DATA l_Fld1 TYPE String VALUE ''.
  291.     DATA l_Fld2 TYPE String VALUE ''.
  292.     DATA l_Fld3 TYPE String VALUE ''.
  293.     DATA l_FldRest TYPE String VALUE ''.
  294.  
  295.     FIELD-SYMBOLS  <Line> TYPE String.
  296.  
  297.     "-Main----------------------------------------------------------------
  298.     IF g_csv_data IS NOT INITIAL AND g_error_flag = abap_false.
  299.  
  300.       "-Manipulate Headline---------------------------------------------
  301.       READ TABLE g_csv_data INDEX 1 ASSIGNING  <Line>.
  302.  
  303.       IF has_mandt IS INITIAL AND NOT has_header IS INITIAL.
  304.         <Line> = 'MANDT;' &&  <Line>.
  305.       ENDIF.
  306.  
  307.       CONDENSE  <Line> NO-GAPS.
  308.       SPLIT  <Line> AT ';' INTO TABLE g_tab_fields.
  309.  
  310.       IF has_mandt IS INITIAL.
  311.  
  312.         LOOP AT g_csv_data FROM 2 ASSIGNING  <Line>.
  313.           <Line> = sy-mandt && ';' &&  <Line>.
  314.         ENDLOOP.
  315.       ENDIF.
  316.  
  317.     ENDIF.
  318.  
  319.     IF has_max > 0 .
  320.  
  321.       IF NOT has_header IS INITIAL. ADD 1 TO has_max. ENDIF. "<-
  322.       IF has_max < lines( g_csv_data ).
  323.       add 1 to has_max.
  324.         DELETE g_csv_data FROM has_max ."TO  lines( g_csv_data ) .
  325.       ENDIF.
  326.     ENDIF.
  327.     "-End-------------------------------------------------------------------
  328.   ENDMETHOD.
  329.  
  330. ENDCLASS.
  331.  
  332. end-of-SELECTION.
  333.   "-End-------------------------------------------------------------------
  334.  
  335.   "-Variables-----------------------------------------------------------
  336.   DATA: csv   TYPE REF TO z_csv_import,
  337.         l_tab TYPE string.
  338.  
  339.   "-Main----------------------------------------------------------------
  340.   IF NOT p_wipe IS INITIAL.
  341.     DELETE FROM (p_tab).
  342.     COMMIT WORK.
  343.   ENDIF.
  344.  
  345.   CREATE OBJECT csv.
  346.   csv->Load_CSV_File( ).
  347.   l_tab = p_tab.
  348.   CHECK NOT l_tab IS INITIAL.
  349.  
  350. *--[ Configuración
  351.   csv->modo_test   = p_test.
  352.   csv->has_header  = p_header.
  353.   csv->data_format = p_datf.
  354.   csv->has_mandt   = p_mandt.
  355.   csv->has_max     = p_max.
  356.  
  357. *--[ Transformación
  358.   csv->Transform_CSV_Data( l_tab ).
  359.   csv->Get_CSV_Data( l_tab ).