Для манипуляций с файлами на стороне сервера приложений был разработан файловый интерфейс ABAP.
Данный интерфейс реализован набором операторов ABAP и их атрибутов. Как будет видно в следующих статьях, интерфейс позволяет работать с файлами на абстрактном уровне, где ключевым объектом является набор данных (dataset).
Набор данных это нечто вроде файлового дескриптора, при программировании работы с файлами в ОС, на других языках. Так же, как и с дескрипторами, в ABAP можно одновременно работать с несколькими файлами (Читать из одного, а записывать в другой и т.п.), но открывать один и тот же файл без его закрытия в рамках одной программы невозможно (для юникодных программ, для не юникодных программ повторное открытие не приведет к ошибке, но будет проигнорировано).
Следует помнить, так как файловый интерфейс предназначен для работы с текущим сервером приложений, могут возникнуть трудности в системах с несколькими серверами приложений.
В данной статье рассмотрен вопрос хранения путей для директорий и файлов, вне зависимости от ОС и сервера приложений.
Физические и логические имена файлов
Все операторы, используемые в файловом интерфейсе, оперируют физическими именами файлов, которые зависят от операционной системы, используемой на сервере приложений. Физическое имя файла представляет из себя описание пути к файлу и его имя (C:\1.txt или /home/123.text). Допускается использование пробелов в именах файлов. Если передано имя файла, без указания пути к нему, по умолчанию путь к файлу берется из профильного параметра DIR_HOME (редактируется в транзакции RZ11):
Имена файлов и директорий можно хранить как текстовые константы в ABAP коде, однако для этого необходимо учитывать то, на какой ОС работает сервер приложений, а если их несколько? Кроме того необходимо иметь возможность генерации имен файлов в зависимости от тех или иных параметров. Облегчить данную задачу поможет концепция логических имен.
Для манипуляции с файлами вне зависимости от платформы, были разработаны логические имена файлов, по сути, являющиеся записью в таблице БД, в которой для каждой ОС обозначен свой физический путь и правила его формирования.
Задать логические имена файлов можно двумя способами:
- Для независимых от манданта имен файлов, через транзакцию FILE
- Для зависимых через транзакцию SF01
Первым делом настраивается определение синтаксической группы (набора правил наименования файлов), для операционной системы:
На данном шаге определяются:
- Код синтаксической группы
- Название синтаксической группы
- Максимальная длинна имени файла
- Использовать ли в качестве расширения формат файла (TXT, BIN и т.п.)
- Активность данной группы
После определения синтаксической группы необходимо присвоить её для ОС:
При получении физического имени файла по логическому, в качестве ОС будет взято значение из системного параметра sy-opsys.
Далее необходимо определить логический путь к файлу, т.е. директорию, в которой он будет обрабатываться:
Для каждого из логического пути можно настроить присвоение физического пути, относительно платформы:
Как видно из рисунка, физический путь представляет из себя специальную строку с параметрами. Могут быть использованы следующие параметры:
- <FILENAME> — подставляется значение из физического файла (см. ниже)
- <OPSYS> — название ОС
- <INSTANCE> — название инстанции сервера приложений
- <SYSID> — SY-SYSID
- <DBSYS> — SY-DBSYS
- <SAPRL> — SY-SAPRL
- <HOST> — SY-HOST
- <CLIENT> — SY-MANDT
- <LANGUAGE> — SY-LANGU
- <DATE> — SY-DATUM
- <YEAR> — SY-DATUM, 4-символа
- <SYEAR> — SY-DATUM, 2-символа
- <MONTH> — SY-DATUM
- <DAY> — SY-DATUM
- <WEEKDAY> — SY-FDAYW
- <TIME> — SY-UZEIT
- <STIME> — SY-UZEIT
- <HOUR> — SY-UZEIT
- <MINUTE> — SY-UZEIT
- <SECOND> — SY-UZEIT
- <PARAM_1> — внешний параметр 1 (Заполняются в ФМ получения физ. имени файла)
- <PARAM_2> — внешний параметр 2
- <PARAM_3> — внешний параметр 3
- <P=name> — в качестве имени указывается имя параметра из RZ11
- <V=name> — имя переменной
- <F=name> — возвращает результат ФМ с именем: FILENAME_EXIT_name, пример:
1 2 3 4 5 6 7 8 |
FUNCTION FILENAME_EXIT_EXAMPLE. *"---------------------------------------------------------------------- *"Lokale Schnittstelle: *" EXPORTING *" OUTPUT *"---------------------------------------------------------------------- OUTPUT = SY-UNAME. ENDFUNCTION. |
- <Y=name> — аналогично с ФМ: Y_FILENAME_EXIT_name
- <Z=name> — аналогично с ФМ: Z_FILENAME_EXIT_name
Далее настраиваются логические имена файлов:
Для логического файла определяются:
- Его название
- Физический путь, правила заполнения аналогичны для физ. пути для директорий
- Формат данных – может использоваться в качестве расширения файла (если установлена соответствующая настройка, см. выше).
- Прикладная область
- Логический путь
После необходимых настроек, получить физическое имя файла, по его логическому имени, можно через ФМ FILE_GET_NAME (или воспользоваться классом — CL_FS_PATH).
Параметры импорта:
- CLIENT — мандант
- LOGICAL_FILENAME – логическое имя файла (обязательно в верхнем регистре)
- OPERATING_SYSTEM — ОС
- PARAMETER_1 – внешний параметр 1 (рассмотрены выше, при описании физ. пути)
- PARAMETER_2 – внешний параметр 2
- PARAMETER_3 – внешний параметр 3
- USE_PRESENTATION_SERVER – использовать название ОС с сервера представления
- WITH_FILE_EXTENSION – использовать в качестве расширения формат файла (для формата данных DIR игнорируется)
- USE_BUFFER — использование буфера при чтении данных из таблиц
- ELEMINATE_BLANKS – убрать все пробелы из имени файла
- INCLUDING_DIR — в большинстве случаев ФМ используется для получения имен файлов. Если в пользовательской настройке определен формат данных DIR, система возвратит физический путь к директории, но только если данный индикатор будет выставлен в ‘X’. Индикатор не установлен по умолчанию, система ожидает что будет получен именно физический путь к файлу и если при этом был выставлен формат DIR, произойдет исключение — FILE_NOT_FOUND.
Параметры экспорта:
- EMERGENCY_FLAG – если данный параметр не пустой, физический путь не был считан. В данной ситуации в качестве пути будет использовано значение из профильного параметра DIR_GLOBAL.
- FILE_FORMAT – формат файла
- FILE_NAME – физический путь к файлу
Исключения:
- FILE_NOT_FOUND – вызывается, если физическое имя файла не определено.
Пример вызова:
1 2 3 4 5 6 7 8 9 10 11 |
CALL FUNCTION 'FILE_GET_NAME' EXPORTING LOGICAL_FILENAME = 'DATA_FILE' PARAMETER_1 = '01' IMPORTING EMERGENCY_FLAG = LD_EMERGENCY_FLAG FILE_FORMAT = LD_FILE_FORMAT FILE_NAME = LD_FILE_NAME EXCEPTIONS FILE_NOT_FOUND = 1 OTHERS = 2. |
Для экранов часто требуется позволить пользователю выбрать логическое имя файла, можно сделать через ФМ:
- FILE_LOGFILE_ALIAS_PBO
- FILE_LOGFILE_ALIAS_PAI,
- FILE_LOGFILE_ALIAS_F4
Пример:
1 2 3 4 5 6 7 8 9 10 11 12 |
PARAMETERS: p_fname TYPE FILEINTERN. AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_fname. CALL FUNCTION 'FILE_LOGFILE_ALIAS_F4' EXPORTING ed_logfile_appl = p_fname CHANGING cd_logical_file = p_fname EXCEPTIONS exc_no_values_found = 1 others = 2. |