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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 16.06.2009, 19:09   #1  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,901 / 3179 (113) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Цитата:
Сообщение от miklenew Посмотреть сообщение
Нашёл.
Была форма о которой я даже и не знал.
Она делила строки журнала, в текущем уменьшала количество и выносила их в другой журнал.
Ошибка была когда количество из текущего журнала полностью выносилось в другой журнал.
В ней был такой код
X++:
              if (!inventTrans.Qty)
                  inventTrans.delete();
              else
                  inventTrans.update();
На первый взгляд безобидный.
Только при qty = 0 inventTrans удалялся, а InventSum не пересчитывался. Понятно почему, количество то ноль.
Сделал так
X++:
              if (!inventTrans.Qty)
              {
                  inventTrans.update();
                  inventTrans.delete();
              }
              else
                  inventTrans.update();
Ошибка исчезла.
Ого !

Получается что в InventTrans.delete() есть ошибка.

Вместо вызова

X++:
        if (InventSum::mustInventTransBeUpdated(this))
        {
            inventSum = appl.inventUpdateTTSControl().inventSumSelectLocked(this);
            inventSum.updateInventTrans(this,NoYes::No);
        }
правильнее поставить

X++:
        if (InventSum::mustInventTransBeUpdated(this.orig()))
        {
            inventSum = appl.inventUpdateTTSControl().inventSumSelectLocked(this.orig());
            inventSum.updateInventTrans(this.orig(),NoYes::No);
        }
Потому что иначе легко развалить связку InventSum и InventTrans - что собственно и произошло в вашем примере. Сперва отредактировали количество в проводке, поняли что оно 0 и update() ни к чему - вызвали delete() и получили ошибку, там где не ожидали.

Delete() должен работать на основе значений которые лежат в базе, а не в текущем буфере.

В принципе нечто подобное сделано в методе inventTrans.update() - сперва из InventSum вычитаются значения this.orig() а затем прибавляются значения this. Нужно было код перенести убрав прибавку this но оставив вычитание this.orig() Т.е. автор InventTrans.delete() неявно заложился на то что удаляемый InventTrans перед удалением не редактировался.

Последний раз редактировалось Logger; 16.06.2009 в 19:16. Причина: уточнение
За это сообщение автора поблагодарили: Maximin (1), miklenew (2).
Теги
internal, блокировка, лог, поиск ошибок, полезное

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Главная книга / Запросы / Аудит (TransactionLog) Зачем и кому он нужен? ta_and DAX: Функционал 18 24.09.2008 10:14
Эскалация блокировок в MSSQL fomenka DAX: Администрирование 6 24.04.2007 06:02
сброс блокировок при update somebody DAX: Программирование 3 27.03.2007 11:31
?Аудит пользователей Axapta Gray DAX: Администрирование 4 09.06.2004 07:08
Описание функциональности модуля "Аудит действий пользователей системы" D.Cheprasov DAX: Прочие вопросы 2 22.03.2004 04:32

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

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

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