Skip to content

Instantly share code, notes, and snippets.

@kgorin8
Created February 5, 2019 10:58
Show Gist options
  • Save kgorin8/1d2d5e71312ecbe32bd1daee40e72827 to your computer and use it in GitHub Desktop.
Save kgorin8/1d2d5e71312ecbe32bd1daee40e72827 to your computer and use it in GitHub Desktop.
*&---------------------------------------------------------------------*
*& Report ZUPLOADEXCEL
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*
REPORT ZUPLOADEXCEL NO STANDARD PAGE HEADING.
PARAMETERS: p_file LIKE rlgrap-filename OBLIGATORY MEMORY ID Z_FILENAME_ID.
PARAMETERS: p_table TYPE TABNAME AS LISTBOX VISIBLE LENGTH 50 MEMORY ID Z_TABLE_ID.
DATA: it_tab TYPE filetable.
DATA: tb_data TYPE REF TO data.
DATA: g_raw_data TYPE TRUXS_T_TEXT_DATA.
FIELD-SYMBOLS <tb_data> TYPE STANDARD TABLE.
FIELD-SYMBOLS <fs> TYPE ANY.
FIELD-SYMBOLS <fs_field>.
AT SELECTION-SCREEN OUTPUT.
DATA: list TYPE vrm_values,
value LIKE LINE OF list.
DATA: T_ZUPLOADEXCEL TYPE STANDARD TABLE OF ZUPLOADEXCEL WITH HEADER LINE.
SELECT *
INTO CORRESPONDING FIELDS OF TABLE T_ZUPLOADEXCEL
FROM ZUPLOADEXCEL.
LOOP AT T_ZUPLOADEXCEL WHERE TABNAME IS NOT INITIAL.
value-key = T_ZUPLOADEXCEL-TABNAME.
value-text = T_ZUPLOADEXCEL-TABLETEXT.
APPEND value TO list.
ENDLOOP.
CALL FUNCTION 'VRM_SET_VALUES'
EXPORTING id = 'P_TABLE'
values = list.
IF P_TABLE IS INITIAL.
READ TABLE T_ZUPLOADEXCEL INDEX 1.
IF SY-SUBRC EQ 0.
P_TABLE = T_ZUPLOADEXCEL-TABNAME.
ENDIF.
ENDIF.
AT SELECTION-SCREEN ON P_TABLE.
IF P_TABLE EQ ''.
MESSAGE 'Имя таблицы не указано' TYPE 'E'.
ENDIF.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file.
REFRESH: it_tab.
DATA : gd_subrc TYPE I.
CALL METHOD cl_gui_frontend_services=>file_open_dialog
EXPORTING
window_title = 'Выберите файл Excel'
default_filename = '*.xls'
multiselection = ' '
CHANGING
file_table = it_tab
rc = gd_subrc.
LOOP AT it_tab INTO p_file.
ENDLOOP.
START-OF-SELECTION.
CREATE DATA tb_data TYPE TABLE OF (p_table).
ASSIGN tb_data->* TO <tb_data>.
CALL FUNCTION 'TEXT_CONVERT_XLS_TO_SAP'
EXPORTING
i_tab_raw_data = g_raw_data
i_filename = p_file
TABLES
i_tab_converted_data = <tb_data>
EXCEPTIONS
conversion_failed = 1
OTHERS = 2.
IF sy-subrc NE 0.
MESSAGE 'Ошибка загрузки данных' TYPE 'S' DISPLAY LIKE 'E'.
EXIT.
ENDIF.
IF <tb_data> IS INITIAL.
MESSAGE 'Данные для загрузки отсутствуют' TYPE 'S' DISPLAY LIKE 'E'.
EXIT.
ELSE.
DATA td TYPE sydes_desc.
DATA td_names TYPE LINE OF sydes_desc-names.
LOOP AT <tb_data> ASSIGNING <fs>.
DO.
ASSIGN COMPONENT sy-index OF STRUCTURE <fs> TO <fs_field>.
IF SY-SUBRC NE 0.
EXIT.
ENDIF.
IF <fs_field> IS NOT INITIAL.
DESCRIBE FIELD <fs_field> INTO td.
DATA cnt TYPE I.
cnt = LINES( td-NAMES ).
IF cnt GT 2.
DATA CONVEXIT_NAME LIKE td_names-NAME.
READ TABLE td-NAMES INTO td_names INDEX cnt.
MOVE td_names-NAME TO CONVEXIT_NAME.
IF CONVEXIT_NAME+0(2) = '=='.
CONVEXIT_NAME = CONVEXIT_NAME+2.
CONDENSE CONVEXIT_NAME.
DATA FN_CONVEXIT TYPE STRING.
CONCATENATE 'CONVERSION_EXIT_' CONVEXIT_NAME '_INPUT' INTO FN_CONVEXIT.
TRY.
CALL FUNCTION FN_CONVEXIT
EXPORTING
INPUT = <fs_field>
IMPORTING
OUTPUT = <fs_field>.
CATCH cx_sy_dyn_call_illegal_type.
ENDTRY.
ENDIF.
ENDIF.
ENDIF.
ENDDO.
ENDLOOP.
MODIFY (p_table) FROM TABLE <tb_data>.
MESSAGE 'Данные успешно загружены' TYPE 'S'.
ENDIF.
END-OF-SELECTION.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment