|
11.08.2020, 13:20 | #1 |
Участник
|
DAX09: восстановить установленные фильтры в форме после вызовов reread / refresh
Всем привет.
Подскажите как сделать. Имеется форма с таблицей, где таблице отфильтровались по определенным полям. Потом в отфильтрованной записи изменили значение через метод формы допустим - changeValue. После вызова данного метода сбрасывается фильтр установленный в таблице. Начал смотреть данный метод changeValue, он заканчивается такими строками. X++: void changeValue()
{
...
Object dS;
...
dS = recordLocal.dataSource();
dS.reread();
dS.refresh();
} Или может как то перед вызовом reread / refresh сохранить установленные фильтры в таблице, а после вызовов reread / refresh эти фильтры обратно установить? Последний раз редактировалось oleggy; 11.08.2020 в 13:25. |
|
11.08.2020, 14:22 | #2 |
Участник
|
Цитата:
в датасорсе есть 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 для формы сохранять/восстанавливать не надо! пожалуйста. Последний раз редактировалось mazzy; 11.08.2020 в 14:29. |
|
12.08.2020, 11:41 | #3 |
Участник
|
Цитата:
Сообщение от mazzy
нужно найти какая сволочь у вас берет Query и записывает его в QueryRun.Query, полностью игнорируя пользователя, и оторвать ему конечности. Даю маячок - это вполне может быть код от Майкрософта.
В любом случае - в runTime, если хотите сохранить настройки пользователя, работайте только с QueryRun.Query. С Query работайте только в методе init после super когда сам объект уже создан, но еще не выполнен run для формы 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:54 | #4 |
Участник
|
обратите внимание на это место.
|
|
|
За это сообщение автора поблагодарили: oleggy (1). |
11.08.2020, 17:08 | #5 |
Участник
|
Цитата:
Сбросить фильтр может прямой вызов ds.executeQuery(). Ну, или как написал mazzy в случае прямого восстановления запроса. Также при настройке фильтра пользователем становится активна кнопка отмены фильтра. Возможно, у Вас в коде программно "нажимается" эта кнопка ds.removeFilter()
__________________
- Может, я как-то неправильно живу?! - Отчего же? Правильно. Только зря... |
|
12.08.2020, 12:22 | #6 |
Участник
|
Узнаю код для расширенной формы "Поля списком: . Посмотрите тут, возможно это уже поправлено
https://github.com/TrudAX/XppTools/b...RecordInfo.xml |
|
|
За это сообщение автора поблагодарили: mazzy (2), oleggy (1). |
|
|