Динамические фильтры: Как приумножить радость от обладания

В данной статье мы продолжим изучать динамические фильтры, в несомненной полезности которых мы убеждались в предыдущей статье . Сейчас же рассмотрим технологические аспекты создания динамических фильтров.

Для начала напомню, что вводить динамические фильтры нужно в полях из Панелей фильтров, ввод в поле Type to filter к требуемому результату не приводит.

При вводе значения в фильтры происходит вызов триггеров из программного модуля 1 ApplicationManagement. На радость разработчикам он теперь выглядит более причесанным. Наконец-то разные функции вынесли в отдельные программные модули. Например, за форматирование текста отвечает программный модуль 41 TextManagement, а изощренное формирование заголовков для CaptionClass теперь в 42 CaptionManagement.

Нас интересуют триггеры:

Codeunit 1 Application Management

При вводе выражений в поля фильтрации они подвергаются некоторым преобразованиям через TextManagement.
Для начала рассмотрим динамические фильтры типа текст или код:

Codeunit 41 MakeTextFilter

Для обоих из них используется одна функция MakeTextFilter, в которую передается строка введенная пользователем. Далее происходит поиск подстроки, причем на двух языках, на английском и на локальном. Что позволит избежать проблем, когда привычный t(TODAY) в версии для России перестал работать, а вместо него стала использоваться русская с(Сегодня). В данной версии будут работать оба варианта.

Первые три выглядят довольно примитивно, хотя ME (он же USER) думаю будут умерено востребованы, ведь так приятно видеть в списке только свои документы. Фильтр по компании мне кажется довольно странным, но не мешает, поэтому позволим ему остаться.

Дальше я предлагаю рассмотреть расширение функционала аналогичное My Items и прочих, на примере модуля работ.

Для начала создадим таблицу My Job и страницу My Jobs. В процессе используем идею о повторяемых паттернах. Далее подключаем созданную страницу к требуемому ролевому центру и наполняем данными:

My Jobs

Далее модифицируем программный модуль 41 TextManagement:

  • Добавить новую текстовую константу MyJobsText со значением ENU = MYJOBS
  • Изменить функцию MakeTextFilter(VAR TextFilterText : Text) : Integer, добавив в него строки:

COPYSTR(’MYJOBS’,1,STRLEN(PartOfText)),COPYSTR(MyJobsText,1,STRLEN(PartOfText)):
  BEGIN
  Position := Position + STRLEN(PartOfText);
  GetMyFilterText(TextFilterText,DATABASE::”My Job”);
  END;

  • Изменить первую строку в функции GetMyFilterText(VAR TextFilterText : Text;MyTableNo : Integer)

IF NOT (MyTableNo IN [DATABASE::”My Customer”,DATABASE::”My Vendor”,DATABASE::”My Item”,DATABASE::”My Job”]) THEN

Настало время испытать и конечно же это работает.

Однако не заводить же таблицу под каждую сущность которую хочется отфильтровать. Не попробовать ли изобрести нечто «универсальное».

Сказано – сделано.

Создаем таблицу «My Filter» и советующую страницу. В отличие от прочих My* таблиц в ней будет три поля:

My Filters Table

Страница для этой таблицы даже проще, чем в случаем с My* страницами.

My Filters Page

Далее подключаем ее к ролевому центру уже известным способом.

Однако чтобы она заработала потребуются некоторые изменения в программном модулей 41 TextManagement

  • Новая текстовая константа: MyFiltersText ENU= MYFILTERS
  • Новый фрагмент в функции MakeTextFilter(VAR TextFilterText : Text) :

COPYSTR(’MYFILTERS’,1,STRLEN(PartOfText)),COPYSTR(MyFiltersText,1,STRLEN(PartOfText)):
  BEGIN
  Position := Position + STRLEN(PartOfText);
  GetMyFilterText2(TextFilterText,PartOfText);
  END;

  • Новая функция GetMyFilterText2(VAR TextFilterText : Text;PartOfText : Text[250])

MyFilterNo := COPYSTR(TextFilterText,STRPOS(TextFilterText,PartOfText)+STRLEN(PartOfText)+1);
TextFilterText := ”;
IF MyFilter.GET(USERID,MyFilterNo) THEN
  TextFilterText:=MyFilter.”Filter String”;

А теперь испытаем. Вот несколько тестовых фильтровых строк.

MyFilters - data

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

Во-первых, идентификаторы. Да, пришлось сделать их цифровыми – это особенность форматирования текстовой строки в MakeTextFilter, если внести в нее чуть больше изменений, она сможет вполне успешно переваривать и полноценные кодовые идентификаторы. Свои изящные варианты решения задачки можно публиковать в комментариях.

  • Строки фильтров 10 и 20 никаких особых секретов не содержат.
  • Строки 31 и 32 – это попытка протестировать «длинные» фильтры, ведь в таблице строка фильтров может быть только 250 символов вот и пришлось «хитрить», строка 33 динамически заменяется на строки 31 и 32, которые в свою очередь динамически заменяются на те строки, что на картинке. И это работает.
  • Строка 40 – это пример использования и других динамических фильтров внутри конструкции.

А на следующей картинке можно посмотреть, как это выглядит при использовании:

MyFilters - demo

Полагаю, такой инструмент будет полезен как часть стандартной функциональности.

Метки: ,



Оставьте свой отзыв!