Файловый интерфейс ABAP — логические и физические имена файлов

imagesДля манипуляций с файлами на стороне сервера приложений был разработан файловый интерфейс ABAP.

Данный интерфейс реализован набором операторов ABAP и их атрибутов. Как будет видно в следующих статьях, интерфейс позволяет работать с файлами на абстрактном уровне, где ключевым объектом является набор данных (dataset).

Набор данных это нечто вроде файлового дескриптора, при программировании работы с файлами в ОС, на других языках. Так же, как и с дескрипторами, в ABAP можно одновременно работать с несколькими файлами (Читать из одного, а записывать в другой и т.п.), но открывать один и тот же файл без его закрытия в рамках одной программы невозможно (для юникодных программ, для не юникодных программ повторное открытие не приведет к ошибке, но будет проигнорировано).

Следует помнить, так как файловый интерфейс предназначен для работы с текущим сервером приложений, могут возникнуть трудности в системах с несколькими серверами приложений.

В данной статье рассмотрен вопрос хранения путей для директорий и файлов, вне зависимости от ОС и сервера приложений.

Физические и логические имена файлов

Все операторы, используемые в файловом интерфейсе, оперируют физическими именами файлов, которые зависят от операционной системы, используемой на сервере приложений. Физическое имя файла представляет из себя описание пути к файлу и его имя (C:\1.txt или /home/123.text).  Допускается использование пробелов в именах файлов. Если передано имя файла, без указания пути к нему, по умолчанию путь к файлу берется из профильного параметра DIR_HOME (редактируется в транзакции RZ11):

dir_home

Имена файлов и директорий можно хранить как текстовые константы в ABAP коде, однако для этого необходимо учитывать то, на какой ОС работает сервер приложений, а если их несколько? Кроме того необходимо иметь возможность генерации имен файлов в зависимости от тех или иных параметров.  Облегчить данную задачу поможет концепция логических имен.

Для манипуляции с файлами вне зависимости от платформы, были разработаны логические имена файлов, по сути, являющиеся записью в таблице БД, в которой для каждой ОС обозначен свой физический путь и правила его формирования.

Задать логические имена файлов можно двумя способами:

  • Для независимых от манданта имен файлов, через транзакцию FILE
  • Для зависимых через транзакцию SF01

Первым делом настраивается определение синтаксической группы (набора правил наименования файлов), для операционной системы:

syntax_group

На данном шаге определяются:

  • Код синтаксической группы
  • Название синтаксической группы
  • Максимальная длинна имени файла
  • Использовать ли в качестве расширения формат файла (TXT, BIN и т.п.)
  • Активность данной группы

После определения синтаксической группы необходимо присвоить её для ОС:

syntax_group2

При получении физического имени файла по логическому, в качестве ОС будет взято значение из системного параметра sy-opsys.

Далее необходимо определить логический путь к файлу, т.е. директорию, в которой он будет обрабатываться:

logical_path

Для каждого из логического пути можно настроить присвоение физического пути, относительно платформы:

phys_path

Как видно из рисунка, физический путь представляет из себя специальную строку с параметрами. Могут быть использованы следующие параметры:

  • <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> — имя переменной

variable

  •  <F=name> — возвращает результат ФМ с именем: FILENAME_EXIT_name, пример:

  • <Y=name> — аналогично с ФМ: Y_FILENAME_EXIT_name
  • <Z=name> — аналогично с ФМ: Z_FILENAME_EXIT_name

Далее настраиваются логические имена файлов:

phys_names

Для логического файла определяются:

  • Его название
  • Физический путь, правила заполнения аналогичны для физ. пути для директорий
  • Формат данных – может использоваться в качестве расширения файла (если установлена соответствующая настройка, см. выше).
  • Прикладная область
  • Логический путь

После необходимых настроек, получить физическое имя файла, по его логическому имени, можно через ФМ 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 – вызывается, если физическое имя файла не определено.

Пример вызова:

Для экранов часто требуется позволить пользователю выбрать логическое имя файла, можно сделать через ФМ:

  • FILE_LOGFILE_ALIAS_PBO
  • FILE_LOGFILE_ALIAS_PAI,
  • FILE_LOGFILE_ALIAS_F4

Пример:

f4