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).
Теги
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, время: 02:40.