ABAP Prog Propios MIG Tab 5

Programa principal

  1.  
  2. REPORT ZINI_PRG_P000.
  3.  
  4. INCLUDE ZINI_I_P000_TOP.
  5. include ZINI_I_CL_LOG.
  6. include ZINI_XX_I_ZINI_ALV.
  7. INCLUDE ZINI_I_P000_SCN.
  8. INCLUDE ZINI_I_P000_EVE.
  9. INCLUDE ZINI_I_P000_FRM.

ZINI_I_P000_TOP.

  1.  
  2.   types: begin of ty_cfg,
  3.             key type text5,
  4.             tabla(20),
  5.             text(50),
  6.          end   of ty_cfg.
  7.  
  8.   data: p_file type string,
  9.         t_cab type STANDARD TABLE OF string, "<-- CAmpos de cabecera de XLS
  10.         t_dic type STANDARD TABLE OF dd03l.
  11.  
  12. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  13. *--[ Field-Symbols
  14. FIELD-SYMBOLS : <GT_DATA> TYPE STANDARD TABLE,
  15.                 <ls_data> type any.
  16. FIELD-SYMBOLS: <pt> TYPE STANDARD TABLE,
  17.                <pl> TYPE any.

ZINI_I_CL_LOG.

Propio del proyecto, se puede eliminar

ZINI_XX_I_ZINI_ALV.

Ver clase en este mismo Wiki

ZINI_I_P000_SCN.

  1.  
  2. TABLES: sscrfields.  "<-- Para los botones en el PF-STATUS
  3.  
  4. SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME .
  5. PARAMETERS: p_tabla type DD02L-TABNAME.
  6. SELECTION-SCREEN SKIP 1.
  7. SELECTION-SCREEN END OF BLOCK b1 .
  8.  
  9. SELECTION-SCREEN BEGIN OF BLOCK b2 WITH FRAME .
  10. PARAMETERS: p_lincsv TYPE string,
  11.             p_head   AS CHECKBOX DEFAULT abap_false.
  12. SELECTION-SCREEN END OF BLOCK b2 .
  13. PARAMETERS: p_del  AS CHECKBOX DEFAULT ' ',
  14.             p_view AS CHECKBOX DEFAULT 'X',
  15.             p_test AS CHECKBOX DEFAULT 'X'.
  16.  
  17. SELECTION-SCREEN FUNCTION KEY 1.
  18. SELECTION-SCREEN FUNCTION KEY 2.
  19. SELECTION-SCREEN FUNCTION KEY 3.
  20. SELECTION-SCREEN FUNCTION KEY 4.
  21. SELECTION-SCREEN FUNCTION KEY 5.

ZINI_I_P000_EVE.

  1.  
  2. INITIALIZATION.
  3.   perform eve_INITIALIZATION.
  4.  
  5. AT SELECTION-SCREEN.
  6.   PERFORM eve_selection_screen.
  7.  
  8. START-OF-SELECTION.
  9.   perform eve_start_of_selection.
  10.  

ZINI_I_P000_FRM.

  1.  
  2.  
  3. FORM popup_to_delete CHANGING p_subrc TYPE sysubrc.
  4.   DATA: l_ans(1).
  5.   CALL FUNCTION 'POPUP_TO_CONFIRM'
  6.     EXPORTING
  7.       titlebar              = TEXT-t03
  8. *     DIAGNOSE_OBJECT       = ' '
  9.       text_question         = TEXT-q01
  10.       text_button_1         = TEXT-q02
  11. *     ICON_BUTTON_1         = ICON_OKAY
  12.       text_button_2         = TEXT-q03
  13. *     ICON_BUTTON_2         = ICON_CANCEL
  14.       default_button        = '2'
  15.       display_cancel_button = abap_false
  16.       start_column          = 50
  17. *     START_ROW             = 6
  18. *     POPUP_TYPE            =
  19.       iv_quickinfo_button_1 = TEXT-q04
  20.       iv_quickinfo_button_2 = TEXT-q05
  21.     IMPORTING
  22.       answer                = l_ans
  23. *      TABLES
  24. *     PARAMETER             =
  25.     EXCEPTIONS
  26.       text_not_found        = 1
  27.       OTHERS                = 2.
  28.  
  29.   IF l_ans = '1'.
  30. *--[ Bye Bye Bye
  31.     CLEAR sy-subrc.
  32.   ELSE.
  33.     p_subrc = 69.
  34. *      EXIT. "-> Back to the future
  35.   ENDIF.
  36. ENDFORM.
  37.  
  38. FORM eve_initialization.
  39.   sscrfields-functxt_01 = |@49@ Exporar Estructura|.
  40. ENDFORM.
  41.  
  42. FORM eve_selection_screen.
  43.   CASE sscrfields-ucomm.
  44.     WHEN 'FC01'. PERFORM data_export_sample.
  45.   ENDCASE.
  46. ENDFORM.
  47.  
  48. FORM eve_start_of_selection.
  49. *--[ Cuidadín!!!
  50.   g_log = NEW zag3_cl_log( ).
  51.   IF p_del = abap_true AND p_test IS INITIAL.
  52.     PERFORM popup_to_delete CHANGING sy-subrc.
  53.     IF sy-subrc NE 0.
  54.       CLEAR p_del.
  55.     ENDIF.
  56.   ENDIF.
  57.  
  58.   g_log->add( i_db = abap_true
  59.               i_t1 = |Tabla: { p_tabla } Cabecera [{ p_head }]|
  60.               i_t2 = COND #( WHEN p_lincsv IS NOT INITIAL THEN |Lineas CSV { p_lincsv }| )
  61.               i_t3 = |Borrado [{ p_del }] TEST [{ p_test }]|
  62.             ).
  63.  
  64.   PERFORM: data_file_load USING p_file p_tabla,
  65.            data_2_table USING p_tabla,
  66.            data_display.
  67. ENDFORM.
  68.  
  69. FORM data_display.
  70.   CHECK lines( <pt> ) > 0.
  71.   DATA(nl) = NEW zini_cl_falv( ).
  72.   nl->alv_new( CHANGING p_table = <pt> ).
  73.   DATA(l_seleccionados) = nl->alv_show( ).
  74. ENDFORM.
  75.  
  76. FORM data_file_load USING p_file p_tab.
  77.  
  78.   DATA : lv_filename      TYPE string,
  79.          lt_records       TYPE solix_tab,
  80.          lv_headerxstring TYPE xstring,
  81.          lv_filelength    TYPE i,
  82.          ft               TYPE filetable.
  83.  
  84.   lv_filename = p_file.
  85.   IF lv_filename IS INITIAL.
  86.  
  87.     CALL METHOD cl_gui_frontend_services=>file_open_dialog
  88.       EXPORTING
  89.         window_title            = 'Selecciona los ficheros'
  90.         multiselection          = abap_false
  91.       CHANGING
  92.         file_table              = ft
  93.         rc                      = lv_filelength
  94. *       USER_ACTION             =
  95. *       FILE_ENCODING           =
  96.       EXCEPTIONS
  97.         file_open_dialog_failed = 1
  98.         cntl_error              = 2
  99.         error_no_gui            = 3
  100.         not_supported_by_gui    = 4
  101.         OTHERS                  = 5.
  102.     IF sy-subrc EQ 0." AND lines( ft ) = 1.
  103. *      lv_filename = ft[ 1 ]-filename.
  104.     ELSE.
  105.       EXIT.
  106.     ENDIF.
  107.  
  108.     LOOP AT ft INTO DATA(l_ft).
  109.       lv_filename = l_ft-filename.
  110.       g_log->add( i_db = abap_true i_t1 = lv_filename ).
  111.       PERFORM data_file_from_excel USING lv_filename p_tab.
  112.       PERFORM data_file_from_csv USING lv_filename  p_tab.
  113.     ENDLOOP.
  114.   ENDIF.
  115. ENDFORM.
  116.  
  117. FORM data_file_from_csv USING p_filename TYPE string p_tab.
  118.   DATA: t_tab TYPE STANDARD TABLE OF string.
  119.   DATA(ax) = to_upper( p_filename ).
  120.   CHECK ax CP '*CSV'.
  121.  
  122.   CALL METHOD cl_gui_frontend_services=>gui_upload
  123.     EXPORTING
  124.       filename                = p_filename
  125.       filetype                = 'ASC'
  126.       codepage                = '4110'
  127.     CHANGING
  128.       data_tab                = t_tab
  129.     EXCEPTIONS
  130.       file_open_error         = 1
  131.       file_read_error         = 2
  132.       no_batch                = 3
  133.       gui_refuse_filetransfer = 4
  134.       invalid_type            = 5
  135.       no_authority            = 6
  136.       unknown_error           = 7
  137.       bad_data_format         = 8
  138.       header_not_allowed      = 9
  139.       separator_not_allowed   = 10
  140.       header_too_long         = 11
  141.       unknown_dp_error        = 12
  142.       access_denied           = 13
  143.       dp_out_of_memory        = 14
  144.       disk_full               = 15
  145.       dp_timeout              = 16
  146.       not_supported_by_gui    = 17
  147.       error_no_gui            = 18
  148.       OTHERS                  = 19.
  149.  
  150.   CHECK sy-subrc EQ 0.
  151.   PERFORM create_table_dyn USING p_tab.
  152.   LOOP AT t_tab INTO DATA(bx).
  153.     SPLIT bx AT ';' INTO TABLE DATA(t_tmp).
  154.     APPEND INITIAL LINE TO <gt_data> ASSIGNING FIELD-SYMBOL(<ls_data>).
  155.     LOOP AT t_tmp INTO DATA(bl).
  156.       ASSIGN COMPONENT sy-tabix OF STRUCTURE <ls_data> TO FIELD-SYMBOL(<bh>).
  157.       <bh> = bl.
  158.     ENDLOOP.
  159.   ENDLOOP.
  160. ENDFORM.
  161.  
  162. FORM create_table_dyn USING p_tab.
  163.   DATA: ls_component   TYPE cl_abap_structdescr=>component,
  164.         lr_field_descr TYPE REF TO cl_abap_elemdescr,
  165.         lo_structure   TYPE REF TO cl_abap_structdescr,
  166.         lo_table       TYPE REF TO cl_abap_tabledescr,
  167.         wa_structure   TYPE REF TO data,
  168.         li_table       TYPE REF TO data,
  169.         li_tot_comp    TYPE cl_abap_structdescr=>component_table.
  170.   IF <gt_data> IS ASSIGNED. REFRESH <gt_data>. EXIT. ENDIF.
  171.   SELECT COUNT( * ) INTO @DATA(l_indice) FROM  dd03l
  172.          WHERE  tabname  = @p_tab AND
  173.                 fieldname NE '.INCLUDE' AND
  174.                 fieldname NE '.APPEND'.
  175.  
  176.   DO l_indice TIMES.
  177.     ls_component-name = |A{ sy-index }|.
  178.     lr_field_descr   ?= cl_abap_elemdescr=>describe_by_name( 'STRING' ).
  179.     ls_component-type = lr_field_descr.
  180.     INSERT ls_component INTO TABLE li_tot_comp.
  181.   ENDDO.
  182.  
  183.   lo_structure    = cl_abap_structdescr=>create( li_tot_comp ).
  184.   lo_table        = cl_abap_tabledescr=>create( lo_structure ).
  185.   CREATE DATA wa_structure TYPE HANDLE lo_structure.
  186.   CREATE DATA li_table TYPE HANDLE lo_table.
  187.   ASSIGN li_table->* TO <gt_data>.
  188.   ASSIGN wa_structure->* TO <ls_data>.
  189.  
  190. ENDFORM.
  191. *form create_table_DDIC using p_tab.
  192. *
  193. *  DATA:
  194. *    wa_data_ref    TYPE REF TO data,
  195. *    wa_struct_type TYPE REF TO cl_abap_structdescr,
  196. *    wa_elem_type   TYPE REF TO cl_abap_elemdescr,
  197. *    wa_comp_fld    TYPE cl_abap_structdescr=>component,
  198. *    i_comp_tab     TYPE cl_abap_structdescr=>component_table,
  199. *    i_comp_tot_tab TYPE cl_abap_structdescr=>component_table,
  200. *    g_total_field  TYPE i,
  201. *    g_tabix(2)     TYPE c.
  202. *
  203. *  wa_struct_type ?= cl_abap_typedescr=>describe_by_name( p_tab ).
  204. *  i_comp_tab = wa_struct_type->get_components( ).
  205. *  APPEND LINES OF i_comp_tab TO i_comp_tot_tab.
  206. *  wa_struct_type = cl_abap_structdescr=>create( i_comp_tot_tab ).
  207. *  CREATE DATA wa_data_ref TYPE HANDLE wa_struct_type.
  208. *  ASSIGN wa_data_ref->* TO  <gt_data>.
  209. *endform.
  210.  
  211. FORM data_file_from_excel USING p_filename TYPE string
  212.                                 p_tab.
  213.   DATA : lv_filename      TYPE string,
  214.          lt_records       TYPE solix_tab,
  215.          lv_headerxstring TYPE xstring,
  216.          lv_filelength    TYPE i,
  217.          ft               TYPE filetable.
  218.   DATA(ax) = to_upper( p_filename ).
  219.   CHECK ax CP '*XLS' OR ax CP '*XLSX' .
  220.   lv_filename = p_filename.
  221.   CALL METHOD cl_gui_frontend_services=>gui_upload
  222.     EXPORTING
  223.       filename                = lv_filename
  224.       filetype                = 'BIN'
  225.     IMPORTING
  226.       filelength              = lv_filelength
  227.       header                  = lv_headerxstring
  228.     CHANGING
  229.       data_tab                = lt_records
  230. *     ISSCANPERFORMED         = SPACE
  231.     EXCEPTIONS
  232.       file_open_error         = 1
  233.       file_read_error         = 2
  234.       no_batch                = 3
  235.       gui_refuse_filetransfer = 4
  236.       invalid_type            = 5
  237.       no_authority            = 6
  238.       unknown_error           = 7
  239.       bad_data_format         = 8
  240.       header_not_allowed      = 9
  241.       separator_not_allowed   = 10
  242.       header_too_long         = 11
  243.       unknown_dp_error        = 12
  244.       access_denied           = 13
  245.       dp_out_of_memory        = 14
  246.       disk_full               = 15
  247.       dp_timeout              = 16
  248.       not_supported_by_gui    = 17
  249.       error_no_gui            = 18
  250.       OTHERS                  = 19.
  251.   IF sy-subrc <> 0.
  252. * Implement suitable error handling here
  253.   ENDIF.
  254.  
  255.   "convert binary data to xstring
  256.   "if you are using cl_fdt_xl_spreadsheet in odata then skips this step
  257.   "as excel file will already be in xstring
  258.   CALL FUNCTION 'SCMS_BINARY_TO_XSTRING'
  259.     EXPORTING
  260.       input_length = lv_filelength
  261.     IMPORTING
  262.       buffer       = lv_headerxstring
  263.     TABLES
  264.       binary_tab   = lt_records
  265.     EXCEPTIONS
  266.       failed       = 1
  267.       OTHERS       = 2.
  268.  
  269.   IF sy-subrc <> 0.
  270.     "Implement suitable error handling here
  271.   ENDIF.
  272.   DATA : lo_excel_ref TYPE REF TO cl_fdt_xl_spreadsheet .
  273.  
  274.   TRY .
  275.       lo_excel_ref = NEW cl_fdt_xl_spreadsheet(
  276.                               document_name = lv_filename
  277.                               xdocument     = lv_headerxstring ) .
  278.     CATCH cx_fdt_excel_core.
  279.       "Implement suitable error handling here
  280.   ENDTRY .
  281.  
  282.   "Get List of Worksheets
  283.   lo_excel_ref->if_fdt_doc_spreadsheet~get_worksheet_names(
  284.     IMPORTING
  285.       worksheet_names = DATA(lt_worksheets) ).
  286.  
  287.   IF NOT lt_worksheets IS INITIAL.
  288. *    READ TABLE LT_WORKSHEETS INTO DATA(LV_WOKSHEETNAME) INDEX 1.
  289.     LOOP AT lt_worksheets INTO DATA(lv_woksheetname).
  290.       IF lines( lt_worksheets ) NE 1.
  291.         CHECK lv_woksheetname CS p_tab.
  292.       ENDIF.
  293.       DATA(lo_data_ref) = lo_excel_ref->if_fdt_doc_spreadsheet~get_itab_from_worksheet(
  294.                                                lv_woksheetname ).
  295.       "now you have excel work sheet data in dyanmic internal table
  296.       ASSIGN lo_data_ref->* TO <gt_data>.
  297.       EXIT.
  298.     ENDLOOP.
  299.   ENDIF.
  300. ENDFORM.
  301.  
  302. FORM create_table USING p_table.
  303.   DATA:
  304.     wa_data_ref    TYPE REF TO data,
  305.     wa_struct_type TYPE REF TO cl_abap_structdescr,
  306.     wa_elem_type   TYPE REF TO cl_abap_elemdescr,
  307.     wa_comp_fld    TYPE cl_abap_structdescr=>component,
  308.     i_comp_tab     TYPE cl_abap_structdescr=>component_table,
  309.     i_comp_tot_tab TYPE cl_abap_structdescr=>component_table,
  310.     g_total_field  TYPE i,
  311.     g_tabix(2)     TYPE c.
  312.  
  313.   wa_struct_type ?= cl_abap_typedescr=>describe_by_name( p_table ).
  314.   i_comp_tab = wa_struct_type->get_components( ).
  315.   APPEND LINES OF i_comp_tab TO i_comp_tot_tab.
  316.   wa_struct_type = cl_abap_structdescr=>create( i_comp_tot_tab ).
  317.   CREATE DATA wa_data_ref TYPE HANDLE wa_struct_type.
  318.   ASSIGN wa_data_ref->* TO  <pl>.
  319.   CREATE DATA wa_data_ref LIKE STANDARD TABLE OF <pl>.
  320.   ASSIGN wa_data_ref->* TO <pt>.
  321. ENDFORM.
  322.  
  323. FORM data_delete_lines.
  324.  
  325.   DATA: t_lineas TYPE STANDARD TABLE OF numc5,
  326.         t_i      TYPE STANDARD TABLE OF syindex,
  327.         l_i      TYPE syindex.
  328. *--[ Borramos las líneas innecesarias
  329.   CHECK p_lincsv IS NOT INITIAL.
  330.   CONDENSE p_lincsv NO-GAPS.
  331.   SPLIT p_lincsv AT ',' INTO TABLE t_lineas.
  332.  
  333.   LOOP AT t_lineas INTO DATA(ax).
  334.     l_i = ax.
  335.     APPEND l_i TO t_i.
  336.   ENDLOOP.
  337.   SORT t_i DESCENDING.
  338.   LOOP AT t_i INTO l_i.
  339.     TRY.
  340.         DELETE <gt_data> INDEX l_i.
  341.       CATCH cx_root.
  342.         CLEAR sy-subrc.
  343.     ENDTRY.
  344.   ENDLOOP.
  345. ENDFORM.
  346.  
  347. FORM data_read_header.
  348.   CHECK p_head = abap_true.
  349.   CHECK lines( <gt_data> ) > 0.
  350.   READ TABLE <gt_data> ASSIGNING FIELD-SYMBOL(<ax>) INDEX 1.
  351.  
  352.   DO.
  353.     ASSIGN COMPONENT sy-index OF STRUCTURE <ax> TO FIELD-SYMBOL(<bx>).
  354.     IF sy-subrc NE 0. EXIT. ENDIF.
  355.     t_cab = VALUE #( BASE t_cab ( <bx> ) ).
  356.   ENDDO.
  357.   DELETE <gt_data> INDEX 1. "<-- Borramos la cabecera
  358. ENDFORM.
  359.  
  360. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  361. *--[ Sin cabecera en el fichero y estructurado igual que la tabla
  362. FORM data_2_table_without_cab USING t_bp.
  363.   DATA: lv_numberofcolumns TYPE i.
  364.   CHECK p_head IS INITIAL.
  365.  
  366.   DATA(l_tabix) = sy-tabix.
  367.   lv_numberofcolumns = lines( t_dic )." ¿¿¿  - 1. ???
  368.   APPEND INITIAL LINE TO <pt> ASSIGNING FIELD-SYMBOL(<ps>).
  369.  
  370.   DO lv_numberofcolumns TIMES.
  371.     ASSIGN COMPONENT sy-index OF STRUCTURE <ls_data> TO FIELD-SYMBOL(<lv_field>) .
  372.     IF sy-subrc = 0 .
  373.       DATA(l_field) = t_dic[ sy-index ]-fieldname.
  374.       DATA(l_f) = |<ps>-{ l_field }|.
  375.       ASSIGN (l_f) TO FIELD-SYMBOL(<f>).
  376.  
  377.       DESCRIBE FIELD <f> TYPE DATA(l_tipo).
  378.       DESCRIBE FIELD <f> DECIMALS DATA(l_dec).
  379.  
  380.       IF l_dec > 0 AND l_tipo = 'P' AND <lv_field> CP '*.*E-*'.
  381.         DATA: pp TYPE f.
  382.         pp = <lv_field>.
  383.         <f> = pp.
  384.       ELSE.
  385.         <f> = <lv_field>.
  386.       ENDIF.
  387.     ELSE.
  388.       EXIT. "<-- Bye Bye Bye
  389.     ENDIF.
  390.   ENDDO .
  391.   MOVE-CORRESPONDING t_bp TO <ps>.
  392. *    APPEND <pl> to (bx). "L_ZAG3_TDM1 TO IT_ZAG3_TDM1.
  393.  
  394. ENDFORM.
  395.  
  396. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  397. *--[ Con cabecera, pero no sabemos como estará estructurado
  398. FORM data_2_table_with_cab USING t_bp.
  399.   CHECK p_head IS NOT INITIAL.
  400. *  loop at t_cab into data(l_cab).
  401.  
  402.   APPEND INITIAL LINE TO <pt> ASSIGNING FIELD-SYMBOL(<ps>).
  403.  
  404.   DO.
  405.     ASSIGN COMPONENT sy-index OF STRUCTURE <ls_data> TO FIELD-SYMBOL(<lv_field>) .
  406.     IF sy-subrc NE 0. EXIT. ENDIF.
  407.     TRY.
  408.         DATA(al) = t_cab[ sy-index ].
  409.       CATCH cx_root.
  410.         CONTINUE. "<-- No existe campo para esa columna
  411.     ENDTRY.
  412.     CHECK al IS NOT INITIAL.
  413.     DATA(ah) = |<ps>-{ al }|.
  414.     ASSIGN (ah) TO FIELD-SYMBOL(<al>).
  415.     CHECK sy-subrc EQ 0.
  416.     DESCRIBE FIELD <al> TYPE DATA(l_tipo).
  417.     DESCRIBE FIELD <al> DECIMALS DATA(l_dec).
  418.  
  419.     IF l_dec > 0 AND l_tipo = 'P'.
  420.       IF  <lv_field> CP '*.*E-*'.
  421.         DATA: pp TYPE f.
  422.         pp = <lv_field>.
  423.         <al> = pp.
  424.       ELSE.
  425. *--[ Aquí puede tener comas, puntos, signos, debería arreglase desde fichero
  426.         TRANSLATE <lv_field> USING ',.% '.
  427.         REPLACE ALL OCCURRENCES OF REGEX '[a-zA-Z]' IN <lv_field> WITH ' '.
  428.         CONDENSE <lv_field> NO-GAPS.
  429.         <al> = <lv_field>. "Dejemos que explote
  430.       ENDIF.
  431.     ELSE.
  432.       <al> = <lv_field>.
  433.     ENDIF.
  434.  
  435.   ENDDO.
  436.   MOVE-CORRESPONDING t_bp TO <ps>.
  437.  
  438.  
  439. ENDFORM.
  440.  
  441. FORM data_2_table USING p_tabla.
  442.   TYPES: BEGIN OF ty_bp,
  443. *           ZUS_CREA  type ZUS_CREA_A,
  444.            zfe_cread TYPE zfe_cread_a,
  445.            zhr_cread TYPE zh_cread_a.
  446. *           ZUS_MOD  type ZUS_MOD_A,
  447. *           ZFE_MOD  type ZFE_MOD_A,
  448. *           ZHR_MOD  type ZHR_MOD_A.
  449.            INCLUDE STRUCTURE zag3_tdmx..
  450.          TYPES END OF ty_bp.
  451.  
  452.   DATA : bp TYPE ty_bp.
  453.  
  454.   PERFORM create_table USING p_tabla.
  455.  
  456.   CLEAR bp.
  457.   bp-zus_crea  = sy-uname.
  458.   bp-zfe_crea  = bp-zfe_cread = sy-datum.
  459.   bp-zhr_crea  = bp-zhr_cread = sy-uzeit.
  460.   CHECK <gt_data> IS ASSIGNED.
  461.   PERFORM data_delete_lines.
  462.   PERFORM data_read_header.
  463. *--[ Capturamos la cabecera que debe ser la primera línea
  464. *--[ Después de lo que quede por ahí
  465.  
  466.   LOOP AT <gt_data> ASSIGNING <ls_data>.
  467.     AT FIRST.
  468.       IF p_head IS INITIAL.
  469.         SELECT * FROM  dd03l INTO TABLE t_dic WHERE tabname = p_tabla AND
  470.                                                   fieldname NE 'MANDT' AND
  471.                                                   fieldname NOT LIKE '%INCLUDE'.
  472.       ENDIF.
  473.     ENDAT.
  474.  
  475.     PERFORM data_2_table_without_cab USING bp.
  476.     PERFORM data_2_table_with_cab USING bp.
  477.  
  478.     AT LAST.
  479.       IF lines( <pt> ) >= 1.
  480.         DATA(l_lines) = lines( <pt> ).
  481.         IF p_test IS INITIAL.
  482.           IF p_del = abap_true.
  483.             g_log->add( i_db = abap_true i_t1 = |Tabla { p_tabla } borrada| ).
  484.             DELETE FROM (p_tabla).
  485.           ENDIF.
  486.  
  487.           g_log->add( i_db = abap_true i_t1 = |Grabando: { l_lines } registros| ).
  488. *--[ BUscamos la cantidad incial
  489.           DATA: l_count_ini TYPE i,
  490.                 l_count_fin TYPE i,
  491.                 l_total     TYPE i.
  492.           SELECT COUNT( * ) INTO l_count_ini FROM (p_tabla).
  493.  
  494.           MODIFY (p_tabla) FROM TABLE <pt>.
  495.           DATA(l_dbcount) = sy-dbcnt.
  496.           COMMIT WORK AND WAIT.
  497.  
  498. *--[ Buscamos la cantidad final
  499.           SELECT COUNT( * ) INTO l_count_fin FROM (p_tabla).
  500.  
  501.           l_total = l_lines - ( l_count_fin - l_count_ini ).
  502.           IF l_total NE 0.
  503.             MESSAGE i398(00) WITH 'Posible perdida de' l_total 'registros'.
  504.           ENDIF.
  505.           DATA(l_msg) = |Tabla { p_tabla } actualizada con { l_lines }/{ l_dbcount } registros|.
  506.         ELSE.
  507.           l_msg = |(TEST) Tabla { p_tabla } cargada con { l_lines } registros|.
  508.         ENDIF.
  509.         MESSAGE s398(00) WITH l_msg '' '' ''.
  510.  
  511.       ELSE.
  512.         l_msg = |No hay registros para { p_tabla }|.
  513.         MESSAGE s398(00) WITH l_msg '' '' ''.
  514.       ENDIF.
  515.     ENDAT.
  516.   ENDLOOP.
  517. ENDFORM.
  518.  
  519. FORM data_export_sample.
  520.   SELECT
  521. *TABNAME,
  522. fieldname,
  523. rollname,
  524. datatype,
  525. leng,
  526. decimals
  527.     FROM  dd03l
  528.     INTO TABLE @DATA(ax)
  529.     WHERE tabname = @p_tabla AND
  530.           fieldname NE 'MANDT' AND
  531.           fieldname NE '.INCLUDE'
  532.     ORDER BY position.
  533.   IF sy-subrc EQ 0.
  534.     DATA: t_s TYPE STANDARD TABLE OF string.
  535.     DATA: l01 TYPE string, l03 TYPE string, l02 TYPE string.
  536. *    l01 = l02 = ','.
  537.  
  538.  
  539.     DATA(nl) = NEW zini_cl_falv( ).
  540.     nl->alv_new( CHANGING p_table = ax ).
  541.     DATA(l_seleccionados) = nl->alv_show( p_popup = abap_true p_popup_xy = VALUE #( start_x = 50 start_y = 5 end_x = 150 end_y = 20 ) ).
  542.     LOOP AT l_seleccionados INTO DATA(lsel).
  543.  
  544.       DATA(ah) = ax[ lsel ].
  545. *    LOOP AT ax INTO DATA(ah).
  546.       DATA(al) = CONV string( ah-leng ).
  547.       SHIFT al LEFT DELETING LEADING '0'.
  548.       IF ah-decimals NE 0.
  549.         DATA(bh) = CONV string( ah-decimals ).
  550.         SHIFT bh LEFT DELETING LEADING '0'.
  551.         al = |{ al },{ bh }|.
  552.       ENDIF.
  553.       IF ah-datatype = 'DATS'.
  554.         al = 'YYYYMMDD'.
  555.       ENDIF.
  556.       SELECT SINGLE reptext INTO @DATA(l_text) FROM  dd04t
  557.              WHERE  rollname    = @ah-rollname
  558.              AND    ddlanguage  = @sy-langu.
  559.       l01 = |{ l01 };{ ah-fieldname }|.
  560.       l02 = |{ l02 };{ ah-datatype }({ al })|.
  561.       l03 = |{ l03 };{ l_text }|.
  562.  
  563.       AT LAST.
  564.         SHIFT l01 LEFT DELETING LEADING ';'.
  565.         SHIFT l03 LEFT DELETING LEADING ';'.
  566.         SHIFT l02 LEFT DELETING LEADING ';'.
  567.         APPEND l01 TO t_s.
  568.         APPEND l03 TO t_s.
  569.         APPEND l02 TO t_s.
  570.         APPEND 'NOTA 1: La primera línea es obligatoria' TO t_s.
  571.         APPEND 'NOTA 2: El resto de lineas son informativas y deben borrarse' TO t_s.
  572.         APPEND 'NOTA 3: Grabar como XLSX' TO t_s.
  573.       ENDAT.
  574.  
  575.     ENDLOOP.
  576.  
  577.     CHECK lines( t_s ) > 0.
  578.  
  579.     DATA: len TYPE i.
  580.  
  581.     DATA(l_name) = CONV string( |{ p_tabla }.csv| ).
  582.     CALL METHOD cl_gui_frontend_services=>file_save_dialog
  583.       EXPORTING
  584.         window_title              = 'Exportar fichero'
  585.         default_extension         = 'csv'
  586.         default_file_name         = l_name
  587.       CHANGING
  588.         filename                  = l01
  589.         path                      = l02
  590.         fullpath                  = l03
  591. *       user_action               =
  592. *       file_encoding             =
  593.       EXCEPTIONS
  594.         cntl_error                = 1
  595.         error_no_gui              = 2
  596.         not_supported_by_gui      = 3
  597.         invalid_default_file_name = 4
  598.         OTHERS                    = 5.
  599.  
  600.     IF sy-subrc EQ 0.
  601.       l_name = l03.
  602.       CALL METHOD cl_gui_frontend_services=>gui_download
  603.         EXPORTING
  604.           filename                = l_name
  605.           filetype                = 'ASC'
  606.         CHANGING
  607.           data_tab                = t_s
  608.         EXCEPTIONS
  609.           file_write_error        = 1
  610.           no_batch                = 2
  611.           gui_refuse_filetransfer = 3
  612.           invalid_type            = 4
  613.           no_authority            = 5
  614.           unknown_error           = 6
  615.           header_not_allowed      = 7
  616.           separator_not_allowed   = 8
  617.           filesize_not_allowed    = 9
  618.           header_too_long         = 10
  619.           dp_error_create         = 11
  620.           dp_error_send           = 12
  621.           dp_error_write          = 13
  622.           unknown_dp_error        = 14
  623.           access_denied           = 15
  624.           dp_out_of_memory        = 16
  625.           disk_full               = 17
  626.           dp_timeout              = 18
  627.           file_not_found          = 19
  628.           dataprovider_exception  = 20
  629.           control_flush_error     = 21
  630.           not_supported_by_gui    = 22
  631.           error_no_gui            = 23
  632.           OTHERS                  = 24.
  633.       IF sy-subrc <> 0.
  634. * Implement suitable error handling here
  635.       ENDIF.
  636.     ENDIF.
  637.  
  638.   ENDIF.
  639.  
  640. ENDFORM.