Показать сообщение отдельно
Старый 22.05.2012, 12:39   #1  
plumbum is offline
plumbum
Участник
Соотечественники
 
182 / 86 (3) ++++
Регистрация: 07.12.2007
Адрес: Vienna, AT
! Изменения остатков в строке заказа на перемещение
Вот вчера наткнулся на такую особенность:

Если в строке заказа на продажу изменить в коде количество в полях остатков (RemainInventPhysical / RemainSalesPhysical) а потом просто вызвать
X++:
salesLine.update()
то проводки будут соотвественно откорректированы.

Если жи такую же операцию произвести со строкой заказа на перемещение, при этом поправив оба количества: Отгрузить остаток и Получить остаток, а потом вызвать обновления буффера, то проводки будут неправильно откорректированы, если количество остатка обнулить

X++:
inventTransferLine.QtyRemainShip       -= qty;
inventTransferLine.QtyRemainReceive -= qty; 
/*или так inventTransferLine.synchronizeQtyRemainReceive();*/
invnetTransferLine.update();
дело в том, что строка заказа на перемещение имеет 4 складские проводки: ИЗ СКЛАДА-> Транзит ИЗ / Транзит НА -> НА СКАЛАД.
При этом, как известно, проводки Транзита смаркированы между собой.
Так вот, при удалении проводки Транзит НА будет удалена маркировка и вызван метод
X++:
invnetTransferLine.doUpdate()
, что в последствии приводит к тому, что количества preEstimated и transEstimated в классе InventUpd_Estimated оба равны нулю и тогда проводки Транзит ИЗ и НА СКАЛАД не удаляются!!!

К счастью есть чудесный метод, который используется из функции на форме:

X++:
inventTransferLine.updateDeliverRemainder()
Приведу часть его кода, чтобы наглядно показать, где разработчики перехватывают и предотвращают вышеописанное поведение:

X++:
   movementFrom = InventMovement::construct(this);

    estimatedFrom = InventUpd_Estimated::newInventMovement(movementFrom);
    estimatedFrom.updateNow();

    estimatedTransitTo = InventUpd_Estimated::newInventMovement(InventMovement::construct(this,InventMovSubType::TransferOrderTransitTo));
    estimatedTransitTo.updateNow();

    this.QtyRemainReceive  = qtyRemainReceive; /*здесь происходит принудительное восстановление остатка*/
    movementTransitFrom = InventMovement::construct(this,InventMovSubType::TransferOrderTransitFrom);

    estimatedTransitFrom = InventUpd_Estimated::newInventMovement(movementTransitFrom);
    estimatedTransitFrom.updateNow();

    estimatedTo = InventUpd_Estimated::newInventMovement(InventMovement::construct(this,InventMovSubType::TransferOrderTo));
    estimatedTo.updateNow();
Код совпадает и в AX 4.0 и в AX 2012.

Удачи в разработке!
__________________
http://www.axdevposts.blogspot.com
Пришел, уведел.... отойди, дай другому увидеть!