ВЫЗОВ БРАУЗЕРА ОБЪЕКТОВ КЛАССА МЕТАСХЕМЫ

На классах метасхемы АБС Бисквит указывается метод browse содержащий процедуру просмотра объектов данного класса (браузера). Браузеры классов строятся на основе универсального инструмента navigate.cqr. При отображении объектов класса возможно задание фильтра, структура которого описывается в процедуре фильтра указываемой в методе fltstruct.

Параметры фильтра записываются во временную таблицу flt-attr описанную в flt-file.i. Данный инклюд-файл содержит так же процедуры по работе с этой таблицей. Код параметра фильтра можно получить зайдя в фильтр, встав на интересующем нас параметре и нажав CTRL+T. Код параметра будет указан в поле Frame-Field открывшегося окна.

Так же можно вывести отчет с содержимым таблицы flt-attr, предварительно созданного фильтра, вызвать который необходимо находясь в браузере по CTRL+E.

Пример процедуры такого отчета:

globals.i}
{flt-file.i}
{setdest.i}

PUT UNFORMATTED "|КОД ПАРАМ.|ЗНАЧ. ПАРАМ.|ТАБЛИЦА БД|ПОЛЕ ТАБЛ.~
|КОД. ДОП. РЕК.|ОПЕР. УСЛ.|" SKIP.

PUT UNFORMATTED FILL("-",73) SKIP.
FOR EACH flt-attr NO-LOCK:
   PUT UNFORMATTED "|" + STRING(flt-attr.attr-code, "x(10)")
                 + "|" + STRING(flt-attr.attr-code-value,"x(12)")
                 + "|" + STRING(flt-attr.attr-table,"x(10)")
                 + "|" + STRING(flt-attr.attr-basic,"x(10)")
                 + "|" + STRING(flt-attr.attr-basic-signs,"x(14)")
                 + "|" + STRING(attr-op,"x(10)")
                 + "|"  SKIP.
   PUT UNFORMATTED FILL("-",73) SKIP.    

END.
{preview.i}

Про то как создавать собственные браузеры на основе navigate.cqr мы поговорим в отдельной статье, а сейчас научимся вызывать стандартные.

Процедура browseld.p осуществляет вызов процедур браузеров с предустановленным фильтром:

browseld.p (ipClassChar,
            ipCodeLstChar,
            ipValLstChar,
            ipLockFldChar,
            Lavel).

  • ipClassChar - класс объекта метасхемы, тип CHAR;
  • ipCodeLstChar - список кодов параметров предустанавливаемого фильтра, с разделителем CHR(1), тип CHAR;
  • ipValLstChar - список значений соответствующих кодов полей предустанавливаемого фильтра, перечисленных в ipCodeLstChar с разделителем CHR(1), тип CHAR;
  • ipLockFldChar - список блокируемых для изменения кодов параметров фильтра, тип CHAR;
  • Lavel - номер строки фрейма, с которой будет выводится браузер, тип INT64.

Для примера, вызовем браузер физических лиц с фамилией Иванов:

RUN browseld.p ("person",
                "name-last",
                "Иванов",
                "",
                4).

Задание дополнительных реквизитов класса в предустанавливаемом фильтре осуществляется посредством пары кодов параметров фильтра: sc-n - код n-го дополнительного реквизита и sv-n - значение  n-го дополнительного реквизита.

Осуществим вызов браузера клиентов физических лиц у которых дополнительный реквизит branch-id (код отделения) равен "0001", т.е. выведем только клиентов относящихся к этому отделению:

RUN browseld.p ("person",
                "sc-1" + CHR(1) + "sv-1",
                "branch-id" + CHR(1) + "0001",
"",
4).

При формировании запроса по предустановленному фильтру оператор условия сравнения формируется автоматически в зависимости от формата указанного значения.

Пример формирования условий запроса по параметру name-last (фамилия):

значение условие
иванов name-last EQ "иванов"
иванов* name-last BEGINS "иванов*"
*иванов* name-last MATHES "*иванов*"
*иванов name-last MATHES "*иванов"
иванов,петров CAN-DO("иванов,петров", name-last)

Данный оператор записывается в поле attr-op таблицы фильтра и может быть переопределен.

Для изменения поля attr-op таблицы фильтра в браузере в качестве кода параметра в ipCodeLstChar необходимо указать специальный код "FieldOper", а соответствующее ему значение должно представлять собой:

"<код поля1,оператор>|<код поля2,оператор>|<...>"

Для примера осуществим вызов браузера клиентов физических лиц с датой рождения большей 01.01.1990 и меньшей 01.01.1995.

RUN browseld.p ("person",
                "birthday1"  + CHR(1) + "birthday2"  + CHR(1) + "FieldOper",    
                "01/01/1990" + CHR(1) + "01/01/1995" + CHR(1)
+ "birthday1,>|birthday2,<",

                "",
                4).


СОРТИРОВКА ЗАПИСЕЙ


Для установки сортировки записей в браузере, отобранных по фильтру (поле attr-sort таблицы фильтра), в качестве кода параметра ipCodeLstChar указываем "FieldSort", при этом соответствующее ему значение должно представлять собой список полей по которым будет осуществляться сортировка, разделитель - запятая.

По умолчанию используется восходящая сортировка. Для нисходящей сортировки (установки поля attr-sort-desc таблицы фильтра) после кода поля в значении параметра через разделитель "|" необходимо указать символ "d". Порядок сортировки по полям (поле sort-order таблицы фильтра) определяется порядковым номером кода поля для сортировки в списке:

"<код поля1>,<код поля2|d>,<...>"
     {1}               {2}            {N}

Для примера вызовем браузер кредитных договоров (класс loan_allocat) отсортированных по коду подразделения, а внутри каждого подразделения по статусу с нисходящей сортировкой.

RUN browseld.p ("loan_allocat",
              "FieldSort",
                "branch-id,loan-status|d",
                "",
                4).

Если вызов браузера договоров планируется осуществлять не из родного модуля, необходимо в процедуре вызова подключить {svarloan.def new}


ПОЛЬЗОВАТЕЛЬСКИЙ ФИЛЬТР


Браузер может быть вызван с предустановленным пользовательским фильтром. Для этого, в качестве ipCodeLstChar указывается "UserConf", а параметр ipValLstChar должен представлять собой список из параметров фильтра:

"user-id, flt_proc, flt_name, flt_code"

где:

  • flt_proc - процедура;
  • flt_name - описание фильтра (название);
  • flt_code - код параметра.
RUN browseld.p ("dps_person",
                "UserConf"
                "Usr1, dpscbrow.p, Мой фильтр,",
                "branch-id",
                4).


ФОРМА БРАУЗЕРА


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

Так же возможно задание заголовка браузера посредством параметра Title. 

RUN browseld.p ("person",
                "SetFirstFrm" + CHR(1) + "Title",
                "5"         + CHR(1) + "Плательщики",
                "",
                4).

После того, как был осуществлен вызов браузера, по CTRL+F2 возможно просмотреть запрос, который был сформирован при его вызове.


ТРИГГЕРЫ БРАУЗЕРА


При вызове браузера возможно отключение триггеров определенных для него. Для этого необходимо передать параметр ActionLock в качестве значения которого указывается список кодов клавиш в формате CAN-DO, триггеры которых необходимо заблокировать.

RUN browseld.p ("person",
                "ActionLock",
                "INS,DEL",
                "",
                4).

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


ВОЗВРАЩАЕМЫЕ ЗНАЧЕНИЯ



ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ (PICK-VALUE)


Напишем процедуру вызова экранной формы с одним полем ввода. По F1 на поле будет вызываться браузер вкладов физ. лиц, где мы будем выбирать (поиск, фильтр) нужный нам вклад. После нажатия заветных CTRL+ENTER на интересующей нас записи, в поле ввода мы будем отображать значение которое вернул нам браузер. Возвращаемое браузером значение записывается в глобальную переменную pick-value, объявленную в globals.i и формируется в инклюд-файле заданного в аргументе &return в navigate.cqr  при построении браузера.

{globals.i} 
PAUSE(0).
DEF VAR vReturnVal  AS CHAR FORMAT "x(25)" NO-UNDO.
DEF FRAME fmain vReturnVal LABEL "Возвр. значение"
    WITH SIDE-LABELS CENTERED overlay ROW 7 1 COL
    TITLE color bright-white "[ PICK-VALUE ]".

ON F1 OF vReturnVal IN FRAME fmain
DO:
   DO TRANSACTION:
      pick-value = "".
      RUN browseld.p ("dep_person",
                      "",
                      "",
                      "",
                      4).   
      IF LASTKEY EQ 10 AND pick-value NE ? THEN
      vReturnVal:SCREEN-VALUE = pick-value.
   END.
END.

ENABLE ALL WITH FRAME fmain.
WAIT-FOR GO OF FRAME fmain.

Как правило, в существующих браузерах АБС Бисквит, в pick-value возвращается суррогат объекта, который в свою очередь представляет собой список реквизитов объекта класса определяющих его уникальное значение (первичный ключ) с разделителем запятая. Так например, для класса счетов (acct) суррогатом является: <номер счета>,<код валюты>.

Допустим, что из возвращаемого суррогата нам необходимо не все его компоненты, а только один, например, только номер счета. В этом случае, нам удобней будет воспользоваться процедурой вызова браузера browseldex.p:

browseldex.p (ipEntry,
              ipClassChar,
              ipCodeLstChar,
              ipValLstChar,
              ipLockFldChar,
              Lavel).

  • ipEntry - порядковый номер возвращаемого элемента из списка pick-value, тип INT64;
  • ipClassChar - класс объекта метасхемы, тип CHAR;
  • ipCodeLstChar - список кодов параметров предустанавливаемого фильтра, с разделителем CHR(1), тип CHAR;
  • ipValLstChar - список значений соответствующих кодов полей предустанавливаемого фильтра, перечисленных в ipCodeLstChar с разделителем CHR(1), тип CHAR;
  • ipLockFldChar - список блокируемых для изменения кодов параметров фильтра, тип CHAR;
  • Lavel - номер строки фрейма, с которой будет выводится браузер, тип INT64.
{globals.i} 
PAUSE(0).
DEF VAR vReturnVal  AS CHAR FORMAT "x(40)" NO-UNDO.
DEF FRAME fmain vReturnVal LABEL "Возвр. значение"
    WITH SIDE-LABELS CENTERED overlay ROW 7 1 COL
    TITLE color bright-white "[ PICK-VALUE ]".

ON F1 OF vReturnVal IN FRAME fmain
DO:
   DO TRANSACTION:
      pick-value = "".
      RUN browseldex.p (1,
                        "acct",
                        "",
                        "",
                        "",
                        4).   
      IF LASTKEY EQ 10 AND pick-value NE ? THEN
      vReturnVal:SCREEN-VALUE = pick-value.
   END.
END.

ENABLE ALL WITH FRAME fmain.
WAIT-FOR GO OF FRAME fmain.

Если же нам нужно, чтобы браузер возвращал не то значение, которое было определено разработчиком браузера в &return, а определенного реквизита (основного или дополнительного) отмеченного объекта, то и на этот счет имеется стандартное решение browseldvar.p:

browseldvar.p (ipVarName,
               ipClassChar,
               ipCodeLstChar,
               ipValLstChar,
               ipLockFldChar,
               Lavel).

  • ipVarName - код возвращаемого реквизита объекта, тип CHAR;
  • ipClassChar - класс объекта метасхемы, тип CHAR;
  • ipCodeLstChar - список кодов параметров предустанавливаемого фильтра, с разделителем CHR(1), тип CHAR;
  • ipValLstChar - список значений соответствующих кодов полей предустанавливаемого фильтра, перечисленных в ipCodeLstChar с разделителем CHR(1), тип CHAR;
  • ipLockFldChar - список блокируемых для изменения кодов параметров фильтра, тип CHAR;
  • Lavel - номер строки фрейма с которой будет выводится браузер, тип INT64.

Процедура browseldvar.p имеет те же самые параметры, что и browseld.p, за исключением первого дополнительного параметра - код возвращаемого реквизита объекта.

{globals.i} 
PAUSE(0).
DEF VAR vReturnVal  AS CHAR FORMAT "x(25)" NO-UNDO.
DEF FRAME fmain vReturnVal LABEL "Возвр. значение"
    WITH SIDE-LABELS CENTERED overlay ROW 7 1 COL
    TITLE color bright-white "[ PICK-VALUE ]".

ON F1 OF vReturnVal IN FRAME fmain
DO:
   DO TRANSACTION:
      pick-value = "".
      RUN browseldvar.p ("cont-type",
                         "dep_person",
                         "",
                         "",
                         "",
                         4).   
      IF LASTKEY EQ 10 AND pick-value NE ? THEN
      vReturnVal:SCREEN-VALUE = pick-value.
   END.
END.

ENABLE ALL WITH FRAME fmain.
WAIT-FOR GO OF FRAME fmain.


ВОЗВРАТ МНОЖЕСТВА ЗНАЧЕНИЙ


RECID записей отмеченных в браузере автоматически сохраняются во временной таблице tmprecid описанной в tmprecid.def.

{tmprecid.def}
DO TRANSACTION:
   RUN browseld.p ("dep_person",
                   "status" + CHR(1) + "currency",
                   "ф" + CHR(1) + "",
                   "status" + CHR(1) + "currency",
                   4).
END.
{setdest.i}
FOR EACH tmprecid, FIRST loan WHERE RECID(loan) = tmprecid.id: 
   DISPL loan.cont-code.
END.
{preview.i}

Помимо механизма заполнения таблицы tmprecid отмеченными в браузере записями (RECID), существует механизм заполнения отдельной временной таблицы значениями указываемых полей отмеченных записей. Данный механизм описан в библиотеке pp-ret.p - процедуры RetSet и RetDel.

Существует 2-а режима формирования такой временной таблицы:

1. Получение информации по одной записи.

В качестве приемника могут выступать:
- указатель на temp-table с полем PickValue;
- указатель на whidget экранной формы, значение будет помещено <whidget>:screen-value.

2. Получение информации по нескольким записям.

В данном случае приемником служит ТОЛЬКО временная таблица, у которой существует 2-а обязательных поля:

  • FileRowId - ROWDID отмеченной записи;
  • PickValue - Список необходимых значений этой записи.

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

  • "RetRcp"  - указатель на приемник данных (например, временная таблица);
  • "RetFld"  - поля для возврата (например, surrogate);
  • "RetType" - тип возвращаемого значения (Single/Multi).

Пример:

{globals.i}
{ttretval.def}

RUN browseld.p("acct",                     
               "RetRcp"  + CHR(1) +
               "RetType" + CHR(1) +
               "RetFld",
               STRING(TEMP-TABLE ttRetVal:HANDLE) + CHR(1) +
               "Multi"   + CHR(1) +
               "acct",
               "",
               4).

{setdest.i}

FOR EACH ttRetVal:
   PUT UNFORMATTED ttRetVal.PickValue SKIP.
END.

{preview.i}

 

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