|  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(); | 
|  |