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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 21.11.2008, 16:34   #1  
DenisS is offline
DenisS
Участник
 
65 / 24 (1) +++
Регистрация: 01.09.2003
InventTransIdReturn и Закрытие склада
Доброго времени суток!
Axapta 3.0 sp 5

Наткнулся на баг в закрытии склада в случае заполнения номера возвращенного лота (InventTransIdReturn) в приходной проводке НЕ по заказу. В этом случае себестоимость приходной проводки не корректируется.

В классе InventCostItemDim есть 2 основных метода, которые отвечают за коррекцию приходной возвратной проводки:


Этот метод корректируе все приходные проводки по заказам с заполненным лотом возврата перед выполнением закрытия по номенклатуре
X++:
void updateItemReturnAdjustments(ItemId _itemId = inventCostList.ItemId)
{
    InventTrans     inventTrans;
    InventTrans     issue;
    Price           costPrice;
    CostAmount      adjustment;
    ;

    while select sum(Qty), sum(CostAmountAdjustment), sum(CostAmountPosted) from inventTrans
        index hint StatusItemIdx
        group by   inventTransId, inventTransIdReturn
        where inventTrans.ItemId                == _itemId                      &&
              inventTrans.ValueOpen             == inventTransOpen::Yes         &&
              inventTrans.StatusReceipt         == StatusReceipt::Purchased     &&
              inventTrans.StatusIssue           == StatusIssue::None            &&
              inventTrans.TransType             == InventTransType::Sales       &&             inventTrans.DateStatus            <= inventClosing.TransDate      &&
              inventTrans.PackingSlipReturned   == 0                            &&
              inventTrans.InventTransIdReturn   != ''
    {
        select sum(Qty), sum(CostAmountAdjustment), sum(CostAmountPosted) from issue
            index hint TransIdIdx
            where issue.InventTransId           == inventTrans.inventTransIdReturn  &&
                  issue.StatusReceipt           == StatusReceipt::None              &&
                  issue.StatusIssue             == StatusIssue::Sold                &&
                  issue.PackingSlipReturned     == 0                                &&
                  issue.InventTransIdReturn     == inventTrans.inventTransId;

        if (issue.Qty)
        {
            costPrice   = (issue.costAmountPosted + issue.costAmountAdjustment) / issue.Qty;
            adjustment  = Currency::amount(inventTrans.Qty * costPrice - inventTrans.costAmountPosted - inventTrans.costAmountAdjustment);

            if (abs(adjustment) >= inventClosing.minTransferValue && !InventAdj::isOnhandAdjusted(inventTrans.InventTransId, inventTrans.InventTransIdReturn, ''))
                this.updateTransIdReturnReceipt(inventTrans.InventTransId, inventTrans.InventTransIdReturn, costPrice);
        }
    }
}

Второй метод "протаскивает" возвратную проводку на следующий уровень расчета, но опять-таки только проводку по заказу:
X++:
protected void updateTrans(
    InventTrans     inventTrans,
    CostAmount      adjustment
    )
{
    if (adjustment)
    {
        switch (inventTrans.transType)
        {
            case InventTransType::QuarantineOrder:
                this.addkeyAdjustment(true,inventTrans.inventTransId,adjustment,'',inventTrans.voucher);
                break;

            case InventTransType::InventTransfer:
            case InventTransType::WMSTransport:
                this.addkeyAdjustment(true,inventTrans.inventTransId,adjustment,'','');
                break;

            case InventTransType::ProdLine :
                this.addkeyAdjustment(false,inventTrans.inventTransIdFather,adjustment,'','');
                break;

            case InventTransType::BOMLine  :
                this.addkeyAdjustment(false,inventTrans.inventTransIdFather,adjustment,'','');
                break;

            default:
                if (inventTrans.inventTransIdReturn && inventTrans.qty < 0 && inventTrans.transType == InventTransType::Sales)
                    this.addkeyAdjustment(true,inventTrans.inventTransIdReturn,adjustment,inventTrans.inventTransId,'');
        }

        inventAdj::updateModule(inventTrans,adjustment,inventClosing);
    }

}
Наткнулся на эту ситуацию при попытке сторнировать расходный журнал Проводка.

Если из методов убрать условие
inventTrans.transType == InventTransType::Sales
то закрытие корректирует себестоимость возврата как мне и нужно.

У кого есть опыт подобной модификации, просьба откликнуться...
Теги
закрытие склада, коррекция себестоимости, себестоимость, склад

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Denis Fedotenko: Себестоимость и закрытие склада Blog bot DAX: База знаний и проекты 44 29.03.2010 14:54
И снова закрытие склада... Apriori DAX: Функционал 3 21.01.2008 10:03
Закрытие склада. Параметр "Спецификация" DenWolf DAX: Функционал 0 05.06.2006 14:46
Закрытие склада по заказам по которым нет приемки... netbas DAX: Функционал 3 26.11.2004 22:24
Закрытие склада в основной и вторичной валюте, отключенная корреспонденция счетов May DAX: Функционал 1 02.04.2004 13:25

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

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

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