Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- TYPES:
- " Строка Excel файла.
- BEGIN OF GTS_VALUE_XLS,
- VALUE(262135) TYPE C,
- "VALUE(131072) TYPE C,
- "VALUE(258048) TYPE C,
- END OF GTS_VALUE_XLS,
- " Данные в виде Строка, Столбец, Значение.
- BEGIN OF GTS_RC_VALUE,
- ROW(5) TYPE N,
- COLUMN(3) TYPE N,
- VALUE(2048) TYPE C,
- END OF GTS_RC_VALUE,
- GTT_RC_VALUE TYPE TABLE OF GTS_RC_VALUE INITIAL SIZE 5 WITH NON-UNIQUE DEFAULT KEY,
- " Структура таблицы в которую будут загружены данные из Excel в виде строки.
- BEGIN OF GTS_EXCE_LINE,
- VALUE TYPE GTS_VALUE_XLS-VALUE,
- END OF GTS_EXCE_LINE,
- GTT_EXCE_LINE TYPE TABLE OF GTS_EXCE_LINE INITIAL SIZE 5 WITH NON-UNIQUE DEFAULT KEY.
- DATA:
- G_STR0 TYPE STRING,
- " Приложение - Эксель.
- L_APPLICATION TYPE OLE2_OBJECT,
- " Книга экселя.
- L_BOOKS TYPE OLE2_OBJECT,
- " Книга экселя.
- L_WORKBOOK TYPE OLE2_OBJECT,
- " Лист книги.
- L_SHEET TYPE OLE2_OBJECT,
- " Область ячеек.
- L_RANGE TYPE OLE2_OBJECT,
- " Ячейки: начальная и конечная.
- L_CELL1 TYPE OLE2_OBJECT,
- L_CELL2 TYPE OLE2_OBJECT.
- FUNCTION Z_LOAD_XLS_TO_SAP.
- *"----------------------------------------------------------------------
- *"*"Локальный интерфейс:
- *" IMPORTING
- *" REFERENCE(P_FILE_NAME) TYPE CHAR255
- *" REFERENCE(P_NLK) TYPE I DEFAULT 1
- *" REFERENCE(P_START_ROW) TYPE I DEFAULT 2
- *" REFERENCE(P_START_COL) TYPE I DEFAULT 1
- *" REFERENCE(P_DEL_EMPTY_STR) TYPE C DEFAULT 'X'
- *" CHANGING
- *" REFERENCE(PT_ITAB) TYPE STANDARD TABLE
- *" EXCEPTIONS
- *" P_ERROR
- *"----------------------------------------------------------------------
- " Загрузка данных во внутреннюю таблицу INTERN1 из файла эксель FILE_NAME с листа номер P_NLK.
- " Изменения:
- " 73zaa (1,318,821) 04.09.2019 - Оптимизация скорости работы.
- DATA:
- " Таблица для преобразованных данных.
- LT_RC_VALUE TYPE TABLE OF GTS_RC_VALUE,
- " Символ разделитель столбцов.
- L_SEPARATOR TYPE C,
- " Таблица в которую будут загружены данные из Excel.
- LT_EXCEL_LINE TYPE TABLE OF GTS_EXCE_LINE,
- LR_EXCEL_LINE TYPE REF TO GTS_EXCE_LINE,
- "LT_EXCEL_LINE_S TYPE TABLE OF GTS_EXCE_LINE,
- L_STR1 TYPE STRING,
- LR_GEN_TAB TYPE REF TO GTS_RC_VALUE,
- "
- L_TABLE TYPE TABLE OF GTS_RC_VALUE,
- L_CURRENT_ROW TYPE I,
- L_TABIX TYPE I,
- L_CNT TYPE SY-TABIX,
- L_POS1 TYPE SY-TABIX,
- L_POS2 TYPE SY-TABIX,
- L_SPACE1 TYPE STRING,
- L_SPACE2 TYPE STRING,
- L_EMPTY TYPE C.
- CONSTANTS:
- L_STEP TYPE SY-TABIX VALUE 4096.
- FIELD-SYMBOLS:
- <L_ITAB> TYPE ANY.
- " Разделитель - горизонтальная табуляция.
- L_SEPARATOR = CL_ABAP_CHAR_UTILITIES=>HORIZONTAL_TAB.
- IF SY-BATCH IS INITIAL.
- L_STR1 = `Считывание файла ` && P_FILE_NAME.
- CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
- EXPORTING
- TEXT = L_STR1.
- ENDIF.
- " Создаём объект - ЭКСЕЛЬ.
- IF L_APPLICATION IS INITIAL.
- CREATE OBJECT L_APPLICATION 'EXCEL.APPLICATION'.
- " Ошибка при создании объекта Excel.
- IF SY-SUBRC <> 0.
- MESSAGE 'Ошибка 1' TYPE 'E' RAISING P_ERROR.
- ENDIF.
- "SET PROPERTY OF L_APPLICATION 'VISIBLE' = 0.
- " Отвечать на диалоги по умолчанию - Нет.
- "SET PROPERTY OF L_APPLICATION 'DISPLAYALERTS' = 0.
- ENDIF.
- " Создаём новую книгу.
- CALL METHOD OF L_APPLICATION 'WORKBOOKS' = L_BOOKS.
- " Открываем книгу эксель из файла.
- CALL METHOD OF L_BOOKS 'Open' = L_WORKBOOK
- EXPORTING
- #1 = P_FILE_NAME.
- " Ошибка при открытии файла.
- IF SY-SUBRC <> 0.
- MESSAGE 'Ошибка 2' TYPE 'E' RAISING P_ERROR.
- ENDIF.
- " Открываем лист книги под номером NLK.
- CALL METHOD OF L_APPLICATION 'WORKSHEETS' = L_SHEET
- EXPORTING
- #1 = P_NLK.
- " Делаем лист активным.
- CALL METHOD OF L_SHEET 'ACTIVATE'.
- "
- L_POS1 = P_START_ROW.
- L_POS2 = P_START_ROW + L_STEP - 1.
- DO 256 TIMES.
- G_STR0 = `Копирование пакета № ` && SY-INDEX.
- " Выделяем ячейку с которой начнётся выделение области.
- CALL METHOD OF L_SHEET 'CELLS' = L_CELL1
- EXPORTING
- " Номер строки.
- #1 = L_POS1
- " Номер столбца.
- #2 = P_START_COL.
- " Выделяем ячейку в которой выделение области закончится.
- CALL METHOD OF L_SHEET 'CELLS' = L_CELL2
- EXPORTING
- " Номер строки.
- #1 = L_POS2
- " Номер столбца.
- #2 = 4096.
- " Готовим область ячеек.
- CALL METHOD OF L_SHEET 'RANGE' = L_RANGE
- EXPORTING
- " Начальная ячейка.
- #1 = L_CELL1
- " Конечная ячейка.
- #2 = L_CELL2.
- " Выделяем область.
- "CALL METHOD OF L_RANGE 'SELECT'.
- " Копируем область в буфер обмена.
- CALL METHOD OF L_RANGE 'COPY'.
- " Читаем данные из буфера обмена в таблицу EXCEL_TAB.
- CALL METHOD CL_GUI_FRONTEND_SERVICES=>CLIPBOARD_IMPORT
- IMPORTING
- DATA = LT_EXCEL_LINE
- EXCEPTIONS
- CNTL_ERROR = 1
- OTHERS = 4.
- IF SY-SUBRC <> 0.
- MESSAGE 'Ошибка 2.1' TYPE 'E' RAISING P_ERROR.
- ENDIF.
- FREE OBJECT:
- L_CELL2,
- L_CELL1,
- L_RANGE.
- IF LINES( LT_EXCEL_LINE ) = 1.
- IF L_SPACE1 IS INITIAL.
- READ TABLE LT_EXCEL_LINE INDEX 1 REFERENCE INTO LR_EXCEL_LINE.
- IF SY-SUBRC = 0.
- L_SPACE1 = LR_EXCEL_LINE->VALUE.
- ENDIF.
- ELSE.
- READ TABLE LT_EXCEL_LINE INDEX 1 REFERENCE INTO LR_EXCEL_LINE.
- IF SY-SUBRC = 0.
- L_SPACE2 = LR_EXCEL_LINE->VALUE.
- ENDIF.
- ENDIF.
- " Если скопирован последний пакет.
- IF L_SPACE1 = L_SPACE2.
- " Удаляем техническую пустую строку.
- IF P_DEL_EMPTY_STR IS INITIAL.
- L_CNT = LINES( PT_ITAB ).
- READ TABLE PT_ITAB ASSIGNING <L_ITAB> INDEX L_CNT.
- IF <L_ITAB> IS INITIAL.
- DELETE PT_ITAB INDEX L_CNT.
- ENDIF.
- ENDIF.
- EXIT.
- ENDIF.
- ENDIF.
- IF LT_EXCEL_LINE[] IS INITIAL.
- EXIT.
- ENDIF.
- " Проходим по скопированным строкам и делим их как: строка, столбец, значение.
- PERFORM SEPARATED_TO_INTERN_CONVERT1
- USING
- L_SEPARATOR
- LT_EXCEL_LINE
- P_DEL_EMPTY_STR
- CHANGING
- LT_RC_VALUE.
- L_CNT = LINES( LT_EXCEL_LINE ).
- " Передаём значения принятые из Excel в результирующую таблицу.
- LOOP AT LT_RC_VALUE REFERENCE INTO LR_GEN_TAB.
- AT NEW ROW.
- REFRESH L_TABLE.
- ENDAT.
- APPEND LR_GEN_TAB->* TO L_TABLE.
- AT END OF ROW.
- APPEND INITIAL LINE TO PT_ITAB ASSIGNING <L_ITAB>.
- PERFORM PARSE_TABLE_LINE USING L_TABLE CHANGING <L_ITAB>.
- IF <L_ITAB> IS INITIAL.
- L_CURRENT_ROW = L_CURRENT_ROW + 1.
- ELSE.
- L_TABIX = SY-TABIX.
- CLEAR L_CURRENT_ROW.
- ENDIF.
- ENDAT.
- ENDLOOP.
- REFRESH LT_EXCEL_LINE.
- L_POS1 = L_POS1 + L_STEP.
- L_POS2 = L_POS2 + L_STEP.
- ENDDO.
- REFRESH:
- L_TABLE,
- LT_EXCEL_LINE.
- " Очистка буфера обмена.
- SET PROPERTY OF L_APPLICATION 'CutCopyMode' = 0.
- " Закрываем эксель.
- CALL METHOD OF L_APPLICATION 'QUIT'.
- " Освобождаем память.
- FREE OBJECT:
- L_SHEET,
- L_WORKBOOK,
- L_BOOKS,
- L_APPLICATION.
- CLEAR:
- L_SHEET,
- L_WORKBOOK,
- L_BOOKS,
- L_APPLICATION.
- IF SY-BATCH IS INITIAL.
- CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
- EXPORTING
- TEXT = ''.
- ENDIF.
- ENDFUNCTION.
- FORM SEPARATED_TO_INTERN_CONVERT1
- USING
- P_SEPARATOR TYPE C
- PT_EXCE_LINE TYPE GTT_EXCE_LINE
- P_DEL_EMPTY TYPE C
- CHANGING
- PT_RC_VALUE TYPE GTT_RC_VALUE.
- " Процедура готовит данные: строка, столбец, значение.
- DATA:
- L_ADDSTR TYPE C,
- L_SIC_TABIX TYPE SY-TABIX,
- L_SIC_COL TYPE KCD_EX_COL,
- L_FDPOS TYPE SY-FDPOS,
- LR_EXCE_LINE TYPE REF TO GTS_EXCE_LINE,
- LS_RC_VALUE TYPE GTS_RC_VALUE,
- L_STR1 TYPE STRING,
- L_CNT TYPE SY-TABIX,
- "
- LR_TAB_SPL TYPE REF TO STRING,
- LT_TAB_SPL TYPE TABLE OF STRING.
- "
- REFRESH PT_RC_VALUE.
- "
- L_CNT = LINES( PT_EXCE_LINE ).
- LOOP AT PT_EXCE_LINE REFERENCE INTO LR_EXCE_LINE.
- L_SIC_TABIX = SY-TABIX.
- L_SIC_COL = 0.
- " Разбиваем строку по символу табуляции.
- SPLIT LR_EXCE_LINE->* AT P_SEPARATOR INTO TABLE LT_TAB_SPL.
- " Добавляем столбцы текущей строки в результирующую таблицу.
- LOOP AT LT_TAB_SPL REFERENCE INTO LR_TAB_SPL.
- CLEAR L_ADDSTR.
- " Если строка не пустая или пустая строка нужна.
- IF LR_TAB_SPL->* IS NOT INITIAL OR P_DEL_EMPTY IS INITIAL.
- L_ADDSTR = 'X'.
- ENDIF.
- IF L_ADDSTR = 'X'.
- LS_RC_VALUE-ROW = L_SIC_TABIX.
- LS_RC_VALUE-COLUMN = L_SIC_COL + 1.
- LS_RC_VALUE-VALUE = LR_TAB_SPL->*.
- APPEND LS_RC_VALUE TO PT_RC_VALUE.
- ENDIF.
- L_SIC_COL = L_SIC_COL + 1.
- ENDLOOP.
- ENDLOOP.
- IF SY-BATCH IS INITIAL.
- L_STR1 = G_STR0 && ` обработана строка ` && L_SIC_TABIX && ` из ` && L_CNT.
- CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
- EXPORTING
- TEXT = L_STR1.
- ENDIF.
- ENDFORM.
- FORM PARSE_TABLE_LINE
- USING
- PI_TABLE TYPE GTT_RC_VALUE
- CHANGING
- PC_STRUC_DATA TYPE ANY.
- " Присвоение данных строки Excel в результирующую таблицу.
- DATA:
- LR_TABLE TYPE REF TO GTS_RC_VALUE,
- L_COMPONENT TYPE I,
- L_ERR TYPE SY-SUBRC,
- L_COL TYPE STRING,
- L_ROW TYPE STRING,
- L_STR1 TYPE STRING.
- FIELD-SYMBOLS:
- <FS_STRUC_DATA> TYPE ANY.
- CLEAR PC_STRUC_DATA.
- LOOP AT PI_TABLE REFERENCE INTO LR_TABLE.
- CHECK NOT LR_TABLE->VALUE IS INITIAL.
- L_COMPONENT = LR_TABLE->COLUMN.
- ASSIGN COMPONENT L_COMPONENT OF STRUCTURE PC_STRUC_DATA TO <FS_STRUC_DATA>.
- CHECK SY-SUBRC = 0.
- PERFORM INPUT_DATA2SAP_DATA CHANGING LR_TABLE->VALUE <FS_STRUC_DATA> L_ERR.
- CASE L_ERR.
- WHEN 0.
- WHEN 4.
- L_ROW = LR_TABLE->ROW. SHIFT L_ROW LEFT DELETING LEADING '0'.
- L_COL = LR_TABLE->COLUMN. SHIFT L_COL LEFT DELETING LEADING '0'.
- L_STR1 = `Ошибка (3) при преобразовании данных, строка ` && L_ROW && `, столбец ` && L_COL && `, значение ` && LR_TABLE->VALUE.
- WHEN 8.
- L_ROW = LR_TABLE->ROW. SHIFT L_ROW LEFT DELETING LEADING '0'.
- L_COL = LR_TABLE->COLUMN. SHIFT L_COL LEFT DELETING LEADING '0'.
- L_STR1 = `Ошибка (4) при преобразовании данных, строка ` && L_ROW && `, столбец ` && L_COL && `, значение ` && LR_TABLE->VALUE.
- ENDCASE.
- IF L_ERR <> 0.
- " Очистка буфера обмена.
- SET PROPERTY OF L_APPLICATION 'CutCopyMode' = 0.
- " Закрываем эксель.
- CALL METHOD OF L_APPLICATION 'QUIT'.
- " Освобождаем память.
- FREE OBJECT:
- L_SHEET,
- L_WORKBOOK,
- L_BOOKS,
- L_APPLICATION.
- CLEAR:
- L_SHEET,
- L_WORKBOOK,
- L_BOOKS,
- L_APPLICATION.
- MESSAGE L_STR1 TYPE 'E' RAISING P_ERROR.
- ENDIF.
- ENDLOOP.
- ENDFORM.
- FORM INPUT_DATA2SAP_DATA
- CHANGING
- PI_SOURCE TYPE ANY
- PI_TARGET TYPE ANY
- PC_SUBRC TYPE SY-SUBRC.
- " Загрузка значения в поле результирующей таблицы.
- DATA:
- PI_FIELD_TYPE TYPE C,
- L_DECIMALS TYPE I,
- L_DECIMALS_TARGET TYPE I.
- "
- FIELD-SYMBOLS: <FS_TYPE_X> TYPE X.
- DESCRIBE FIELD PI_TARGET TYPE PI_FIELD_TYPE.
- CLEAR PC_SUBRC.
- CASE PI_FIELD_TYPE.
- WHEN 'C'.
- PI_TARGET = PI_SOURCE.
- WHEN 'D'.
- DO 3 TIMES.
- REPLACE '.' WITH ' ' INTO PI_SOURCE.
- ENDDO.
- CONDENSE PI_SOURCE NO-GAPS.
- IF NOT PI_SOURCE IS INITIAL "Space
- AND PI_SOURCE <> '00.00.0000'
- AND PI_SOURCE <> '00000000'.
- CALL FUNCTION 'CONVERT_DATE_TO_INTERNAL'
- EXPORTING
- DATE_EXTERNAL = PI_SOURCE
- IMPORTING
- DATE_INTERNAL = PI_TARGET
- EXCEPTIONS
- ERROR_MESSAGE = 4
- OTHERS = 4.
- IF SY-SUBRC <> 0.
- PC_SUBRC = 4.
- ENDIF.
- ENDIF.
- WHEN 'T'.
- IF NOT PI_SOURCE IS INITIAL AND PI_SOURCE <> '00:00:00'.
- CALL FUNCTION 'CONVERT_TIME_INPUT'
- EXPORTING
- INPUT = PI_SOURCE
- IMPORTING
- OUTPUT = PI_TARGET
- EXCEPTIONS
- ERROR_MESSAGE = 4
- OTHERS = 4.
- IF SY-SUBRC <> 0.
- PC_SUBRC = 4.
- ENDIF.
- ENDIF.
- WHEN 'X'.
- ASSIGN PI_SOURCE TO <FS_TYPE_X>.
- IF <FS_TYPE_X> IS NOT ASSIGNED.
- PC_SUBRC = 8.
- ENDIF.
- PI_TARGET = <FS_TYPE_X> .
- WHEN 'N'.
- DESCRIBE FIELD PI_TARGET DECIMALS L_DECIMALS_TARGET.
- PERFORM PREPARE_NUMBER CHANGING PI_SOURCE L_DECIMALS.
- IF PI_SOURCE CN '1234567890 '.
- PC_SUBRC = 8.
- ELSE.
- L_DECIMALS_TARGET = L_DECIMALS_TARGET - L_DECIMALS.
- PI_TARGET = PI_SOURCE * ( 10 ** ( L_DECIMALS_TARGET ) ).
- ENDIF.
- WHEN 'I'.
- DESCRIBE FIELD PI_TARGET DECIMALS L_DECIMALS_TARGET.
- PERFORM PREPARE_NUMBER CHANGING PI_SOURCE L_DECIMALS.
- IF PI_SOURCE CN '1234567890 '.
- PC_SUBRC = 8.
- ELSE.
- L_DECIMALS_TARGET = L_DECIMALS_TARGET - L_DECIMALS.
- PI_TARGET = PI_SOURCE * ( 10 ** ( L_DECIMALS_TARGET ) ).
- ENDIF.
- WHEN 'P'.
- " Если указано не число.
- IF PI_SOURCE CN '-1234567890., '.
- PC_SUBRC = 4.
- ELSE.
- IF PI_SOURCE(1) = '-'.
- DATA L_MINUS TYPE XFELD.
- L_MINUS = 'X'.
- SHIFT PI_SOURCE BY 1 PLACES LEFT.
- ENDIF.
- DESCRIBE FIELD PI_TARGET DECIMALS L_DECIMALS_TARGET.
- PERFORM PREPARE_NUMBER CHANGING PI_SOURCE L_DECIMALS.
- DATA L_LEN_SOURCE TYPE I.
- DATA L_LEN_TARGET TYPE I.
- DESCRIBE FIELD PI_TARGET LENGTH L_LEN_TARGET
- IN BYTE MODE.
- L_LEN_TARGET = ( L_LEN_TARGET * 2 ) - 1.
- L_LEN_SOURCE = STRLEN( PI_SOURCE ).
- IF L_LEN_SOURCE > L_LEN_TARGET.
- L_DECIMALS_TARGET = L_DECIMALS_TARGET - L_LEN_TARGET +
- L_LEN_SOURCE.
- PI_SOURCE = PI_SOURCE(L_LEN_TARGET).
- ENDIF.
- IF PI_SOURCE CN '1234567890 -+'.
- PC_SUBRC = 8.
- ELSE.
- L_DECIMALS_TARGET = L_DECIMALS_TARGET - L_DECIMALS.
- PACK PI_SOURCE TO PI_TARGET.
- PI_TARGET = PI_TARGET * ( 10 ** ( L_DECIMALS_TARGET ) ).
- ENDIF.
- IF NOT L_MINUS IS INITIAL.
- PI_TARGET = PI_TARGET * -1.
- ENDIF.
- ENDIF.
- WHEN 'F'.
- CALL FUNCTION 'CHAR_FLTP_CONVERSION'
- EXPORTING
- STRING = PI_SOURCE
- IMPORTING
- FLSTR = PI_TARGET
- EXCEPTIONS
- OTHERS = 4.
- IF SY-SUBRC <> 0.
- PC_SUBRC = 4.
- ENDIF.
- WHEN OTHERS.
- PI_TARGET = PI_SOURCE.
- ENDCASE.
- ENDFORM.
- FORM PREPARE_NUMBER
- CHANGING
- P_PARAMETER TYPE ANY
- PC_DECIMAL_POS TYPE I.
- " Обработка чисел.
- DATA L_STRLEN TYPE I.
- DATA L_LAST_DECIMAL TYPE I.
- DATA L_HLPVZ TYPE I.
- L_STRLEN = STRLEN( P_PARAMETER ).
- CLEAR: SY-SUBRC, PC_DECIMAL_POS.
- WHILE SY-SUBRC = 0.
- IF P_PARAMETER CA '.'.
- IF SY-FDPOS > L_LAST_DECIMAL.
- L_LAST_DECIMAL = SY-FDPOS + 1.
- ENDIF.
- ENDIF.
- REPLACE '.' WITH SPACE INTO P_PARAMETER.
- ENDWHILE.
- CLEAR SY-SUBRC.
- WHILE SY-SUBRC = 0.
- IF P_PARAMETER CA ','.
- IF SY-FDPOS > L_LAST_DECIMAL.
- L_LAST_DECIMAL = SY-FDPOS + 1.
- ENDIF.
- ENDIF.
- REPLACE ',' WITH SPACE INTO P_PARAMETER.
- ENDWHILE.
- CLEAR SY-SUBRC.
- WHILE SY-SUBRC = 0.
- IF P_PARAMETER CA ';'.
- IF SY-FDPOS > L_LAST_DECIMAL.
- L_LAST_DECIMAL = SY-FDPOS + 1.
- ENDIF.
- ENDIF.
- REPLACE ';' WITH SPACE INTO P_PARAMETER.
- ENDWHILE.
- CLEAR SY-SUBRC.
- WHILE SY-SUBRC = 0.
- IF P_PARAMETER CA '/'.
- IF SY-FDPOS > L_LAST_DECIMAL.
- L_LAST_DECIMAL = SY-FDPOS + 1.
- ENDIF.
- ENDIF.
- REPLACE '/' WITH SPACE INTO P_PARAMETER.
- ENDWHILE.
- IF NOT L_LAST_DECIMAL IS INITIAL.
- L_HLPVZ = L_STRLEN - 1.
- IF P_PARAMETER+L_HLPVZ(1) = '-'.
- PC_DECIMAL_POS = L_STRLEN - L_LAST_DECIMAL - 1.
- ELSE.
- PC_DECIMAL_POS = L_STRLEN - L_LAST_DECIMAL.
- ENDIF.
- ENDIF.
- CONDENSE P_PARAMETER NO-GAPS.
- ENDFORM.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement