Автор Тема: SO_SPLIT_FILE_AND_PATH - Путь к файлу и имя файла из строки  (Прочитано 5170 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Uukrul

  • SAP ECC 6.0 Ehp(*)
  • Administrator
  • Epic Member
  • *****
  • Сообщений: 3 762
  • Репутация: +47/-0
  • Пол: Мужской
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
    • Sapforum.BIZ
SO_SPLIT_FILE_AND_PATH - Путь к файлу и имя файла из строки. В общем-то конечно можно и самому это сделать, но опять же если делать универсальный вариант, то надо знать что разделители могут быть как unix-формат так и виндовый, а это уже надо напрягаться, а тут как бы люди сами уже напряглись и сделали функцию, так чего бы и не воспользоваться, ну пока SAP не додумался до отдельного лицензирования на использование внутренних функций системы  :D
Код: You are not allowed to view links. Register or Login
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/       

И не надо лохматить бабушку  ^-^

Оффлайн Uukrul

  • SAP ECC 6.0 Ehp(*)
  • Administrator
  • Epic Member
  • *****
  • Сообщений: 3 762
  • Репутация: +47/-0
  • Пол: Мужской
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
    • Sapforum.BIZ
Re: SO_SPLIT_FILE_AND_PATH - Путь к файлу и имя файла из строки
« Ответ #1 : Декабрь 26, 2008, 02:18:05 pm »
Однако бабушку как оказывается иногда таки приходится лохматить... в общем не полез в исходный код, а надо бы... так как эта зараза оказывается не работает в фоновом режиме. Проблема, точнее фишка в том что внутри вызывается WS_QUERY,.для получения разделителя файлового пути, типа / или \ или маковский стандарт и само собой пытается обратиться к GUI, которой опять же само собой в фоне нет... ну и результат вываливает ошибку, типа не смогла я разделить пусть. Короче пришлось сделать типа свой ФМ по мотивам этого, где тип файловой системы передается при вызове ФМ:
Код: You are not allowed to view links. Register or Login
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*, таки надо было бы задуматься  ;)