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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 12.03.2013, 11:15   #1  
byte is offline
byte
Участник
 
36 / 31 (2) +++
Регистрация: 21.08.2007
Открытая проводка по закрытой проводке клиента
Добрый день!

Имеется валютная проводка клиента с проставленной датой закрытия, при этом по ней есть открытая проводка с нулевой суммой в валюте операции и ненулевой суммой в первичной валюте. Вопрос, это нормальная ситуация?
А то эта сумма вылезает, как задолженность в нашем отчете по дебиторке, если строить его в первичной валюте.
Старый 12.03.2013, 11:30   #2  
raz is offline
raz
NavAx
Аватар для raz
NavAx Club
Лучший по профессии 2014
Лучший по профессии 2009
 
1,494 / 1065 (38) ++++++++
Регистрация: 22.07.2003
Адрес: МО
Это ошибка.

Вот кусок джоба, которым искали подобные ошибки.

X++:
        while select CustTrans
               where (!AccountNum     || CustTrans.AccountNum     == AccountNum)
                  && (!Voucher        || CustTrans.Voucher        == Voucher)
                  && (!PostingProfile || CustTrans.PostingProfile == PostingProfile)
                  && (!dateFrom       || CustTrans.TransDate      >= dateFrom)
        exists join CustTransOpen2
            where CustTransOpen2.RefRecId == CustTrans.RecId
        {
            select sum(AmountMST), sum(AmountCur), count(RecId) from CustTransOpen
                where CustTransOpen.RefRecId == CustTrans.RecId;

            AmountMST = CustTrans.AmountMST + CustTrans.ExchAdjustment - CustTrans.SettleAmountMST - CustTransOpen.AmountMST;
            AmountCur = CustTrans.AmountCur - CustTrans.SettleAmountCur - CustTransOpen.AmountCur;

            if (AmountMST != 0 || AmountCur != 0)
                info(strfmt("CustTrans.RecId открытая сумма  %1", CustTrans.RecId));

            select sum(SettleAmountMST), sum(SettleAmountCur), sum(ExchAdjustment) from CustSettlement
                where CustSettlement.TransRecId == CustTrans.RecId;

            AmountMST = CustTrans.SettleAmountMST - CustSettlement.SettleAmountMST - CustSettlement.ExchAdjustment;
            AmountCur = CustTrans.SettleAmountCur - CustSettlement.SettleAmountCur;

            if (AmountMST != 0 || AmountCur != 0)
                info(strfmt("CustTrans.RecId сумма сопоставления  %1", CustTrans.RecId));

            if (abs(CustTrans.AmountCur) < abs(CustTrans.SettleAmountCur) ||
                abs(CustTrans.AmountMST) < abs(CustTrans.SettleAmountMST - CustTrans.ExchAdjustment))
            {
                info(strfmt("!!!CustTrans.RecId сумма сопоставления больше самой суммы %1", CustTrans.RecId));
            }
        }

Последний раз редактировалось raz; 12.03.2013 в 11:35. Причина: 1
За это сообщение автора поблагодарили: gl00mie (3), byte (1).
Старый 12.03.2013, 11:39   #3  
mnt_dx is offline
mnt_dx
Участник
Axapta Retail User
Лучший по профессии 2014
 
1,747 / 188 (10) ++++++
Регистрация: 17.02.2011
Адрес: К Северу через Северо-Запад
Тип проводки какой?
Старый 12.03.2013, 13:31   #4  
byte is offline
byte
Участник
 
36 / 31 (2) +++
Регистрация: 21.08.2007
Цитата:
Сообщение от mnt_dx Посмотреть сообщение
Тип проводки какой?
Тип проводки - заказ на продажу
Старый 12.03.2013, 14:24   #5  
byte is offline
byte
Участник
 
36 / 31 (2) +++
Регистрация: 21.08.2007
Цитата:
Сообщение от raz Посмотреть сообщение
Это ошибка.

Вот кусок джоба, которым искали подобные ошибки.
Спасибо за джобик. Он ругается на открытую сумму.
Насколько я понимаю, должно выполняться равенство
custTrans.AmountMST = custTransOpen.AmountMST + custSettlement.SettleAmountMST - custSettlement.ExchAdjustment

В моем случае имеется расхождения на сумму открытой проводки. Единственное, что мне приходит на ум, это тупо ее удалить.
Старый 12.03.2013, 14:59   #6  
raz is offline
raz
NavAx
Аватар для raz
NavAx Club
Лучший по профессии 2014
Лучший по профессии 2009
 
1,494 / 1065 (38) ++++++++
Регистрация: 22.07.2003
Адрес: МО
Цитата:
Сообщение от byte Посмотреть сообщение
что мне приходит на ум, это тупо ее удалить.
Сперва все проанализируйте, особенно CustSettlement, чаще проблема бывает при сопоставлении или расчете крусовых. Если полностью уверены, тогда удаляйте.
Старый 13.03.2013, 11:43   #7  
byte is offline
byte
Участник
 
36 / 31 (2) +++
Регистрация: 21.08.2007
Цитата:
Сообщение от raz Посмотреть сообщение
Сперва все проанализируйте, особенно CustSettlement, чаще проблема бывает при сопоставлении или расчете крусовых. Если полностью уверены, тогда удаляйте.
Проанализировал случай, когда равенство
custTrans.AmountMST = custTransOpen.AmountMST + custSettlement.SettleAmountMST - custSettlement.ExchAdjustment
выполняется, но опять же по закрытой проводке имеется открытая, причем равная нереализованной курсовой разнице. Что бы это могло значить? В чем вообще отличие нереализованной от реализованной курсовой разницы?
Старый 18.03.2013, 14:54   #8  
byte is offline
byte
Участник
 
36 / 31 (2) +++
Регистрация: 21.08.2007
Для начала поделюсь тем, что выяснил:
Реализованная КР - разница между рублевой оценкой сделки покупки/продажи валюты по курсу сделки и рублевой оценкой сделки по курсу ЦБ на дату проведения сделки.
Нереализованная КР - изменение рублевой оценки валютных средств в связи с изменением курса ЦБ.
Т.е. курсовая, появляющаяся в процессе сопоставления - реализованная, а в процессе переоценки - нереализованная.
Что касается равенства
custTrans.AmountMST = custTransOpen.AmountMST + custSettlement.SettleAmountMST - custSettlement.ExchAdjustment,
то для проводок типа "курсовая разница" оно не выполняется, выяснено на практике.
Что же касается других типов проводки, я думаю, все же должно выполнятся (это мое предположение, поправьте, пжл, если не так).

А теперь вопрос. После запуска переоценки я обнаружил, что она корректирует закрытые проводки. Несмотря на то, что при запуске переоценки в запросе присутствует join с открытыми проводками, запрос, с которым она работает строится на лету и в нем этой связи нет. Это нормально, что так система работает? Метод расчета КР стоит "Инкрементный".
Старый 18.03.2013, 23:16   #9  
twilight is offline
twilight
MCTS
MCBMSS
 
880 / 237 (9) ++++++
Регистрация: 17.10.2004
Адрес: Королёв
У меня тоже появляются подобные проводки (AX 2009 RU6) и сегодня я обнаружил один из вариантов их возникновения: если в форме сопоставление фактур с оплатами сопоставлять одновременно накладные от 31.01.2013, 07.02.2013 и 28.02.2013 с платежом от 07.02.2013 при условии, что расчитана нереализованная курсовая (метод расчета в параметрах ГК Итого за период) на 28.02.2013. То потом при отмене этих сопоставлений нереализованная курсовая по накладным от 31.01.2013 и 07.02.2013 задваивается! Это происходит из-за того, что когда выбирается несколько записей в форме сопоставления, то дата сопоставления определяется по умолчанию как максимальная из всех дат отмеченных записей (т. е. есть разница - сопоставляем попарно будет один результат, сопостовляем все вместе - будет другой результат). Мало того, что это само по себе странно (пользователям удобно сопоставлять несколько записей одновременно, но по бух. учету правильнее дату сопоставления брать отдельно по каждой паре сопоставляемых проводок), так еще и при этом некорректно срабатывает отмена сопоставления...
__________________
I could tell you, but then I would have to bill you.
За это сообщение автора поблагодарили: byte (1).
Старый 19.03.2013, 17:38   #10  
twilight is offline
twilight
MCTS
MCBMSS
 
880 / 237 (9) ++++++
Регистрация: 17.10.2004
Адрес: Королёв
Нашел как исправить: Реверс сопоставлений
__________________
I could tell you, but then I would have to bill you.
Старый 02.04.2013, 18:37   #11  
byte is offline
byte
Участник
 
36 / 31 (2) +++
Регистрация: 21.08.2007
Цитата:
Сообщение от byte Посмотреть сообщение
После запуска переоценки я обнаружил, что она корректирует закрытые проводки.
По-видимому проблема, описанная в первом посте была вызвана именно переоценкой курсовых по закрытым проводкам. Во избежание этого рекомендую добавить в запросы CustRateAdjustment и VendRateAdjustment (возможно и EmplRateAdjustment_RU) критериев по полю Closed = 0.
Приведу код, который позволил сторнировать неправильные корректировки нереализованной курсовой. Для его работы требуется сделать public метод postExchAdj класса CustVendExchAdjustment_W.
X++:
CustTrans       custTrans,
                    custTrans2,
                    custTransNew;
    CustSettlement  custSettlement,
                    custSettlement2;
    CustTransOpen   custTransOpen,
                    custTransOpen2;
    LedgerTrans     ledgerTrans;
    ExchRate        exchRate;

    CustVendExchAdjustment_W    custVendExchAdjustment;
    CustVendTransSettlement     custVendTransSettlement;
    CustVendSettle              custVendSettle;
    CustVendExchAdj             custVendExchAdj;
    CustVendExchAdjTrans        custVendExchAdjTrans;
    LedgerVoucherGroup          ledgerVoucherGroup;
    LedgerVoucher               ledgerVoucher;
    LedgerVoucherObject         ledgerVoucherObject;

    TransDate                   transDate   = 31\03\2013;
    Voucher                     voucher;
    Set                         set = new Set(types::Container);
    SetIterator                 si;
    ;
while select forupdate custTrans where
            custTrans.TransType     != LedgerTransType::ExchAdjustment  &&
            custTrans.CurrencyCode  != "RUR"
        notexists join custTransOpen2 where
            custTransOpen2.RefRecId == custTrans.RecId
    {
        if(custTrans.AmountMST != custTrans.SettleAmountMST - custTrans.ExchAdjustment)
        {
            if(custTrans.AmountMST == custTrans.SettleAmountMST - custTrans.CustExchAdjustmentRealized)
            {
                info(strfmt("Расходится на нереализованную курсовую;%1;%2;%3", custTrans.Voucher, custTrans.RecId, custTrans.TransDate));

                while select custSettlement where
                        custSettlement.TransRecId   == custTrans.RecId              &&
                        custSettlement.ExchAdjustment
                    join custTrans2 where
                        custTrans2.Voucher          == custSettlement.OffsetTransVoucher    &&
                        custTrans2.TransType        == LedgerTransType::ExchAdjustment      &&
                        custTrans2.CustExchAdjustmentUnrealized
                {
                    set.add([custTrans.RecId, custTrans2.RecId]);
                }
            }
            else
            {
                info(strfmt(";%1;%2;%3", custTrans.Voucher, custTrans.RecId, custTrans.TransDate));
            }
        }
    }

    ttsbegin;
    si = new SetIterator(set);
    while(si.more())
    {
        custTrans = CustTrans::find(conpeek(si.value(), 1), true);
        custTrans2 = CustTrans::find(conpeek(si.value(), 2));

        custVendTransSettlement = CustVendTransSettlement::construct(SysModule::Cust);
        custVendExchAdj         = new CustExchAdj();
        custVendExchAdjTrans    = CustVendExchAdjTrans::construct(SysModule::Cust, custVendExchAdj);
        custVendExchAdjustment  = CustVendExchAdjustment_W::newFromExchAdj(custVendExchAdj, custVendExchAdjTrans);
        custVendExchAdjustment.setCustVendTransSettlement(custVendTransSettlement);
        custVendExchAdjustment.parmTransactionDate(transDate);
        custVendExchAdjustment.setSettlementGroupPlaceHolder(1);

        ledgerVoucher = LedgerVoucher::newLedgerPost(   DetailSummary::Summary,
                                                        SysModule::Cust,
                                                        "" );
        ledgerVoucher.parmCompanyId(curext());

        //voucher = NumberSeq::newGetNum(CustParameters::numRefCustExchAdjVoucher()).num();
        voucher = custTrans2.Voucher;
        ledgerVoucherObject = LedgerVoucherObject::newVoucher(  voucher,
                                                                transDate,
                                                                SysModule::Cust,
                                                                LedgerTransType::ExchAdjustment,
                                                                true );

        ledgerVoucher.addVoucher(ledgerVoucherObject);

        custVendExchAdjustment.parmLedgerVoucher(ledgerVoucher);

        exchRate                          = ExchRates::findExchRateDate(custTrans.CurrencyCode,
                                                                        custVendExchAdjTrans.exchrateDate(custTrans)).ExchRate;

        custTrans.LastSettleVoucher  = ledgerVoucher.lastVoucher();
        custTrans.LastSettleCompany  = ledgerVoucher.parmCompanyId();
        custTrans.LastExchAdjVoucher = custTrans.LastSettleVoucher;
        custTrans.LastExchAdjRate    = exchRate;
        custTrans.LastExchAdj        = transDate;
        custTrans.LastSettleDate     = custTrans.LastExchAdj;
        custTrans.update();

        custVendExchAdjustment.postExchAdj( custTrans2.CustExchAdjustmentUnrealized,
                                            custTrans,
                                            true,
                                            false,
                                            "",
                                            datenull(),
                                            0,
                                            NoneTableTrans::Transaction,
                                            custTrans.Dimension,
                                            custTrans.PostingProfile,
                                            false,
                                            "",
                                            0,
                                            false,
                                            custTrans,
                                            custTrans,
                                            voucher );

        custSettlement2 = custVendExchAdjustment.parmCustVendSettle().updateTransaction_W(custTrans, null);
        custVendTransSettlement.addSettlement(custSettlement2, 1, custTrans.TransType);

        ledgerVoucher.end();
        custVendTransSettlement.post();

        si.next();
    }
    ttscommit;
Старый 03.04.2013, 10:16   #12  
twilight is offline
twilight
MCTS
MCBMSS
 
880 / 237 (9) ++++++
Регистрация: 17.10.2004
Адрес: Королёв
Цитата:
Сообщение от byte Посмотреть сообщение
По-видимому проблема, описанная в первом посте была вызвана именно переоценкой курсовых по закрытым проводкам. Во избежание этого рекомендую добавить в запросы CustRateAdjustment и VendRateAdjustment (возможно и EmplRateAdjustment_RU) критериев по полю Closed = 0.
Вообще, в переоценке курсовых по закрытым проводкам нет ничего криминального. Так как допустим, сопоставили мы накладную с оплатой в текущем периоде. А переоценку курсовой на конец прошлого периода сделать забыли. А теперь хотим получить корректную отчетность на конец прошлого периода с учетом курсовых.
__________________
I could tell you, but then I would have to bill you.
За это сообщение автора поблагодарили: byte (1).
Старый 03.04.2013, 16:43   #13  
byte is offline
byte
Участник
 
36 / 31 (2) +++
Регистрация: 21.08.2007
Цитата:
Сообщение от twilight Посмотреть сообщение
Вообще, в переоценке курсовых по закрытым проводкам нет ничего криминального. Так как допустим, сопоставили мы накладную с оплатой в текущем периоде. А переоценку курсовой на конец прошлого периода сделать забыли. А теперь хотим получить корректную отчетность на конец прошлого периода с учетом курсовых.
Спасибо за комментарий. Проблема в том, что после этой процедуры в текущем периоде сумма сопоставления + курсовая не сходится с суммой проводки. Но не исключено, что это относится только к нашему приложению.
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
передача бинарных файлов с клиента на AOS и обратно corvax DAX: Программирование 9 01.04.2014 15:05
Странное Периодическое и Ручное Сопоставление проводок клиента в Акс 2009 Aquarius DAX: Функционал 3 17.05.2012 01:53
Как из X++ запустить клиента AX 2009 с минимизированным окном? gl00mie DAX: Программирование 8 13.07.2011 00:36
сопоставление оплат клиента, переносов сальдо-поле накладная в общем журнале? Aquarius DAX: Функционал 3 28.01.2009 12:51
Определение - открытая проводка? sguryev DAX: Функционал 2 12.12.2001 07:57
Опции темы Поиск в этой теме
Поиск в этой теме:

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

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

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

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