ABAP Prog Propios MIG Tab 5
Programa principal
- REPORT ZINI_PRG_P000.
- INCLUDE ZINI_I_P000_TOP.
- include ZINI_I_CL_LOG.
- include ZINI_XX_I_ZINI_ALV.
- INCLUDE ZINI_I_P000_SCN.
- INCLUDE ZINI_I_P000_EVE.
- INCLUDE ZINI_I_P000_FRM.
ZINI_I_P000_TOP.
- types: begin of ty_cfg,
- key type text5,
- tabla(20),
- text(50),
- end of ty_cfg.
- data: p_file type string,
- t_cab type STANDARD TABLE OF string, "<-- CAmpos de cabecera de XLS
- t_dic type STANDARD TABLE OF dd03l.
- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- *--[ Field-Symbols
- FIELD-SYMBOLS : <GT_DATA> TYPE STANDARD TABLE,
- <ls_data> type any.
- FIELD-SYMBOLS: <pt> TYPE STANDARD TABLE,
- <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.
- TABLES: sscrfields. "<-- Para los botones en el PF-STATUS
- SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME .
- PARAMETERS: p_tabla type DD02L-TABNAME.
- SELECTION-SCREEN SKIP 1.
- SELECTION-SCREEN END OF BLOCK b1 .
- SELECTION-SCREEN BEGIN OF BLOCK b2 WITH FRAME .
- PARAMETERS: p_lincsv TYPE string,
- p_head AS CHECKBOX DEFAULT abap_false.
- SELECTION-SCREEN END OF BLOCK b2 .
- PARAMETERS: p_del AS CHECKBOX DEFAULT ' ',
- p_view AS CHECKBOX DEFAULT 'X',
- p_test AS CHECKBOX DEFAULT 'X'.
- SELECTION-SCREEN FUNCTION KEY 1.
- SELECTION-SCREEN FUNCTION KEY 2.
- SELECTION-SCREEN FUNCTION KEY 3.
- SELECTION-SCREEN FUNCTION KEY 4.
- SELECTION-SCREEN FUNCTION KEY 5.
ZINI_I_P000_EVE.
- INITIALIZATION.
- perform eve_INITIALIZATION.
- AT SELECTION-SCREEN.
- PERFORM eve_selection_screen.
- START-OF-SELECTION.
- perform eve_start_of_selection.
ZINI_I_P000_FRM.
- FORM popup_to_delete CHANGING p_subrc TYPE sysubrc.
- DATA: l_ans(1).
- CALL FUNCTION 'POPUP_TO_CONFIRM'
- EXPORTING
- titlebar = TEXT-t03
- * DIAGNOSE_OBJECT = ' '
- text_question = TEXT-q01
- text_button_1 = TEXT-q02
- * ICON_BUTTON_1 = ICON_OKAY
- text_button_2 = TEXT-q03
- * ICON_BUTTON_2 = ICON_CANCEL
- default_button = '2'
- display_cancel_button = abap_false
- start_column = 50
- * START_ROW = 6
- * POPUP_TYPE =
- iv_quickinfo_button_1 = TEXT-q04
- iv_quickinfo_button_2 = TEXT-q05
- IMPORTING
- answer = l_ans
- * TABLES
- * PARAMETER =
- EXCEPTIONS
- text_not_found = 1
- OTHERS = 2.
- IF l_ans = '1'.
- *--[ Bye Bye Bye
- CLEAR sy-subrc.
- ELSE.
- p_subrc = 69.
- * EXIT. "-> Back to the future
- ENDIF.
- ENDFORM.
- FORM eve_initialization.
- sscrfields-functxt_01 = |@49@ Exporar Estructura|.
- ENDFORM.
- FORM eve_selection_screen.
- CASE sscrfields-ucomm.
- WHEN 'FC01'. PERFORM data_export_sample.
- ENDCASE.
- ENDFORM.
- FORM eve_start_of_selection.
- *--[ Cuidadín!!!
- g_log = NEW zag3_cl_log( ).
- IF p_del = abap_true AND p_test IS INITIAL.
- PERFORM popup_to_delete CHANGING sy-subrc.
- IF sy-subrc NE 0.
- CLEAR p_del.
- ENDIF.
- ENDIF.
- g_log->add( i_db = abap_true
- i_t1 = |Tabla: { p_tabla } Cabecera [{ p_head }]|
- i_t2 = COND #( WHEN p_lincsv IS NOT INITIAL THEN |Lineas CSV { p_lincsv }| )
- i_t3 = |Borrado [{ p_del }] TEST [{ p_test }]|
- ).
- PERFORM: data_file_load USING p_file p_tabla,
- data_2_table USING p_tabla,
- data_display.
- ENDFORM.
- FORM data_display.
- CHECK lines( <pt> ) > 0.
- DATA(nl) = NEW zini_cl_falv( ).
- nl->alv_new( CHANGING p_table = <pt> ).
- DATA(l_seleccionados) = nl->alv_show( ).
- ENDFORM.
- FORM data_file_load USING p_file p_tab.
- DATA : lv_filename TYPE string,
- lt_records TYPE solix_tab,
- lv_headerxstring TYPE xstring,
- lv_filelength TYPE i,
- ft TYPE filetable.
- lv_filename = p_file.
- IF lv_filename IS INITIAL.
- CALL METHOD cl_gui_frontend_services=>file_open_dialog
- EXPORTING
- window_title = 'Selecciona los ficheros'
- multiselection = abap_false
- CHANGING
- file_table = ft
- rc = lv_filelength
- * USER_ACTION =
- * FILE_ENCODING =
- EXCEPTIONS
- file_open_dialog_failed = 1
- cntl_error = 2
- error_no_gui = 3
- not_supported_by_gui = 4
- OTHERS = 5.
- IF sy-subrc EQ 0." AND lines( ft ) = 1.
- * lv_filename = ft[ 1 ]-filename.
- ELSE.
- EXIT.
- ENDIF.
- LOOP AT ft INTO DATA(l_ft).
- lv_filename = l_ft-filename.
- g_log->add( i_db = abap_true i_t1 = lv_filename ).
- PERFORM data_file_from_excel USING lv_filename p_tab.
- PERFORM data_file_from_csv USING lv_filename p_tab.
- ENDLOOP.
- ENDIF.
- ENDFORM.
- FORM data_file_from_csv USING p_filename TYPE string p_tab.
- DATA: t_tab TYPE STANDARD TABLE OF string.
- DATA(ax) = to_upper( p_filename ).
- CHECK ax CP '*CSV'.
- CALL METHOD cl_gui_frontend_services=>gui_upload
- EXPORTING
- filename = p_filename
- filetype = 'ASC'
- codepage = '4110'
- CHANGING
- data_tab = t_tab
- 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
- dp_timeout = 16
- not_supported_by_gui = 17
- error_no_gui = 18
- OTHERS = 19.
- CHECK sy-subrc EQ 0.
- PERFORM create_table_dyn USING p_tab.
- LOOP AT t_tab INTO DATA(bx).
- SPLIT bx AT ';' INTO TABLE DATA(t_tmp).
- APPEND INITIAL LINE TO <gt_data> ASSIGNING FIELD-SYMBOL(<ls_data>).
- LOOP AT t_tmp INTO DATA(bl).
- ASSIGN COMPONENT sy-tabix OF STRUCTURE <ls_data> TO FIELD-SYMBOL(<bh>).
- <bh> = bl.
- ENDLOOP.
- ENDLOOP.
- ENDFORM.
- FORM create_table_dyn USING p_tab.
- DATA: ls_component TYPE cl_abap_structdescr=>component,
- lr_field_descr TYPE REF TO cl_abap_elemdescr,
- lo_structure TYPE REF TO cl_abap_structdescr,
- lo_table TYPE REF TO cl_abap_tabledescr,
- wa_structure TYPE REF TO data,
- li_table TYPE REF TO data,
- li_tot_comp TYPE cl_abap_structdescr=>component_table.
- IF <gt_data> IS ASSIGNED. REFRESH <gt_data>. EXIT. ENDIF.
- SELECT COUNT( * ) INTO @DATA(l_indice) FROM dd03l
- WHERE tabname = @p_tab AND
- fieldname NE '.INCLUDE' AND
- fieldname NE '.APPEND'.
- DO l_indice TIMES.
- ls_component-name = |A{ sy-index }|.
- lr_field_descr ?= cl_abap_elemdescr=>describe_by_name( 'STRING' ).
- ls_component-type = lr_field_descr.
- INSERT ls_component INTO TABLE li_tot_comp.
- ENDDO.
- lo_structure = cl_abap_structdescr=>create( li_tot_comp ).
- lo_table = cl_abap_tabledescr=>create( lo_structure ).
- CREATE DATA wa_structure TYPE HANDLE lo_structure.
- CREATE DATA li_table TYPE HANDLE lo_table.
- ASSIGN li_table->* TO <gt_data>.
- ASSIGN wa_structure->* TO <ls_data>.
- ENDFORM.
- *form create_table_DDIC using p_tab.
- *
- * DATA:
- * wa_data_ref TYPE REF TO data,
- * wa_struct_type TYPE REF TO cl_abap_structdescr,
- * wa_elem_type TYPE REF TO cl_abap_elemdescr,
- * wa_comp_fld TYPE cl_abap_structdescr=>component,
- * i_comp_tab TYPE cl_abap_structdescr=>component_table,
- * i_comp_tot_tab TYPE cl_abap_structdescr=>component_table,
- * g_total_field TYPE i,
- * g_tabix(2) TYPE c.
- *
- * wa_struct_type ?= cl_abap_typedescr=>describe_by_name( p_tab ).
- * i_comp_tab = wa_struct_type->get_components( ).
- * APPEND LINES OF i_comp_tab TO i_comp_tot_tab.
- * wa_struct_type = cl_abap_structdescr=>create( i_comp_tot_tab ).
- * CREATE DATA wa_data_ref TYPE HANDLE wa_struct_type.
- * ASSIGN wa_data_ref->* TO <gt_data>.
- *endform.
- FORM data_file_from_excel USING p_filename TYPE string
- p_tab.
- DATA : lv_filename TYPE string,
- lt_records TYPE solix_tab,
- lv_headerxstring TYPE xstring,
- lv_filelength TYPE i,
- ft TYPE filetable.
- DATA(ax) = to_upper( p_filename ).
- CHECK ax CP '*XLS' OR ax CP '*XLSX' .
- lv_filename = p_filename.
- CALL METHOD cl_gui_frontend_services=>gui_upload
- EXPORTING
- filename = lv_filename
- filetype = 'BIN'
- IMPORTING
- filelength = lv_filelength
- header = lv_headerxstring
- CHANGING
- data_tab = lt_records
- * ISSCANPERFORMED = SPACE
- 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
- dp_timeout = 16
- not_supported_by_gui = 17
- error_no_gui = 18
- OTHERS = 19.
- IF sy-subrc <> 0.
- * Implement suitable error handling here
- ENDIF.
- "convert binary data to xstring
- "if you are using cl_fdt_xl_spreadsheet in odata then skips this step
- "as excel file will already be in xstring
- CALL FUNCTION 'SCMS_BINARY_TO_XSTRING'
- EXPORTING
- input_length = lv_filelength
- IMPORTING
- buffer = lv_headerxstring
- TABLES
- binary_tab = lt_records
- EXCEPTIONS
- failed = 1
- OTHERS = 2.
- IF sy-subrc <> 0.
- "Implement suitable error handling here
- ENDIF.
- DATA : lo_excel_ref TYPE REF TO cl_fdt_xl_spreadsheet .
- TRY .
- lo_excel_ref = NEW cl_fdt_xl_spreadsheet(
- document_name = lv_filename
- xdocument = lv_headerxstring ) .
- CATCH cx_fdt_excel_core.
- "Implement suitable error handling here
- ENDTRY .
- "Get List of Worksheets
- lo_excel_ref->if_fdt_doc_spreadsheet~get_worksheet_names(
- IMPORTING
- worksheet_names = DATA(lt_worksheets) ).
- IF NOT lt_worksheets IS INITIAL.
- * READ TABLE LT_WORKSHEETS INTO DATA(LV_WOKSHEETNAME) INDEX 1.
- LOOP AT lt_worksheets INTO DATA(lv_woksheetname).
- IF lines( lt_worksheets ) NE 1.
- CHECK lv_woksheetname CS p_tab.
- ENDIF.
- DATA(lo_data_ref) = lo_excel_ref->if_fdt_doc_spreadsheet~get_itab_from_worksheet(
- lv_woksheetname ).
- "now you have excel work sheet data in dyanmic internal table
- ASSIGN lo_data_ref->* TO <gt_data>.
- EXIT.
- ENDLOOP.
- ENDIF.
- ENDFORM.
- FORM create_table USING p_table.
- DATA:
- wa_data_ref TYPE REF TO data,
- wa_struct_type TYPE REF TO cl_abap_structdescr,
- wa_elem_type TYPE REF TO cl_abap_elemdescr,
- wa_comp_fld TYPE cl_abap_structdescr=>component,
- i_comp_tab TYPE cl_abap_structdescr=>component_table,
- i_comp_tot_tab TYPE cl_abap_structdescr=>component_table,
- g_total_field TYPE i,
- g_tabix(2) TYPE c.
- wa_struct_type ?= cl_abap_typedescr=>describe_by_name( p_table ).
- i_comp_tab = wa_struct_type->get_components( ).
- APPEND LINES OF i_comp_tab TO i_comp_tot_tab.
- wa_struct_type = cl_abap_structdescr=>create( i_comp_tot_tab ).
- CREATE DATA wa_data_ref TYPE HANDLE wa_struct_type.
- ASSIGN wa_data_ref->* TO <pl>.
- CREATE DATA wa_data_ref LIKE STANDARD TABLE OF <pl>.
- ASSIGN wa_data_ref->* TO <pt>.
- ENDFORM.
- FORM data_delete_lines.
- DATA: t_lineas TYPE STANDARD TABLE OF numc5,
- t_i TYPE STANDARD TABLE OF syindex,
- l_i TYPE syindex.
- *--[ Borramos las líneas innecesarias
- CHECK p_lincsv IS NOT INITIAL.
- CONDENSE p_lincsv NO-GAPS.
- SPLIT p_lincsv AT ',' INTO TABLE t_lineas.
- LOOP AT t_lineas INTO DATA(ax).
- l_i = ax.
- APPEND l_i TO t_i.
- ENDLOOP.
- SORT t_i DESCENDING.
- LOOP AT t_i INTO l_i.
- TRY.
- DELETE <gt_data> INDEX l_i.
- CATCH cx_root.
- CLEAR sy-subrc.
- ENDTRY.
- ENDLOOP.
- ENDFORM.
- FORM data_read_header.
- CHECK p_head = abap_true.
- CHECK lines( <gt_data> ) > 0.
- READ TABLE <gt_data> ASSIGNING FIELD-SYMBOL(<ax>) INDEX 1.
- DO.
- ASSIGN COMPONENT sy-index OF STRUCTURE <ax> TO FIELD-SYMBOL(<bx>).
- IF sy-subrc NE 0. EXIT. ENDIF.
- t_cab = VALUE #( BASE t_cab ( <bx> ) ).
- ENDDO.
- DELETE <gt_data> INDEX 1. "<-- Borramos la cabecera
- ENDFORM.
- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- *--[ Sin cabecera en el fichero y estructurado igual que la tabla
- FORM data_2_table_without_cab USING t_bp.
- DATA: lv_numberofcolumns TYPE i.
- CHECK p_head IS INITIAL.
- DATA(l_tabix) = sy-tabix.
- lv_numberofcolumns = lines( t_dic )." ¿¿¿ - 1. ???
- APPEND INITIAL LINE TO <pt> ASSIGNING FIELD-SYMBOL(<ps>).
- DO lv_numberofcolumns TIMES.
- ASSIGN COMPONENT sy-index OF STRUCTURE <ls_data> TO FIELD-SYMBOL(<lv_field>) .
- IF sy-subrc = 0 .
- DATA(l_field) = t_dic[ sy-index ]-fieldname.
- DATA(l_f) = |<ps>-{ l_field }|.
- ASSIGN (l_f) TO FIELD-SYMBOL(<f>).
- DESCRIBE FIELD <f> TYPE DATA(l_tipo).
- DESCRIBE FIELD <f> DECIMALS DATA(l_dec).
- IF l_dec > 0 AND l_tipo = 'P' AND <lv_field> CP '*.*E-*'.
- DATA: pp TYPE f.
- pp = <lv_field>.
- <f> = pp.
- ELSE.
- <f> = <lv_field>.
- ENDIF.
- ELSE.
- EXIT. "<-- Bye Bye Bye
- ENDIF.
- ENDDO .
- MOVE-CORRESPONDING t_bp TO <ps>.
- * APPEND <pl> to (bx). "L_ZAG3_TDM1 TO IT_ZAG3_TDM1.
- ENDFORM.
- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- *--[ Con cabecera, pero no sabemos como estará estructurado
- FORM data_2_table_with_cab USING t_bp.
- CHECK p_head IS NOT INITIAL.
- * loop at t_cab into data(l_cab).
- APPEND INITIAL LINE TO <pt> ASSIGNING FIELD-SYMBOL(<ps>).
- DO.
- ASSIGN COMPONENT sy-index OF STRUCTURE <ls_data> TO FIELD-SYMBOL(<lv_field>) .
- IF sy-subrc NE 0. EXIT. ENDIF.
- TRY.
- DATA(al) = t_cab[ sy-index ].
- CATCH cx_root.
- CONTINUE. "<-- No existe campo para esa columna
- ENDTRY.
- CHECK al IS NOT INITIAL.
- DATA(ah) = |<ps>-{ al }|.
- ASSIGN (ah) TO FIELD-SYMBOL(<al>).
- CHECK sy-subrc EQ 0.
- DESCRIBE FIELD <al> TYPE DATA(l_tipo).
- DESCRIBE FIELD <al> DECIMALS DATA(l_dec).
- IF l_dec > 0 AND l_tipo = 'P'.
- IF <lv_field> CP '*.*E-*'.
- DATA: pp TYPE f.
- pp = <lv_field>.
- <al> = pp.
- ELSE.
- *--[ Aquí puede tener comas, puntos, signos, debería arreglase desde fichero
- TRANSLATE <lv_field> USING ',.% '.
- REPLACE ALL OCCURRENCES OF REGEX '[a-zA-Z]' IN <lv_field> WITH ' '.
- CONDENSE <lv_field> NO-GAPS.
- <al> = <lv_field>. "Dejemos que explote
- ENDIF.
- ELSE.
- <al> = <lv_field>.
- ENDIF.
- ENDDO.
- MOVE-CORRESPONDING t_bp TO <ps>.
- ENDFORM.
- FORM data_2_table USING p_tabla.
- TYPES: BEGIN OF ty_bp,
- * ZUS_CREA type ZUS_CREA_A,
- zfe_cread TYPE zfe_cread_a,
- zhr_cread TYPE zh_cread_a.
- * ZUS_MOD type ZUS_MOD_A,
- * ZFE_MOD type ZFE_MOD_A,
- * ZHR_MOD type ZHR_MOD_A.
- INCLUDE STRUCTURE zag3_tdmx..
- TYPES END OF ty_bp.
- DATA : bp TYPE ty_bp.
- PERFORM create_table USING p_tabla.
- CLEAR bp.
- bp-zus_crea = sy-uname.
- bp-zfe_crea = bp-zfe_cread = sy-datum.
- bp-zhr_crea = bp-zhr_cread = sy-uzeit.
- CHECK <gt_data> IS ASSIGNED.
- PERFORM data_delete_lines.
- PERFORM data_read_header.
- *--[ Capturamos la cabecera que debe ser la primera línea
- *--[ Después de lo que quede por ahí
- LOOP AT <gt_data> ASSIGNING <ls_data>.
- AT FIRST.
- IF p_head IS INITIAL.
- SELECT * FROM dd03l INTO TABLE t_dic WHERE tabname = p_tabla AND
- fieldname NE 'MANDT' AND
- fieldname NOT LIKE '%INCLUDE'.
- ENDIF.
- ENDAT.
- PERFORM data_2_table_without_cab USING bp.
- PERFORM data_2_table_with_cab USING bp.
- AT LAST.
- IF lines( <pt> ) >= 1.
- DATA(l_lines) = lines( <pt> ).
- IF p_test IS INITIAL.
- IF p_del = abap_true.
- g_log->add( i_db = abap_true i_t1 = |Tabla { p_tabla } borrada| ).
- DELETE FROM (p_tabla).
- ENDIF.
- g_log->add( i_db = abap_true i_t1 = |Grabando: { l_lines } registros| ).
- *--[ BUscamos la cantidad incial
- DATA: l_count_ini TYPE i,
- l_count_fin TYPE i,
- l_total TYPE i.
- SELECT COUNT( * ) INTO l_count_ini FROM (p_tabla).
- MODIFY (p_tabla) FROM TABLE <pt>.
- DATA(l_dbcount) = sy-dbcnt.
- COMMIT WORK AND WAIT.
- *--[ Buscamos la cantidad final
- SELECT COUNT( * ) INTO l_count_fin FROM (p_tabla).
- l_total = l_lines - ( l_count_fin - l_count_ini ).
- IF l_total NE 0.
- MESSAGE i398(00) WITH 'Posible perdida de' l_total 'registros'.
- ENDIF.
- DATA(l_msg) = |Tabla { p_tabla } actualizada con { l_lines }/{ l_dbcount } registros|.
- ELSE.
- l_msg = |(TEST) Tabla { p_tabla } cargada con { l_lines } registros|.
- ENDIF.
- MESSAGE s398(00) WITH l_msg '' '' ''.
- ELSE.
- l_msg = |No hay registros para { p_tabla }|.
- MESSAGE s398(00) WITH l_msg '' '' ''.
- ENDIF.
- ENDAT.
- ENDLOOP.
- ENDFORM.
- FORM data_export_sample.
- SELECT
- *TABNAME,
- fieldname,
- rollname,
- datatype,
- leng,
- decimals
- FROM dd03l
- INTO TABLE @DATA(ax)
- WHERE tabname = @p_tabla AND
- fieldname NE 'MANDT' AND
- fieldname NE '.INCLUDE'
- ORDER BY position.
- IF sy-subrc EQ 0.
- DATA: t_s TYPE STANDARD TABLE OF string.
- DATA: l01 TYPE string, l03 TYPE string, l02 TYPE string.
- * l01 = l02 = ','.
- DATA(nl) = NEW zini_cl_falv( ).
- nl->alv_new( CHANGING p_table = ax ).
- 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 ) ).
- LOOP AT l_seleccionados INTO DATA(lsel).
- DATA(ah) = ax[ lsel ].
- * LOOP AT ax INTO DATA(ah).
- DATA(al) = CONV string( ah-leng ).
- SHIFT al LEFT DELETING LEADING '0'.
- IF ah-decimals NE 0.
- DATA(bh) = CONV string( ah-decimals ).
- SHIFT bh LEFT DELETING LEADING '0'.
- al = |{ al },{ bh }|.
- ENDIF.
- IF ah-datatype = 'DATS'.
- al = 'YYYYMMDD'.
- ENDIF.
- SELECT SINGLE reptext INTO @DATA(l_text) FROM dd04t
- WHERE rollname = @ah-rollname
- AND ddlanguage = @sy-langu.
- l01 = |{ l01 };{ ah-fieldname }|.
- l02 = |{ l02 };{ ah-datatype }({ al })|.
- l03 = |{ l03 };{ l_text }|.
- AT LAST.
- SHIFT l01 LEFT DELETING LEADING ';'.
- SHIFT l03 LEFT DELETING LEADING ';'.
- SHIFT l02 LEFT DELETING LEADING ';'.
- APPEND l01 TO t_s.
- APPEND l03 TO t_s.
- APPEND l02 TO t_s.
- APPEND 'NOTA 1: La primera línea es obligatoria' TO t_s.
- APPEND 'NOTA 2: El resto de lineas son informativas y deben borrarse' TO t_s.
- APPEND 'NOTA 3: Grabar como XLSX' TO t_s.
- ENDAT.
- ENDLOOP.
- CHECK lines( t_s ) > 0.
- DATA: len TYPE i.
- DATA(l_name) = CONV string( |{ p_tabla }.csv| ).
- CALL METHOD cl_gui_frontend_services=>file_save_dialog
- EXPORTING
- window_title = 'Exportar fichero'
- default_extension = 'csv'
- default_file_name = l_name
- CHANGING
- filename = l01
- path = l02
- fullpath = l03
- * user_action =
- * file_encoding =
- EXCEPTIONS
- cntl_error = 1
- error_no_gui = 2
- not_supported_by_gui = 3
- invalid_default_file_name = 4
- OTHERS = 5.
- IF sy-subrc EQ 0.
- l_name = l03.
- CALL METHOD cl_gui_frontend_services=>gui_download
- EXPORTING
- filename = l_name
- filetype = 'ASC'
- CHANGING
- data_tab = t_s
- 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
- not_supported_by_gui = 22
- error_no_gui = 23
- OTHERS = 24.
- IF sy-subrc <> 0.
- * Implement suitable error handling here
- ENDIF.
- ENDIF.
- ENDIF.
- ENDFORM.