БИБЛИОТЕКИ ПАРСЕРНЫХ ФУНКЦИЙ

При создании Универсальной транзакции применяются различные готовые парсерные функции из подключаемых в транзакции библиотек. Описание данных библиотек и функции входящих в их состав находится в классификаторе "Библиотеки".  Большое разнообразие разработанных на текущий момент ЗАО "БИС" библиотек парсерных функции позволяет решать практически любые задачи в универсальных транзакциях, но что делать если необходимой функции нет? О том, как написать свою библиотеку парсерных функций мы здесь и поговорим.

Все парсерные библиотеки представляют собой процедуры с именем pp-p<имя (<= 4 символа)>. Как мы можем видеть, принцип формирования имени такой библиотеки схож с принципом формирования имени процедуры библиотек интерфейсов, за исключением того, что вторая часть имени процедуры после дефиса начинается с "p", что свидетельствует о том, что это библиотека персистентных функций.

Создадим собственную процедуру библиотеки парсерных функций с именем pp-pown.

Структура процедуры такой библиотеки:

Подключение необходимых библиотек и инклюд-файлов:

{globals.i}
{sh-defs.i}
{intrface.get tmess}
{intrface.get pbase}

Отключать подключаемые библиотеки интерфейсов указывая {intrface.del} в библиотеке парсерных функций не нужно.

Описание самой библиотеки (автодокументирование):

{pfuncdef
   &LIBDEF       = "YES"
   &NAME         = "POWN"
   &LIBNAME      = "Библиотека собственных функций."
   &DESCRIPTION  = "Библиотека функций для работа в новых транзакциях."
 }

Для примера напишем функцию, возвращающую доступный остаток по счету.

Описание функции:

{pfuncdef 
  &NAME        = "ОСТАТОК_ДОСТУПНЫЙ"
  &DESCRIPTION = "Возвращает доступный остаток по счету на дату"
  &PARAMETERS  = "НОМЕР СЧЕТА [,ВАЛЮТА СЧЕТА[,ДАТА[,СТАТУС = ~~373]]"
  &RESULT      = "ОСТАТОК"
  &SAMPLE      = "ОСТАТОК_ДОСТУП('10201810000020010028','') ~~n~
ОСТАТОК_ДОСТУП('10201810000020010028','',DATE('01/01/2004')) ~~n~
ОСТАТОК_ДОСТУП('10201810000020010028','',ДАТА(),'П')"
}

Объявление входных и выходных параметров функции:

DEF INPUT  PARAMETER iAcct      AS CHAR  NO-UNDO. 
DEF INPUT  PARAMETER iCurrency  AS CHAR NO-UNDO.
DEF INPUT  PARAMETER iDate      AS DATE  NO-UNDO.
DEF INPUT  PARAMETER iStatus    AS CHAR  NO-UNDO.
DEF OUTPUT PARAMETER out_Result AS DEC   NO-UNDO.
DEF OUTPUT PARAMETER is-ok      AS INT64 NO-UNDO.

Успешность или не успешность выполнения функции определяется значением выходного параметра is-ok. Занчение -1 свидетельствует о возникшей в ходе выполнения функции критической ошибки и как следствие прерывание выполнения всей транзакции.

Проверка правильности передачи входных параметров в парсерную функцию осуществляется в инклюд-файле {pchpar {1} {2} {3}...} в качестве аргументов которого передаются значения входных параметров. Некорректность передачи параметра определяется его значением равным - ?.

{pchkpar iAcct}

IF iCurrency <> "" THEN
DO:
{pchkpar iCurrency}
END.

После

   FIND FIRST bacct WHERE bacct.acct EQ iAcct NO-LOCK NO-ERROR.
   IF NOT AVAIL bacct THEN
DO:

    is-ok = -1.
    RUN Fill-SysMes("","","-1","Не найден счет с номером " + iAcct
                             + " и кодом валюты " + iCurrency).
    RETURN.
   END.

IF iDate = ? THEN iDate = GetBaseOpDate().
IF iStatus = ? THEN iStatus = CHR(251).
   
RUN acct-pos IN h_base (iAcct,iCurrency,iDate,iStatus).
out_result = sh-bal.

END PROCEDURE.

Завершаться каждая функция должна - END PROCEDURE.

После компиляции и размещения данной процедуры в каталогах PROPATH библиотеку необходимо прописать в классификаторе "Библиотеки".