БИБЛИОТЕКИ ИНТЕРФЕЙСОВ

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

Подключение таких библиотек в процедурах осуществляется с помощью универсального инструмента 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.

inrface

Разберем представленный пример подключения и удаления библиотек.

В процедуре 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   - библиотека для работы со службой системных сообщений.

Вы здесь: Главная ИБС Бисквит БАЗОВЫЙ БИБЛИОТЕКИ ИНТЕРФЕЙСОВ