AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 11.08.2020, 13:20   #1  
oleggy is offline
oleggy
Участник
 
276 / 36 (2) +++
Регистрация: 03.12.2019
Адрес: Россия
DAX09: восстановить установленные фильтры в форме после вызовов reread / refresh
Всем привет.
Подскажите как сделать.

Имеется форма с таблицей, где таблице отфильтровались по определенным полям.
Потом в отфильтрованной записи изменили значение через метод формы допустим - changeValue. После вызова данного метода сбрасывается фильтр установленный в таблице.
Начал смотреть данный метод changeValue, он заканчивается такими строками.

X++:
void changeValue()
{
...
    Object                  dS;
...
    dS = recordLocal.dataSource();
    dS.reread();
    dS.refresh();
}
Я так понял что какой то из методов reread / refresh сбрасывает еще и установленные фильтры. Как понять какой из них сбрасывает и можно ли как то установить что бы фильтры не сбрасывались?

Или может как то перед вызовом reread / refresh сохранить установленные фильтры в таблице, а после вызовов reread / refresh эти фильтры обратно установить?

Последний раз редактировалось oleggy; 11.08.2020 в 13:25.
Старый 11.08.2020, 14:22   #2  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от oleggy Посмотреть сообщение
Или может как то перед вызовом reread / refresh сохранить установленные фильтры в таблице, а после вызовов reread / refresh эти фильтры обратно установить?
Немного теории:

в датасорсе есть Query - это запрос, который "пришел" из параметров AOT
в датасорсе есть QueryRun.Query - это запрос, с которым пользователь работает в рантайме. этот QueryRun.Query содержит фильтры и сортировки пользователя

Предполагается, что в методе init происходит создание QueryRun.Query на основании Query из AOT. Далее QueryRun.Query содержит то, что указал пользователь фильтрами, сортировками и прочими Ctrl+F3. Обратите внимание, что QueryRun.Query может содержать дополнительные связанные таблицы.

так вот:

нужно найти какая сволочь у вас берет Query и записывает его в QueryRun.Query, полностью игнорируя пользователя, и оторвать ему конечности. Даю маячок - это вполне может быть код от Майкрософта.

В любом случае - в runTime, если хотите сохранить настройки пользователя, работайте только с QueryRun.Query.
С Query работайте только в методе init после super когда сам объект уже создан, но еще не выполнен run для формы

сохранять/восстанавливать не надо! пожалуйста.
__________________
полезное на axForum, github, vk, coub.

Последний раз редактировалось mazzy; 11.08.2020 в 14:29.
Старый 11.08.2020, 17:08   #3  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,701 / 1195 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Цитата:
Сообщение от oleggy Посмотреть сообщение
Я так понял что какой то из методов reread / refresh сбрасывает еще и установленные фильтры.
Нет. Эти методы не могут сбросить фильтры, поскольку работают только с одной (текущей) записью Grid. Именно в таком виде эти методы обычно и используются (если их не перекрыли, конечно)

Сбросить фильтр может прямой вызов ds.executeQuery(). Ну, или как написал mazzy в случае прямого восстановления запроса.

Также при настройке фильтра пользователем становится активна кнопка отмены фильтра. Возможно, у Вас в коде программно "нажимается" эта кнопка ds.removeFilter()
__________________
- Может, я как-то неправильно живу?!
- Отчего же? Правильно. Только зря...
Старый 12.08.2020, 11:41   #4  
oleggy is offline
oleggy
Участник
 
276 / 36 (2) +++
Регистрация: 03.12.2019
Адрес: Россия
Цитата:
Сообщение от mazzy Посмотреть сообщение
нужно найти какая сволочь у вас берет Query и записывает его в QueryRun.Query, полностью игнорируя пользователя, и оторвать ему конечности. Даю маячок - это вполне может быть код от Майкрософта.

В любом случае - в runTime, если хотите сохранить настройки пользователя, работайте только с QueryRun.Query.
С Query работайте только в методе init после super когда сам объект уже создан, но еще не выполнен run для формы
Приведу полный код этого метода. Можете подсказать в каком месте Query записывает в QueryRun.Query ?
X++:
void changeValue()
{
    Common                  recordLocal;
    Args                    args = element.args();
    Object                  dS;

    DictField               dictField;

    Dialog                  dialog = new Dialog("@GEE28566");
    DialogField             df ;
    DialogField             dfUseDoUpdate;
    FormComboBoxControl     formControl;
    Object                  formControlObject;
    FormCheckBoxControl     formControlCheck;
    boolean                 isUseDoUpdate;
    RecordInfoEnumHandler enumHelper;
    boolean                   dialogLaunched;
    boolean                   dialogClosedOk;
    ;

    recordLocal    = args.record();
    dictField = new DictField(recordLocal.TableId, fieldname2id(recordLocal.TableId, tmpDevRecordInfo.FieldName));

    //if(dictField.typeId() == extendedTypeNum(Dimension))
        dictField = new DictField(recordLocal.TableId, fieldExt2Id(dictField.id()));
    if (dictField.type() != Types::Enum)
    {
        dfUseDoUpdate = dialog.addFieldValue(typeid(NoYesId), false, "@RTE121", "@RTE122");
        df  = dialog.addFieldValue((dictField.typeId() << 16) | dictField.type(), recordLocal.(dictField.id()));
    }
    else
    {
        formControlCheck = dialog.form().design().addControl(FormControlType::CheckBox, 'CheckBoxctrl');
        formControlCheck.label("@RTE121");

        formControl = dialog.form().design().addControl(FormControlType::ComboBox, 'enumctrl');
        formControl.enumType(dictField.enumId());
        formControl.selection(recordLocal.(dictField.id()));

        enumHelper = new RecordInfoEnumHandler();
        enumHelper.parmDialog(dialog);
        enumHelper.prepareControls();
        dialog.doRun();
        dialog.formRun().controlMethodOverload(true);
        dialog.formRun().controlMethodOverloadObject(enumHelper);
        dialog.wait();
        dialogClosedOk = dialog.closedOk();
        dialogLaunched = true;
    }

    //if (dialog.run())
    if(! dialogLaunched)
    {
        dialogClosedOk = dialog.run();
    }

    if (dialogClosedOk)
    {
        if (formControl)
        {
            formControlObject    = dialog.formRun().control(formControl.id());
            recordLocal.(dictField.id()) = formControlValue(formControlObject, Types::Enum);
            //inputValue           = formControlValue(formControlObject, Types::Enum);
            formControlObject    = dialog.formRun().control(formControlCheck.id());
            isUseDoUpdate        = formControlValue(formControlObject, Types::Enum);
        }
        else
        {
            recordLocal.(dictField.id()) = df.value();
            //inputValue      = df.value();
            isUseDoUpdate   = dfUseDoUpdate.value();
        }

        //recordLocal.(dictField.id()) = inputValue;

        ttsbegin;
        DevRecordInfoHistory::writeLogUpdate(recordLocal,
                                                 dictField.id(),
                                                 isUseDoUpdate);
        if (isUseDoUpdate)
        {
            recordLocal.doUpdate();
        }
        else
        {
            recordLocal.update();
        }

        ttscommit;
        tmpSysRecordInfoLocal.data(TmpDevRecordInfo);

        if(dictField.typeId() == extendedTypeNum(Dimension))
            element.close();
        else
        {
            tmpSysRecordInfoLocal.FieldValue = strFmt('%1', recordLocal.(dictField.id()));
            tmpSysRecordInfoLocal.update();
        }
        tmpSysRecordInfoLocal.data(TmpDevRecordInfo);
        TmpDevRecordInfo_ds.executeQuery();
        TmpDevRecordInfo_ds.findRecord(tmpSysRecordInfoLocal);

        dS = recordLocal.dataSource();
        dS.reread();
        dS.refresh();
    }
}
Старый 12.08.2020, 12:22   #5  
trud is offline
trud
Участник
Лучший по профессии 2017
 
1,039 / 1633 (57) ++++++++
Регистрация: 07.06.2003
Записей в блоге: 1
Узнаю код для расширенной формы "Поля списком: . Посмотрите тут, возможно это уже поправлено
https://github.com/TrudAX/XppTools/b...RecordInfo.xml
За это сообщение автора поблагодарили: mazzy (2), oleggy (1).
Старый 12.08.2020, 12:54   #6  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от oleggy Посмотреть сообщение
X++:
        TmpDevRecordInfo_ds.executeQuery();
обратите внимание на это место.
__________________
полезное на axForum, github, vk, coub.
За это сообщение автора поблагодарили: oleggy (1).
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Research, refresh, reread шпаргалка Qaz Qwerty DAX: База знаний и проекты 7 03.05.2024 12:17
axinthefield: 3 Powershell Scripts for Dynamics AX – Refresh, Report and Monitor Blog bot DAX Blogs 0 02.03.2019 22:16
alirazazaidi: Form did not refresh on workflow submit Dynamics 365 for finance and operations Blog bot DAX Blogs 0 26.12.2018 16:11
Reread() на форме c View KpecT DAX: Программирование 8 11.11.2008 13:00
Сортировка и/или фильтры в lookup форме - howto. Maximin DAX: Программирование 5 07.06.2005 11:06

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 19:53.