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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 29.02.2024, 15:44   #1  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,928 / 3227 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Багофича qbds.cacheAddMethod() для _updateOnWrite = true
Привет всем.

Заметил особенность кеширования дисплей методов для параметра _updateOnWrite = true метода cacheAddMethod().

Обновление значений дисплей методов идет при вызове super() в табличном методе update. (А лучше бы шло после отработки update.)

Последствия :
Если есть форма, шапка - строки (например SalesTable c двумя датасорсами - SalesTable_ds и SalesLine_ds)
На шапке есть дисплей методы отображающие агрегированные суммы из строк. Меняем в шапке скидку, это влияет на сумму по строке. Но при сохранении шапки, дисплей методы шапки обновляются до того как обновятся строки (обновление строк стоит после super() в методе update шапки). - Т.е. дисплей методы показывают неактуальные, старые значения сумм по строкам. Нужно сохранить шапку повторно, и только тогда обновятся дисплей методы. Для таких ситуаций (весьма часто встречающихся)) параметр _updateOnWrite = true бесполезен. Приходится его явно ставить в false и на write датасорса вызывать для каждого дисплей метода cacheCalculateMethod

Либо скопом один раз вызывать salesTable.executeCachedDisplayMethods()

(Ax 2012 R3)
За это сообщение автора поблагодарили: gl00mie (10).
Старый 29.02.2024, 16:39   #2  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5798 (201) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
С другой стороны, а где еще ядру пересчитывать закэшированные display-методы, как не внутри super() в update()? Если бы даже ядро обновляло их после update(), то можно было бы засунуть бизнес-логику в пост-обработчики, и тогда тоже пересчитанные вслед за update() значения могли бы оказаться неактуальными.
Старый 29.02.2024, 17:30   #3  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,928 / 3227 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Цитата:
Сообщение от gl00mie Посмотреть сообщение
то можно было бы засунуть бизнес-логику в пост-обработчики, и тогда тоже пересчитанные вслед за update() значения могли бы оказаться неактуальными.
Ну можно вызывать доп. логику после всех обработчиков. Это же ядро. Захотели бы - сделали бы. Наверно просто не подумали.
Старый 01.03.2024, 11:36   #4  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,928 / 3227 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Что еще плохо у такого поведения
1. Дисплей методы отрабатывают при открытой транзакции,. Т. Е показывают незафиксированные данные.
2. Длительность транзакции увеличивается на время отработки дисплеев, со всеми налагаемыми блокировками .

Всего этого можно было бы избежать, если бы дисплей методы рассчитывались позже, после отработки update и после закрытия транзакции.
Старый 01.03.2024, 11:50   #5  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,435 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
В идеале update вообще не должен вызывать процедуру пересчёта кэша, он должен только устанавливать признак того что кэш устарел. А процедура пересчёт должна срабатывать при первом обращении к такому устаревшему кэшу
Старый 01.03.2024, 16:43   #6  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,928 / 3227 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
В идеале update вообще не должен вызывать процедуру пересчёта кэша,
Ну выход есть. Можно указывать _updateOnWrite = false и явно ручками инициировать обновление кеша.
А в текущем виде значение _updateOnWrite = true часто бесполезно. Но смысл в нем есть. Есть сценарии когда он может быть полезен. Особенно если бы обновление шло после update.
Теги
cacheaddmethod, updateonwrite, баг, кеш

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Как узнать, что форма открыта через "Перейти к форме основной таблицы"? mazzy DAX: Программирование 15 13.09.2021 10:16
ошибка в AIF syl DAX: Программирование 14 20.08.2015 15:25
Сортировка в Report smailik DAX: Программирование 8 12.12.2013 20:10
Очередная бороьба с Query() (DAX2009) RVS DAX: Программирование 3 17.07.2013 23:07
NoExistsJoin и addRange Deepoint DAX: Программирование 15 04.07.2012 11:11

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

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

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 04:54.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.