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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 28.01.2008, 13:50   #1  
online
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,983 / 3273 (117) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Цитата:
Сообщение от kashperuk Посмотреть сообщение
А приведите пожалуйста перечень проводок и их Тип (TransType), которые на момент вызова запроса у вас добавлены в RecordViewCache.

Надо ж воспроизвести, чтоб починили

Как воспроизвести глюк.

1. Создаем заказ
Строки заказа
Лот1 Количество 4 (2 физрезерв; 2 скомплектовано)
Лот2 Количество 5 (5 физрезерв)

2. Обрабатываем накладную по заказу (SalesformLetterInvoice) по скомплектованному.
Перед обработкой в SalesParmLine должна быть одна запись которая соответсвует Лот1.
Взводим галку SalesParmLine.closed (для воспроизведения бага галку взводить необязательно - но с ней будет проще - меньше проводок перебирать. Так как с взведенной SalesParmLine.closed после обработки по строке Лот1 не будет проводок в физрезерве - меньеш строк в отладчике перебирать)

3. Смотрим отладчик.
В методе SalesformLetterInvoice.Updatenow()
После цикла
X++:
    while (salesParmLine)
    {
    ...
    }
Стоит наш код (кастомизация)
1. Цикл по всем строкам заказа по которым осталось необработанное количество.
Для каждой строки такой запрос

X++:
    select sum(qty) from inventTrans
        index hint TransIdIdx
        where inventTrans.inventTransId         == _inventTransId   &&
            (inventTrans.statusIssue == StatusIssue::ReservPhysical ||
             inventTrans.statusIssue == StatusIssue::ReservOrdered  ||
             inventTrans.statusIssue == StatusIssue::OnOrder
            );
В нашем примере для строки Лот2 он вернет 0.
Если отключить кеш,
InventTrans.disablecache(true);
то вернет -5.

Если поставить точное равенство

X++:
    select sum(qty) from inventTrans
        index hint TransIdIdx
        where inventTrans.inventTransId         == _inventTransId   &&
            (inventTrans.statusIssue == StatusIssue::ReservPhysical);
то вернет -5

Если поставить диапазон значений

X++:
    select sum(qty) from inventTrans
        index hint TransIdIdx
        where inventTrans.inventTransId         == _inventTransId   &&
                       inventTrans.StatusIssue >= StatusIssue::ReservPhysical
                    && inventTrans.StatusIssue <= StatusIssue::OnOrder;
что эквивалентно перечислению, так как значения в енуме идут подряд
то тоже вернет -5

И теперь внимание !
Если принудительно перед выполнением запроса создать RecordViewCache
X++:
    object             object;
    ;
...
    object = InventTrans::viewCacheInventTransId(_InventTransId, true);
    select sum(qty) from inventTrans
        index hint TransIdIdx
        where inventTrans.inventTransId         == _inventTransId   &&
            (inventTrans.statusIssue == StatusIssue::ReservPhysical ||
             inventTrans.statusIssue == StatusIssue::ReservOrdered  ||
             inventTrans.statusIssue == StatusIssue::OnOrder
            );
то тоже вернет -5 !!!
(в этом случае если посмотреть InventTrans.wasCached() то видно что запись закеширована - во всех предыдущих случаях - она незакеширована, потому что Лот2 вообще небыло в salesParmLine)


Итог :
Если по InventTrans создан RecordViewCache для какого то конкретного запроса (запрос по Лот1)

то при других запросах ядро может глючить и возвращать пустую выборку (запрос по Лот2)

Глюк исчезает если
1. отключить кеширование на буфере перед выполнением запроса
или
2. прнудительно создать RecordViewCache перед выполнением запроса (В нашем примере Лот2)
или
3. Изменить запрос так чтобы в нем не было перечисления через ||
За это сообщение автора поблагодарили: gl00mie (5).
Теги
ax3.0

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Развивающая игра с xRecord.wasCached(), RecordViewCache EVGL DAX: База знаний и проекты 4 12.12.2008 10:20
! "по выбранному курсору нельзя инициализировать recordViewCache" netbas DAX: Программирование 9 20.12.2007 15:24
Глюки в Query с разными типами Join (в т.ч. NonExistsJoin) к одной таблице gl00mie DAX: Программирование 10 14.02.2007 13:22
Глюки в Заказах Pegiy DAX: Функционал 4 17.03.2004 15:09
Глюки с разноской складских проводок на счета ГК Yury DAX: Программирование 0 11.04.2003 19:10

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

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

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