Sapforum.Biz
Инструменты => ABAP - Инструментальные средства => SE37 - Построитель функций => Тема начата: Uukrul от Октябрь 23, 2008, 12:54:26 pm
-
SO_SPLIT_FILE_AND_PATH - Путь к файлу и имя файла из строки. В общем-то конечно можно и самому это сделать, но опять же если делать универсальный вариант, то надо знать что разделители могут быть как unix-формат так и виндовый, а это уже надо напрягаться, а тут как бы люди сами уже напряглись и сделали функцию, так чего бы и не воспользоваться, ну пока SAP не додумался до отдельного лицензирования на использование внутренних функций системы :D
DATA: l_full_path LIKE rlgrap-filename,
l_file_name LIKE rlgrap-filename,
l_file_path LIKE rlgrap-filename.
l_full_path = '/sap/test_files/acc_data.txt'.
CALL FUNCTION 'SO_SPLIT_FILE_AND_PATH'
EXPORTING
full_name = l_full_path
IMPORTING
stripped_name = l_file_name
file_path = l_file_path
EXCEPTIONS
x_error = 1
OTHERS = 2.
Параметры как бы тривиальны. На выходе получим следующий результат:
l_file_name = acc_data.txt
l_file_path = /sap/test_files/
И не надо лохматить бабушку ^-^
-
Однако бабушку как оказывается иногда таки приходится лохматить... в общем не полез в исходный код, а надо бы... так как эта зараза оказывается не работает в фоновом режиме. Проблема, точнее фишка в том что внутри вызывается WS_QUERY,.для получения разделителя файлового пути, типа / или \ или маковский стандарт и само собой пытается обратиться к GUI, которой опять же само собой в фоне нет... ну и результат вываливает ошибку, типа не смогла я разделить пусть. Короче пришлось сделать типа свой ФМ по мотивам этого, где тип файловой системы передается при вызове ФМ:
FUNCTION yuuk_split_file_and_path.
*"----------------------------------------------------------------------
*"*"Локальный интерфейс:
*" IMPORTING
*" VALUE(FULL_NAME) LIKE RLGRAP-FILENAME
*" REFERENCE(SCREENTYPE) TYPE C DEFAULT 'MF'
*" EXPORTING
*" VALUE(STRIPPED_NAME) LIKE RLGRAP-FILENAME
*" VALUE(FILE_PATH) LIKE RLGRAP-FILENAME
*" EXCEPTIONS
*" X_ERROR
*"----------------------------------------------------------------------
* ws_os2(4) value 'PM',
* ws_win(4) value 'WN',
* ws_nt(4) value 'WN32',
* ws_unix(4) value 'MF',
* ws_mac(4) value 'MC'.
DATA: len LIKE sy-fdpos,
len1 LIKE sy-fdpos,
char(1) TYPE c,
shift_ind LIKE sy-index.
DESCRIBE FIELD full_name LENGTH len.
len1 = len - 1.
DO len TIMES. "get last separator (/, \ or :)
shift_ind = sy-index.
SHIFT full_name CIRCULAR RIGHT.
char = full_name+len1(1).
IF screentype NE 'MC'.
IF char = '\' OR char = '/'.
EXIT.
ENDIF.
ELSE.
IF char = ':'.
EXIT.
ENDIF.
ENDIF.
ENDDO.
SHIFT full_name CIRCULAR LEFT BY shift_ind PLACES.
shift_ind = len - shift_ind.
file_path = full_name(shift_ind). "split into path and filename
stripped_name = full_name+shift_ind.
ENDFUNCTION.
Вот такая вот засада... была, хотя конечно при виде префикса SO*, таки надо было бы задуматься ;)