15.03.2005, 23:22 | #1 |
Участник
|
Уважаемые господа,
Имеем: AX 3.0 SP3, авторезервирование, резервирование в закупках, нет отрицательных складов. Ситуация 1. При создании записи в salesLine с указанием значения складской аналитики (первичной), при попытке зарезервировать этот лот появляется совершенно справедливое извещение о невозможности зарезервировать количество с такой складской аналитикой. Действительно, нет в наличии и в закупках такого количества с такой аналитикой. Ситуация 2. При создании записи в salesLine с указанием другого значения складской аналитики (первичной), с которым есть достаточное количество, успешно осуществляется резервирование, например в закупке. В salesTrans этот лот со статусом «зарезервировано». После этого: Меняем значение складской аналитики для этой существующей записи в salesLine на значение из ситуации 1 (того, чего нет ни в наличии, ни в закупке). При этом НЕ ПОЯВЛЯЕТСЯ извещение о невозможности зарезервировать количество с такой складской аналитикой. А в salesTrans лот меняет статус на «в заказе» с соответствующим изменением inventDimId. Вопрос: Как заставить систему работать «неправильно», т.е. при изменении значения аналитики в ситуации 2 не смотреть отличия между двумя лотами по количеству, а повторить путь из ситуации 1, как будто лот в salesTrans только создается? К сожалению ответ на этот вопрос мне нужен быстрее, чем я докапаю inventUpdate и Ко. Если вы решали такую задачу для себя, подскажите короткий путь, пожалуйста! Спасибо. |
|
16.03.2005, 14:00 | #2 |
Участник
|
При создании строки в SalesLine в методе таблицы createLine вызывается метод checkReservation().
<div class='XPPtop'>X++</div><div class='XPP'> [color=:blue]server[/color] [color=:blue]void[/color] createLine(boolean validation = [color=:blue]false[/color], boolean initFromSalesOrderTable = [color=:blue]false[/color], boolean initFromInventTable = [color=:blue]false[/color], boolean calcInventQty = [color=:blue]false[/color], boolean searchMarkup = [color=:blue]true[/color], boolean searchPrice = [color=:blue]false[/color], boolean checkReservation = [color=:blue]false[/color], InventTransId oldInventTransId = [color=:red]''[/color]) { ..... [color=:blue]if[/color] (checkReservation) this.checkReservation(); [color=:green]// Message to infolog [/color] .... }</div> При обновлении строки данный метод в штатном функионале не вызывается. (К сожалению )) ) Предлагаю следующее решение проблемы. Подкрутить метод update() на таблице SalesLine() <div class='XPPtop'>X++</div><div class='XPP'> [color=:blue]public[/color] [color=:blue]void[/color] update(boolean dropInvent = [color=:blue]false[/color], Common childBuffer = NULL) { SalesLineType salesLineType; ; [color=:green]// ZAN, message for infolog about reservation --> [/color] [color=:blue]if[/color](this.salesTable().Reservation [color=:blue]==[/color] ItemReservation::Automatic) this.checkReservation(); [color=:green]// ZAN, message for infolog about reservation <-- [/color] salesLineType = this.type(); salesLineType.update(dropInvent, childBuffer); }</div> Ломать классы InventUpdate и Ко не считаю необходимым в данной ситуации. ................... |
|
16.03.2005, 15:35 | #3 |
Участник
|
Zan
Спасибо, я наверное не совсем корректно выразился. createLine вызывается, как я понял, при создании строк при помощи Функции/Создание строк и действительно появляется инфолог. Я же хотел добится появления не инфолога, а формы из InventMovement.setAutoReserving: <div class='XPPtop'>X++</div><div class='XPP'> [color=:blue]if[/color] (movement.inventTable().inventItemType().mustInventBeControlled()) { movement_Orig = InventMovement::construct(buffer.orig()); [color=:blue]if[/color] (movement.transQty() != movement_Orig.transQty()) { reserveNow = movement.autoReserveQty(movement_Orig); [color=:blue]if[/color] (reserveNow > 0) { inventOnhand = InventOnhand::newEstimatedUpdate(movement,movement.inventdim(),[color=:blue]false[/color]); [color=:blue]if[/color] (reserveNow > inventOnhand.availReservation(InventParameters::find().reserveOnOrdered)) { args = [color=:blue]new[/color] Args(); args.name([color=:blue]formstr[/color](InventOnhandCheckReserve)); args.caller(); args.record(buffer); formRun = classFactory.formRunClass(args); formRun.init(); formRun.run(); formRun.wait(); [color=:blue]return[/color] formRun.closedOk(); } } } }</div> А вот ее то мне и не заставить проявляться, она кажет себя только при создании строки посредством Ctrl-N. Ваше решение может пригодится в будущем, спасибо. |
|
16.03.2005, 16:55 | #4 |
Участник
|
При желании можно заставить ее появляться, но программировать придется немного побольше.
1. В Classdeclaration формы SalesTable объявляем булевую переменную. <div class='XPPtop'>X++</div><div class='XPP'> [color=:blue]class[/color] FormRun [color=:blue]extends[/color] ObjectRun { ..... boolean inventLocationIdUpdate; .... }</div> 2. Вносим изменения в метод modify поля InventLocationId датасурса InventDIm <div class='XPPtop'>X++</div><div class='XPP'> [color=:blue]public[/color] [color=:blue]void[/color] modified() { [color=:blue]super[/color](); [color=:green]// ZAN, for open form --> [/color] inventLocationIdUpdate = [color=:blue]true[/color]; [color=:green]// ZAN, for open form <-- [/color] salesLine.modifyItemDim(inventDim,[color=:blue]fieldNum[/color](InventDim,inventLocationId),inventTable::find(salesLine.ItemId).DimGroupId); }</div> 3. Вносим изменения в метод setAuotoreservation класса InventMovement <div class='XPPtop'>X++</div><div class='XPP'> [color=:blue]Client[/color] [color=:blue]static[/color] boolean setAutoReserving(Common buffer, [color=:green]// ZAN, for open form --> [/color] boolean _inventLocationIdUpdate = [color=:blue]false[/color]) [color=:green]// ZAN, for open form <-- [/color]{ ........ [color=:blue]if[/color] ((movement.transQty() != movement_Orig.transQty()) [color=:blue]||[/color] [color=:green]// ZAN, for open form --> [/color] _inventLocationIdUpdate) [color=:green]// ZAN, for open form <-- [/color] { ...... }</div> 4. Вносим изменения в метод ValidateWrite() датaсурса SalesLine <div class='XPPtop'>X++</div><div class='XPP'> [color=:blue]public[/color] boolean validateWrite() { ...... ret = ret && InventMovement::setAutoReserving(salesLine, [color=:green]// ZAN, for open form --> [/color] inventLocationIdUpdate); [color=:green]// ZAN, for open form <-- [/color] [color=:green]// ZAN, for open form --> [/color] inventLocationIdUpdate = [color=:blue]false[/color]; [color=:green]// ZAN, for open form <-- [/color] ..... }</div> В таком исполнении работает, но как видете програмировать пришлось немного побольше )) |
|
16.03.2005, 23:00 | #5 |
Участник
|
Уважаемый Zan ,
Выражаю Вам свою искреннюю благодарность и "респект++" за Ваше участие и помощь. Рад, что мысли мои двигались в правильном направлении. То, что вы эффектно сделали успешно работает со штатными складскими аналитиками, по крайней мере с InventLocationId. Это то, что мне было нужно! Теперь мне осталось понять, что я упустил при изготовлении самодельной складской аналитики. Почему так не работает в ситуации 2 (при работающей ситуации 1) с моей складской аналитикой. Еще раз огромное спасибо и успехов в творчестве. |
|