Формулировка проблемы: необходима возможность фильтрации отображаемых записей реестра путём задания условий сравнения одного или нескольких полей формы реестра с некоторыми эталонными значениями.
Решение: в подмодуле системы Документы → Реестры необходимо реализовать возможность создавать пользовательские фильтры. Каждый фильтр имеет следующие параметры:
Название (обязательно, отображается в дереве);
Иконка фильтра (если не выбрана, иконка не отображается);
Одно или несколько условий фильтрации. ;
Любой пользователь, имеющий право на просмотр списка реестра, имеет возможность создавать для этого реестра собственные фильтры и использовать их (централизованных фильтров на этом этапе не предусматривается).
Условие фильтрации состоит из:
компонента формы реестра (=«поля реестра»);
способа сравнения с эталонным значением (зависит от типа компонента);
эталонного значения для сравнения (зависит от типа компонента);
В условиях могут быть использованы только компоненты, входящие в «Поля формы реестра», и только следующих типов:
Однострочное поле;
Выпадающий список;
Дата/время;
Выбор вариантов;
Переключатель вариантов;
Подпись компонента формы реестра берётся из названия соответствующего «Поля формы реестра», если оно заполнено, в противном случае подписью будет идентификатор компонента в форме.
Замечание: на данный момент (до реализации этой задачи) в системе название поля в настройках реестра не сохраняется, если для него не активировано «Отображение поля при просмотре реестра». Это поведение необходимо устранить: сохранять введённое название поля формы реестра безотносительно «Отображения поля при просмотре реестра».
Для реализации фильтров навигатор, в котором перечислены реестры, доступные для просмотра, должен быть преобразован в древовидный: корневыми элементами в нём будут являться сами реестры, а узлами и ветками будут фильтры. Фильтры, таким образом, могут накладываться на список записей всего реестра (фильтры первого уровня), так и на выборку, сформированную другим фильтром (вложенные фильтры).
Фильтры создаются при помощи контекстного меню навигатора модуля Документы → Реестры. Содержимое контекстного меню:
реестров:
«Добавить фильтр» - добавляет новый фильтр первого уровня;
фильтров:
«Добавить фильтр» - добавляет новый вложенный фильтр;
«Редактировать фильтр» - редактирует выделенный фильтр;
«Удалить фильтр» - удаляет выделенный фильтр;
Порядок сортировки фильтров, расположенных на одном уровне иерархии в дереве, определяется датой их создания — позже созданные располагаются последними.
При создании нового фильтра по умолчанию не добавляется ни одного условия. Добавление условия к фильтру осуществляется путём выбора поля реестра, по которому будет происходить сравнение, из списка с замещающим текстом «Добавить условие по». Удалить условие можно путём клика по иконке удаления, расположенной рядом с условием.
Условие по любому из полей реестра можно добавить произвольное количество один раз. При добавлении в фильтр нескольких условий, правила, описанные в них, действуют одновременно (логическое «И»).
В зависимости от типа компонента способ сравнения с эталонным значением и способ ввода этого эталонного значения задаются следующим образом:
Способы сравнения для однострочного поля делятся на числовые и строковые. Ввод эталонного значения для строкового способа сравнения осуществляется при помощи обыкновенного строкового поля, а для числового — с помощью компонента для ввода числа.
Необходимый для условия способ выбирается из списка.
Числовые способы сравнения: =
,
<
, >
,
<=
, >=
,
<>
.
Строковые способы сравнения: «совпадает», «не совпадает», «содержит», «не содержит», «начинается с», «не начинается с», «заканчивается на», «не заканчивается на».
При активации фильтра с условием, использующим числовой способ сравнения, значение компонента этого условия приводится к числу с учётом локали компонента (если локаль в нём не указано — используется локаль пользователя, выполняющего активацию фильтра). Если привести значение к числу не удалось — результат сравнения для такого условия считается негативным.
Ввод эталонного значения для условий с компонентом такого типа осуществляется с помощью компонента «Выпадающий список с мультивыбором». Элементы, заданные в соответствующем компоненте формы реестра, помещаются в этот список с теми же названиями. Пользователь при настройке условия может выбрать один или несколько таких элементов. Если ни одного элемента не выбрано — результат сравнения для такого условия считается негативным (кроме условий с компонентами типа «Выбор вариантов» - там пустое количество эталонных элементов означает, что в записи реестра в этом компоненте не должно быть выбрано ничего).
Способ сравнения в этом случае не настраивается пользователем и заключается в том, что при активации фильтра с таким условием происходит проверка «выбрано ли в соответствующем поле какой-либо записи реестра какое-либо (логическое «ИЛИ») из эталонных значений условия».
Ввод эталонного значения для условий с компонентом такого типа осуществляется с помощью компонента «Дата/время», причём возможность ввода времени в него определяется настройкой соответствующего компонента реестра.
Необходимый для условия способ выбирается из списка, возможные способы сравнения:
=
— дата/время в поле реестра и эталонные
дата/время совпадают;
<
— дата/время в поле реестра раньше,
чем эталонные дата/время;
>
— дата/время в поле реестра позже,
чем эталонные дата/время;
<=
— дата/время в поле реестра раньше,
чем эталонные дата/время, либо они совпадают;
>=
— дата/время в поле реестра позже,
чем эталонные дата/время, либо они совпадают;
<>
— дата/время в поле реестра и
эталонные дата/время не совпадают;
Замечание: в случае создания вложенного в фильтр фильтра к дочернему фильтру применяются условия родительского фильтра (замечание: таким образом можно создать структуру фильтров, не соответствующих ни одной записи реестра, и это не будет являться ошибкой в Synergy).
Допустим, у нас имеется реестр сотрудников, в форме которого есть компонент с названием «Обучение» и типом «Выбор вариантов». Настроенные варианты таковы:
«Прошёл корпоративное обучение».
«Проходил сторонние курсы обучения».
«Имеет степень Ph.D.».
Нам необходимо отфильтровать реестр так, чтобы отображались только сотрудники, проходившие корпоративное либо внешнее обучение.
Для этого создаём (пустой) фильтр, добавляем по компоненту «Обучение» условие и выбираем там в качестве эталонных два элемента: «Прошёл корпоративное обучение» и «Проходил сторонние курсы обучения».
Используя реестр из предыдущего примера, нам необходимо создать фильтр, который отберёт только тех сотрудников, которые прошли и корпоративное обучение, и стороннее, и при этом всём имеют степень Ph.D.
Для этого создаём (пустой фильтр) и добавляем по компоненту «Обучение» три условия:
С одним эталонным значением «Прошёл корпоративное обучение».
С одним эталонным значением «Проходил сторонние курсы обучения».
С одним эталонным значением «Имеет степень Ph.D.».
Три условия необходимы потому, что в компоненте типа «Выбор вариантов» одновременно может быть выбрано несколько вариантов (или не выбрано вообще ни одного). Если бы мы добавили только одно условие, в котором в качестве эталонных элементов указали бы «Прошёл корпоративное обучение», «Проходил сторонние курсы обучения», «Имеет степень Ph.D.», то мы получили бы выборку всех записей, в которых выбран хотя бы один из наших эталонных элементов. Но, так как нам нужна связь типа «И», необходимо создать три различных условия для каждого эталонного элемента отдельно.