Динамические фильтры: Как приумножить радость от обладания
В данной статье мы продолжим изучать динамические фильтры, в несомненной полезности которых мы убеждались в предыдущей статье . Сейчас же рассмотрим технологические аспекты создания динамических фильтров.
Для начала напомню, что вводить динамические фильтры нужно в полях из Панелей фильтров, ввод в поле Type to filter к требуемому результату не приводит.
При вводе значения в фильтры происходит вызов триггеров из программного модуля 1 ApplicationManagement. На радость разработчикам он теперь выглядит более причесанным. Наконец-то разные функции вынесли в отдельные программные модули. Например, за форматирование текста отвечает программный модуль 41 TextManagement, а изощренное формирование заголовков для CaptionClass теперь в 42 CaptionManagement.
Нас интересуют триггеры:
При вводе выражений в поля фильтрации они подвергаются некоторым преобразованиям через TextManagement.
Для начала рассмотрим динамические фильтры типа текст или код:
Для обоих из них используется одна функция MakeTextFilter, в которую передается строка введенная пользователем. Далее происходит поиск подстроки, причем на двух языках, на английском и на локальном. Что позволит избежать проблем, когда привычный t(TODAY) в версии для России перестал работать, а вместо него стала использоваться русская с(Сегодня). В данной версии будут работать оба варианта.
Первые три выглядят довольно примитивно, хотя ME (он же USER) думаю будут умерено востребованы, ведь так приятно видеть в списке только свои документы. Фильтр по компании мне кажется довольно странным, но не мешает, поэтому позволим ему остаться.
Дальше я предлагаю рассмотреть расширение функционала аналогичное My Items и прочих, на примере модуля работ.
Для начала создадим таблицу My Job и страницу 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* страницами.
Далее подключаем ее к ролевому центру уже известным способом.
Однако чтобы она заработала потребуются некоторые изменения в программном модулей 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”;
А теперь испытаем. Вот несколько тестовых фильтровых строк.
Пожалуй, я сразу раскрою все карты и расскажу почему мои фильтры выглядят именно так.
Во-первых, идентификаторы. Да, пришлось сделать их цифровыми – это особенность форматирования текстовой строки в MakeTextFilter, если внести в нее чуть больше изменений, она сможет вполне успешно переваривать и полноценные кодовые идентификаторы. Свои изящные варианты решения задачки можно публиковать в комментариях.
- Строки фильтров 10 и 20 никаких особых секретов не содержат.
- Строки 31 Рё 32 – это попытка протестировать «длинные» фильтры, ведь РІ таблице строка фильтров может быть только 250 символов РІРѕС‚ Рё пришлось «хитрить», строка 33 динамически заменяется РЅР° строки 31 Рё 32, которые РІ СЃРІРѕСЋ очередь динамически заменяются РЅР° те строки, что РЅР° картинке. Р? это работает.
- Строка 40 – это пример использования и других динамических фильтров внутри конструкции.
А на следующей картинке можно посмотреть, как это выглядит при использовании:
Полагаю, такой инструмент будет полезен как часть стандартной функциональности.
Метки: Andrey Panko, Андрей Панько