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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 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
 
316 / 407 (14) +++++++
Регистрация: 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
 
316 / 407 (14) +++++++
Регистрация: 08.08.2007
Записей в блоге: 1
Цитата:
Сообщение от Silphidae Посмотреть сообщение
А можно спросить, что это свойство определяет?
Почитайте вот эту тему aEremenko: Излучая оптимизм
__________________
Sergey Nefedov
За это сообщение автора поблагодарили: lev (2).
Старый 21.10.2009, 11:17   #7  
ZVV is offline
ZVV
MCITP
MCP
Oracle
MCBMSS
 
1,006 / 246 (11) ++++++
Регистрация: 13.02.2004
Адрес: Минск
->
Цитата:
Сообщение от SRF Посмотреть сообщение
.оптимизм.[/URL]
Ну и каким образом это повлияло на ситуацию с ошибкой на вставке, я что-то не совсем понимаю?
__________________
Zhirenkov Vitaly
Старый 01.03.2010, 10:28   #8  
Silphidae is offline
Silphidae
Участник
 
96 / 15 (1) ++
Регистрация: 17.11.2008
История с этой проблемой получила продолжение:
Установка свойства OccEnabled в 0 на VendSettlement с недавнего времени стала вешать АХ наглухо (оставляли расчет на ночь - с тем же результатом), хотя, ранее это помогало.
В то время как OccEnabled == 1 выдает ошибку, указанную в первом посте этого топика.
Т.о. в любом случае не удается произвести расчет.
Прошу, подскажите, пожалуйста, как это побороть.
Старый 19.03.2010, 11:22   #9  
ena_ax is offline
ena_ax
Участник
 
239 / 28 (1) +++
Регистрация: 06.12.2006
Наткнулся на эту проблему. При анализе определил следующее: в методе 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  
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   #11  
ena_ax is offline
ena_ax
Участник
 
239 / 28 (1) +++
Регистрация: 06.12.2006
Цитата:
Сообщение от Jabberwocky Посмотреть сообщение
Метод recalcFutureRealizedExchAdj выполняет переоценку "будущих" операций по реализованной курсовой разнице и вызывается при периодической переоценке операций по контрагенту. Проводки по реализованной курсовой разнице рождаются при сопоставлении и их, в общем случае, может быть несколько, так что firstonly здесь ставить некорректно.
Нельзя сопоставить 2 документа друг с другом несколькими частями, система сигнализирует об ошибке. По крайней мере у меня так.
Axapta 4.0 SP2. (Именно друг с другом, т.е. добиться чтобы по 2-м документам было несколько сопоставлений между собой).

Последний раз редактировалось ena_ax; 19.03.2010 в 21:24.
Старый 22.03.2010, 13:31   #12  
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   #13  
raz is offline
raz
NavAx
Аватар для raz
NavAx Club
Лучший по профессии 2014
Лучший по профессии 2009
 
1,453 / 973 (35) +++++++
Регистрация: 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   #14  
Sada is offline
Sada
Программатор
Аватар для Sada
 
1,444 / 150 (8) ++++++
Регистрация: 29.03.2005
Адрес: Толи Барнаул, толи Москва
переменная openAmountCur будет только положительной. Это правильно? а могла быть любой. Просто я лично с этим кодом пока не сталкивался, но в системе есть глюки с расчетом курсовой. Изучаю стандартные глюки на форуме...
Старый 16.01.2013, 14:31   #15  
Maximin is offline
Maximin
NavAx
NavAx Club
 
405 / 336 (12) ++++++
Регистрация: 09.10.2002
Адрес: Москва
Если вы посмотрите ниже,
X++:
        unrealisedAmountMST  = Currency::amount(_exchRateDiff * abs(_settleAmountCur / (openAmountCur ? openAmountCur : _settleAmountCur)));
то вы поймете, что, на самом деле, этот фикс вообще никак не влияет на результат, т.к. отношение _settleAmountCur / (openAmountCur ? openAmountCur : _settleAmountCur) берется по модулю и важно само отношение, но не его знак.
__________________
Жизнь прекрасна! Если, конечно, правильно подобрать антидепрессанты...
Старый 16.01.2013, 14:49   #16  
Sada is offline
Sada
Программатор
Аватар для Sada
 
1,444 / 150 (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   #17  
Maximin is offline
Maximin
NavAx
NavAx Club
 
405 / 336 (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   #18  
Sada is offline
Sada
Программатор
Аватар для Sada
 
1,444 / 150 (8) ++++++
Регистрация: 29.03.2005
Адрес: Толи Барнаул, толи Москва
Ну да с математикой я обложался Потому и спрашиваю - в чём грабли?
Старый 17.01.2013, 10:32   #19  
raz is offline
raz
NavAx
Аватар для raz
NavAx Club
Лучший по профессии 2014
Лучший по профессии 2009
 
1,453 / 973 (35) +++++++
Регистрация: 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, время: 23:18.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.