В этом разделе рассказывается как настраивать фильтры. Раздел предназначен только для специалистов со знанием основ языка SQL, а так же структуры базы данных НЭП.
Картинок здесь не будет…
Определения:
Помимо системных фильтров, которые создаются автоматически для основных полей возможно настроить пользовательские фильтры.
Доступны три типа фильтров:
Самый простой вариант фильтра, для которого указывается только значение фильтра, по которому будут отфильтровываться записи.
Создадим новый «Фильтр по значению». Заполним следующие свойства фильтра:
Если для таких колонок ранее не было определено ни одного фильтра, то после привязки нового фильтра у соответствующих одноименных колонок появится кнопка, которая вызывает меню с фильтрами.
ВАЖНО! Фильтры появятся у пользователей только после перезагрузки Nep.exe
При активации фильтра такого типа с одним значением к запросу в секцию where будет добавлено следующее условие:
where FIELD_NAME=FILTER_VALUE где FIELD_NAME - Поле для проверки условий, а FILTER_VALUE - Значение фильтра
При активации фильтра такого типа с несколькими значениями через запятую к запросу в секцию where будет добавлено следующее условие:
where FIELD_NAME in (FILTER_VALUE) где FIELD_NAME - Поле для проверки условий, а FILTER_VALUE - Значение фильтра (несколько через запятую)
Если условие where уже присутствует в запросе, то в этом случае будет добавлен оператор and
Например, для отбора Своих фирм по ID в качестве «Поле для отображения фильтра» можно указать FIRM_ALIAS (поле «Краткое наименование»), а в качестве «Поле для проверки условий» нужно указать FIRM_ID.
В окно со Значениями в этом случае нужно вбить ID Своей фирмы по которой должна вестись выборка для данного фильтра. Возможно указать несколько значении через запятую, в следующе виде: 20,100,12
Если необходимо фильтровать по текстовому наименованию Своей фирмы можно в качестве «Поля для проверки условий» указать FIRM_NAME (или тот же FIRM_ALIAS)
Рассмотрим примеры, где «Поле для отображения фильтра» заполнено, как FIRM_ALIAS, а «Поле для проверки условий» заполнено как FIRM_NAME
Для текстовых полей в окне со Значениями можно указать теги , которые позволяют вместо строгого списка задать условия:
<:Not> - тег для негативного отбора; <:Like> - тег для отбора "похожих" по тексту значений; Например, если в окне "Значение" написать <:Like>"ИП%" , то будут отбираться Свои фирмы, наименование которых начинается с фразы "ИП"; <:Containing> - тег для отбора строк, включающих необходимую фразу. Например, если в окне "Значение" написать <:Containing>"лтд" - будут отбираться Свои фирмы, в наименовании которых содержится текст "лтд"; <:is distinct from> - тег для условного отбора по значениям, отличающихся от указанного. Условие отбора в этом случае похоже на условный оператор <>, с тем отличием, что сравнение можно делать с null. Например, если в окне "Значение" написать <:is distinct from null> - будут отбираться Свои фирмы наименования, которых не пустые (null). Если указать дополнительно тег негативного отбора в виде <:not><:is distinct from>null , то будут наоборот отбираться Свои фирмы с пустым полем наименования
Для выборки используется произвольное SQL условие, которое программируется на оригинальном языке SQL Firebird, что позволяет существенно расширить возможности фильтрации в отличии от «Фильтров по значению».
Возможно использовать вложенные подзапросы и встроенные функции языка SQL, SQL условие при включении фильтра подключается в секцию where основного запроса.
Для этого типа фильтра, так же необходимо заполнить «Поле для отображения фильтра» и заполнить «Текст SQL условия»
Расcмотрим это условие подробнее:
Например, предыдущие фильтры можно усовершенствовать с помощью SQL условия
Upper(<:Alias>.FIRM_NAME) contraining "ЛТД"
данное условие в отличии от фильтра «по Значению» решает проблему чувствительности к регистру. Условия проверяются с заглавными буквами.
Важно всегда перед полем по которому проверяется условия указывать тег:
<:Alais>
- он нужен для ссылки на основной SQL запрос в котором это поле должно быть доступно.
Еще примеры SQL условий:
Пусть так же фильтры будут в выпадающем списке у поля FIRM_NAME:
(select Count(*) from FIRMS where FIRM_NAME= <:Alias>.FIRM_NAME)>1
- основной запрос буде отфильтровывать Свои фирмы, у которых дублируется наименование;
<:Alias>.FIRM_ID in (select distinct FIRM_ID from ChecksView where DOC_ID=0 and KIND=0 and TAKEN<>"V")
- основной запрос буде отфильтровывать Свои фирмы, на которых весят нереализованные Документы резерва;
С помощью SQL запроса формируется список фильтров, на подобии системных фильтров.
Результатом такого SQL запроса будет набор фильтров, который будет отображаться в выпадающем списке фильтров у колонок, которые можно помечать аналогично системным фильтрам.
SQL запрос необходимо написать с учетом определенных правил. А именно, SQL запрос должен возвращать заполненными свойства, которые были необходимы для определения фильтра «По значению»:
Соответственно SQL запрос должен возвращать как минимум эти два поля.
После того, как запрос списка фильтров сформирован, нужно определить правило по которому будет осуществляется выборка по «Значениям фильтра».
Тут два варианта: Первый - простой, выборка будет осуществляться по простой схеме с «по значению»
FILED_NAME in (A,B,С)
где A,B,С - «Значения фильтров» через запятую (например ID) , соответствующие включенным в выпадающем меню фильтрам.
Пример:
for select t.TARGET_ID, t.TARGET_ID, t.TARGET_NAME from CLASSES_TARGETS t where t.CLASS_ID=122 Order by t.TARGET_NAME into :FILTER_ID, :FILTER_VALUE, :FILTER_NAME
- выводит список фильтров в качестве которых выступают Страны из таблицы Атрибутов. В качестве «Поле для отображения фильтра» укажем COUNTRY.
Cоответственно этот список фильтров будет доступен у всех таблиц, где есть поле COUNTRY (Страна). Например «Партии» (PARTS) и «Складские документы» (CHECKS)
Пример фильтра по секциям прайс-листа
Поле фильтра: PRICELIST_NAME SQL запрос списка: select t.TARGET_ID, t.TARGET_NAME from CLASSES_TARGETS t where t.CLASS_ID=109 Order by t.TARGET_NAME SQL условие: <:ALIAS>.PRICELIST_ID=<:FILTER_VALUE>
ВАЖНО!
• Фильтры разного типа (По значениям, SQL условие и текстовый фильтр) добавляют условия к результирующему SQL запросу черезAND
• Внутри одного типа через условия добавляются черезOR