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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 20.10.2009, 16:23   #1  
Silphidae is offline
Silphidae
Участник
 
96 / 15 (1) ++
Регистрация: 17.11.2008
Ошибка в расчете курсовых разниц
Добрый день.

При расчете курсовых разниц возникает такая ошибка: Невозможно отредактировать запись в Сопоставление по поставщику (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;
}
Есть подозрение, что clear() таблицы не успевает отработать до insert().
Подскажите, пожалуйста, как решить эту проблему. АХ 4sp2, MS SQL 2005
Старый 20.10.2009, 20:51   #2  
Jabberwocky is offline
Jabberwocky
Microsoft Dynamics
Аватар для Jabberwocky
Сотрудники Microsoft Dynamics
 
274 / 307 (11) ++++++
Регистрация: 02.09.2005
Адрес: Москва
->
Да, есть бага в этом фрагменте. Причина проблемы в том, что если после строки
X++:
custVendSettlement.clear();
ни одно из if-условий не равно TRUE, то в таблицу VendSettlement будет вставляться пустая запись. Эту ошибку можно исправить введением дополнительной проверки на "заполненность" буфера:

X++:
insertRecord = false;
custVendSettlement.clear();

if (custVendTrans.ExchAdjustment != this_Orig.ExchAdjustment)
{
.....
insertRecord = true;
}

if (...)
{
.....
insertRecord = true;
}

if (insertRecord)
{
     custVendSettlement.insert();
}
В версии 2009 бага поправлена.
__________________
You should use Bing before asking dumb questions.
За это сообщение автора поблагодарили: Silphidae (1).
Старый 21.10.2009, 09:14   #3  
Silphidae is offline
Silphidae
Участник
 
96 / 15 (1) ++
Регистрация: 17.11.2008
Да, Вы правы, такая проблема есть.
В моем случае ошибка в чем-то другом, ибо добавление проверки на "заполненность" буфера, к сожалению, не решило проблемы с конфликтом обновления.
Старый 21.10.2009, 09:38   #4  
SRF is offline
SRF
Участник
MCBMSS
Axapta Retail User
 
365 / 542 (19) +++++++
Регистрация: 08.08.2007
Записей в блоге: 1
? Таблица VendSettlement свойство OccEnabled = No
Попробуйте у таблицы VendSettlement свойство OccEnabled выставить в No. Только учтите, что время обновления данных по данной таблице увеличится, но ошибка по идее должна пропасть.
__________________
Sergey Nefedov
За это сообщение автора поблагодарили: driller (1), Silphidae (1).
Старый 21.10.2009, 09:49   #5  
Silphidae is offline
Silphidae
Участник
 
96 / 15 (1) ++
Регистрация: 17.11.2008
Спасибо, SRF
Установка указанного свойства в No решила проблему. А можно спросить, что это свойство определяет?
Старый 21.10.2009, 09:57   #6  
SRF is offline
SRF
Участник
MCBMSS
Axapta Retail User
 
365 / 542 (19) +++++++
Регистрация: 08.08.2007
Записей в блоге: 1
Цитата:
Сообщение от Silphidae Посмотреть сообщение
А можно спросить, что это свойство определяет?
Почитайте вот эту тему aEremenko: Излучая оптимизм
__________________
Sergey Nefedov
За это сообщение автора поблагодарили: lev (2).
Старый 19.03.2010, 17:29   #7  
Jabberwocky is offline
Jabberwocky
Microsoft Dynamics
Аватар для Jabberwocky
Сотрудники Microsoft Dynamics
 
274 / 307 (11) ++++++
Регистрация: 02.09.2005
Адрес: Москва
Метод recalcFutureRealizedExchAdj выполняет переоценку "будущих" операций по реализованной курсовой разнице и вызывается при периодической переоценке операций по контрагенту. Проводки по реализованной курсовой разнице рождаются при сопоставлении и их, в общем случае, может быть несколько, так что firstonly здесь ставить некорректно.
__________________
You should use Bing before asking dumb questions.

Последний раз редактировалось Jabberwocky; 19.03.2010 в 17:32.
Старый 19.03.2010, 21:16   #8  
ena_ax is offline
ena_ax
Участник
 
254 / 46 (2) +++
Регистрация: 06.12.2006
Цитата:
Сообщение от Jabberwocky Посмотреть сообщение
Метод recalcFutureRealizedExchAdj выполняет переоценку "будущих" операций по реализованной курсовой разнице и вызывается при периодической переоценке операций по контрагенту. Проводки по реализованной курсовой разнице рождаются при сопоставлении и их, в общем случае, может быть несколько, так что firstonly здесь ставить некорректно.
Нельзя сопоставить 2 документа друг с другом несколькими частями, система сигнализирует об ошибке. По крайней мере у меня так.
Axapta 4.0 SP2. (Именно друг с другом, т.е. добиться чтобы по 2-м документам было несколько сопоставлений между собой).

Последний раз редактировалось ena_ax; 19.03.2010 в 21:24.
Старый 22.03.2010, 13:31   #9  
Jabberwocky is offline
Jabberwocky
Microsoft Dynamics
Аватар для Jabberwocky
Сотрудники Microsoft Dynamics
 
274 / 307 (11) ++++++
Регистрация: 02.09.2005
Адрес: Москва
Можно сопоставить несколькими частями, но на разные даты.
Попробуйте взять реализацию классов CustVendExchAdjustment_W и CustVendReversePosting иэ этого пакета (здесь наиболее актуальные версии этих классов): https://mbs.microsoft.com/customerso...alculations_ru

Возможно, у Вас не установлен какой-то хотфикс.
__________________
You should use Bing before asking dumb questions.
Старый 25.09.2012, 14:35   #10  
raz is offline
raz
NavAx
Аватар для raz
NavAx Club
Лучший по профессии 2014
Лучший по профессии 2009
 
1,490 / 1060 (38) ++++++++
Регистрация: 22.07.2003
Адрес: МО
Нашел еще ошибку в расчете курсовой.

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 <--
        }
Проблема при exchRateDiffCalcType != ExchRateDiffCalcType_W::Standard.

Последний раз редактировалось raz; 25.09.2012 в 14:38. Причина: 123
За это сообщение автора поблагодарили: EVGL (5), gl00mie (5).
Старый 16.01.2013, 12:12   #11  
Sada is offline
Sada
Программатор
Аватар для Sada
 
1,450 / 153 (8) ++++++
Регистрация: 29.03.2005
Адрес: Толи Барнаул, толи Москва
переменная openAmountCur будет только положительной. Это правильно? а могла быть любой. Просто я лично с этим кодом пока не сталкивался, но в системе есть глюки с расчетом курсовой. Изучаю стандартные глюки на форуме...
Старый 16.01.2013, 14:31   #12  
Maximin is offline
Maximin
NavAx
NavAx Club
 
409 / 341 (12) ++++++
Регистрация: 09.10.2002
Адрес: Москва
Если вы посмотрите ниже,
X++:
        unrealisedAmountMST  = Currency::amount(_exchRateDiff * abs(_settleAmountCur / (openAmountCur ? openAmountCur : _settleAmountCur)));
то вы поймете, что, на самом деле, этот фикс вообще никак не влияет на результат, т.к. отношение _settleAmountCur / (openAmountCur ? openAmountCur : _settleAmountCur) берется по модулю и важно само отношение, но не его знак.
__________________
Жизнь прекрасна! Если, конечно, правильно подобрать антидепрессанты...
Старый 16.01.2013, 14:49   #13  
Sada is offline
Sada
Программатор
Аватар для Sada
 
1,450 / 153 (8) ++++++
Регистрация: 29.03.2005
Адрес: Толи Барнаул, толи Москва
Цитата:
Сообщение от Maximin Посмотреть сообщение
Если вы посмотрите ниже,
X++:
        unrealisedAmountMST  = Currency::amount(_exchRateDiff * abs(_settleAmountCur / (openAmountCur ? openAmountCur : _settleAmountCur)));
то вы поймете, что, на самом деле, этот фикс вообще никак не влияет на результат, т.к. отношение _settleAmountCur / (openAmountCur ? openAmountCur : _settleAmountCur) берется по модулю и важно само отношение, но не его знак.
если openAmountCur = -3 а _settleAmountCur = -3, то будет ноль в стандарте, и будет -3 в скобках, после фикса будет 6
Старый 16.01.2013, 19:00   #14  
Maximin is offline
Maximin
NavAx
NavAx Club
 
409 / 341 (12) ++++++
Регистрация: 09.10.2002
Адрес: Москва
Цитата:
Сообщение от Sada Посмотреть сообщение
если openAmountCur = -3 а _settleAmountCur = -3, то будет ноль в стандарте, и будет -3 в скобках, после фикса будет 6
Чего-то мне всегда казалось что -3 + (-3) будет -6. Соотв, разницы никакой.
А, поскольку у openAmountCur и settleAmountCur знак всегда совпадает (вот если нет - будут проблемы, да, и фикс это вылечит), то все будет нормально работать. Но могут ли они по смыслу быть с разным знаком? По сути, это открытая сумма и сопоставленная сумма. И в getOpenAmount видны усилия по приведению всего в вид с одинаковым знаком...
__________________
Жизнь прекрасна! Если, конечно, правильно подобрать антидепрессанты...

Последний раз редактировалось Maximin; 16.01.2013 в 19:02.
Старый 16.01.2013, 19:22   #15  
Sada is offline
Sada
Программатор
Аватар для Sada
 
1,450 / 153 (8) ++++++
Регистрация: 29.03.2005
Адрес: Толи Барнаул, толи Москва
Ну да с математикой я обложался Потому и спрашиваю - в чём грабли?
Старый 17.01.2013, 10:32   #16  
raz is offline
raz
NavAx
Аватар для raz
NavAx Club
Лучший по профессии 2014
Лучший по профессии 2009
 
1,490 / 1060 (38) ++++++++
Регистрация: 22.07.2003
Адрес: МО
Не проще настроить и попробовать?
Проблема была найдена при помощи отладчика, не хотите патчить, оставьте как есть.
За это сообщение автора поблагодарили: Sada (2).
Теги
конфликт обновления, курсовая разница

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Ошибка в логе при установке клиента AX 2009 sao DAX: Администрирование 9 04.02.2010 11:56
Ошибка в формате числа. 36AC DAX: Программирование 7 19.10.2006 10:04
НДС с курсовых разниц Ann DAX: Функционал 7 26.10.2004 15:10
Отмена курсовых разниц AndSoft DAX: Функционал 11 17.08.2004 15:34
Русская локализация Axapta 3 ? SlavaK DAX: Администрирование 59 01.07.2003 22:38
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра
Комбинированный вид Комбинированный вид

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

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

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