МЕТОД BRWQUERY КЛАССОВ МЕТАСХЕМЫ
Метод класса brwquery осуществляет построения выражения запроса (QUERY) для браузера navigate.cqr. Основой процедуры метода является инклюд-файл qrdef.i. Входные параметры процедуры метода описаны в инклюд-файле dsparams.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. По этим полям будут отсортированы договора в момент запуска браузера.