24.04.2012, 04:47 | #1 |
HAI; CAN HAS STDIO?
|
сохранение фильтра в портале AX2012
делаю апгрейд с 2009 на 2012. у клиента было требование сохранять состояние фильтра на датасорсе одной из страниц с гридом. открываешь например эту страницу, фильтруешь данные по какому-то критерию, работаешь с ними. возвращаешься на ту же страницу, а фильтр применяется такой же, не надо фильтровать снова. из коробки аксапта так не делает.
в 2009 мы делали так: переопределяли метод pack() датасета (не датасорса, именно датасета), и прятали туда состояние запроса: X++: sysLastValue.RecId = 0;
sysLastValue.Company = curext();
sysLastValue.UserId = curuserid();
sysLastValue.RecordType = UtilElementType::DataSet;
sysLastValue.ElementName = smmActivities_ds.name();
sysLastValue.DesignName = smmActivities_ds.name();
sysLastValue.value = SysQuery::packRangeAndSortorder(smmActivities_ds.queryRun().query());
//sysLastValue.value = smmActivities_ds.queryRun().query().pack();
sysLastValue.insert(); X++: SysQuery::unpackRangeAndSortorder(this.query(), sysLastValue.value) потому что в 2009 на таблице smmActivities было поле ResponsibleEmployee, оно содержало в себе EmplId, поэтому фильтр по работнику относился напрямую к таблице smmActivities (SELECT * FROM smmActivities WHERE smmActivities.ResponsibleEmployee и т.д.). в 2012 теперь вместо этого поля есть ResponsibleWorker, который содержит RecId работника, и фильтр по работнику теперь выглядит вот так: SELECT * FROM smmActivities OUTER JOIN FROM HcmWorker ON blablabla WHERE HcmWorker.PersonnelNumber и т.д. проблема в том, что после отработки super() метода init() датасорса, дополнительные датасорсы ещё не привязаны к smmActivities, их просто нет, поэтому вызов unpackRangeAndSortorder не возвращает фильтр по работнику: его некуда привязать. я решил проблему переносом кода из метода init() датасорса в метод run() датасета, это первое место, где дополнительные датасорсы привязаны, и можно восстановить состояние запроса целиком. мне всё же кажется, что run() датасета не лучшее для этого место. что подскажете? P.S. вот порядок вызова методов при запуске (только запуске, до начала работы с пользователем) страницы на портале (датасет и датасорс), нигде не нашёл, поэтому решил сам посмотреть: datasource.init() - изначально пытался восстанавливать фильтры здесь dataset.run() - перенёс сюда datasource.executeQuery() datasource.leaveRecord() datasource.leave() datasource.leaveRecord() datasource.executeQuery() datasource.leaveRecord() datasource.leave() datasource.leaveRecord() dataset.pack() - здесь сохраняю состояние фильтра (этот метод вызывается после каждого изменения фильтра пользователем)
__________________
our sharp bitter vitriol is not that of the vulgar. |
|
24.04.2012, 08:41 | #2 |
Молодой, подающий надежды
|
а dataset.init() после super() разве не подходит?
|
|
26.04.2012, 01:10 | #3 |
HAI; CAN HAS STDIO?
|
пробовал, почему-то не работает. уже не помню, почему. надо посмотреть.
__________________
our sharp bitter vitriol is not that of the vulgar. |
|
|
|