14.02.2011, 09:13 | #1 |
Участник
|
Неправильное округление величины
Добрый день!
Периодически при разноске складских журналов возникает ошибка "Неправильное округление величины". Ошибка возникает в InventJournalTrans/checkAmount X++: if (this.CostAmount != Currency::amount(this.CostAmount)) ok = checkFailed("@SYS2602"); При этом в отладчике в поле CostAmount непонятно почему заносится очень странное значение(например 8933,719999999999), т.е. система не округлила сумму. При этом, если изменить в строке журнала сумму на 8933,73, то ошибка не возникает. Не подскажите в чем может быть проблема Dynamics AX 2009 5.0.1500.2116 |
|
14.02.2011, 09:33 | #2 |
Участник
|
Строка в журнале создается программным способом - читай модификацией?
__________________
Ivanhoe as is.. |
|
14.02.2011, 09:51 | #3 |
Участник
|
Нет, все создается руками.
|
|
14.02.2011, 10:28 | #4 |
Участник
|
А на основной валюте компании у вас поставлено округление? Например, 0,01.
__________________
Ivanhoe as is.. |
|
14.02.2011, 10:40 | #5 |
Участник
|
Да, на валютах, везде стоит округление 0,01.
|
|
14.02.2011, 16:42 | #6 |
Member
|
А в каком месте отладчик пишет в поле неокругленную сумму? И какую операцию вы вводите?
__________________
С уважением, glibs® |
|
14.02.2011, 18:28 | #7 |
Участник
|
Чтобы не гадать, откуда берутся неокругленные суммы, можно на InventJournalTrans.insert() и update() повесить проверку поля CostAmount и, если что, выводить стек вызовов (как вариант - писать куда-нить детализированную информацию). Так, по-моему, будет проще, чем пытаться отловить ситуацию, не имея никаких зацепок. К тому же, очень сомнительно, что неокругленная сумма вводится руками - округление на формах работает вполне надежно и таких вольностей не допускает (либо это будет первый известный случай).
|
|
14.02.2011, 19:43 | #8 |
Member
|
Там в Cost price можно вводить до 12 знаков после запятой или даже больше (что из внешнего вида формы совсем не очевидно, и мне кажется что раньше могло быть не так). Cost amount в форме должно округляться до двух знаков. Но если кто-то что-то программировал в этом месте, то мог забыть округлить.
__________________
С уважением, glibs® |
|
15.02.2011, 06:19 | #9 |
Участник
|
Цитата:
Сообщение от gl00mie
Чтобы не гадать, откуда берутся неокругленные суммы, можно на InventJournalTrans.insert() и update() повесить проверку поля CostAmount и, если что, выводить стек вызовов (как вариант - писать куда-нить детализированную информацию). Так, по-моему, будет проще, чем пытаться отловить ситуацию, не имея никаких зацепок. К тому же, очень сомнительно, что неокругленная сумма вводится руками - округление на формах работает вполне надежно и таких вольностей не допускает (либо это будет первый известный случай).
X++: this.CostPrice = Currency::amount(this.CostPrice);
this.CostAmount = Currency::amount(this.CostAmount);
super(); |
|
15.02.2011, 06:24 | #10 |
Участник
|
Цитата:
Возникает при проверке журнала Инвентаризации и Проводки. И возникает именно на сумме 8933,72(при вводе суммы 8933,73 все проходит без ошибок). Еще один ньюанс - данная ошибка возникла только в AX5.0 в 4.0 ее не было. |
|
15.02.2011, 08:15 | #11 |
Участник
|
Цитата:
Я бы на вашем месте последовал бы совету gl00mie |
|
15.02.2011, 10:36 | #12 |
Участник
|
Вы случайно не списываете номенклатуру? Может, у вас начальные данные были некорректно загружены и складская себестоимость имеет такую размерность (кучка знаков после запятой)?
__________________
Ivanhoe as is.. |
|
15.02.2011, 10:42 | #13 |
Участник
|
|
|
15.02.2011, 10:45 | #14 |
Участник
|
Ошибка возникает и при списании и при оприходовании товара, независимо от номенклатуры и соответственно от себестоимости
|
|
15.02.2011, 12:41 | #15 |
Member
|
Вам известно как создавалась строка журнала?
Если вручную в этом же журнале ввести точно такую же строку журнала - проверка выдаст ошибку во введенной вручную строке?
__________________
С уважением, glibs® |
|
15.02.2011, 13:05 | #16 |
Участник
|
|
|
15.02.2011, 13:24 | #17 |
Участник
|
Если вы говорите, что перед сохранинием записи (перед super в insert/update) вы значения округляете, то значит портятся эти значения уже позже и причём в обход update при помощи doUpdate. Запускаете ли вы какие-нибудь дополнительные обработки перед разноской журнала, или возможно у вас есть какие-то модификации самой процедуры разноски?
Т.е.на форме вводим 8933.72, а в таблицу попадает 8933,719999999999 ? Или сразу после ввода до попытки разнести журнал в таблице ещё правильное значение, а хвост появляется позже? Непонятно в какой именно момент у суммы в таблице появляется хвост. |
|
15.02.2011, 13:48 | #18 |
Участник
|
Да, именно так...
После долгих экспериментов, удалось установить что неправильное значение присваиваеться в super() inventJournalTrans.update(). Я сделал выборку строки журнала ДО super, и ПОСЛЕ. До в CostAmount было значение 8933.72, после 8933,719999999999 |
|
15.02.2011, 14:02 | #19 |
Участник
|
|
|
15.02.2011, 14:18 | #20 |
Участник
|
Сейчас обнаружил еще одну странную вещь: у нас на форме 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). |