23.10.2013, 19:16 | #1 |
Участник
|
Динамический фильтр на ListPage
Добрый день.
Возникла задача добавления нового фильтра на форму ProjProjectListPage в аксапте 2012. Начальство хочет дополнительный контрол, по которому будут фильтроваться только дочерние строки конкретного главного проекта. До этого я ни разу не трогал аксапту 2012 и не подозревал что тривиальная задача по добавлению фильтра решается не совсем так как я привык. Неожиданно выяснил что добавлять методы в форму и на датасоурсы нет возможности. При исследовании уже существующих фильтров понял что это нечто новое работающее через свойства котролов FilterDataSource, FilterField и FilterExpression. Придумано конечно здорово, и со статичными фильтрами работает вообще на ура, но в моём случае надо передать в функцию, или наложить на поле не конкретное значение а неизвестное заранее - значение надо взять из текущей строки. Провозился вчера весь день, так ни к чему и не пришел. Вроде как можно решить брутально через код на контроле, но получается не красиво и неизвестно к чему приведёт при возможной интеграции с веб порталом. Инфы в интернете не нашел. В общем вопрос такой - кто нибудь знает как правильно делать динамические фильтры на лист страницах?
__________________
С уважением, Dozer |
|
23.10.2013, 19:40 | #2 |
Программатор
|
В свойствах формы - есть InteractionClass. попробуйте туда посмотреть
|
|
24.10.2013, 10:39 | #3 |
Участник
|
А где главный проект указывается? Это и есть значение фильтра? И по какому полю фильтруются дочерние строки?
Или вводя номер главного проекта Вы хотите получить все его дочерние проекты?
__________________
http://www.axdevposts.blogspot.com Пришел, уведел.... отойди, дай другому увидеть! |
|
24.10.2013, 18:43 | #4 |
Участник
|
Главный проект определяется текущей выбраной строкой в гриде, а фильтрация может производиться по ParentId полю. Но это всё легко решается если есть возможность исполнить код который будет иметь доступ к курсору грида. И вот это-то пока не получается. Точнее один способ я нашел - выполнять код на контроле, но это совсем не красиво. Должен быть способ лучше и правильней.
__________________
С уважением, Dozer |
|
24.10.2013, 18:56 | #5 |
Участник
|
Вы можете создать под главным гридом InfoPart (посмотрите SalesTableListPageOpenPreviewPart на SalesTableListPage) и показывать в нем дочерние проекты в зависимости от выбранного:
__________________
http://www.axdevposts.blogspot.com Пришел, уведел.... отойди, дай другому увидеть! |
|
24.10.2013, 19:04 | #6 |
Участник
|
Хорошая мысль. Надо обсудить с начальством.
Спасибо. Правда вопрос про фильтр не снимается - хочу всётаки понять как это сделать для собственного развития.
__________________
С уважением, Dozer |
|
25.10.2013, 02:31 | #7 |
Участник
|
Цитата:
Для доступа к выбранной записи (записям) нужно перекрыть метод selectionChanged. Вот пример, который пробегает через все выбранные записи (могут быть ошибки, так как изначально мой код был не для проектов): X++: public void selectionChanged() { MultiSelectionHelper helper = MultiSelectionHelper::construct(); ProjTable projTableCurrent = this.listPage().activeRecord(queryDataSourceStr(ProjProjectsListPage, ProjTable_NoFilter)); ProjTable projTableSelected; super(); helper.parmDatasource(projTableCurrent .dataSource()); projTableSelected= helper.getFirst(); while (projTableSelected) { //вставить логику projTableSelected= helper.getNext(); } } X++: public void initializeQuery(Query _query) { ProjTable projTable; super(_query); _query.dataSourceNo(1).addRange(fieldNum(ProjTable,ProjId)).value(SysQuery::value("PRJ-00001")); } |
|
|
За это сообщение автора поблагодарили: Dozer (1), wolfstein (2). |
25.10.2013, 02:34 | #8 |
Участник
|
Еще добавлю, что в этом же классе (в методе selectionChange или в своих методах) можно включать/выключать кнопки в зависимости от выбранной записи, примерно таким образом:
X++: this.listPage().actionPaneControlEnabled(formControlStr(ProjProjectsListPage, SubProjectNew), false); |
|
25.10.2013, 17:09 | #9 |
Участник
|
Я вот только не понимаю одного:
Если Вы работаете с ListPage, то результатом вывода на экран является плоская таблица (пускай и сформированная из разных источников данных). Теперь, двигаясь по этой таблице Вы её же хотите и фильтровать, так? Как система должна реагировать, если Вы выбрали очередной проект: показывать в том же гриде его подпроекты? А как тогда убрать этот фильтр? Логичнее сделать вид: главные-подчиненные.
__________________
http://www.axdevposts.blogspot.com Пришел, уведел.... отойди, дай другому увидеть! |
|
25.10.2013, 18:39 | #10 |
Участник
|
griefon - спасибо за код! По крайней мере теперь понятно куда и как копать.
plumbum - для того чтобы показывать в одном гриде идея для фильтра была "вкл/выкл" - тоесть сперва имеем список только голов, а при переключении контрола для фильтра показываем строки того проекта который был выбран. Мне кажется что теперь у меня есть всё чтобы сделать правильно. Похоже это будет комбинированый подход. Главные-подчинённые это правильно. Но так же и фильтр на подчинённых не может быть простым и должен генерироваться через код который дал griefon. Большое спасибо.
__________________
С уважением, Dozer |
|
25.10.2013, 20:07 | #11 |
Участник
|
Цитата:
а при переключении контрола для фильтра показываем строки того проекта который был выбран.
Для этого на контрол фильтра надо будет перевести в режим Client и перекрыть метод modified, тоесть теряется возможность этот фильтр применять при интеграции с EnterprisePortal, а этого Вы хотели избежать.
__________________
http://www.axdevposts.blogspot.com Пришел, уведел.... отойди, дай другому увидеть! |
|
25.10.2013, 20:18 | #12 |
Участник
|
Именно!
Поэтому я рассматривал способ вызова кода фильтра через FilterExpression свойство контрола фильтра. Но к сожалению похоже что там можно передать в код только одно значение - текущее состояние самого контрола, и при этом код находится во внешнем специальном классе. Тоесть в коде не будет известно какая строка в гриде выбрана.
__________________
С уважением, Dozer |
|