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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 14.02.2011, 09:13   #1  
AvrDen is offline
AvrDen
Участник
 
134 / 26 (1) +++
Регистрация: 04.08.2005
Адрес: Усть-Каменогорск
Неправильное округление величины
Добрый день!
Периодически при разноске складских журналов возникает ошибка "Неправильное округление величины".
Ошибка возникает в InventJournalTrans/checkAmount
X++:
    if (this.CostAmount != Currency::amount(this.CostAmount))
        ok = checkFailed("@SYS2602");
В строке журнала поле CostAmount стоит сумма 8933,72
При этом в отладчике в поле CostAmount непонятно почему заносится очень странное значение(например 8933,719999999999), т.е. система не округлила сумму. При этом, если изменить в строке журнала сумму на 8933,73, то ошибка не возникает.

Не подскажите в чем может быть проблема

Dynamics AX 2009 5.0.1500.2116
Старый 14.02.2011, 09:33   #2  
Ivanhoe is offline
Ivanhoe
Участник
Аватар для Ivanhoe
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
4,143 / 2156 (80) +++++++++
Регистрация: 29.09.2005
Адрес: Санкт-Петербург
Строка в журнале создается программным способом - читай модификацией?
__________________
Ivanhoe as is..
Старый 14.02.2011, 09:51   #3  
AvrDen is offline
AvrDen
Участник
 
134 / 26 (1) +++
Регистрация: 04.08.2005
Адрес: Усть-Каменогорск
Нет, все создается руками.
Старый 14.02.2011, 10:28   #4  
Ivanhoe is offline
Ivanhoe
Участник
Аватар для Ivanhoe
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
4,143 / 2156 (80) +++++++++
Регистрация: 29.09.2005
Адрес: Санкт-Петербург
А на основной валюте компании у вас поставлено округление? Например, 0,01.
__________________
Ivanhoe as is..
Старый 14.02.2011, 10:40   #5  
AvrDen is offline
AvrDen
Участник
 
134 / 26 (1) +++
Регистрация: 04.08.2005
Адрес: Усть-Каменогорск
Да, на валютах, везде стоит округление 0,01.
Старый 14.02.2011, 16:42   #6  
glibs is offline
glibs
Member
Сотрудники компании It Box
Most Valuable Professional
Лучший по профессии 2011
Лучший по профессии 2009
 
4,942 / 911 (40) +++++++
Регистрация: 10.06.2002
Адрес: I am from Kyiv, Ukraine. Now I am in Moscow. For private contacts: glibs@hotmail.com
А в каком месте отладчик пишет в поле неокругленную сумму? И какую операцию вы вводите?
__________________
С уважением,
glibs®
Старый 14.02.2011, 18:28   #7  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5798 (201) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Чтобы не гадать, откуда берутся неокругленные суммы, можно на InventJournalTrans.insert() и update() повесить проверку поля CostAmount и, если что, выводить стек вызовов (как вариант - писать куда-нить детализированную информацию). Так, по-моему, будет проще, чем пытаться отловить ситуацию, не имея никаких зацепок. К тому же, очень сомнительно, что неокругленная сумма вводится руками - округление на формах работает вполне надежно и таких вольностей не допускает (либо это будет первый известный случай).
Старый 14.02.2011, 19:43   #8  
glibs is offline
glibs
Member
Сотрудники компании It Box
Most Valuable Professional
Лучший по профессии 2011
Лучший по профессии 2009
 
4,942 / 911 (40) +++++++
Регистрация: 10.06.2002
Адрес: I am from Kyiv, Ukraine. Now I am in Moscow. For private contacts: glibs@hotmail.com
Там в Cost price можно вводить до 12 знаков после запятой или даже больше (что из внешнего вида формы совсем не очевидно, и мне кажется что раньше могло быть не так). Cost amount в форме должно округляться до двух знаков. Но если кто-то что-то программировал в этом месте, то мог забыть округлить.
__________________
С уважением,
glibs®
Старый 15.02.2011, 06:19   #9  
AvrDen is offline
AvrDen
Участник
 
134 / 26 (1) +++
Регистрация: 04.08.2005
Адрес: Усть-Каменогорск
Цитата:
Сообщение от gl00mie Посмотреть сообщение
Чтобы не гадать, откуда берутся неокругленные суммы, можно на InventJournalTrans.insert() и update() повесить проверку поля CostAmount и, если что, выводить стек вызовов (как вариант - писать куда-нить детализированную информацию). Так, по-моему, будет проще, чем пытаться отловить ситуацию, не имея никаких зацепок. К тому же, очень сомнительно, что неокругленная сумма вводится руками - округление на формах работает вполне надежно и таких вольностей не допускает (либо это будет первый известный случай).
Да я так и сделал в первую очередь, на insert() и update() InventJournalTrans вставил округление CostPrice и CostAmount перед вызовом super()
X++:
    this.CostPrice = Currency::amount(this.CostPrice);

    this.CostAmount = Currency::amount(this.CostAmount);
    super();
Старый 15.02.2011, 06:24   #10  
AvrDen is offline
AvrDen
Участник
 
134 / 26 (1) +++
Регистрация: 04.08.2005
Адрес: Усть-Каменогорск
Цитата:
Сообщение от glibs Посмотреть сообщение
А в каком месте отладчик пишет в поле неокругленную сумму? И какую операцию вы вводите?
Ошибка возникает при проверке суммы строк журнала InventJournalTrans/checkAmount.
Возникает при проверке журнала Инвентаризации и Проводки. И возникает именно на сумме 8933,72(при вводе суммы 8933,73 все проходит без ошибок). Еще один ньюанс - данная ошибка возникла только в AX5.0 в 4.0 ее не было.
Старый 15.02.2011, 08:15   #11  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,440 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от AvrDen Посмотреть сообщение
Да я так и сделал в первую очередь, на insert() и update() InventJournalTrans вставил округление CostPrice и CostAmount перед вызовом super()
Суть не в том что бы за минуту написать заглушку, а в том чтобы вычислить природу происхождения неокруглённых значений.

Я бы на вашем месте последовал бы совету gl00mie
Цитата:
Сообщение от gl00mie Посмотреть сообщение
Чтобы не гадать, откуда берутся неокругленные суммы, можно на InventJournalTrans.insert() и update() повесить проверку поля CostAmount и, если что, выводить стек вызовов (как вариант - писать куда-нить детализированную информацию).
Старый 15.02.2011, 10:36   #12  
Ivanhoe is offline
Ivanhoe
Участник
Аватар для Ivanhoe
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
4,143 / 2156 (80) +++++++++
Регистрация: 29.09.2005
Адрес: Санкт-Петербург
Вы случайно не списываете номенклатуру? Может, у вас начальные данные были некорректно загружены и складская себестоимость имеет такую размерность (кучка знаков после запятой)?
__________________
Ivanhoe as is..
Старый 15.02.2011, 10:42   #13  
AvrDen is offline
AvrDen
Участник
 
134 / 26 (1) +++
Регистрация: 04.08.2005
Адрес: Усть-Каменогорск
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
Суть не в том что бы за минуту написать заглушку, а в том чтобы вычислить природу происхождения неокруглённых значений.

Я бы на вашем месте последовал бы совету gl00mie
Так в том то и дело, что с этой заглушкой все равно возникает ошибка
Старый 15.02.2011, 10:45   #14  
AvrDen is offline
AvrDen
Участник
 
134 / 26 (1) +++
Регистрация: 04.08.2005
Адрес: Усть-Каменогорск
Цитата:
Сообщение от Ivanhoe Посмотреть сообщение
Вы случайно не списываете номенклатуру? Может, у вас начальные данные были некорректно загружены и складская себестоимость имеет такую размерность (кучка знаков после запятой)?
Ошибка возникает и при списании и при оприходовании товара, независимо от номенклатуры и соответственно от себестоимости
Старый 15.02.2011, 12:41   #15  
glibs is offline
glibs
Member
Сотрудники компании It Box
Most Valuable Professional
Лучший по профессии 2011
Лучший по профессии 2009
 
4,942 / 911 (40) +++++++
Регистрация: 10.06.2002
Адрес: I am from Kyiv, Ukraine. Now I am in Moscow. For private contacts: glibs@hotmail.com
Вам известно как создавалась строка журнала?

Если вручную в этом же журнале ввести точно такую же строку журнала - проверка выдаст ошибку во введенной вручную строке?
__________________
С уважением,
glibs®
Старый 15.02.2011, 13:05   #16  
AvrDen is offline
AvrDen
Участник
 
134 / 26 (1) +++
Регистрация: 04.08.2005
Адрес: Усть-Каменогорск
Цитата:
Сообщение от glibs Посмотреть сообщение
Если вручную в этом же журнале ввести точно такую же строку журнала - проверка выдаст ошибку во введенной вручную строке?
Да, при ручном вводе ошибка повторяется
Старый 15.02.2011, 13:24   #17  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,440 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Если вы говорите, что перед сохранинием записи (перед super в insert/update) вы значения округляете, то значит портятся эти значения уже позже и причём в обход update при помощи doUpdate. Запускаете ли вы какие-нибудь дополнительные обработки перед разноской журнала, или возможно у вас есть какие-то модификации самой процедуры разноски?
Цитата:
Сообщение от AvrDen Посмотреть сообщение
Да, при ручном вводе ошибка повторяется
Т.е.на форме вводим 8933.72, а в таблицу попадает 8933,719999999999 ? Или сразу после ввода до попытки разнести журнал в таблице ещё правильное значение, а хвост появляется позже? Непонятно в какой именно момент у суммы в таблице появляется хвост.
Старый 15.02.2011, 13:48   #18  
AvrDen is offline
AvrDen
Участник
 
134 / 26 (1) +++
Регистрация: 04.08.2005
Адрес: Усть-Каменогорск
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
Т.е.на форме вводим 8933.72, а в таблицу попадает 8933,719999999999 ?
Да, именно так...

После долгих экспериментов, удалось установить что неправильное значение присваиваеться в super() inventJournalTrans.update(). Я сделал выборку строки журнала ДО super, и ПОСЛЕ. До в CostAmount было значение 8933.72, после 8933,719999999999
Старый 15.02.2011, 14:02   #19  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,440 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от AvrDen Посмотреть сообщение
Да, именно так...
Ужас то какой. И что, стабильно воспроизводится? А на тестовом приложении также?
Старый 15.02.2011, 14:18   #20  
AvrDen is offline
AvrDen
Участник
 
134 / 26 (1) +++
Регистрация: 04.08.2005
Адрес: Усть-Каменогорск
Сейчас обнаружил еще одну странную вещь: у нас на форме InventJournalCount есть небольшая модификация к InventJournalTrans присоединена таблица Inventtable для отображания доп. параметров номенклатуры в строках журнала(больше можификаций нет, никакие методы не перекрыты). Так вот при JoinMode:: Active запись обновляется нормально и проверка проходит тоже, а при InnerJoin возникает эта ошибка.
Смотрели профайлер SQL и при JoinMode:: Active обновление проходит с помощью команды
exec sp_execute 94,8933.720000000000,8933.720000000000,1150887998,N'mhv',N'000256_070',1.000000000000,2095401284,
а при JoinMode::InnerJoin
UPDATE INVENTJOURNALTRANS SET COSTPRICE=4.46686E3,COSTAMOUNT=8.93372E3,RECVERSION=290773656 WHERE (((DATAAREAID=N'mhv') AND (RECID=5693788077)) AND (RECVERSION=140598760))

т.е. при InnerJoin COSTAMOUNT представляется в экспоненциальном виде.
В АХ 3.0/4.0 такой проблемы не было...

Последний раз редактировалось AvrDen; 15.02.2011 в 14:23.
За это сообщение автора поблагодарили: Ivanhoe (3), S.Kuskov (5).
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Округление при расчете НДФЛ barry allen DAX: Программирование 1 20.12.2010 15:15
Расчеты с персоналом // Виды зарплаты // Округление farlander DAX: Функционал 0 29.04.2009 09:54
Неверное округление физ. Обновляемого количества товара fur-lined DAX: Функционал 14 10.11.2006 11:02
округление в OLAP xconsul DAX: Администрирование 2 19.11.2005 14:33
Тип проводки - округление накладной по закупке Ann DAX: Функционал 0 23.06.2004 14:05

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

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

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