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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 18.06.2009, 11:55   #1  
ena_ax is offline
ena_ax
Участник
 
254 / 46 (2) +++
Регистрация: 06.12.2006
Отмена Курсовой по поставщика. Возможно?
Коллеги,
В системе провели расчет курсовой по поставщикам поздней датой. Теперь при расчете более ранней датой, система выдает ошибку "
Курсовая разница как в 30.10.2008 операции ГК-007218 невозможна, поскольку курсовая разница по этой операции уже была посчитана как в 02.03.2009."

Подскажите, возможно ли отменить Расчитанную курсовую разницу по поставщику?
Старый 19.06.2009, 15:46   #2  
ena_ax is offline
ena_ax
Участник
 
254 / 46 (2) +++
Регистрация: 06.12.2006
По отсутствию ответов делаю вывод что стандартными средствами удалить или отменить рассчитанную курсовую разницу по поставщику невозоможно.

Тогда второй вопрос.

Если удалить программно: по Voucher курсовой, удалить VendTrans и LedgerTrans получу я так скаазть отмену Курсовой? Или надо еще какие-то таблицы чистить?
Старый 20.06.2009, 21:22   #3  
Андре is offline
Андре
Moderator
Сотрудники компании GMCS
 
2,375 / 464 (20) +++++++
Регистрация: 03.12.2001
Цитата:
Подскажите, возможно ли отменить Расчитанную курсовую разницу по поставщику?
Насколько я знаю, стандартной реализации не существует. На мой взгляд, проще реализовать удаление посчитанной курсовой, нежели писать свою реализацию операции отмены.

Цитата:
Если удалить программно: по Voucher курсовой, удалить VendTrans и LedgerTrans получу я так скаазть отмену Курсовой? Или надо еще какие-то таблицы чистить?
Чистить придется на порядок больше. Например, в CustTransOpen придется изменять AmountMST на величину соответствующей проводки по курсовой. Для CustTrans придется корректировать поле ExchAdjustment. Там же придется откорректировать LastSettleVoucher и LastSettleDate. Но это только для начальных размышлений.
Старый 22.06.2009, 08:22   #4  
Yury J is offline
Yury J
Участник
Аватар для Yury J
 
11 / 34 (2) +++
Регистрация: 30.10.2007
В стандартной функциональности отмена пересчета нереализованных курсовых разниц при помощи периодической операции модуля отсутствует. Это относится к Microsoft NavisionAxapta 3.0 SP6 Microsoft Dynamics AX 4.0 SP2.


Для ручного \ программного способа, в Вашем случае расчета нереализованной курсовой по поставщикам необходимо:
  1. Почистить последние операции LastSettleVoucher и даты LastSettleDate (для 4-ки) сопоставления, сумму курсовой разницы ExchAdjustment, последнюю курсовую разницу LastExchAdj, последнюю операцию по курсовой разнице LastExchAdjVoucher(для 4-ки), последнюю ставку по курсовой разнице LastExchAdjRate (для 4-ки), и нереализованную курсовую разницу VendExchAdjustmentUnrealized, в таблице VendTrans
  2. В таблице открытых проводок по поставщику VendTransOpen для поля AmountMST по ссылке RefRecId для соответствующего поля RecId в проводках поставщика переписать значение поля AmountMST из VendTrans.
  3. Удалить записи в таблице сопоставления по поставщику VendSettlement по соответствующим сопоставляемым значениям поля Voucher и по ссылке RefRecId для соответствующих полей RecId таблицы VendTrans.
  4. Удалить по значениям полей LastSettleVoucher, Voucher, TransDate записи в таблицах VendTrans и LedgerTrans касаемые расчета нереализованной курсовой (значение поля VendExchAdjustmentUnrealized таблицы VendTrans не равно нулю, значение поля VendExchAdjustmentRealized таблицы VendTrans равно нулю, значение поля TransType таблицы VendTrans равно ExchAdjustment: VendTrans. TransType == LedgerTransType:: ExchAdjustment)
По этой схеме получим следующий код Job-а для стандарта:
X++:
static void CorrVendExchAdj(Args _args)
{
    VendTable      vtb;
    VendTrans      vtAc;
    VendTrans      vtEx;
    VendTrans      vt;
    VendTrans      vtr;
    VendTransOpen  vto;
    VendSettlement vtsAc;
    VendSettlement vts;
    LedgerTrans    ledgerTransAc;
    LedgerTrans    ledgerTransCorr;
    TransDate      dt = 22\06\2009; // Дата отменяемого пересчета НКР
    int            i;
    ;
    if (box::okCancel("Вы уверены в необходимости отмены пересчета нереализованных курсовых разниц поставщиков", DialogButton::Cancel) == DialogButton::Ok)
    {
    ttsbegin;
     while select vtb
       where vtb.AccountNum
     {
     while select forupdate vtAc
       where vtAc.AccountNum                   == vtb.AccountNum    &&
             vtAc.LastSettleDate               == dt                &&
             vtAc.VendExchAdjustmentUnrealized != 0        &&
             vtAc.ExchAdjustment               != 0
       join forupdate vtEx
           where vtEx.LastSettleVoucher == vtAc.Voucher                    &&
                 vtEx.TransType         == LedgerTransType::ExchAdjustment &&
                 vtEx.TransDate         == dt
       {
         while select forupdate ledgerTransAc
          where ledgerTransAc.Voucher   == vtEx.Voucher           &&
                ledgerTransAc.TransType == LedgerTransType::ExchAdjustment &&
                ledgerTransAc.TransDate == dt
          join forupdate ledgerTransCorr
            where ledgerTransCorr.Voucher       == ledgerTransAc.Voucher           &&
              ledgerTransCorr.BondBatchTrans_RU == ledgerTransAc.BondBatchTrans_RU &&
              ledgerTransCorr.BondBatch_RU      == ledgerTransAc.BondBatch_RU      &&
              ledgerTransCorr.Crediting         == NoYes::Yes
          {
            ledgerTransAc.doDelete();
            ledgerTransCorr.doDelete();
          }
          while select forupdate vtsAc
            where vtsAc.OffsetTransVoucher == vtEx.Voucher &&
                  vtsAc.TransRecId         == vtAc.RecId
            join forupdate vts
            where vts.OffsetTransVoucher == vtAc.Voucher &&
                  vts.TransRecId         == vtEx.RecId
          {
            vtsAc.doDelete();
            vts.doDelete();
          }
          select firstonly forupdate vto
           where vto.RefRecId == vtAc.RecId;
          vto.AmountMST = vtAc.AmountMST;
          vto.doUpdate();
          vtEx.doDelete();
          vtAc.LastSettleVoucher = '';
          vtAc.LastSettleDate = dateNull(); // for AX 4.0
          vtAc.ExchAdjustment = 0;
          vtAc.LastExchAdj = dateNull();
          vtAc.LastExchAdjVoucher = ''; // for AX 4.0
          vtAc.LastExchAdjRate = 0;     // for AX 4.0
          vtAc.VendExchAdjustmentUnrealized = 0;
          vtAc.doUpdate();
       i++;
 
       }
    }
    }
    Info(strfmt("Отмена пересчета нереализованных курсовых разниц поставщиков выполнена. %1 проводок обработано", i));
    ttscommit;
}

При наличии реализованной курсовой разницы пересчитанной сопоставлением проводок и нереализованной курсовой разницы в разных налоговых периодах стандартный функционал отрабатывает корректно не для всех сценариев. И по этому поводу Microsoft NavisionAxapta 3.0 приходилось дорабатывать. Например:



Расчет реализованной и нереализованной курсовой разницы:
  1. Проводим валютную накладную по поставщику (клиенту). В следующем месяце проводим валютный платеж по поставщику (клиенту). Сопоставляем проводки вручную либо сопоставление происходит в автоматическом режиме.
  2. Проводим переоценку задолженности по контрагенту на конец месяца, в котором была сделана накладная.
  3. При расчете нереализованной курсовой разницы к переоценке принимается только открытая сумма накладной. Хотя на дату переоценки платежа еще нет.
Получается, что при переоценке задолженности дата сопоставления не анализируется.
Решение: Данную ситуацию легко избежать, если регистрировать в системе операции в их хронологической последовательности. Если выполнить переоценку в последний день месяца не удается, то рекомендуется отключать автоматическое сопоставление проводок по контрагенту, и не выполнять ручного сопоставления до того момента, пока переоценка задолженности по этому контрагенту на конец месяца не будет выполнена в системе.
Механизм расчета курсовой разницы переработан в следующей версии системы - Microsoft Dynamics AX 4.0. Но не достаточно для того, чтобы не возникало ошибок данных. При определённых сценариях система формирует бухгалтерские проводки не по требованию Налогового законодательства. Например:



Некорректное закрытие проводок с разными профилями разноски:
  1. Разнесена Накладная по Закупке Профиль разноски – MDCStd. Итоговый счет для Группы поставщиков ExtFrg 60.1101. Сформировалась бухгалтерская проводка: 01.11.2007; Д 41.0100 К 60.1101; 210,00 EUR, 7350,00 руб. Валюта: EUR. Курс: 35 руб./EUR.
  2. Разнесена Кредит-Нота по этой Закупке Профиль разноски – CreditNote. Итоговый счет для Группы поставщиков ExtFrg 76.5500. Сформировалась бухгалтерская проводка: 05.11.2007; Д 76.5500 К 41.0100; 210,00 EUR, 7560,00 руб. Валюта: EUR. Курс: 36 руб./EUR.
  3. Выполнено сопоставление проводок Накладной и Кредит-ноты по Закупке. Сформировались бухгалтерские проводки: 05.11.2007; Д 91.2012 К 60.1101; 210,00 руб. Проводка отрицательной курсовой разницы выполнена без ошибок. 05.11.2007; Д 60.1101 К 76.5500; 7560,00 руб. Текст проводки - (закрытие счета). Это закрывающая проводка привела к увеличению остатка по Дебету счета 60.1101 на 7560,00 руб., и к увеличению остатка по Кредиту счета 76.5500 на 7560,00 руб.
Решение: В \Classes\CustVendSettle_Vend\balancePostingProfile:
X++:
void balancePostingProfile(CustVendTrans    _custVendTransDebet,
                           CustVendTrans    _custVendTransCredit,
                           AmountMST        _amountMST)
{
    LedgerBondClient_RU     ledgerBondClient = ledgerVoucher.findLedgerVoucherObject().ledgerBondClient_RU();
    LedgerVoucherTransObject ledgerVoucherTransObject;
    LedgerVoucherObject      ledgerVoucherObject;
    LedgerAccount   accountNumDebet;
    LedgerAccount   accountNumCredit;
    CustVendSettlePostingLog_RU postingLog;
    ;
    //  fix   -->
    //if (_custVendTransDebet.postingProfile != _custVendTransCredit.postingProfile)
    if ((_custVendTransDebet.postingProfile != _custVendTransCredit.postingProfile)  &&
        ((_custVendTransDebet.TransType  == LedgerTransType::Purch) &&
         (_custVendTransCredit.TransType != LedgerTransType::Purch)))
    //  fix   <--
    {
        ledgerVoucherObject  = this.createLedgerVoucherObject_RU();
        ledgerBondClient     = ledgerVoucherObject.ledgerBondClient_RU();
        accountNumDebet      = VendLedgerAccounts::sumAccount(_custVendTransDebet.accountNum,
                                                              _custVendTransDebet.postingProfile);
        accountNumCredit     = VendLedgerAccounts::sumAccount(_custVendTransCredit.accountNum,
                                                              _custVendTransCredit.postingProfile);
        if (accountNumDebet != accountNumCredit)
        {
            ledgerVoucherTransObject = LedgerVoucherTransObject::newCreateTrans(ledgerVoucher.findLedgerVoucherObject(),
                                                                                LedgerPostingType::VendPayment,
                                                                                accountNumDebet,
                                                                                _custVendTransDebet.dimension,
                                                                                Companyinfo::standardCurrency(),
                                                                                _amountMST,
                                                                                _custVendTransDebet.recId);
            ledgerVoucherObject.addTrans(ledgerVoucherTransObject);
            ledgerVoucherTransObject = LedgerVoucherTransObject::newCreateTrans(ledgerVoucher.findLedgerVoucherObject(),
                                                                                LedgerPostingType::VendPayment,
                                                                                accountNumCredit,
                                                                                _custVendTransCredit.dimension,
                                                                                Companyinfo::standardCurrency(),
                                                                                -_amountMST,
                                                                                _custVendTransCredit.recId);
            ledgerVoucherObject.addTrans(ledgerVoucherTransObject);
            if (isConfigurationkeyEnabled(configurationkeynum(CustVendJournalizeSettlementTrans_W)))
            {
                CustVendTrans::balancePostingProfile_ru(ledgerVoucherTransObject,
                                                        _custVendTransDebet,
                                                        _custVendTransCredit,
                                                        companyInfo::standardCurrency(),
                                                        _custVendTransDebet.dimension,
                                                        _custVendTransCredit.dimension,
                                                        _amountMst,
                                                        _amountMst);
                postingLog = New CustVendSettlePostingLog_RU(CustVendTransPostingLogType_RU::Balance);
                postingLog.parmVoucher(ledgerVoucher.lastVoucher());
                postingLog.parmTransDate(ledgerVoucher.lastTransDate());
                postingLog.parmCorrect(ledgerVoucher.parmCorrection(ledgerVoucher.lastVoucher()));
                postingLog.parmTransRecId  (_custVendTransDebet.RecId);
                postingLog.parmOffsetRecId (_custVendTransCredit.RecId);
                postingLog.parmOffsetDimension(_custVendTransCredit.Dimension);
                postingLog.parmReverseTrans(true);
                postingLog.createTrans(LedgerPostingType::CustPayment,
                                       accountNumDebet,
                                       accountNumCredit,
                                       _custVendTransDebet.dimension,
                                       CompanyInfo::standardCurrency(),
                                       _amountMst,
                                       _amountMST,
                                       - ledgerVoucherTransObject.parmAmountMSTSecondary());
            }
            if (ledgerBondClient)
            {
                ledgerBondClient.bondVRef2VRef(ledgerBondClient.lastVrefId(),
                                               ledgerBondClient.lastVrefId(-1));
            }
        }
    }
}
__________________
“Правильно поставленная задача – оказывается наполовину решена” Мой шеф по диплому Анатолий Алексеевич Маркилов.
Мой статус: В поиске хорошо оплачиваемой работы.
За это сообщение автора поблагодарили: BOAL (1), ena_ax (1).
Теги
курсовая разница, отмена, сторно

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Отмена курсовой разницы по Поставщику tolstjak DAX: Функционал 6 15.10.2008 08:46
Отмена закрытия склада. AlexeyBP DAX: Функционал 2 16.01.2008 07:47
Перенос задолженности с одного поставщика/клиента на другого Лучана DAX: Функционал 2 29.06.2006 16:10
Ограничение по номеру накладной для поставщика BigMike DAX: Функционал 2 16.12.2004 16:39
Вопрос: Для чего служит скрещивание поставщика с клиентом!? Хемуль DAX: Функционал 4 30.04.2004 19:05

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

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

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