Advertisement
demanzzz

Untitled

Jun 16th, 2020
1,500
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
ABAP 18.62 KB | None | 0 0
  1. TYPES:
  2.       " Строка Excel файла.
  3.       BEGIN OF GTS_VALUE_XLS,
  4.         VALUE(262135)   TYPE          C,
  5.         "VALUE(131072)   TYPE          C,
  6.         "VALUE(258048)   TYPE          C,
  7.       END   OF GTS_VALUE_XLS,
  8.       " Данные в виде Строка, Столбец, Значение.
  9.       BEGIN OF GTS_RC_VALUE,
  10.         ROW(5)          TYPE          N,
  11.         COLUMN(3)       TYPE          N,
  12.         VALUE(2048)     TYPE          C,
  13.       END OF GTS_RC_VALUE,
  14.       GTT_RC_VALUE      TYPE TABLE OF GTS_RC_VALUE INITIAL SIZE 5 WITH NON-UNIQUE DEFAULT KEY,
  15.       " Структура таблицы в которую будут загружены данные из Excel в виде строки.
  16.       BEGIN OF GTS_EXCE_LINE,
  17.         VALUE           TYPE          GTS_VALUE_XLS-VALUE,
  18.       END   OF GTS_EXCE_LINE,
  19.       GTT_EXCE_LINE     TYPE TABLE OF GTS_EXCE_LINE INITIAL SIZE 5 WITH NON-UNIQUE DEFAULT KEY.
  20. DATA:
  21.       G_STR0            TYPE          STRING,
  22.       " Приложение - Эксель.
  23.       L_APPLICATION     TYPE          OLE2_OBJECT,
  24.       " Книга экселя.
  25.       L_BOOKS           TYPE          OLE2_OBJECT,
  26.       " Книга экселя.
  27.       L_WORKBOOK        TYPE          OLE2_OBJECT,
  28.       " Лист книги.
  29.       L_SHEET           TYPE          OLE2_OBJECT,
  30.       " Область ячеек.
  31.       L_RANGE           TYPE          OLE2_OBJECT,
  32.       " Ячейки: начальная и конечная.
  33.       L_CELL1           TYPE          OLE2_OBJECT,
  34.       L_CELL2           TYPE          OLE2_OBJECT.
  35.  
  36. FUNCTION Z_LOAD_XLS_TO_SAP.
  37. *"----------------------------------------------------------------------
  38. *"*"Локальный интерфейс:
  39. *"  IMPORTING
  40. *"     REFERENCE(P_FILE_NAME) TYPE  CHAR255
  41. *"     REFERENCE(P_NLK) TYPE  I DEFAULT 1
  42. *"     REFERENCE(P_START_ROW) TYPE  I DEFAULT 2
  43. *"     REFERENCE(P_START_COL) TYPE  I DEFAULT 1
  44. *"     REFERENCE(P_DEL_EMPTY_STR) TYPE  C DEFAULT 'X'
  45. *"  CHANGING
  46. *"     REFERENCE(PT_ITAB) TYPE  STANDARD TABLE
  47. *"  EXCEPTIONS
  48. *"      P_ERROR
  49. *"----------------------------------------------------------------------
  50.  
  51. " Загрузка данных во внутреннюю таблицу INTERN1 из файла эксель FILE_NAME с листа номер P_NLK.
  52. " Изменения:
  53. " 73zaa (1,318,821) 04.09.2019 - Оптимизация скорости работы.
  54.  
  55.   DATA:
  56.         " Таблица для преобразованных данных.
  57.         LT_RC_VALUE     TYPE TABLE OF GTS_RC_VALUE,
  58.         " Символ разделитель столбцов.
  59.         L_SEPARATOR     TYPE          C,
  60.         " Таблица в которую будут загружены данные из Excel.
  61.         LT_EXCEL_LINE   TYPE TABLE OF GTS_EXCE_LINE,
  62.         LR_EXCEL_LINE   TYPE REF TO   GTS_EXCE_LINE,
  63.         "LT_EXCEL_LINE_S TYPE TABLE OF GTS_EXCE_LINE,
  64.         L_STR1          TYPE          STRING,
  65.         LR_GEN_TAB      TYPE REF TO   GTS_RC_VALUE,
  66.         "
  67.         L_TABLE         TYPE TABLE OF GTS_RC_VALUE,
  68.         L_CURRENT_ROW   TYPE          I,
  69.         L_TABIX         TYPE          I,
  70.         L_CNT           TYPE          SY-TABIX,
  71.         L_POS1          TYPE          SY-TABIX,
  72.         L_POS2          TYPE          SY-TABIX,
  73.         L_SPACE1        TYPE          STRING,
  74.         L_SPACE2        TYPE          STRING,
  75.         L_EMPTY         TYPE          C.
  76.  
  77.   CONSTANTS:
  78.         L_STEP          TYPE          SY-TABIX VALUE 4096.
  79.  
  80.   FIELD-SYMBOLS:
  81.     <L_ITAB>            TYPE          ANY.
  82.  
  83.   " Разделитель - горизонтальная табуляция.
  84.   L_SEPARATOR = CL_ABAP_CHAR_UTILITIES=>HORIZONTAL_TAB.
  85.  
  86.   IF SY-BATCH IS INITIAL.
  87.     L_STR1 = `Считывание файла ` && P_FILE_NAME.
  88.     CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
  89.       EXPORTING
  90.         TEXT = L_STR1.
  91.   ENDIF.
  92.   " Создаём объект - ЭКСЕЛЬ.
  93.   IF L_APPLICATION IS INITIAL.
  94.     CREATE OBJECT L_APPLICATION 'EXCEL.APPLICATION'.
  95.     " Ошибка при создании объекта Excel.
  96.     IF SY-SUBRC <> 0.
  97.       MESSAGE 'Ошибка 1' TYPE 'E' RAISING P_ERROR.
  98.     ENDIF.
  99.     "SET PROPERTY OF L_APPLICATION 'VISIBLE'       = 0.
  100.     " Отвечать на диалоги по умолчанию - Нет.
  101.     "SET PROPERTY OF L_APPLICATION 'DISPLAYALERTS' = 0.
  102.   ENDIF.
  103.   " Создаём новую книгу.
  104.   CALL METHOD OF L_APPLICATION 'WORKBOOKS' = L_BOOKS.
  105.   " Открываем книгу эксель из файла.
  106.   CALL METHOD OF L_BOOKS 'Open' = L_WORKBOOK
  107.     EXPORTING
  108.       #1 = P_FILE_NAME.
  109.   " Ошибка при открытии файла.
  110.   IF SY-SUBRC <> 0.
  111.     MESSAGE 'Ошибка 2' TYPE 'E' RAISING P_ERROR.
  112.   ENDIF.
  113.   " Открываем лист книги под номером NLK.
  114.   CALL METHOD OF L_APPLICATION 'WORKSHEETS' = L_SHEET
  115.     EXPORTING
  116.       #1 = P_NLK.
  117.   " Делаем лист активным.
  118.   CALL METHOD OF L_SHEET 'ACTIVATE'.
  119.   "
  120.   L_POS1 = P_START_ROW.
  121.   L_POS2 = P_START_ROW + L_STEP - 1.
  122.   DO 256 TIMES.
  123.  
  124.     G_STR0 = `Копирование пакета № ` && SY-INDEX.
  125.     " Выделяем ячейку с которой начнётся выделение области.
  126.     CALL METHOD OF L_SHEET 'CELLS' = L_CELL1
  127.       EXPORTING
  128.         " Номер строки.
  129.         #1 = L_POS1
  130.         " Номер столбца.
  131.         #2 = P_START_COL.
  132.     " Выделяем ячейку в которой выделение области закончится.
  133.     CALL METHOD OF L_SHEET 'CELLS' = L_CELL2
  134.       EXPORTING
  135.         " Номер строки.
  136.         #1 = L_POS2
  137.         " Номер столбца.
  138.         #2 = 4096.
  139.     " Готовим область ячеек.
  140.     CALL METHOD OF L_SHEET 'RANGE' = L_RANGE
  141.       EXPORTING
  142.         " Начальная ячейка.
  143.         #1 = L_CELL1
  144.         " Конечная ячейка.
  145.         #2 = L_CELL2.
  146.     " Выделяем область.
  147.     "CALL METHOD OF L_RANGE 'SELECT'.
  148.     " Копируем область в буфер обмена.
  149.     CALL METHOD OF L_RANGE 'COPY'.
  150.     " Читаем данные из буфера обмена в таблицу EXCEL_TAB.
  151.     CALL METHOD CL_GUI_FRONTEND_SERVICES=>CLIPBOARD_IMPORT
  152.       IMPORTING
  153.         DATA                 = LT_EXCEL_LINE
  154.       EXCEPTIONS
  155.         CNTL_ERROR           = 1
  156.         OTHERS               = 4.
  157.     IF SY-SUBRC <> 0.
  158.       MESSAGE 'Ошибка 2.1' TYPE 'E' RAISING P_ERROR.
  159.     ENDIF.
  160.  
  161.     FREE OBJECT:
  162.       L_CELL2,
  163.       L_CELL1,
  164.       L_RANGE.
  165.  
  166.     IF LINES( LT_EXCEL_LINE ) = 1.
  167.       IF L_SPACE1 IS INITIAL.
  168.         READ TABLE LT_EXCEL_LINE INDEX 1 REFERENCE INTO LR_EXCEL_LINE.
  169.         IF SY-SUBRC = 0.
  170.           L_SPACE1 = LR_EXCEL_LINE->VALUE.
  171.         ENDIF.
  172.       ELSE.
  173.         READ TABLE LT_EXCEL_LINE INDEX 1 REFERENCE INTO LR_EXCEL_LINE.
  174.         IF SY-SUBRC = 0.
  175.           L_SPACE2 = LR_EXCEL_LINE->VALUE.
  176.         ENDIF.
  177.       ENDIF.
  178.       " Если скопирован последний пакет.
  179.       IF L_SPACE1 = L_SPACE2.
  180.         " Удаляем техническую пустую строку.
  181.         IF P_DEL_EMPTY_STR IS INITIAL.
  182.           L_CNT = LINES( PT_ITAB ).
  183.           READ TABLE PT_ITAB ASSIGNING <L_ITAB> INDEX L_CNT.
  184.           IF <L_ITAB> IS INITIAL.
  185.             DELETE PT_ITAB INDEX L_CNT.
  186.           ENDIF.
  187.         ENDIF.
  188.         EXIT.
  189.       ENDIF.
  190.     ENDIF.
  191.     IF LT_EXCEL_LINE[] IS INITIAL.
  192.       EXIT.
  193.     ENDIF.
  194.  
  195.     " Проходим по скопированным строкам и делим их как: строка, столбец, значение.
  196.     PERFORM SEPARATED_TO_INTERN_CONVERT1
  197.       USING
  198.         L_SEPARATOR
  199.         LT_EXCEL_LINE
  200.         P_DEL_EMPTY_STR
  201.       CHANGING
  202.         LT_RC_VALUE.
  203.     L_CNT = LINES( LT_EXCEL_LINE ).
  204.     " Передаём значения принятые из Excel в результирующую таблицу.
  205.     LOOP AT LT_RC_VALUE REFERENCE INTO LR_GEN_TAB.
  206.       AT NEW ROW.
  207.         REFRESH L_TABLE.
  208.       ENDAT.
  209.       APPEND LR_GEN_TAB->* TO L_TABLE.
  210.       AT END OF ROW.
  211.         APPEND INITIAL LINE TO PT_ITAB ASSIGNING <L_ITAB>.
  212.         PERFORM PARSE_TABLE_LINE USING L_TABLE CHANGING <L_ITAB>.
  213.         IF <L_ITAB> IS INITIAL.
  214.           L_CURRENT_ROW = L_CURRENT_ROW + 1.
  215.         ELSE.
  216.           L_TABIX = SY-TABIX.
  217.           CLEAR L_CURRENT_ROW.
  218.         ENDIF.
  219.       ENDAT.
  220.     ENDLOOP.
  221.  
  222.     REFRESH LT_EXCEL_LINE.
  223.     L_POS1 = L_POS1 + L_STEP.
  224.     L_POS2 = L_POS2 + L_STEP.
  225.   ENDDO.
  226.  
  227.   REFRESH:
  228.     L_TABLE,
  229.     LT_EXCEL_LINE.
  230.  
  231.   " Очистка буфера обмена.
  232.   SET PROPERTY OF L_APPLICATION 'CutCopyMode' = 0.
  233.   " Закрываем эксель.
  234.   CALL METHOD OF L_APPLICATION 'QUIT'.
  235.   " Освобождаем память.
  236.   FREE OBJECT:
  237.     L_SHEET,
  238.     L_WORKBOOK,
  239.     L_BOOKS,
  240.     L_APPLICATION.
  241.   CLEAR:
  242.     L_SHEET,
  243.     L_WORKBOOK,
  244.     L_BOOKS,
  245.     L_APPLICATION.
  246.  
  247.   IF SY-BATCH IS INITIAL.
  248.     CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
  249.       EXPORTING
  250.         TEXT = ''.
  251.   ENDIF.
  252. ENDFUNCTION.
  253. FORM SEPARATED_TO_INTERN_CONVERT1
  254.   USING
  255.         P_SEPARATOR   TYPE          C
  256.         PT_EXCE_LINE  TYPE          GTT_EXCE_LINE
  257.         P_DEL_EMPTY   TYPE          C
  258.   CHANGING
  259.         PT_RC_VALUE   TYPE          GTT_RC_VALUE.
  260. " Процедура готовит данные: строка, столбец, значение.
  261.   DATA:
  262.         L_ADDSTR      TYPE          C,
  263.         L_SIC_TABIX   TYPE          SY-TABIX,
  264.         L_SIC_COL     TYPE          KCD_EX_COL,
  265.         L_FDPOS       TYPE          SY-FDPOS,
  266.         LR_EXCE_LINE  TYPE REF TO   GTS_EXCE_LINE,
  267.         LS_RC_VALUE   TYPE          GTS_RC_VALUE,
  268.         L_STR1        TYPE          STRING,
  269.         L_CNT         TYPE          SY-TABIX,
  270.         "
  271.         LR_TAB_SPL    TYPE REF TO   STRING,
  272.         LT_TAB_SPL    TYPE TABLE OF STRING.
  273.   "
  274.   REFRESH PT_RC_VALUE.
  275.   "
  276.   L_CNT = LINES( PT_EXCE_LINE ).
  277.   LOOP AT PT_EXCE_LINE REFERENCE INTO LR_EXCE_LINE.
  278.     L_SIC_TABIX = SY-TABIX.
  279.     L_SIC_COL = 0.
  280.     " Разбиваем строку по символу табуляции.
  281.     SPLIT LR_EXCE_LINE->* AT P_SEPARATOR INTO TABLE LT_TAB_SPL.
  282.     " Добавляем столбцы текущей строки в результирующую таблицу.
  283.     LOOP AT LT_TAB_SPL REFERENCE INTO LR_TAB_SPL.
  284.       CLEAR L_ADDSTR.
  285.       " Если строка не пустая или пустая строка нужна.
  286.       IF LR_TAB_SPL->* IS NOT INITIAL OR P_DEL_EMPTY IS INITIAL.
  287.         L_ADDSTR = 'X'.
  288.       ENDIF.
  289.       IF L_ADDSTR = 'X'.
  290.         LS_RC_VALUE-ROW       = L_SIC_TABIX.
  291.         LS_RC_VALUE-COLUMN    = L_SIC_COL + 1.
  292.         LS_RC_VALUE-VALUE     = LR_TAB_SPL->*.
  293.         APPEND LS_RC_VALUE TO PT_RC_VALUE.
  294.       ENDIF.
  295.       L_SIC_COL = L_SIC_COL + 1.
  296.     ENDLOOP.
  297.  
  298.   ENDLOOP.
  299.  
  300.   IF SY-BATCH IS INITIAL.
  301.     L_STR1 = G_STR0 && ` обработана строка ` && L_SIC_TABIX && ` из ` && L_CNT.
  302.     CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
  303.       EXPORTING
  304.         TEXT = L_STR1.
  305.   ENDIF.
  306. ENDFORM.
  307. FORM PARSE_TABLE_LINE
  308.   USING
  309.         PI_TABLE        TYPE        GTT_RC_VALUE
  310.   CHANGING
  311.         PC_STRUC_DATA   TYPE        ANY.
  312. " Присвоение данных строки Excel в результирующую таблицу.
  313.   DATA:
  314.         LR_TABLE        TYPE REF TO GTS_RC_VALUE,
  315.         L_COMPONENT     TYPE        I,
  316.         L_ERR           TYPE        SY-SUBRC,
  317.         L_COL           TYPE        STRING,
  318.         L_ROW           TYPE        STRING,
  319.         L_STR1          TYPE        STRING.
  320.   FIELD-SYMBOLS:
  321.         <FS_STRUC_DATA> TYPE        ANY.
  322.  
  323.   CLEAR PC_STRUC_DATA.
  324.   LOOP AT PI_TABLE REFERENCE INTO LR_TABLE.
  325.     CHECK NOT LR_TABLE->VALUE IS INITIAL.
  326.     L_COMPONENT = LR_TABLE->COLUMN.
  327.     ASSIGN COMPONENT L_COMPONENT OF STRUCTURE PC_STRUC_DATA TO <FS_STRUC_DATA>.
  328.     CHECK SY-SUBRC = 0.
  329.     PERFORM INPUT_DATA2SAP_DATA CHANGING LR_TABLE->VALUE <FS_STRUC_DATA> L_ERR.
  330.     CASE L_ERR.
  331.       WHEN 0.
  332.       WHEN 4.
  333.         L_ROW = LR_TABLE->ROW.    SHIFT L_ROW LEFT DELETING LEADING '0'.
  334.         L_COL = LR_TABLE->COLUMN. SHIFT L_COL LEFT DELETING LEADING '0'.
  335.         L_STR1 = `Ошибка (3) при преобразовании данных, строка ` && L_ROW && `, столбец ` && L_COL && `, значение ` && LR_TABLE->VALUE.
  336.       WHEN 8.
  337.         L_ROW = LR_TABLE->ROW.    SHIFT L_ROW LEFT DELETING LEADING '0'.
  338.         L_COL = LR_TABLE->COLUMN. SHIFT L_COL LEFT DELETING LEADING '0'.
  339.         L_STR1 = `Ошибка (4) при преобразовании данных, строка ` && L_ROW && `, столбец ` && L_COL && `, значение ` && LR_TABLE->VALUE.
  340.     ENDCASE.
  341.     IF L_ERR <> 0.
  342.       " Очистка буфера обмена.
  343.       SET PROPERTY OF L_APPLICATION 'CutCopyMode' = 0.
  344.       " Закрываем эксель.
  345.       CALL METHOD OF L_APPLICATION 'QUIT'.
  346.       " Освобождаем память.
  347.       FREE OBJECT:
  348.         L_SHEET,
  349.         L_WORKBOOK,
  350.         L_BOOKS,
  351.         L_APPLICATION.
  352.       CLEAR:
  353.         L_SHEET,
  354.         L_WORKBOOK,
  355.         L_BOOKS,
  356.         L_APPLICATION.
  357.       MESSAGE L_STR1 TYPE 'E' RAISING P_ERROR.
  358.     ENDIF.
  359.   ENDLOOP.
  360. ENDFORM.
  361. FORM INPUT_DATA2SAP_DATA
  362.   CHANGING
  363.         PI_SOURCE  TYPE ANY
  364.         PI_TARGET  TYPE ANY
  365.         PC_SUBRC   TYPE SY-SUBRC.
  366. " Загрузка значения в поле результирующей таблицы.
  367.   DATA:
  368.         PI_FIELD_TYPE     TYPE C,
  369.         L_DECIMALS        TYPE I,
  370.         L_DECIMALS_TARGET TYPE I.
  371.   "
  372.   FIELD-SYMBOLS: <FS_TYPE_X> TYPE X.
  373.   DESCRIBE FIELD PI_TARGET TYPE PI_FIELD_TYPE.
  374.   CLEAR PC_SUBRC.
  375.   CASE PI_FIELD_TYPE.
  376.     WHEN 'C'.
  377.       PI_TARGET = PI_SOURCE.
  378.  
  379.     WHEN 'D'.
  380.       DO 3 TIMES.
  381.         REPLACE '.' WITH ' ' INTO PI_SOURCE.
  382.       ENDDO.
  383.       CONDENSE PI_SOURCE NO-GAPS.
  384.  
  385.       IF  NOT PI_SOURCE IS INITIAL   "Space
  386.       AND PI_SOURCE <> '00.00.0000'
  387.       AND PI_SOURCE <> '00000000'.
  388.         CALL FUNCTION 'CONVERT_DATE_TO_INTERNAL'
  389.              EXPORTING
  390.                   DATE_EXTERNAL = PI_SOURCE
  391.              IMPORTING
  392.                   DATE_INTERNAL = PI_TARGET
  393.              EXCEPTIONS
  394.                   ERROR_MESSAGE = 4
  395.                   OTHERS        = 4.
  396.         IF SY-SUBRC <> 0.
  397.           PC_SUBRC = 4.
  398.         ENDIF.
  399.       ENDIF.
  400.  
  401.     WHEN 'T'.
  402.       IF NOT PI_SOURCE IS INITIAL AND PI_SOURCE <> '00:00:00'.
  403.         CALL FUNCTION 'CONVERT_TIME_INPUT'
  404.           EXPORTING
  405.             INPUT         = PI_SOURCE
  406.           IMPORTING
  407.             OUTPUT        = PI_TARGET
  408.           EXCEPTIONS
  409.             ERROR_MESSAGE = 4
  410.             OTHERS        = 4.
  411.         IF SY-SUBRC <> 0.
  412.           PC_SUBRC = 4.
  413.         ENDIF.
  414.       ENDIF.
  415.     WHEN 'X'.
  416.       ASSIGN PI_SOURCE TO <FS_TYPE_X>.
  417.       IF <FS_TYPE_X> IS NOT ASSIGNED.
  418.         PC_SUBRC = 8.
  419.       ENDIF.
  420.       PI_TARGET = <FS_TYPE_X> .
  421.     WHEN 'N'.
  422.       DESCRIBE FIELD PI_TARGET DECIMALS L_DECIMALS_TARGET.
  423.       PERFORM PREPARE_NUMBER CHANGING PI_SOURCE L_DECIMALS.
  424.       IF PI_SOURCE CN '1234567890 '.
  425.         PC_SUBRC = 8.
  426.       ELSE.
  427.         L_DECIMALS_TARGET = L_DECIMALS_TARGET - L_DECIMALS.
  428.         PI_TARGET = PI_SOURCE * ( 10 ** ( L_DECIMALS_TARGET ) ).
  429.       ENDIF.
  430.     WHEN 'I'.
  431.       DESCRIBE FIELD PI_TARGET DECIMALS L_DECIMALS_TARGET.
  432.       PERFORM PREPARE_NUMBER CHANGING PI_SOURCE L_DECIMALS.
  433.       IF PI_SOURCE CN '1234567890 '.
  434.         PC_SUBRC = 8.
  435.       ELSE.
  436.         L_DECIMALS_TARGET = L_DECIMALS_TARGET - L_DECIMALS.
  437.         PI_TARGET = PI_SOURCE * ( 10 ** ( L_DECIMALS_TARGET ) ).
  438.       ENDIF.
  439.     WHEN 'P'.
  440.       " Если указано не число.
  441.       IF PI_SOURCE CN '-1234567890., '.
  442.         PC_SUBRC = 4.
  443.       ELSE.
  444.         IF PI_SOURCE(1) = '-'.
  445.          DATA L_MINUS TYPE XFELD.
  446.          L_MINUS = 'X'.
  447.          SHIFT PI_SOURCE BY 1 PLACES LEFT.
  448.         ENDIF.
  449.  
  450.         DESCRIBE FIELD PI_TARGET DECIMALS L_DECIMALS_TARGET.
  451.         PERFORM PREPARE_NUMBER CHANGING PI_SOURCE L_DECIMALS.
  452.  
  453.         DATA L_LEN_SOURCE TYPE I.
  454.         DATA L_LEN_TARGET TYPE I.
  455.         DESCRIBE FIELD PI_TARGET LENGTH L_LEN_TARGET
  456.                                  IN BYTE MODE.
  457.         L_LEN_TARGET = ( L_LEN_TARGET * 2 ) - 1.
  458.         L_LEN_SOURCE = STRLEN( PI_SOURCE ).
  459.         IF L_LEN_SOURCE > L_LEN_TARGET.
  460.           L_DECIMALS_TARGET = L_DECIMALS_TARGET -  L_LEN_TARGET +
  461.                               L_LEN_SOURCE.
  462.           PI_SOURCE = PI_SOURCE(L_LEN_TARGET).
  463.         ENDIF.
  464.  
  465.         IF PI_SOURCE CN '1234567890 -+'.
  466.           PC_SUBRC = 8.
  467.         ELSE.
  468.           L_DECIMALS_TARGET = L_DECIMALS_TARGET - L_DECIMALS.
  469.           PACK PI_SOURCE TO PI_TARGET.
  470.           PI_TARGET = PI_TARGET * ( 10 ** ( L_DECIMALS_TARGET ) ).
  471.         ENDIF.
  472.  
  473.         IF NOT L_MINUS IS INITIAL.
  474.          PI_TARGET = PI_TARGET * -1.
  475.         ENDIF.
  476.       ENDIF.
  477.     WHEN 'F'.
  478.       CALL FUNCTION 'CHAR_FLTP_CONVERSION'
  479.         EXPORTING
  480.           STRING = PI_SOURCE
  481.         IMPORTING
  482.           FLSTR  = PI_TARGET
  483.         EXCEPTIONS
  484.           OTHERS = 4.
  485.       IF SY-SUBRC <> 0.
  486.         PC_SUBRC = 4.
  487.       ENDIF.
  488.     WHEN OTHERS.
  489.       PI_TARGET = PI_SOURCE.
  490.   ENDCASE.
  491. ENDFORM.
  492. FORM PREPARE_NUMBER
  493.   CHANGING
  494.     P_PARAMETER    TYPE ANY
  495.     PC_DECIMAL_POS TYPE I.
  496. " Обработка чисел.
  497.   DATA L_STRLEN TYPE I.
  498.   DATA L_LAST_DECIMAL TYPE I.
  499.   DATA L_HLPVZ TYPE I.
  500.  
  501.   L_STRLEN = STRLEN( P_PARAMETER ).
  502.   CLEAR: SY-SUBRC, PC_DECIMAL_POS.
  503.   WHILE SY-SUBRC = 0.
  504.     IF P_PARAMETER CA '.'.
  505.       IF SY-FDPOS  > L_LAST_DECIMAL.
  506.         L_LAST_DECIMAL = SY-FDPOS + 1.
  507.       ENDIF.
  508.     ENDIF.
  509.     REPLACE '.' WITH SPACE INTO P_PARAMETER.
  510.   ENDWHILE.
  511.   CLEAR SY-SUBRC.
  512.   WHILE SY-SUBRC = 0.
  513.     IF P_PARAMETER CA ','.
  514.       IF SY-FDPOS  > L_LAST_DECIMAL.
  515.         L_LAST_DECIMAL = SY-FDPOS + 1.
  516.       ENDIF.
  517.     ENDIF.
  518.     REPLACE ',' WITH SPACE INTO P_PARAMETER.
  519.   ENDWHILE.
  520.   CLEAR SY-SUBRC.
  521.   WHILE SY-SUBRC = 0.
  522.     IF P_PARAMETER CA ';'.
  523.       IF SY-FDPOS  > L_LAST_DECIMAL.
  524.         L_LAST_DECIMAL = SY-FDPOS + 1.
  525.       ENDIF.
  526.     ENDIF.
  527.     REPLACE ';' WITH SPACE INTO P_PARAMETER.
  528.   ENDWHILE.
  529.   CLEAR SY-SUBRC.
  530.   WHILE SY-SUBRC = 0.
  531.     IF P_PARAMETER CA '/'.
  532.       IF SY-FDPOS  > L_LAST_DECIMAL.
  533.         L_LAST_DECIMAL = SY-FDPOS + 1.
  534.       ENDIF.
  535.     ENDIF.
  536.     REPLACE '/' WITH SPACE INTO P_PARAMETER.
  537.   ENDWHILE.
  538.   IF NOT L_LAST_DECIMAL IS INITIAL.
  539.     L_HLPVZ = L_STRLEN - 1.
  540.     IF P_PARAMETER+L_HLPVZ(1) = '-'.
  541.       PC_DECIMAL_POS = L_STRLEN - L_LAST_DECIMAL - 1.
  542.     ELSE.
  543.       PC_DECIMAL_POS = L_STRLEN - L_LAST_DECIMAL.
  544.     ENDIF.
  545.   ENDIF.
  546.   CONDENSE P_PARAMETER NO-GAPS.
  547. ENDFORM.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement