|
24.05.2007, 11:02 | #1 |
Участник
|
Не срабатывает процедура снятия резерва
Преамбула:
В таблицу InventTrans добавили поле "истечение срока резерва". Выставляем из параметров, и т.д. Соответствено написали запрос строк с истекшим сроком резервирования с суммированием по количеству. соответственно на эту форму прикручена кнопка снятия резерва. Есть идентичных механизм в виде периодической операции, но не суть важно. Амбула: Прописанный алгоритм не работает... Сверился с тем, что есть здесь: http://axapta.mazzy.ru/lib/reserve_from_code/ - у нас идентично. Может, кто чего подскажет? X++: void clicked() { InventMovement inventMovement; InventUpd_Reservation inventUpdReservation; InventTrans tIT; ; super(); while select tIT where tIT.InventTransId==InventTrans.InventTransId { inventMovement = InventMovement::construct (tIT); inventUpdReservation = InventUpd_Reservation::newMovement(inventMovement, -tIT.Qty, false ); inventUpdReservation.updateNow(); } InventTrans_DS.executequery(); } |
|
24.05.2007, 11:22 | #2 |
Участник
|
Посмотрите на складские аналитки. Они у вас в строке заказа (ну или какого другого Movement) совпадают или в проводках есть значения аналитик, которых нет в строке заказа, например в строке заказа нет партий, а резерв по партиям?
Дело в том, что newMovement инициализирует критерий по строке Movement и, соответственно, пропускает проводки с другими аналитиками. |
|
24.05.2007, 11:31 | #3 |
Участник
|
Проверил - он на основани моего InventMovement в конце концов подтягивает аналитики непосредственно из заказа. Соответственно, аналитики совпадают. Заодно сверил, убедился - действительно ве ок.
Может, я не туда смотрю, проверяя резерв? Если есть строка складских проводок со статусом "Физ. зарезервировано", привязанная к InventTransId строки заказа - это необходимый и достаточный фактор того, что строка зарезервирована? Или может, у меня просто запрос неправильный? |
|
24.05.2007, 11:55 | #4 |
Участник
|
Вобщем, достаточный (правда проводка может быть не одна). Кстати, если есть подчиненный буфер, то резерв снять с поводки не получится (например, есть заказ на отгрузку - без его удаления резерв не снять).
Я понимаю, что аналитики берутся из заказа. Я имел ввиду следующее: В заказе указан только склад. Кроме склада для номенклатуры активна аналитика Серийный номер или Партия, естественно резерв идет с учетом партий. Вот в таком случае просто вызвав InventUpd_Reservation::newMovement для создания объекта резерв не снимешь, так как фильтрация будет осуществляться для пустой партии, а в проводке она есть. |
|
24.05.2007, 12:02 | #5 |
Участник
|
в периодической операции movement создается из строки заказа. тоже не срабатывает....
|
|
24.05.2007, 12:03 | #6 |
Участник
|
да, у нас так и есть, как Вы пишете - только у нас аналитик штук 6-7
и как тогда снимать? |
|
24.05.2007, 12:13 | #7 |
Участник
|
Если нужно снять все резервы, независимо от значений аналитик, то просто нужно дополнительно передать параметры фильтрации. Пишу по памяти, может что укажу не так:
i X++: nventDimBlank = InventDim::findOrCreateBlank(false);
inventDimParm.initFromInventDim(inventDimReg);
InventUpd_Reservation::updateReserveFromForm(_inventJTrans, inventDimBlank, inventDimParm, -qtyNow); |
|
24.05.2007, 12:58 | #8 |
Участник
|
к сожалеию, есть обязательные аналитики, поэтому вариант с пустым inventdim не прошел. сделал вот так:
X++: salesLine=SalesLine::findInventTransId(tIT.InventTransId);
inventDim = InventDim::findOrCreateBlank(false);
inventDimParm.initFromInventDim(salesLine.inventDim());
InventUpd_Reservation::updateReserveFromForm(salesLine, salesLine.inventDim(), inventDimParm, - tIT.Qty); |
|
24.05.2007, 13:08 | #9 |
Участник
|
Так этот вариант ничем не отличается от newMovement - фильтры по аналитикам так же инициируешь из строки заказа, только, в отличии от newMovement нарушаешь "путь Аксапта"
А что имеется ввиду под "обязательные аналитики" по отношению к снятию резерва? Если что-о важное, то инициируй inventDimParm как деаешь сейчас, а затем сбрось ненужные флаги. |
|
24.05.2007, 13:07 | #10 |
Участник
|
X++: while select inventTrans where inventTrans.InventTransId == salesLine.InventTransId && (inventTrans.StatusIssue == StatusIssue::ReservOrdered || inventTrans.StatusIssue == StatusIssue::ReservPhysical) { inventDim = inventTrans.inventDim(); inventDimParm.initFromInventDim(inventDim); InventUpd_Reservation::updateReserveFromForm(salesLine, inventDim, inventDimParm, inventTrans.Qty); } |
|
24.05.2007, 13:43 | #11 |
Участник
|
Есть 6 аналитик, кот-е указываеются и в заказе, и есть одна - ерийный номер, которая, раз-ся, определяется только потом. соответственно, в резервировании присутствует только эта "лишняя" аналитика
|
|
24.05.2007, 13:54 | #12 |
Участник
|
george040875
А мой вариант у вас не работает? |
|
24.05.2007, 14:27 | #13 |
Злыдни
|
А почему не использовать выборку строки заказа и передачу ее в качестве параметра в класс InventUpd_reservation::updateReserveBuffer так, чтобы резерв очистился?
__________________
люди...считают, что если техника не ломается, то ее не нужно ремонтировать. Инженеры считают, что если она не ломается, то нуждается в совершенствовании. |
|
25.05.2007, 10:27 | #14 |
Участник
|
после ряда экспериментов сработал вот такой вариант:
X++: void clrRS(InventTransId _InventTransId){ InventMovement inventMovement; InventUpd_Reservation inventUpdReservation; InventTrans tIT; InventOnHand inventOnHand; InventUpd_Picked inventUpd_Picked; InventDimParm inventDimParm; InventDim InventDim; SalesLine salesLine; Common bf; ; while select tIT where tIT.InventTransId==_InventTransId { inventMovement = InventMovement::construct (tIT); switch (tIT.StatusIssue){ case StatusIssue::ReservOrdered: case StatusIssue::ReservPhysical: InventDim=tIT.inventDim(); inventDimParm.initFromInventDim(InventDim); if(inventMovement.childBuffer().RecId) bf=InventMovement.childBuffer(); else bf=inventMovement.buffer(); InventUpd_Reservation::updateReserveFromForm(bf, InventDim, inventDimParm, tIT.Qty); break; case StatusIssue::Picked: inventOnHand = inventOnHand::newItemDim(tIT.ItemId,tIT.inventDim(),inventDimParm,false); inventDimParm.initPhysicalUpdate(inventMovement.dimGroupId()); inventUpd_Picked = InventUpd_Picked::newParameters(inventMovement,tIT.inventDim(),inventDimParm,tIT.inventDim(),inventDimParm, - tIT.Qty); inventUpd_Picked.updateNow(); break; } } } |
|
|
|