МЕТОД BRWQUERY КЛАССОВ МЕТАСХЕМЫ

Метод класса brwquery осуществляет построения выражения запроса (QUERY) для браузера navigate.cqr. Основой процедуры метода является инклюд-файл qrdef.i. Входные параметры процедуры метода описаны в инклюд-файле dsparams.i, который должен быть обязательно подключен в начале процедуры метода. 

Аргументы qrdef.i

Атрибут Описание
&buff-list Список буферов разделенных пробелами. Обязательный параметр
&buff-handles Список хэндлов таблиц, разделённых запятыми, можно указывать полностью динамику. При указании данного параметра buff-list переопределяется
&need-buff-list Список буферов обязательных при создании QUERY. По умолчанию первый из buff-list
&Join-List Список соединений между буферами. По умолчанию EACH.
&Fixed-Where Список фиксированных where-выражений разделенных |.
&Var-Where Список переменных разделенных пробелами участвующих в &Fixed-Where.
&Use-Index Список индексов при формировании QUERY.
&Lock-List Список блокировок буферов. По умолчанию NO-LOCK.
&condition Выражение для выбора данного QUERY.
&SortBy Выражение для сортировки QUERY.
&Ind-Rep Yes - использование INDEXED-REPOSTION. По умолчанию NO.
&Fields-Sort Список полей с разделителем пробел, для сортировки.
&Fields-Manual Список полей с разделителем пробел, по которым where-выражение формируется не стандартным образом (стандартным является формирование выражения при отличии начального значения от введенного в flt-file.p.), а процедурой определенной препроцесорной переменной &manualWhere в navigate.cqr. Поле может состоять из нескольких полей разделенных . В этом случае where-выражение формируется один раз при изменение любой составляющей.
&Fields-Mandatory Список полей с разделителем пробел, включающихся в where- выражение в независимости отличается ли начальное значение от введенного.
&Fields-Ignore Список полей с разделителем пробел, не участвующих в формирование where-выражения стандартным образом.
&outer-join-buff Список пропускаемых при формирование запроса буферов, в случае если пользовательская функция без параметров (если она объявлена) Use-Outer-Join-<имя_буфера> вернет YES. При этом не будет задан фильтр для данного буфера.
&manualWhere Имя собственной процедуры для формирования нестандартного
where-выражения для полей фильтра:
&ManualSort Имя собственной функции для формирования нестандартного
выражения сортировки:

Рассмотрим пример процедуры метода для классов метасхемы построенных на таблице loan (договора). При построении выражения запроса будем учитывать права пользователя на чтение объектов подклассов класса метасхемы, для которого определена наша процедура метода brwquery, а так же права на подчиненных пользователя создавших объекты.

Первоначально запрос сформируем в следующем виде:

FOR EACH loan WHERE CAN-DO(vAvailClass, loan.class-code)NO-LOCK,
FIRST ttRights  WHERE ttRights.user-id EQ loan.user-id
AND ttRights.freading
NO-LOCK
BY loan.open-date
BY loan.doc-ref:

...

END.

Далее на данный запрос будут накладываться условия фильтра в браузере.

{globals.i}             /* Глобальные переменные сессии                */
{dsparams.i}
{brwsubright.def}

{intrface.get rights}   /* Библиотека для работы с правами и паролями. */
{intrface.get xclass}   /* Библиотека инструментов метасхемы. */

DEF VAR vAvailClass  AS CHAR NO-UNDO.
DEF VAR vUserSlaves  AS CHAR NO-UNDO.
DEF VAR vSotrView    AS LOG NO-UNDO.

vUserSlaves  = getSlaves ().
vSotrView    = getThisUserXAttrValue("ПросмотрСотр") EQ "Нет".

FUNCTION Use-Outer-Join-ttRights RETURN LOGICAL.
   RETURN vUserSlaves EQ "*" OR vSotrView.
END FUNCTION.
/* Получение списка доступных для пользователя на чтение подклассов */
vAvailClass = GetRightClasses (iClassCode, "R").

{qrdef.i
   &buff-list        = "loan ttRights"
   &need-buff-list   = "loan,ttRights"
   &Join-list        = "EACH,FIRST"
   &fixed-where      =  "' WHERE CAN-DO(""' + vAvailClass + '"",
                                        loan.class-code)' +
                           ' AND loan.contract EQ ""Пакет"" ' +   
                           ' AND loan.close-date EQ ? ' +
                        '| WHERE ttRights.user-id EQ loan.user-id'
                         + ' AND ttRights.freading'
                        "
   &outer-join-buff  = "ttRights"
   &SortBy           = "'BY loan.open-date BY loan.doc-ref'"                        
   &condition        = YES
}

Наша процедура формирует запрос по основной таблице класса метасхемы loan, а так же по таблице прав доступа на подчиненных ttRights. Поэтому, в аргументе &buff-list мы указываем обе эти таблицы (буфера).

Для выбора записей по таблице loan в запросе у нас используется оператор EACH, а для таблицы ttRights оператор FIND, поэтому в соответствии с порядком указания таблиц в &buff-list определяем эти операторы в &Join-list в том же порядке.

Для каждой таблицы участвующей в запросе формируем тексты WHERE выражений и указываем их в аргументе &fixed-where согласно последовательности указания таблиц в аргументе &buff-list. Разделитель между WHERE выражениями "|".

В &outer-join-buff мы указали буфер ttRights, а так же определили функцию Use-Outer-Join-ttRights. Таким образом, если данная функция вернет TRUE, то условие по буферу ttRights не будет включено в выражение запроса.

В качестве выражения сортировки в &SortBy мы указали сортировку по полям loan.open-date и loan.doc-ref. По этим полям будут отсортированы договора в момент запуска браузера.