22.03.2019, 17:59 | #1 |
Участник
|
ax2009, ax2012: как правильно отобразить фильтр на форме?
обратите внимание:
= версия аксапты - 2009, 2012 = вопрос сформулирован "как правильно?", поэтому воздержитесь от "быстрых и грязных" решений при обсуждении. Итак, типовая задача от пользователей - отобразить фильтр на форме. Вы уже показывали Ctrl+F3, рассказали о возможности сохранения фильтров и даже показали как добавлять новые таблицы к стандартным фильтрам. Вы даже добавили пункт меню, который позволяет копировать настроенные фильтры другим пользователям. Но пользователи все равно хотят фильтр на форме. С одной стороны, добавлять таблицы в Ctrl+F3 - действительно утомляет. С другой стороны, есть такие пользователи, что ну его нафиг, пусть будет фильтр на форме. =============== Требования к фильтру: = это должен быть критерий, а не единственное значение для фильтрации = поле должно показывать текущий фильтр при входе на форму и при изменении критерия стандартными средствами (тот же Ctrl+F3) = фильтр должен изменять только свой range, не изменяя другие критерии в запросе = фильтр должен работать и по добавленным таблицам. ============== типичный пример - добавить фильтр по дате в Партии на форме складских проводок. если фильтр не задан, то показываем все проводки если фильтр задан, то показываем проводки для которых партии заданы И дата в партии подходит под критерий ============== типичный сценарий использования: 1. пользователь открывает форму складских проводок [скриншот 1] 2. пользователь выполняет поиск, фильтрацию сортировку (по номенклатуре, по датам, по статусам и т.п.) 3. в какой-то момент пользователь хочет отфильтровать и по дате, которая указана в партии. при этом он понимает, что после фильтрации он НЕ увидит проводок, для которых партия не включена в складских аналитиках. [в стандартном функционале] пользователь нажимает Ctrl+F3, добавляет таблицу InventBatch, добавляет range. получает проводки, отфильтрованные еще и по полю Expired Date 4. затем пользователь может убрать фильтр по номенклатуре, а фильтр по полю Expired Date оставить ============== вопрос: как правильно реализовать подобный функционал при помощи фильтра на форме аксапты 2009, 2012? внимание: важно не только добавлять фильтр по Expired Date, но и убирать его, когда пользователь очищает критерий. бонус вопрос: предположим мы реализовали подобный фильтр. как отобразить поле Expired Date в гриде, когда фильтр задан? |
|
23.03.2019, 12:18 | #2 |
Участник
|
Что-то на моей практике никто не требовал " = поле должно показывать текущий фильтр при входе на форму и при изменении критерия стандартными средствами (тот же Ctrl+F3)". Это выглядит усложнением
Т.е. стандартно я делаю так 1.Для фильтров создаю временную таблицу. Это имхо позволяет удобно общаться со значениями фильтров и дает нормальный переход к основной таблице. 2. В classDeclaration формы добавляется Range или в твоем случае ссылка на QBDS. На init формы или датасорса инициализация этого Range(с признаком locked) 3. В executeQuery основной таблицы простановка в этот Range значения из полей временной таблицы(ну или в твоем случае дизейблинг датасорса) 4. На modified всех полей временной таблицы стоит executeQuery основной таблицы В 2012 можно поиграться с addFilter на источнике данных, он вроде будет корректно работать с outerJoin |
|
|
За это сообщение автора поблагодарили: mazzy (2), Corel (1). |
23.03.2019, 20:41 | #3 |
Banned
|
Основной принцип который у меня в голове это
в executeQuery менять/добавлять/удалять свой range для queryRun().Query() (то есть динамическое Query на данный момент а не изначальное статическое Query). Понятно что не весь код в executeQuery(), а вызов метода на уровне element скорее всего. Насколько помню это прекрасно сочетается с вручную наложенными фильтрами. Все остальное уже не так важно. Временная таблица хорошая идея, иногда так делал. Но не как стандарт, а когда упрощает решение. К примеру когда список значений range явно безумен. Последний раз редактировалось ax_mct; 23.03.2019 в 20:44. |
|
24.03.2019, 02:30 | #4 |
Участник
|
Тут может быть проблема что queryRun().Query() будет пустой при первом вызове, т.е. если нужно ставить какие-то значения при открытии, это не будет работать.
|
|
24.03.2019, 10:39 | #5 |
Участник
|
Цитата:
кроме того, на проектах любят делать кнопки, которые устанавливают query принудительно. Цитата:
другими словами, инжектить содержимое формы Ctrl+F3 в пользовательскую форму? Цитата:
Сообщение от trud
2. В classDeclaration формы добавляется Range или в твоем случае ссылка на QBDS. На init формы или датасорса инициализация этого Range(с признаком locked)
3. В executeQuery основной таблицы простановка в этот Range значения из полей временной таблицы(ну или в твоем случае дизейблинг датасорса) 4. На modified всех полей временной таблицы стоит executeQuery основной таблицы но имеем стандартные недостатки - фильтры могут содержать значения, не совпадающие с текущим запросом. т.е. фильтры показывают одно, а Ctrl+F3 - другое. Цитата:
добавлено: а что насчет добавления/убирания таблиц в query? см. пример в исходном сообщении я к чему: у меня ощущение, что жутко не хватает класса, который реализовал бы функционал окна Ctrl+F3. может быть есть такой класс? может кто-то уже делал? Последний раз редактировалось mazzy; 24.03.2019 в 10:48. |
|
24.03.2019, 15:46 | #6 |
Banned
|
Цитата:
в Init() и изменять просто Query, а не this.QueryRun().Query(). element.updateQuery(this.QueryRun() ? this.QueryRun().Query() : this.Query()) Не прямо так конечно но типа этого. По крайней мере мне всегда этого хватало. И с точки зрения как правильно мне кажется что правильней то и нет. |
|
25.03.2019, 19:09 | #7 |
Участник
|
Цитата:
кто-нибудь пробовал использовать/расширять класс SysQueryForm и/или SysQieryEdit для полей-фильтров на форме? |
|