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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 16.06.2008, 18:32   #1  
Peter Savintsev is offline
Peter Savintsev
Участник
 
246 / 119 (4) +++++
Регистрация: 14.12.2001
Баг (?) в классе LedgerBalanceDim
Похоже, нашел ошибку в классе LedgerBalanceDim, точнее, его методе balance. Как известно, данный класс используется для расчета оборотов по счетам ГК в разрезе финансовой аналитики за определенный период. Помимо прочих параметров при создании экземпляра класса можно указать, что необходимо использовать кеширование (параметр _cache в методе new). В этом случае, все результаты расчета сохраняются в контейнере и при повторной попытке рассчитать обороты по какому-либо счету, результат берется из данного контейнера, а не рассчитываются заново. Для кеширования используется несколько контейнеров, в частности, cacheAccount используется для хранения списка счетов, для которых был выполнен расчет, и cacheData, в котором, собственно, хранятся сами рассчитанные данные.

Вставка данных осуществляется следующим образом (строки 87 и 88 метода balance() в DAX 3.0 или 85 и 86 в DAX 4.0):
X++:
cacheAccount             += accountNum;
cacheData                = conIns(cacheData,1, balance.export());
Т.е. счет записывается в контейнер cacheAccount последним элементом, а данные для этого счета записываются в контейнер cacheData первым элементом.

Дальнейший поиск кешированных данных осуществляется следующим образом (строки с 24 по 29 метода balance() в DAX 3.0 или с 45 по 50 в DAX 4.0):

X++:
accountIdx       = conFind(cacheAccount, accountNum);
if (accountIdx)
{
    balance.import(conPeek(cacheData, accountIdx));
    return balance;
}
Т.е. в контейнере cacheData поиск данных осуществляется по тому номеру, по которому в контейнере cacheAccount находится счет. Но поскольку вставка данных в эти два контейнера происходила в разном порядке, то выбираются неверные данные. Исправляется ошибка достаточно просто: необходимо изменить вставку данных в контейнер cacheData следующим образом:

X++:
cacheAccount             += accountNum;
cacheData                = conIns(cacheData,conLen(cacheData) + 1, balance.export());
Проблема была обнаружена в DAX 3.0 SP6 и DAX 4.0 SP2. Вопрос: это действительно ошибка или здесь есть какая-то хитрая логика?
За это сообщение автора поблагодарили: kashperuk (5).
Старый 17.06.2008, 15:52   #2  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
Тогда уж лучше было бы так
X++:
cacheAccount             += accountNum;
cacheData                  += balance.export();
Но из-за этого возникают больше подозрения - почему бы разработчики сразу не написали так?
Кто что думает, баг это или не баг?
Старый 17.06.2008, 16:48   #3  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5798 (201) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Цитата:
Сообщение от kashperuk Посмотреть сообщение
Но из-за этого возникают больше подозрения - почему бы разработчики сразу не написали так?
Да ладно придумывать... Король-то голый!
Цитата:
Сообщение от kashperuk Посмотреть сообщение
Кто что думает, баг это или не баг?
Очень смахивает на баг, и, главное, непонятно, почему нельзя было Map использовать вместо того, чтобы заморачиваться с контейнерами...

Старый 18.06.2008, 05:41   #4  
Peter Savintsev is offline
Peter Savintsev
Участник
 
246 / 119 (4) +++++
Регистрация: 14.12.2001
Цитата:
Сообщение от kashperuk Посмотреть сообщение
Тогда уж лучше было бы так
X++:
cacheAccount             += accountNum;
cacheData                  += balance.export();
А вот так как раз, по-моему, не стоит делать. Каждый элемент cacheData - это контейнер. Результат, возвращаемый balance.export() - это контейнер. Если использовать конструкцию cacheData += balance.export(), то все элементы контейнера, возвращаемого balance.export(), просто допишутся в качестве элементов в хвост контейнера cacheData, а нужно, чтобы они добавились туда в качестве элемента контейнера.Поэтому надо или использовать conIns (как это предложил я), либо сделать так:

X++:
cacheAccount             += accountNum;
cacheData                  += [balance.export()];
Теги
ax3.0, ax4.0

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Баг в системном классе SysOperationProgressBase. Hyper DAX: Прочие вопросы 0 19.03.2009 18:58
Нашёл баг, причем очень похоже на баг ядра (SP5 FP2 KR2) Deep Dreamer DAX: Программирование 5 10.11.2006 18:04
Как в наследуемом классе кл. RunBase перехватывать модиф. полей м.Prompt() alef_nor DAX: Программирование 2 11.05.2006 15:07
баг в 2.5. Будьте осторожнее с символом "_" подчеркивание levsha DAX: Программирование 5 07.12.2004 12:26

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

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

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