30.08.2007, 11:47 | #1 |
Участник
|
Пересчет с/с в проводках с заполненным InventRefTransId
AX 3.0 SP5 KR2
В процессе анализа расчета себестоимости по проводкам расхода определенной товарной позиции была обнаружена след. особенность: Система не корректирует себестоимость в проводках с заполненным InventRefTransId (Ссылка на лот). Очевидно, такие проводки система считает промаркированными с какими-либо проводками прихода -- это нормально. Однако, в проводках расхода, сформированных по заказу, который создан из контракта (базовая функциональность создания заказа на отпуск), в поле InventRefTransId система заносит ссылку на номер лота исходной строки контракта. При этом такие проводки не являются промаркированными (для строк контракта проводки не создаются вообще). Таким образом, себестоимость списания в таких проводках вычисляется как мгновенная и не пересчитывается в процессе выполнения базовой функциональности пересчета себестоимости. Процедура закрытия склада также не корректирует себестоимость в таких проводках - вот это условие пропускает проводки, которые ссылаются на строки заказа Вопрос №1: Почему так сделано? Это "by design"? Мы изменили функциональность создания проводок по строкам заказа, не заполняя поле "Ссылка на лот" в проводках для строк заказа, созданных из контракта. Вопрос №2: Чревато ли это какими-либо последствиями? Какими? |
|
|
За это сообщение автора поблагодарили: Logger (8). |
30.08.2007, 11:53 | #2 |
Banned
|
Мне кажется, баг.
По вопросу 2: чревато тем, что система не найдет исходную строку Blanket Order и при доставке Release Order не уменьшит остаток и не сменит статус в строке Blanket Order. |
|
|
За это сообщение автора поблагодарили: kashperuk (3). |
30.08.2007, 11:57 | #3 |
Участник
|
Цитата:
По количеству мы, конечно же, проверили - пересчет кол-ва по контракту отталкивается от ссылки на лот в самой строке заказа. Тут все ОК. Пересчет при этом выполняется правильно - себестоимость меняется в зависимости от выбранного метода (у нас - FIFO) |
|
30.08.2007, 12:02 | #4 |
Banned
|
А, правильно, речь ведь идет о InventTrans, а не о SalesLine. Тогда все в порядке будет. Коллеги тут для одного клиента вообще всю маркировку во всей системе истребили - и ничего.
|
|
30.08.2007, 12:21 | #5 |
Member
|
Есть такое в 3.0. Если запустить закрытие, то такие ссылки чистятся.
Для одного клиента мы с mazzy в процедуру пересчета вставляли такой же кусок кода (чистящий ссылки), как и в закрытии.
__________________
С уважением, glibs® |
|
30.08.2007, 12:26 | #6 |
Участник
|
Цитата:
Это из метода, который вызывается при пересчете себестоимости и закрытии склада. X++: // clear unused references if (inventClosing.AdjustmentType == inventAdjustmentType::Closing && (mapQtyIssue || mapQtyReceipt)) { while select forupdate inventTrans index hint openItemIdx where inventTrans.ValueOpen == inventTransOpen::Yes && inventTrans.ItemId == _itemId && inventTrans.InventRefTransId != '' { if (! setPhysicalMarked.in(inventTrans.inventTransId) && this.financialOpenQty(inventTrans)) { if ((inventTrans.Qty > 0 && (! mapQtyIssue || ! mapQtyIssue.exists(inventTrans.InventTransId) || abs(mapQtyIssue.lookup(inventTrans.InventTransId)) < inventAdj::settleQtyDiff())) || (inventTrans.Qty < 0 && (! mapQtyReceipt || ! mapQtyReceipt.exists(inventTrans.InventTransId) || abs(mapQtyReceipt.lookup(inventTrans.InventTransId)) < inventAdj::settleQtyDiff()))) { if (inventTrans.QtySettled) inventTrans.updateSplit(this.financialOpenQty(inventTrans)); if (!InventCostItemDim::isBlanketOrderReference(inventTrans)) { inventTrans.InventRefTransId = ''; inventTrans.doUpdate(); if (! inventTrans.isUpdatedFinancial()) { movement = inventTrans.inventMovement(true); if (movement && movement.inventRefTransId() != '') { movement.setInventRefFields(inventRefType::None,'',''); movement.updateDoBuffer(); } } } } } } } X++: if (!InventCostItemDim::isBlanketOrderReference(inventTrans)) |
|
30.08.2007, 13:07 | #7 |
Участник
|
Посмотрел только что всю эту функциональность в 4.0 SP2
При создании заказа из контракта они связываются уже по новому полю - BlanketRefTransId. То есть для контрактов InventRefTransId не заполняется. А соответственно при пересчете уже все нормально отрабатывает. Кстати, класс для создания заказа такого уже по другому называется - SalesAutoCreate_ReleaseOrder (был SalesAutoCreate_tmpSalesLine). Приведенный код для пересчета в 4.0 тоже немного подкорректировали. Кстати, опять же про 3.0. Не проверял, но скорее всего так: Проверка X++: if (!InventCostItemDim::isBlanketOrderReference(inventTrans)) В методе делается поиск строки контракта по номеру лота. И этой строки может уже не существовать. |
|
30.08.2007, 13:08 | #8 |
Member
|
Хм... Мы над сп3 издевались. Там это как-то работало. Теперь уже не помню.
Поглядел. В сп3 такого условия не было... Интересненько. Проблему с маркировкой и ссылками Микрософт обещал побороть в 4.0. В 3.0 вроде как уже не собирался тогда. Смотрите...
__________________
С уважением, glibs® |
|
30.08.2007, 13:17 | #9 |
Участник
|
Цитата:
Однако, в проводках расхода, сформированных по заказу, который создан из контракта (базовая функциональность создания заказа на отпуск), в поле InventRefTransId система заносит ссылку на номер лота исходной строки контракта. При этом такие проводки не являются промаркированными (для строк контракта проводки не создаются вообще). Таким образом, себестоимость списания в таких проводках вычисляется как мгновенная и не пересчитывается в процессе выполнения базовой функциональности пересчета себестоимости.
|
|
30.08.2007, 13:19 | #10 |
Участник
|
Цитата:
Сообщение от petr
Если я вас правильно понял, вы создаете заказ (release order) из контракта (blanket order), и при этом в складской проводке заказа в поле InventRefTransId у вас проставлен лот из строки контракта. Я этого у себя не наблюдаю. Мне кажется так и не может быть в принципе в стандарном функционале.
См. тогда пред. сообщение мое |
|
30.08.2007, 13:27 | #11 |
Участник
|
Не, я пробовал и в 3.0 SP4, насколько я понимаю. Но зачем им понадобилось заполнять поле ссылкой на несуществующий лот я не понимаю. (по контракту складские проводки не создаются). Притом ссылка всегда должна быть на противоположную проводку (приход на расход и наоборот). Вообще непонятно, если такое было раньше, то зачем?
|
|
30.08.2007, 13:32 | #12 |
Участник
|
Цитата:
Сообщение от petr
Не, я пробовал и в 3.0 SP4, насколько я понимаю. Но зачем им понадобилось заполнять поле ссылкой на несуществующий лот я не понимаю. (по контракту складские проводки не создаются). Притом ссылка всегда должна быть на противоположную проводку (приход на расход и наоборот). Вообще непонятно, если такое было раньше, то зачем?
(1 этап - SalesAutoCreate_tmpSalesLine.setSalesLine - копируется в строку заказа 2 этап - InventMovement.initInventTransFromBuffer - копируется из строки заказа в проводку (используется метод InventMov_Sales.inventRefTransId) А вот зачем - мне как раз тоже непонятно |
|
|
За это сообщение автора поблагодарили: aidsua (1). |
30.08.2007, 13:42 | #13 |
Member
|
Цитата:
Сообщение от petr
...
Но зачем им понадобилось заполнять поле ссылкой на несуществующий лот я не понимаю. ... Просто в контракте не создается складских проводок. Поэтому лот существует, а вот ссылка на складскую проводку с таким номером лота не существует.
__________________
С уважением, glibs® |
|
30.08.2007, 13:45 | #14 |
Участник
|
Случайно обратил внимание.
20000 - номер этой темы. Юбилейная! |
|
30.08.2007, 13:56 | #15 |
Member
|
kashperuk, вы маньяк.
На всякий случай. Если вы обидчивый, то постарайтесь воспринять это как комплимент.
__________________
С уважением, glibs® |
|
30.08.2007, 13:56 | #16 |
Участник
|
Цитата:
Стараюсь, стараюсь, не получается |
|
30.08.2007, 13:57 | #17 |
Участник
|
Цитата:
Это не несуществующий лот. Он очень даже существующий.
Тоже самое и с номером лота. Ссылка на него есть в строке заказа, но в "справочнике" лотов таблице inventTrans этого лота нет. Поэтому проверка ссылочной целостности должна тут выдавать ошибку "такого номера лота не существует". P.S. Правдя я никогда этого не делал. Надо будет на досуге попробовать. |
|
30.08.2007, 14:10 | #18 |
Member
|
petr, вы не правы. Лот — это не складская проводка. Это источник складской проводки (строка складского журнала, заказа, закупки. производственного заказа, журнала в проектах...).
Так что все с точностью до наоборот. Складских проводок с одинаковым номером лота может быть множество. А вот строк журналов и заказов/закупок с одинаковым номером лота быть не может. Как может идти речь о ссылке на запись в таблице, если поле-ключ не уникально?
__________________
С уважением, glibs® |
|
30.08.2007, 14:23 | #19 |
Участник
|
Да, действительно не прав. Спасибо
|
|
Теги |
ax3.0, faq, себестоимость |
|
Опции темы | Поиск в этой теме |
Опции просмотра | |
|