![]() |
#5 |
Участник
|
Занялся исследованием этой хотелки и выплыло несколько моментов.
1. Что такое пользовательский фильтр? Это запрос, хранящийся в QueryRun датасоурса. Для того, чтобы он туда попал необходимо для начала создать этот QueryRun. Создается он ядром в вызове executeQuery датасоурса, после создания уходит на сервер. Отсюда первый момент - первоначально выполяется оригинальный Query. 2. Помимо того, что для наложения фильтра необходимо выполнить оригинальный запрос - результат этого запроса еще и отобразится на форме, т.е. если после этого накладывать пользовательский фильтр, то на форме появится мелькание. 3. Вызов формы возможен через "переход к основной таблице" - т.е. пользовательский фильтр может помешать отображению данных Если обойти первый момент я не представляю как, то второй и третий обойти можно. В общем, что бы не возиться с sysLastValue, написал класс-надстройку над движком расширенных фильтров. Из нюансов. 1. Для использования советую перекрывать метод executeQuery() датасоурса - пример использования ниже 2. Выбор запросов для использования - по названию (как в списке фильтра) с помощью методов queryLoad() или queryLoadLastUsed() (этот метод вызывает "Ранее использованный запрос"). Получить названия можно с помощью пары методов SavedQueriesCount() и SavedQueryName(). Сюда же входят "Ранее использованный запрос" и "Используемый запрос" 3. Метод buildSavedQueriesBox() позволяет заполнять FormComboBox списком запросов. Пример использования для формы LedgerTable. 1. В classDeclaration формы добавляется булевый флаг userFilter X++: boolean userFilter; 3. Перекрывается метода executeQuery() на датасоурсе LedgerTable X++: public void executeQuery() { UserQuerySetup userQuerySetup; boolean lookup = element.args().lookupValue() != "" || element.args().dataset(); // флаг для проверки перехода по JumpRef ; super(); if (userFilter && !lookup) { userQuerySetup = new UserQuerySetup(element, LedgerTable_QR); if (userQuerySetup.UserQuery()) { userQuerySetup.queryLoadLastUsed(); // вызов "Ранее использованного запроса" // или загрузка первого сохраненного запроса (или любого по номеру) // userQuerySetup.queryLoad(userQuerySetup.SavedQueryName(1)); userQuerySetup.queryUpdate(); // обновление запроса в QueryRun датасоурса userFilter = false; LedgerTable_DS.research(); // запрос из QueryRun перевыполняется } } userFilter = false; }
__________________
Axapta v.3.0 sp5 kr2 |
|
|
За это сообщение автора поблагодарили: mazzy (5), Андре (5), Anton Sk. (1), sukhanchik (4), gl00mie (3), Yaroslav (1), S.Kuskov (3). |