20.10.2009, 16:23 | #1 |
Участник
|
Ошибка в расчете курсовых разниц
Добрый день.
При расчете курсовых разниц возникает такая ошибка: Невозможно отредактировать запись в Сопоставление по поставщику (VendSettlement). Возник конфликт обновления из-за того, что другой пользовательский процесс выполняет удаление записи или изменение одного или нескольких полей в записи. Вот так выглядит код в котором идет обновление данных в таблице VendSettlement (метод updateSettlement в классе CustVendTransData): X++: public CustVendSettlement updateSettlement(CustVendTransOpen _custVendTransOpen, DiscAmount _utilizedCashDisc = 0, PennyDiff _pennyDiff = 0, NoYes _canBeReversed = NoYes::No, boolean _setOffsetRecId = false, boolean _update = false, Dimension _cashDiscDimension = custVendTrans.Dimension, Voucher _taxVoucher = '') { CustVendTrans this_Orig = custVendTrans.orig(); CustVendSettlement custVendSettlement = this.parmCustVendTransStatic().custVendSettlement(); ; ttsbegin; if (_update) { ... //тут все нормально } else { custVendSettlement.clear(); if (custVendTrans.ExchAdjustment != this_Orig.ExchAdjustment) { custVendSettlement.AccountNum = custVendTrans.AccountNum; custVendSettlement.OffsetTransVoucher = custVendTrans.LastSettleVoucher; custVendSettlement.TransDate = max(custVendTrans.TransDate, custVendTrans.LastExchAdj); custVendSettlement.TransRecId = custVendTrans.RecId; custVendSettlement.ExchAdjustment = custVendTrans.ExchAdjustment - this_Orig.ExchAdjustment; custVendSettlement.DueDate = _custVendTransOpen.DueDate; } if (custVendTrans.SettleAmountMST != this_Orig.SettleAmountMST || custVendTrans.SettleAmountCur != this_Orig.SettleAmountCur || _utilizedCashDisc || !custVendSettlement.AccountNum) { custVendSettlement.AccountNum = custVendTrans.AccountNum; custVendSettlement.OffsetTransVoucher = custVendTrans.LastSettleVoucher; custVendSettlement.TransDate = max(custVendTrans.TransDate, custVendTrans.LastSettleDate); custVendSettlement.TransRecId = custVendTrans.RecId; custVendSettlement.SettleAmountMST = custVendTrans.SettleAmountMST- this_Orig.SettleAmountMST; custVendSettlement.SettleAmountCur = custVendTrans.SettleAmountCur- this_Orig.SettleAmountCur; custVendSettlement.UtilizedCashDisc = _utilizedCashDisc; custVendSettlement.PennyDiff = _pennyDiff; custVendSettlement.CashDiscDate = _custVendTransOpen.CashDiscDate; custVendSettlement.OffsetRecId = _setOffsetRecId ? custVendTrans.OffsetRecId : 0; //custVendSettlement.SettleAmountCur ? this.offsetRecid : 0; custVendSettlement.DueDate = _custVendTransOpen.DueDate; custVendSettlement.LastInterestDate = _custVendTransOpen.LastInterestDate; custVendSettlement.CanBeReversed = _canBeReversed; custVendSettlement.CashDiscAccount = _custVendTransOpen.CashDiscAccount; if ( _canBeReversed && _utilizedCashDisc) { custVendSettlement.Dimension = _cashDiscDimension; } custVendSettlement.TaxVoucher_RU = _taxVoucher; } custVendSettlement.insert(); } ttscommit; return custVendSettlement; } Подскажите, пожалуйста, как решить эту проблему. АХ 4sp2, MS SQL 2005 |
|
20.10.2009, 20:51 | #2 |
Microsoft Dynamics
|
Да, есть бага в этом фрагменте. Причина проблемы в том, что если после строки
X++: custVendSettlement.clear(); X++: insertRecord = false; custVendSettlement.clear(); if (custVendTrans.ExchAdjustment != this_Orig.ExchAdjustment) { ..... insertRecord = true; } if (...) { ..... insertRecord = true; } if (insertRecord) { custVendSettlement.insert(); }
__________________
You should use Bing before asking dumb questions. |
|
|
За это сообщение автора поблагодарили: Silphidae (1). |
21.10.2009, 09:14 | #3 |
Участник
|
Да, Вы правы, такая проблема есть.
В моем случае ошибка в чем-то другом, ибо добавление проверки на "заполненность" буфера, к сожалению, не решило проблемы с конфликтом обновления. |
|
21.10.2009, 09:38 | #4 |
Участник
|
Таблица VendSettlement свойство OccEnabled = No
Попробуйте у таблицы VendSettlement свойство OccEnabled выставить в No. Только учтите, что время обновления данных по данной таблице увеличится, но ошибка по идее должна пропасть.
__________________
Sergey Nefedov |
|
|
За это сообщение автора поблагодарили: driller (1), Silphidae (1). |
21.10.2009, 09:49 | #5 |
Участник
|
Спасибо, SRF
Установка указанного свойства в No решила проблему. А можно спросить, что это свойство определяет? |
|
21.10.2009, 09:57 | #6 |
Участник
|
Почитайте вот эту тему aEremenko: Излучая оптимизм
__________________
Sergey Nefedov |
|
|
За это сообщение автора поблагодарили: lev (2). |
21.10.2009, 11:17 | #7 |
MCITP
|
Ну и каким образом это повлияло на ситуацию с ошибкой на вставке, я что-то не совсем понимаю?
__________________
Zhirenkov Vitaly |
|
01.03.2010, 10:28 | #8 |
Участник
|
История с этой проблемой получила продолжение:
Установка свойства OccEnabled в 0 на VendSettlement с недавнего времени стала вешать АХ наглухо (оставляли расчет на ночь - с тем же результатом), хотя, ранее это помогало. В то время как OccEnabled == 1 выдает ошибку, указанную в первом посте этого топика. Т.о. в любом случае не удается произвести расчет. Прошу, подскажите, пожалуйста, как это побороть. |
|
19.03.2010, 11:22 | #9 |
Участник
|
Наткнулся на эту проблему. При анализе определил следующее: в методе recalcFutureRealizedExchAdj класса CustVendExchAdjustment_W
есть выборка X++: *************************************** while select forupdate custVendSettlement where custVendSettlement.SettleAmountCur && custVendSettlement.TransRecId == _custVendTrans.RecId && custVendSettlement.TransDate > _postingDate && custVendSettlement.CanBeReversed join forupdate custVendSettlementOffset where custVendSettlementOffset.TransRecId == custVendSettlement.OffsetRecId && custVendSettlementOffset.OffsetRecId == custVendSettlement.TransRecId && custVendSettlementOffset.TransDate == custVendSettlement.TransDate && custVendSettlementOffset.CanBeReversed { ************************************************* } { Но в некотрых случаях в недрах происходит добавление строки в таблицу сопоставлений и выборка идет по более чем одной строке. В результате получаем сообщение об ошибке, так как одна строка сопоставления Update несколько раз. Сам Update происходит в методе reverseSettlement класса CustVendReversePosting. X++: public void reverseSettlement() { // create reverse custVendSettlement for the original settled CustVendSettlement reverseCustVendSettlement = custVendSettlement.data(); ; reverseCustVendSettlement.CanBeReversed = NoYes::No; reverseCustVendSettlement.SettleAmountCur = - custVendSettlement.SettleAmountCur; reverseCustVendSettlement.SettleAmountMST = - custVendSettlement.SettleAmountMST; reverseCustVendSettlement.UtilizedCashDisc = - custVendSettlement.UtilizedCashDisc; reverseCustVendSettlement.ExchAdjustment = - custVendSettlement.ExchAdjustment; if (isConfigurationkeyEnabled(configurationkeynum(ReverseSettlementDatePrinciple_RU))) { reverseCustVendSettlement.TransDate = transactionDate; } custVendSettlement.CanBeReversed = NoYes::No; reverseCustVendSettlement.insert(); if (custVendSettlement.TransDate != transactionDate) { custVendSettlement.ReversedRecId_RU = reverseCustVendSettlement.RecId; reverseCustVendSettlement.ReversedRecId_RU = custVendSettlement.RecId; reverseCustVendSettlement.ReverseTrans_RU = NoYes::Yes; reverseCustVendSettlement.update(); } [COLOR=red]custVendSettlement.update();[/COLOR] [COLOR=red][/COLOR]} Для исправление поставил firstonly (пока в тестовой базе). Как считаете корректно ли такое исправление? Может кто по другому решил данную проблему. Последний раз редактировалось ena_ax; 19.03.2010 в 11:33. |
|
19.03.2010, 17:29 | #10 |
Microsoft Dynamics
|
Метод recalcFutureRealizedExchAdj выполняет переоценку "будущих" операций по реализованной курсовой разнице и вызывается при периодической переоценке операций по контрагенту. Проводки по реализованной курсовой разнице рождаются при сопоставлении и их, в общем случае, может быть несколько, так что firstonly здесь ставить некорректно.
__________________
You should use Bing before asking dumb questions. Последний раз редактировалось Jabberwocky; 19.03.2010 в 17:32. |
|
19.03.2010, 21:16 | #11 |
Участник
|
Цитата:
Сообщение от Jabberwocky
Метод recalcFutureRealizedExchAdj выполняет переоценку "будущих" операций по реализованной курсовой разнице и вызывается при периодической переоценке операций по контрагенту. Проводки по реализованной курсовой разнице рождаются при сопоставлении и их, в общем случае, может быть несколько, так что firstonly здесь ставить некорректно.
Axapta 4.0 SP2. (Именно друг с другом, т.е. добиться чтобы по 2-м документам было несколько сопоставлений между собой). Последний раз редактировалось ena_ax; 19.03.2010 в 21:24. |
|
22.03.2010, 13:31 | #12 |
Microsoft Dynamics
|
Можно сопоставить несколькими частями, но на разные даты.
Попробуйте взять реализацию классов CustVendExchAdjustment_W и CustVendReversePosting иэ этого пакета (здесь наиболее актуальные версии этих классов): https://mbs.microsoft.com/customerso...alculations_ru Возможно, у Вас не установлен какой-то хотфикс.
__________________
You should use Bing before asking dumb questions. |
|
25.09.2012, 14:35 | #13 |
NavAx
|
Нашел еще ошибку в расчете курсовой.
DAX 2009 X++: \classes\CustVendExchAdjustment_W.calcUnrealizedExchAdj() if (Currency::amount(abs(_settleAmountCur), _custVendTrans.CurrencyCode) <= abs(pendingSettledAmountCur)) { //NDN10966_CustVendExchAdjustment, [], edd, 21.09.2012 --> //openAmountCur += _settleAmountCur; openAmountCur = abs(openAmountCur); openAmountCur += abs(_settleAmountCur); //NDN10966_CustVendExchAdjustment, [], edd, 21.09.2012 <-- } Последний раз редактировалось raz; 25.09.2012 в 14:38. Причина: 123 |
|
|
За это сообщение автора поблагодарили: EVGL (5), gl00mie (5). |
16.01.2013, 12:12 | #14 |
Программатор
|
переменная openAmountCur будет только положительной. Это правильно? а могла быть любой. Просто я лично с этим кодом пока не сталкивался, но в системе есть глюки с расчетом курсовой. Изучаю стандартные глюки на форуме...
|
|
16.01.2013, 14:31 | #15 |
NavAx
|
Если вы посмотрите ниже,
X++: unrealisedAmountMST = Currency::amount(_exchRateDiff * abs(_settleAmountCur / (openAmountCur ? openAmountCur : _settleAmountCur)));
__________________
Жизнь прекрасна! Если, конечно, правильно подобрать антидепрессанты... |
|
16.01.2013, 14:49 | #16 |
Программатор
|
Цитата:
Сообщение от Maximin
Если вы посмотрите ниже,
X++: unrealisedAmountMST = Currency::amount(_exchRateDiff * abs(_settleAmountCur / (openAmountCur ? openAmountCur : _settleAmountCur))); |
|
16.01.2013, 19:00 | #17 |
NavAx
|
Цитата:
А, поскольку у openAmountCur и settleAmountCur знак всегда совпадает (вот если нет - будут проблемы, да, и фикс это вылечит), то все будет нормально работать. Но могут ли они по смыслу быть с разным знаком? По сути, это открытая сумма и сопоставленная сумма. И в getOpenAmount видны усилия по приведению всего в вид с одинаковым знаком...
__________________
Жизнь прекрасна! Если, конечно, правильно подобрать антидепрессанты... Последний раз редактировалось Maximin; 16.01.2013 в 19:02. |
|
16.01.2013, 19:22 | #18 |
Программатор
|
Ну да с математикой я обложался Потому и спрашиваю - в чём грабли?
|
|
17.01.2013, 10:32 | #19 |
NavAx
|
Не проще настроить и попробовать?
Проблема была найдена при помощи отладчика, не хотите патчить, оставьте как есть. |
|
|
За это сообщение автора поблагодарили: Sada (2). |
Теги |
конфликт обновления, курсовая разница |
|
Похожие темы | ||||
Тема | Ответов | |||
Ошибка в логе при установке клиента AX 2009 | 9 | |||
Ошибка в формате числа. | 7 | |||
НДС с курсовых разниц | 7 | |||
Отмена курсовых разниц | 11 | |||
Русская локализация Axapta 3 ? | 59 |
|