Показать сообщение отдельно
Старый 29.07.2008, 11:03   #1  
altap is offline
altap
MCTS
MCBMSS
 
26 / 18 (1) ++
Регистрация: 28.09.2005
Маркировка
Ax 4.0 Application version: 4.0.2501.121
Есть заказ и закупка. Выполнена маркировка строк, соответственно промаркированы и проводки. Статус проводок в заказе - "Зарезервировано в заказанных", в закупке - "Заказано"
2 ситуации:
1. Уменьшаем количество в заказе, затем увеличиваем количество выше изначального . Результат - одна проводка на изначальное количество в статусе "Зарезервировано в заказанных", другая - на разницу между вновь введенным количеством и изначальным в статусе "Заказано". Но обе они промаркированы с проводкой в закупке. То есть маркировка выполнена на количество, превышающее допустимое. Если после этого удалить закупку, то разница между вновь введенным количеством и изначальным останется в статусе "Зарезервировано в заказанных".
2. Увеличиваем количество в заказе, а затем увеличиваем количество в закупке, но на бОльшую величину. Результат - и в заказе и в закупке все количество в проводках оказывается промаркированным. То есть опять маркировка выполнена на количество, превышающее допустимое.

Возможно ситуации высосаны из пальца, в какой-то степени, но у меня вполне реально могут возникнуть.
Связано это с тем, что в
X++:
InventUpd_Estimated\createEstimatedInventTrans
при разбиении проводки в строке
X++:
inventTrans.updateSplit(inventTrans.Qty > 0 ? abs(markNow) : - abs(markNow));
в курсоре inventTrans остается вновь созданная проводка на количество markNow (то есть на которое маркируем), а проводка на оставшееся количество, которая не должна быть маркирована (так как введенное количество в строке закупки превышает допустимое для маркировки количество) оказывается оставленной как есть и вообще не фигурирует в данном методе (она маркирована, так как инициализируется из изначальной проводки, которая имеет маркировку).
В конце метода выполняется проверка:
X++:
 if (!markNow && inventTrans.InventRefTransId && !markForce) // reset InventRefTransId if no marking could be made
            {
                inventTrans.InventRefTransId = '';
                inventTrans.update();
            }
Она призвана как раз очищать ссылку. Но в данном случае она не пройдет, да и не должна пройти.

Собственно для себя придумал решение - получать из метода updateSplit проводку и очищать в ней InventRefTransId при условии, что знак marknow и InventTrans.Qty одинаковы (увеличиваем маркированное количество).
Если я что-то не так понял, или у кого-то есть другое, более соответствующее концепции решение, или это пофиксено в поздних версиях - подскажите, пожалуйста.
Ну или сойдет, как подсказка тем, кто наступит на эти-же грабли.

Последний раз редактировалось altap; 29.07.2008 в 11:24.