20.07.2010, 02:16 | #1 |
Участник
|
Создание, изменение InventTrans Ax4Sp2
Добрый вечер,
Существует модификация, при создании InvenPickingListJournalTable/Line. Записи в Line суммируются. Тоесть из нескольких sales orders, получается один InvenPickingListJournalTable. Линии суммируются по ItemId в случае совпадающих InventDimId. Отдельно сохраняются ссылки на все InventTrans и Qty для каждой sales line входящей в InvenPickingListJournalLine. Есть задача модифицировать эти InventTrans - inventDimId, qty, и создать новые на основе существующих если необходимо, и зарезервировать относительно нового InventDimId. SalesLine изменять нельзя. Вопрос такой, как правильнее это сделать. Можно ли просто select'om выбрать нужные InventTrans и изменить, как создать новую InventTrans, можно ли её инициализировать от другой и просто поменять inventDimId, qty и сделать insert. Или правильнее использовать какие-то классы. Нашел в SalesLinetype.insert() такой код X++: estimated = InventUpd_Estimated::newInventMovement(InventMovement::construct(salesLine, InventMovSubType::None, childBuffer)); estimated.updateNow(); С Уважением, Денис |
|
20.07.2010, 10:21 | #2 |
Читатель
|
вопрос, конечно, интересен...
Не какие-то, а классы InventUpd_*
Именно они и служат для манипуляций складскими проводками. Именно их работу вам предстоит изучить перед тем, как выполнять ваше задание. И, да, удачи вам |
|
20.07.2010, 12:09 | #3 |
Участник
|
Спасибо за наводку.
Думаю что, поменять dimensions в InventTrans можно с помощью InventUpd_ChangeDimension. Qty и резервацию через InventUpd_Reservation. Интересно как с созданием новой inventTrans. Тоесть если я создаю новую salesLine или InventPickingListJournalLine, inventTrans создается с помощью InventUpd_Estimated, и она основана на этой самой salesLine. Как быть если надо создать InventTrans от InventTrans. |
|
20.07.2010, 12:59 | #4 |
Сам.AX
|
Согласен с b_nosoff
От себя добавлю, что изменять проводки в InventTrans вручную крайне не рекомендуется ввиду всевозможных нехороших последствий, а именно проблем с количеством номенклатур в наличии, заказанных и зарезервированных. А по вопросу: скажите с какой целью вы собираетесь создавать новые проводки? И с какой целью вы их меняете? Для каких манипуляций с журналом отгрузочных накладных это необходимо? Поставьте задачу конкретнее =) |
|
20.07.2010, 13:17 | #5 |
Участник
|
Задача - резервировать суммарную InvenPickingListJournalLine относительно одной inventDim той где есть максимальное наличие ItemId. Тоесть надо модифицировать существующие InventTrans.
В принципе наметил примерно так пока. X++: InventTransSplit::newInventTransSplit(inventTrans.RecId).run(); //или InventUpd_ChangeDimension::updateForceDimInventTrans(InventMovement::construct(inventTrans, InventMovSubType::None, null), qty, inventTrans.inventDim(), InventDim::find(''), false, true,false); //потом inventMovement = InventMovement::construct(inventTrans); if(inventMovement) { reservation = InventUpd_Reservation::newMovement(inventMovement, _qty , _mayBeReduced, _forceNotReserveOrdered, _showInfo); reservation.updateNow(); } |
|
20.07.2010, 19:28 | #6 |
Member
|
Цитата:
Сообщение от rDenis2
...
Существует модификация... из нескольких sales orders, получается один InvenPickingListJournalTable. ... Цитата:
Сообщение от rDenis2
...
Линии суммируются по ItemId в случае совпадающих InventDimId. ... Судя по вашему описанию модификация у вас губительная для стандартного функционала, и лучше подумать над тем, чтобы сделать ее корректнее. Заодно и решите вашу проблему.
__________________
С уважением, glibs® |
|
20.07.2010, 19:52 | #7 |
Участник
|
Цитата:
Модификация большая, InventPickingListJournalTable создается нестандартным способом, но в конечном итоге надо изменять InventTrans оригинальных salesLine. |
|
21.07.2010, 12:48 | #8 |
Программатор
|
Я так понимаю у вас проводки строк заказа в статусе "в заказе". почему просто не перебирать все проводки строки заказа в нужном статусе и резервировать в нужной вам аналитике и с нужным количеством? Строки заказов вы знаете. Класс InventUpd_Reservation поможет это вам сделать. Если в проводке количество больше чем нужно зарезервировать, то по-моему проводка сама разделится на две - зарезервированную и заказанную. Хотя возможно я что то не понял и подзабыл
Последний раз редактировалось Sada; 21.07.2010 в 12:57. |
|
21.07.2010, 15:00 | #9 |
Участник
|
Так и делаю, только если делаешь InventMovement, на основе Inventtrans, он в конце концов всё равно делается на основе salesLine, в InventMovemnet:construct(). InventMov_Sales. На данный момент суммарная InventPickigListJournalLine делается на основе первой, тоесть все остальные прибавяются к ней. Соответсвенна она не удаляется, и InventTrans идет с типом TransChildType Picking list.Тоесть при
X++: reservation = InventUpd_Reservation::newMovement(inventMovement, _qty , _mayBeReduced, _forceNotReserveOrdered, _showInfo); reservation.updateNow(); ищутся InventTrans с X++: inventTrans.TransChildType == None
inventTrans.TransChildRefId == '' Ну и дальше что то типа такого X++: server static void makeReservation(Common _buffer, InventQty _qty, InventDim _inventDim, inventMovement _inventMovement = null, boolean _mayBeReduced =true, boolean _forceNotReserveOrdered = false, boolean _showInfo = true ) { InventMovement inventMovement = _inventMovement; InventUpd_Reservation reservation; InventDim inventDim; InventTrans inventTransLocal; Common _newBuffer; ; if(!inventMovement) { switch (_buffer.TableId) { case tablenum(InventTrans) : inventTransLocal = _buffer; switch (inventTransLocal.TransType) { case InventTransType::Sales : _newBuffer = inventTransLocal.salesLine(); inventMovement = Inventmovement::construct(_newBuffer); break; } break; default: inventMovement = InventMovement::construct(_buffer); break; } } if(_inventDim && inventMovement) { inventDim.data(_inventDim); inventMovement.inventdim(inventDim); } if(inventMovement) { reservation = InventUpd_Reservation::newMovement(inventMovement, _qty , _mayBeReduced, _forceNotReserveOrdered, _showInfo); reservation.updateNow(); } } |
|
21.07.2010, 15:51 | #10 |
Программатор
|
Все я понял что вам нужно. Все что я говорил не верно... делете меня
в каком статусе находятся проводки строк заказов? скомплектовано? Последний раз редактировалось Sada; 21.07.2010 в 16:03. |
|
21.07.2010, 21:09 | #11 |
Участник
|
Строки заказа это sales order?
если да, то они в нетронутом состоянии. Суммируются, только inventPickingListJournalLine. Вообщем как я описал выше, работает, как надо. Добавлю что для InventTrans со статусом reserved pshysical, делаю X++: reservation = InventUpd_Reservation::newMovement(inventMovement, +salesLineLocal.reservedPhysical() , _mayBeReduced, _forceNotReserveOrdered, _showInfo); reservation.updateNow(); |
|