ABAP Prog Propios MIG Tab 4

  1.  
  2. REPORT ZINI_02.
  3.  
  4. PARAMETERS : P_FILE(100) DEFAULT 'M:\Estructura Tablas v2.xlsx' LOWER CASE,
  5.              P_TAB       TYPE TABNAME OBLIGATORY DEFAULT 'ZAG3_TDM2',
  6.              P_TEST      AS CHECKBOX DEFAULT 'X'.
  7.  
  8. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  9. *--[ NOTAS
  10. *--[
  11. *--[ El XLS puede tener multiples pestanyas, pero la pestanya con
  12. *--[ los datos, debe contener el nombre de la tabla o solo una
  13. *--[ unica pestanya.
  14. *--[
  15. *--[ El XLS debe tener la primera linea de cabecera que sera
  16. *--[ ignorada
  17. *--[
  18. CLASS ZINI_CL_UPLOAD_2_TAB DEFINITION.
  19.  
  20.   PUBLIC SECTION.
  21.  
  22.     METHODS: CONSTRUCTOR IMPORTING P_FILE TYPE STRING
  23.                                    P_TAB  TYPE TABNAME
  24.                                    P_TEST TYPE XFELD OPTIONAL,
  25.       DATA_LOADSAVE.
  26.  
  27.   PRIVATE SECTION.
  28.  
  29.     DATA: G_FILE TYPE STRING,
  30.           G_TAB  TYPE TABNAME,
  31.           G_TEST TYPE XFELD.
  32.  
  33. ENDCLASS.
  34.  
  35. CLASS ZINI_CL_UPLOAD_2_TAB IMPLEMENTATION.
  36.  
  37.   METHOD CONSTRUCTOR.
  38.     G_FILE = P_FILE.
  39.     G_TAB  = P_TAB.
  40.     G_TEST = abap_true.
  41.     if p_test is SUPPLIED.
  42.        g_test = P_TEST.
  43.      endif.
  44.   ENDMETHOD.
  45.  
  46.   METHOD DATA_LOADSAVE.
  47.     FIELD-SYMBOLS: <GT_DATA> TYPE STANDARD TABLE.
  48. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  49. *--[ Lectura del XLS
  50.     DATA : LV_FILENAME      TYPE STRING,
  51.            LT_RECORDS       TYPE SOLIX_TAB,
  52.            LV_HEADERXSTRING TYPE XSTRING,
  53.            LV_FILELENGTH    TYPE I,
  54.            FT               TYPE FILETABLE.
  55.  
  56.     IF G_FILE IS INITIAL.
  57.  
  58.       CALL METHOD CL_GUI_FRONTEND_SERVICES=>FILE_OPEN_DIALOG
  59.         EXPORTING
  60.           WINDOW_TITLE            = 'Selecciona un fichero'
  61.           MULTISELECTION          = ABAP_FALSE
  62.         CHANGING
  63.           FILE_TABLE              = FT
  64.           RC                      = LV_FILELENGTH
  65. *         USER_ACTION             =
  66. *         FILE_ENCODING           =
  67.         EXCEPTIONS
  68.           FILE_OPEN_DIALOG_FAILED = 1
  69.           CNTL_ERROR              = 2
  70.           ERROR_NO_GUI            = 3
  71.           NOT_SUPPORTED_BY_GUI    = 4
  72.           OTHERS                  = 5.
  73.       IF SY-SUBRC EQ 0 AND LINES( FT ) = 1.
  74. *    Implement suitable error handling here
  75.         G_FILE = FT[ 1 ]-FILENAME.
  76.       ELSE.
  77.         EXIT.
  78.       ENDIF.
  79.  
  80.     ENDIF.
  81.     CALL METHOD CL_GUI_FRONTEND_SERVICES=>GUI_UPLOAD
  82.       EXPORTING
  83.         FILENAME                = G_FILE
  84.         FILETYPE                = 'BIN'
  85.       IMPORTING
  86.         FILELENGTH              = LV_FILELENGTH
  87.         HEADER                  = LV_HEADERXSTRING
  88.       CHANGING
  89.         DATA_TAB                = LT_RECORDS
  90. *       ISSCANPERFORMED         = SPACE
  91.       EXCEPTIONS
  92.         FILE_OPEN_ERROR         = 1
  93.         FILE_READ_ERROR         = 2
  94.         NO_BATCH                = 3
  95.         GUI_REFUSE_FILETRANSFER = 4
  96.         INVALID_TYPE            = 5
  97.         NO_AUTHORITY            = 6
  98.         UNKNOWN_ERROR           = 7
  99.         BAD_DATA_FORMAT         = 8
  100.         HEADER_NOT_ALLOWED      = 9
  101.         SEPARATOR_NOT_ALLOWED   = 10
  102.         HEADER_TOO_LONG         = 11
  103.         UNKNOWN_DP_ERROR        = 12
  104.         ACCESS_DENIED           = 13
  105.         DP_OUT_OF_MEMORY        = 14
  106.         DISK_FULL               = 15
  107.         DP_TIMEOUT              = 16
  108.         NOT_SUPPORTED_BY_GUI    = 17
  109.         ERROR_NO_GUI            = 18
  110.         OTHERS                  = 19.
  111.  
  112.     CHECK SY-SUBRC EQ 0 .
  113.  
  114.     CALL FUNCTION 'SCMS_BINARY_TO_XSTRING'
  115.       EXPORTING
  116.         INPUT_LENGTH = LV_FILELENGTH
  117.       IMPORTING
  118.         BUFFER       = LV_HEADERXSTRING
  119.       TABLES
  120.         BINARY_TAB   = LT_RECORDS
  121.       EXCEPTIONS
  122.         FAILED       = 1
  123.         OTHERS       = 2.
  124.  
  125.     CHECK SY-SUBRC EQ 0.
  126.  
  127.     DATA : LO_EXCEL_REF TYPE REF TO CL_FDT_XL_SPREADSHEET .
  128.  
  129.     TRY .
  130.         LO_EXCEL_REF = NEW CL_FDT_XL_SPREADSHEET(
  131.                                 DOCUMENT_NAME = LV_FILENAME
  132.                                 XDOCUMENT     = LV_HEADERXSTRING ) .
  133.       CATCH CX_FDT_EXCEL_CORE.
  134.         "Implement suitable error handling here
  135.     ENDTRY .
  136.  
  137.     "Get List of Worksheets
  138.     LO_EXCEL_REF->IF_FDT_DOC_SPREADSHEET~GET_WORKSHEET_NAMES(
  139.       IMPORTING
  140.         WORKSHEET_NAMES = DATA(LT_WORKSHEETS) ).
  141.  
  142.     CHECK NOT LT_WORKSHEETS IS INITIAL.
  143.  
  144.     LOOP AT LT_WORKSHEETS INTO DATA(LV_WOKSHEETNAME).
  145.       IF LINES( LT_WORKSHEETS ) NE 1.
  146.         CHECK LV_WOKSHEETNAME CS P_TAB.
  147.       ENDIF.
  148.       DATA(LO_DATA_REF) = LO_EXCEL_REF->IF_FDT_DOC_SPREADSHEET~GET_ITAB_FROM_WORKSHEET(
  149.                                                LV_WOKSHEETNAME ).
  150.       "now you have excel work sheet data in dyanmic internal table
  151.       ASSIGN LO_DATA_REF->* TO <GT_DATA>.
  152.       EXIT.
  153.     ENDLOOP.
  154.  
  155. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  156. *--[ DATA_LOAD
  157.     DATA : LV_NUMBEROFCOLUMNS TYPE I,
  158.            TABLE              TYPE REF TO DATA.
  159.     FIELD-SYMBOLS: <PT> TYPE STANDARD TABLE,
  160.                    <PL> TYPE ANY.
  161.  
  162.  
  163.     DATA(STRUCT_DESC) = CL_ABAP_STRUCTDESCR=>DESCRIBE_BY_NAME( G_TAB ).
  164.     DATA(TABLE_DESC)  = CL_ABAP_TABLEDESCR=>CREATE(
  165.                                               P_LINE_TYPE  = CAST #( STRUCT_DESC )
  166.                                               P_TABLE_KIND = CL_ABAP_TABLEDESCR=>TABLEKIND_STD
  167.                                               P_UNIQUE     = ABAP_FALSE
  168.                                           ).
  169.  
  170.     CREATE DATA TABLE TYPE HANDLE TABLE_DESC.
  171.     ASSIGN TABLE->* TO <PT>.
  172.  
  173.     LOOP AT <GT_DATA> ASSIGNING FIELD-SYMBOL(<LS_DATA>).
  174.       AT FIRST.
  175.         SELECT * FROM  DD03L INTO TABLE @DATA(T_DIC) WHERE TABNAME = @G_TAB AND
  176.                                                            FIELDNAME NE 'MANDT' AND
  177.                                                            FIELDNAME NOT LIKE '%INCLUDE'.
  178.       ENDAT.
  179.       DATA(L_TABIX) = SY-TABIX.
  180.       IF SY-TABIX EQ 1. CONTINUE. ENDIF.
  181.       LV_NUMBEROFCOLUMNS = LINES( T_DIC ) - 1.
  182.       APPEND INITIAL LINE TO <PT> ASSIGNING FIELD-SYMBOL(<PS>).
  183.       DO LV_NUMBEROFCOLUMNS TIMES.
  184.         ASSIGN COMPONENT SY-INDEX OF STRUCTURE <LS_DATA> TO FIELD-SYMBOL(<LV_FIELD>) .
  185.         IF SY-SUBRC = 0 .
  186.           DATA(L_FIELD) = T_DIC[ SY-INDEX ]-FIELDNAME.
  187.           DATA(L_F) = |<ps>-{ L_FIELD }|.
  188.           ASSIGN (L_F) TO FIELD-SYMBOL(<F>).
  189.           <F> = <LV_FIELD>.
  190.         ELSE.
  191.           EXIT. "<-- Bye Bye Bye
  192.         ENDIF.
  193.       ENDDO .
  194.  
  195.       AT LAST.
  196.         IF LINES( <PT> ) >= 1.
  197.           IF G_TEST IS INITIAL.
  198.             MODIFY (G_TAB) FROM TABLE <PT>.
  199.             MESSAGE S398(00) WITH 'Tabla' P_TAB 'actualizada' ''.
  200.           ELSE.
  201.  
  202.           ENDIF.
  203.         ELSE.
  204.           MESSAGE E398(00) WITH 'No hay registros para' P_TAB '' ''.
  205.         ENDIF.
  206.       ENDAT.
  207.     ENDLOOP.
  208.   ENDMETHOD.
  209.  
  210. ENDCLASS.
  211.  
  212. END-OF-SELECTION.
  213.  
  214.   DATA(L_XLS) = NEW ZINI_CL_UPLOAD_2_TAB( P_FILE = CONV STRING( P_FILE )
  215.                                           P_TAB  = CONV TABNAME( P_TAB )
  216.                                         ).
  217.   L_XLS->DATA_LOADSAVE( ).