БИБЛИОТЕКИ ПАРСЕРНЫХ ФУНКЦИЙ
При создании Универсальной транзакции применяются различные готовые парсерные функции из подключаемых в транзакции библиотек. Описание данных библиотек и функции входящих в их состав находится в классификаторе "Библиотеки". Большое разнообразие разработанных на текущий момент ЗАО "БИС" библиотек парсерных функции позволяет решать практически любые задачи в универсальных транзакциях, но что делать если необходимой функции нет? О том, как написать свою библиотеку парсерных функций мы здесь и поговорим.
Все парсерные библиотеки представляют собой процедуры с именем 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 библиотеку необходимо прописать в классификаторе "Библиотеки".