REPORT ZINI_02.
PARAMETERS : P_FILE(100) DEFAULT 'M:\Estructura Tablas v2.xlsx' LOWER CASE,
P_TAB TYPE TABNAME OBLIGATORY DEFAULT 'ZAG3_TDM2',
P_TEST AS CHECKBOX DEFAULT 'X'.
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*--[ NOTAS
*--[
*--[ El XLS puede tener multiples pestanyas, pero la pestanya con
*--[ los datos, debe contener el nombre de la tabla o solo una
*--[ unica pestanya.
*--[
*--[ El XLS debe tener la primera linea de cabecera que sera
*--[ ignorada
*--[
CLASS ZINI_CL_UPLOAD_2_TAB DEFINITION.
PUBLIC SECTION.
METHODS: CONSTRUCTOR IMPORTING P_FILE TYPE STRING
P_TAB TYPE TABNAME
P_TEST TYPE XFELD OPTIONAL,
DATA_LOADSAVE.
PRIVATE SECTION.
DATA: G_FILE TYPE STRING,
G_TAB TYPE TABNAME,
G_TEST TYPE XFELD.
ENDCLASS.
CLASS ZINI_CL_UPLOAD_2_TAB IMPLEMENTATION.
METHOD CONSTRUCTOR.
G_FILE = P_FILE.
G_TAB = P_TAB.
G_TEST = abap_true.
if p_test is SUPPLIED.
g_test = P_TEST.
endif.
ENDMETHOD.
METHOD DATA_LOADSAVE.
FIELD-SYMBOLS: <GT_DATA> TYPE STANDARD TABLE.
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*--[ Lectura del XLS
DATA : LV_FILENAME TYPE STRING,
LT_RECORDS TYPE SOLIX_TAB,
LV_HEADERXSTRING TYPE XSTRING,
LV_FILELENGTH TYPE I,
FT TYPE FILETABLE.
IF G_FILE IS INITIAL.
CALL METHOD CL_GUI_FRONTEND_SERVICES=>FILE_OPEN_DIALOG
EXPORTING
WINDOW_TITLE = 'Selecciona un fichero'
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.
* Implement suitable error handling here
G_FILE = FT[ 1 ]-FILENAME.
ELSE.
EXIT.
ENDIF.
ENDIF.
CALL METHOD CL_GUI_FRONTEND_SERVICES=>GUI_UPLOAD
EXPORTING
FILENAME = G_FILE
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.
CHECK SY-SUBRC EQ 0 .
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.
CHECK SY-SUBRC EQ 0.
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) ).
CHECK NOT LT_WORKSHEETS IS INITIAL.
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.
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*--[ DATA_LOAD
DATA : LV_NUMBEROFCOLUMNS TYPE I,
TABLE TYPE REF TO DATA.
FIELD-SYMBOLS: <PT> TYPE STANDARD TABLE,
<PL> TYPE ANY.
DATA(STRUCT_DESC) = CL_ABAP_STRUCTDESCR=>DESCRIBE_BY_NAME( G_TAB ).
DATA(TABLE_DESC) = CL_ABAP_TABLEDESCR=>CREATE(
P_LINE_TYPE = CAST #( STRUCT_DESC )
P_TABLE_KIND = CL_ABAP_TABLEDESCR=>TABLEKIND_STD
P_UNIQUE = ABAP_FALSE
).
CREATE DATA TABLE TYPE HANDLE TABLE_DESC.
ASSIGN TABLE->* TO <PT>.
LOOP AT <GT_DATA> ASSIGNING FIELD-SYMBOL(<LS_DATA>).
AT FIRST.
SELECT * FROM DD03L INTO TABLE @DATA(T_DIC) WHERE TABNAME = @G_TAB AND
FIELDNAME NE 'MANDT' AND
FIELDNAME NOT LIKE '%INCLUDE'.
ENDAT.
DATA(L_TABIX) = SY-TABIX.
IF SY-TABIX EQ 1. CONTINUE. ENDIF.
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>).
<F> = <LV_FIELD>.
ELSE.
EXIT. "<-- Bye Bye Bye
ENDIF.
ENDDO .
AT LAST.
IF LINES( <PT> ) >= 1.
IF G_TEST IS INITIAL.
MODIFY (G_TAB) FROM TABLE <PT>.
MESSAGE S398(00) WITH 'Tabla' P_TAB 'actualizada' ''.
ELSE.
ENDIF.
ELSE.
MESSAGE E398(00) WITH 'No hay registros para' P_TAB '' ''.
ENDIF.
ENDAT.
ENDLOOP.
ENDMETHOD.
ENDCLASS.
END-OF-SELECTION.
DATA(L_XLS) = NEW ZINI_CL_UPLOAD_2_TAB( P_FILE = CONV STRING( P_FILE )
P_TAB = CONV TABNAME( P_TAB )
).
L_XLS->DATA_LOADSAVE( ).