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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 19.03.2019, 16:21   #1  
mikki_messer is offline
mikki_messer
Участник
 
91 / 20 (1) +++
Регистрация: 20.04.2010
Адрес: Ростов-на-Дону
Значение параметра в диалоге берётся из кэша
Есть класс, кастомный, наследник RunBaseBatch

Вызывается с формы, в зависимости от args.record() создаётся нужный наследник, наследнику присваивается значение номер документа (из args.record()), с которым надо работать, далее открывается диалог.

Проблема: после того, как класс отработает в первый раз, в ините подставляется правильный номер документа (из args.record()), но в диалоге постоянно отображается номер документа с которым отработало в первый раз. Удаляешь данные из SysLastValue - опять один раз работает.

Т.е. такое ощущение, что после первого запуска значение параметра кэшируется и далее в диалоге используется только оно, а из инита значение не передаётся.

Что я делаю не так?

Функция main выполняется на сервере.

Dynamics 2012 R3
Старый 19.03.2019, 17:13   #2  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,701 / 1195 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Так и должно быть

Методы pack/unpack именно для этого и предназначены. Это список значений, которые будут кешироваться. Точнее, эти методы выполняют 3 функции

1. Список значений, которые подставляются как значения по умолчанию при повторном запуске класса. Сохраняют значения, которые были использованы при последнем запуске

2. Список значений, используемый при выполнении пакетных заданий

3. Список значений, которые передаются между экземплярами класса на клиенте и на сервере. Если сам класс запускается на сервере, но использует диалог с пользователем, который работает на клиенте

Ну, еще эти же методы можно использовать для вызова класса из-вне. Из других классов. Но этим, как правило, не пользуются для таких задач

Именно потому, что использование этих методов такое неоднозначное и возникает ряд проблем

В данном случае, чтобы подавить выполнение п.1 (кеширование ранее использованных значений) надо в методе main() после инициализации экземпляра класса, но до вызова методов, которые берут значения из args() сделать вызов метода

MyClass.getLast();

"В никуда" сделать этот вызов. Этот метод, во-первых, прочитает данные из кеша, а, во-вторых, поставит признак, что данные уже прочитаны. Если после вызова этого метода Вы переопределите переменные, то повторный вызов этого же метода внутри prompt() уже не возьмет значение из кеша

PS: Метод initParmDefault() вызывается только в том случае, если метод unpack() вернет false. Т.е. если нет данных в кеше. При первом вызове
__________________
- Может, я как-то неправильно живу?!
- Отчего же? Правильно. Только зря...
За это сообщение автора поблагодарили: NetBus (3), mikki_messer (1), YoungPadawan (1).
Старый 19.03.2019, 17:42   #3  
mikki_messer is offline
mikki_messer
Участник
 
91 / 20 (1) +++
Регистрация: 20.04.2010
Адрес: Ростов-на-Дону
Цитата:
Сообщение от Владимир Максимов Посмотреть сообщение
Так и должно быть

Методы pack/unpack именно для этого и предназначены. Это список значений, которые будут кешироваться. Точнее, эти методы выполняют 3 функции

1. Список значений, которые подставляются как значения по умолчанию при повторном запуске класса. Сохраняют значения, которые были использованы при последнем запуске

2. Список значений, используемый при выполнении пакетных заданий

3. Список значений, которые передаются между экземплярами класса на клиенте и на сервере. Если сам класс запускается на сервере, но использует диалог с пользователем, который работает на клиенте

Ну, еще эти же методы можно использовать для вызова класса из-вне. Из других классов. Но этим, как правило, не пользуются для таких задач

Именно потому, что использование этих методов такое неоднозначное и возникает ряд проблем

В данном случае, чтобы подавить выполнение п.1 (кеширование ранее использованных значений) надо в методе main() после инициализации экземпляра класса, но до вызова методов, которые берут значения из args() сделать вызов метода

MyClass.getLast();

"В никуда" сделать этот вызов. Этот метод, во-первых, прочитает данные из кеша, а, во-вторых, поставит признак, что данные уже прочитаны. Если после вызова этого метода Вы переопределите переменные, то повторный вызов этого же метода внутри prompt() уже не возьмет значение из кеша

PS: Метод initParmDefault() вызывается только в том случае, если метод unpack() вернет false. Т.е. если нет данных в кеше. При первом вызове
Большое спасибо, сработало!
Теги
кэширование

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Значение поля "Открытое значение" и сопоставление складских проводок Dimitry DAX: Функционал 0 23.07.2013 17:23
значение из realControl DmitryK DAX: Программирование 8 21.02.2012 14:43
Значение по умолчанию параметра типа EDT c array elements либо просто массива HorrR DAX: Программирование 16 20.02.2008 19:18
Не берется значение контрола Sada DAX: Программирование 11 21.06.2006 10:24
Как при вводе новой записи установить значение поля по умолчанию Zman DAX: Программирование 3 17.01.2005 10:23
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра
Комбинированный вид Комбинированный вид

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

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

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