Задача [R1]: Настраиваемые фильтры в реестрах

Формулировка проблемы: необходима возможность фильтрации отображаемых записей реестра путём задания условий сравнения одного или нескольких полей формы реестра с некоторыми эталонными значениями.

Решение: в подмодуле системы Документы → Реестры необходимо реализовать возможность создавать пользовательские фильтры. Каждый фильтр имеет следующие параметры:

Любой пользователь, имеющий право на просмотр списка реестра, имеет возможность создавать для этого реестра собственные фильтры и использовать их (централизованных фильтров на этом этапе не предусматривается).

Условие фильтрации состоит из:

В условиях могут быть использованы только компоненты, входящие в «Поля формы реестра», и только следующих типов:

Подпись компонента формы реестра берётся из названия соответствующего «Поля формы реестра», если оно заполнено, в противном случае подписью будет идентификатор компонента в форме.

Замечание: на данный момент (до реализации этой задачи) в системе название поля в настройках реестра не сохраняется, если для него не активировано «Отображение поля при просмотре реестра». Это поведение необходимо устранить: сохранять введённое название поля формы реестра безотносительно «Отображения поля при просмотре реестра».

Для реализации фильтров навигатор, в котором перечислены реестры, доступные для просмотра, должен быть преобразован в древовидный: корневыми элементами в нём будут являться сами реестры, а узлами и ветками будут фильтры. Фильтры, таким образом, могут накладываться на список записей всего реестра (фильтры первого уровня), так и на выборку, сформированную другим фильтром (вложенные фильтры).

Фильтры создаются при помощи контекстного меню навигатора модуля Документы → Реестры. Содержимое контекстного меню:

Порядок сортировки фильтров, расположенных на одном уровне иерархии в дереве, определяется датой их создания — позже созданные располагаются последними.

При создании нового фильтра по умолчанию не добавляется ни одного условия. Добавление условия к фильтру осуществляется путём выбора поля реестра, по которому будет происходить сравнение, из списка с замещающим текстом «Добавить условие по». Удалить условие можно путём клика по иконке удаления, расположенной рядом с условием.

Условие по любому из полей реестра можно добавить произвольное количество один раз. При добавлении в фильтр нескольких условий, правила, описанные в них, действуют одновременно (логическое «И»).

Возможные условия фильтрации.

В зависимости от типа компонента способ сравнения с эталонным значением и способ ввода этого эталонного значения задаются следующим образом:

Однострочное поле.

Способы сравнения для однострочного поля делятся на числовые и строковые. Ввод эталонного значения для строкового способа сравнения осуществляется при помощи обыкновенного строкового поля, а для числового — с помощью компонента для ввода числа.

Необходимый для условия способ выбирается из списка.

Числовые способы сравнения: =, <, >, <=, >=, <>.

Строковые способы сравнения: «совпадает», «не совпадает», «содержит», «не содержит», «начинается с», «не начинается с», «заканчивается на», «не заканчивается на».

При активации фильтра с условием, использующим числовой способ сравнения, значение компонента этого условия приводится к числу с учётом локали компонента (если локаль в нём не указано — используется локаль пользователя, выполняющего активацию фильтра). Если привести значение к числу не удалось — результат сравнения для такого условия считается негативным.

Выпадающий список, переключатель вариантов и выбор вариантов.

Ввод эталонного значения для условий с компонентом такого типа осуществляется с помощью компонента «Выпадающий список с мультивыбором». Элементы, заданные в соответствующем компоненте формы реестра, помещаются в этот список с теми же названиями. Пользователь при настройке условия может выбрать один или несколько таких элементов. Если ни одного элемента не выбрано — результат сравнения для такого условия считается негативным (кроме условий с компонентами типа «Выбор вариантов» - там пустое количество эталонных элементов означает, что в записи реестра в этом компоненте не должно быть выбрано ничего).

Способ сравнения в этом случае не настраивается пользователем и заключается в том, что при активации фильтра с таким условием происходит проверка «выбрано ли в соответствующем поле какой-либо записи реестра какое-либо (логическое «ИЛИ») из эталонных значений условия».

Дата/время.

Ввод эталонного значения для условий с компонентом такого типа осуществляется с помощью компонента «Дата/время», причём возможность ввода времени в него определяется настройкой соответствующего компонента реестра.

Необходимый для условия способ выбирается из списка, возможные способы сравнения:

  • = — дата/время в поле реестра и эталонные дата/время совпадают;

  • < — дата/время в поле реестра раньше, чем эталонные дата/время;

  • > — дата/время в поле реестра позже, чем эталонные дата/время;

  • <= — дата/время в поле реестра раньше, чем эталонные дата/время, либо они совпадают;

  • >= — дата/время в поле реестра позже, чем эталонные дата/время, либо они совпадают;

  • <> — дата/время в поле реестра и эталонные дата/время не совпадают;

Рисунок 220. Диалог создания/редактирования фильтров

Диалог создания/редактирования фильтров

Рисунок 221. Mакет диалога создания/редактирования фильтра реестров (максимальная высота)

Mакет диалога создания/редактирования фильтра реестров (максимальная высота)

Замечание: в случае создания вложенного в фильтр фильтра к дочернему фильтру применяются условия родительского фильтра (замечание: таким образом можно создать структуру фильтров, не соответствующих ни одной записи реестра, и это не будет являться ошибкой в Synergy).

Примеры настройки фильтров.
Пример 1.

Допустим, у нас имеется реестр сотрудников, в форме которого есть компонент с названием «Обучение» и типом «Выбор вариантов». Настроенные варианты таковы:

  • «Прошёл корпоративное обучение».

  • «Проходил сторонние курсы обучения».

  • «Имеет степень Ph.D.».

Нам необходимо отфильтровать реестр так, чтобы отображались только сотрудники, проходившие корпоративное либо внешнее обучение.

Для этого создаём (пустой) фильтр, добавляем по компоненту «Обучение» условие и выбираем там в качестве эталонных два элемента: «Прошёл корпоративное обучение» и «Проходил сторонние курсы обучения».

Пример 2.

Используя реестр из предыдущего примера, нам необходимо создать фильтр, который отберёт только тех сотрудников, которые прошли и корпоративное обучение, и стороннее, и при этом всём имеют степень Ph.D.

Для этого создаём (пустой фильтр) и добавляем по компоненту «Обучение» три условия:

  1. С одним эталонным значением «Прошёл корпоративное обучение».

  2. С одним эталонным значением «Проходил сторонние курсы обучения».

  3. С одним эталонным значением «Имеет степень Ph.D.».

Три условия необходимы потому, что в компоненте типа «Выбор вариантов» одновременно может быть выбрано несколько вариантов (или не выбрано вообще ни одного). Если бы мы добавили только одно условие, в котором в качестве эталонных элементов указали бы «Прошёл корпоративное обучение», «Проходил сторонние курсы обучения», «Имеет степень Ph.D.», то мы получили бы выборку всех записей, в которых выбран хотя бы один из наших эталонных элементов. Но, так как нам нужна связь типа «И», необходимо создать три различных условия для каждого эталонного элемента отдельно.