Показать сообщение отдельно
Старый 25.05.2006, 18:16   #5  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2476 (88) +++++++++
Регистрация: 20.08.2005
Занялся исследованием этой хотелки и выплыло несколько моментов.

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;
2. В методе init() формы устанавливается значение этого флага в истину
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;
}
Вложения
Тип файла: xpo UserQuerySetup.xpo (5.7 Кб, 595 просмотров)
__________________
Axapta v.3.0 sp5 kr2
За это сообщение автора поблагодарили: mazzy (5), Андре (5), Anton Sk. (1), sukhanchik (4), gl00mie (3), Yaroslav (1), S.Kuskov (3).