БИБЛИОТЕКИ ИНТЕРФЕЙСОВ
В АБС Бисквит существует ряд библиотек интерфейсов, содержащих различные функции и процедуры по работе с теми или иными объектами, такими как например: счета, договора, клиенты и т.д.
Подключение таких библиотек в процедурах осуществляется с помощью универсального инструмента intrface.get, которому в качестве аргумента необходимо передать имя подключаемого интерфейса, библиотеку которого мы вызываем.
{intrface.get <имя интерфейса>}
Сами библиотеки представляют собой персистентные процедуры с именем pp-<5-ть первых символов имени интерфейса>.p.
Так например, процедура библиотеки интерфейса xclass, по работе с метасхемой - pp-xclas.p.
Помимо самой процедуры, в состав библиотеки обязательно входит файл <имя интерфейса>.def, содержащий объявления прототипов функций входящих в состав библиотеки. Для интерфейса xclass это файл xclass.def. Данный файл обязательно должен присутствовать, даже если библиотека не содержит функций. В этом случае данный файл будет просто пустым, но он должен быть.
Объявление прототипов функций в файле <имя интерфейса>.def осуществляется следующим образом:
FUNCTION function-name RETURNS ret-data-type (params) IN {1}.
- function-name - имя функции;
- ret-data-type - возвращаемый функцией тип данных;
- params - параметры функции.
Реализация функции, как правило, описываются в отдельном файле <имя интерфейса>.fun, который в свою очередь подключается в процедуре библиотеки.
Загрузка библиотек, как мы уже сказали выше, осуществляется с помощью инклюд-файла intrface.get. Данный инклюд-файл осуществляет PERSISTENT вызов процедуры интерфейса создавая указатель на нее (handle). Предварительно осуществляется проверка существования данного указателя в стеке процедур, другими словами, проверяется не была ли ранее загружена данная библиотека. Если такой указатель (handle) уже существует, то это означает, что данная библиотека уже загружена в стек и повторная ее загрузка осуществляться не будет. При загрузке библиотеки так же осуществляется фиксация процедуры из которой она загружается.
{intrface.get loan}
При загрузке библиотеки автоматически осуществляется вызов процедуры без параметров StartInterface, если она объявлена в загружаемой библиотеке.
По окончанию работы с библиотекой ее обязательно нужно удалить из стека процедур с помощью intrface.del:
{intrface.del loan}
Если необходимо удалить все подключенные ранее интерфейсы:
{intrface.del}
Не удаление процедур будет приводить к увеличению занимаемой клиентской сессией памяти, что в последствии может привести к снижению производительности. Именно поэтому нужно внимательно следить за тем, чтобы ненужные более библиотеки были удалены из стека процедур.
Просмотреть информацию по загруженным библиотекам можно в браузере, вызываемом по CTRL+U.
Разберем представленный пример подключения и удаления библиотек.
В процедуре proc1.p осуществляется загрузка библиотеки loan, после чего осуществляется вызов процедуры proc2.p.
В proc2.p объявлено подключение двух библиотек: loan и dps. Так как библиотека loan уже загружена в proc1.p, то ее загрузка не будет выполнена повторно, но при этом она будет доступна для использования. Библиотека dps ранее не загружалась, поэтому она будет загружена.
Далее из proc2.p осуществляется вызов процедуры proc3.p, в которой осуществляется вызов библиотеки acct. В процедуре proc3.p будут доступны для использования как подключенная в ней библиотека acct, так и библиотеки loan и dps.
Как мы видим в процедуре proc3.p нет удаления библиотеки acct, так что по завершению процедуры она останется в памяти.
По завершению процедуры proc2.p осуществляется удаление только библиотеки dps.
В процедуре proc1.p указано удаление всех библиотек, таки образом в ней будут удалены библиотека loan и библиотека acct, которую забыли удалить в процедуре proc3.p.
При использовании библиотек интерфейсов в своих процедурах необходимо соблюдать принцип "один вход - один выход", который требует от разработчика перед каждым оператором RETURN удалять библиотеку интерфейсов из стека.
Вызов процедур из библиотек:
RUN proc-name IN h_<имя интерфейса> [(parameters)].
proc-name - имя внутренней процедуры;
parameters - параметры процедуры.
Получить состав библиотеки, т.е. перечень входящих в нее процедур и функций можно следующим образом:
{intrface.get acct}
RUN libinfo.p (h_acct).
{intrface.del}
процедура libinfo.p:
{intrface.get strng}
DEF INPUT PARAM vLibHdl AS HANDLE NO-UNDO.
DEF VAR vProcList AS CHAR NO-UNDO.
DEF VAR vProcName AS CHAR NO-UNDO.
DEF VAR vProcSignature AS CHAR NO-UNDO.
DEF VAR vParam AS CHAR NO-UNDO.
DEF VAR i AS INT NO-UNDO.
DEF VAR j AS INT NO-UNDO.
DEF TEMP-TABLE tt-lib NO-UNDO
FIELD type AS CHAR
FIELD name AS CHAR
FIELD return-type AS CHAR
FIELD param-num AS INT64
FIELD param-type AS CHAR
FIELD param-name AS CHAR
FIELD param-data-type AS CHAR
.
vProcList = vLibHdl:INTERNAL-ENTRIES.
REPEAT i = 1 TO NUM-ENTRIES(vProcList):
vProcName = ENTRY(i,vProcList).
vProcSignature = vLibHdl:GET-SIGNATURE(vProcName).
REPEAT j = 3 TO NUM-ENTRIES(vProcSignature):
vParam = ENTRY(j,vProcSignature).
CREATE tt-lib.
ASSIGN
tt-lib.type = ENTRY(1,vProcSignature)
tt-lib.name = vProcName
tt-lib.return-type = ENTRY(2,vProcSignature)
tt-lib.param-num = j - 2
tt-lib.param-type = ENTRY(1,vParam, " ")
tt-lib.param-name = ENTRY(2,vParam, " ")
tt-lib.param-data-type = ENTRY(3,vParam, " ")
NO-ERROR.
END.
END.
{setdest.i}
PUT UNFORMATTED FStrPad("Ф/П", 10, TRUE) + " " +
FStrPad("Наименование", 25, TRUE) + " " +
FStrPad("Возв. знач", 10, TRUE) + " " +
FStrPad("Тип парам.", 12, TRUE) + " " +
FStrPad("Параметр", 15, TRUE) + " " +
FStrPad("Тип данных", 10, TRUE)
SKIP.
FOR EACH tt-lib WHERE CAN-DO("PROCEDURE,FUNCTION",tt-lib.type)
BREAK BY tt-lib.type DESC
BY tt-lib.name
BY tt-lib.param-num:
IF FIRST-OF(tt-lib.name)
THEN
DO:
PUT UNFORMATTED FILL("?",97) SKIP.
PUT UNFORMATTED FStrPad(tt-lib.type, 10, TRUE) + " " +
FStrPad(tt-lib.name, 25, TRUE) + " " +
FStrPad(tt-lib.return-type, 10, TRUE) + " " +
FStrPad(tt-lib.param-type, 12, TRUE) + " " +
FStrPad(tt-lib.param-name, 15, TRUE) + " " +
FStrPad(tt-lib.param-data-type, 10, TRUE)
SKIP.
END.
ELSE
PUT UNFORMATTED FStrPad("", 10, TRUE) + " " +
FStrPad("", 25, TRUE) + " " +
FStrPad("", 10, TRUE) + " " +
FStrPad(tt-lib.param-type, 12, TRUE) + " " +
FStrPad(tt-lib.param-name, 15, TRUE) + " " +
FStrPad(tt-lib.param-data-type, 10, TRUE)
SKIP.
END.
{preview.i}
{intrface.del}
Основные интерфейсы:
cust - библиотека для работы с клиентами;
acct - библиотека для работы со счетами;
crd - библиотека для работы с картотекой;
loan - библиотека для работы с таблицей loan и кредитными договорами;
chwch - инструменты для работы с параметрами договоров и операциями;
bag - библиотека для работы с ПОС;
dps - библиотека для работы со вкладами физ. лиц;
axd - библиотека для работы с хозяйственными договорами;
card - библиотека для работы с ПК;
vok - библиотека "Выносная операционная касса";
instrum - библиотека для работы с финансовыми инструментами;
bank - библиотека для работы с банками;
email - библиотека для отправки e-mail сообщений;
xclass - библиотека для работы с метасхемой;
data - библиотека для работы с отвязанным набором данных (Instance);
blkob - библиотека для работы с блокированными объектами;
refer - библиотека для работы со службой "Справочники";
tmcod - библиотека для работы с темпорированными классификаторами;
rights - библиотека для работы с правами и паролями;
brnch - библиотека для работы с отделениями (таблица branch);
date - библиотека для работы с датами;
strng - библиотека для работы со строками и списками;
trans - библиотека для работы с буфером стандартной транзакции;
tmess - библиотека для работы со службой системных сообщений.