Navision 4.0, пример использования кода UpgradeToolkit для частичного приобщение к “фиче” из новой версии (5.0)

Столкнулся с интересной проблемой. Необходимо было написать sql запрос, показывающий реальную себестоимость по строке учтенного счета продажи для 4-ой версии Navision. Т.е. получить запрос с колонками а-ля:

SalesInvLine.[Document No_], SalesInvLine.[Line No_], SalesInvLine.[No_], … sum(-ValueEntry.[Cost Amount (Actual)])

Сложность здесь в том, что таблица “Value Entry” (5802) не содержит привязки к конкретной строке учтенного документа. Максимум того что можно сделать - это градироваться по товару, но проблема в том, что в документе может быть несколько строк с одним и тем же товаром и однозначного соответствия не получится. 

В целом это проблема известная, ведь даже статистика по учтенным документам не показывает правильные (с учетом коррекции себестоимости и доп. издержек) значения.

Как быть?

Первым делом я проверил версию 5.0, смотрю в Change.doc.

Change.doc - документ c инсталляционного диска 5.0 в котором описываются произведенные по сравнению с предыдущей версией изменения, диск для международной 5.0 можно скачать с Partnersource.

Вижу новую “фичу”:

A48) Item Cost Adjustments are Forwarded to Sales and Customer Statistics
Feature
All customer and sales statistics windows as well as (standard) reports showing profit calculations have now new fields for adjusted cost and profit amounts and percentage, in addition to original cost and profit fields. Adjusted cost amounts are derived directly from inventory ledger without updating customer ledger and posted invoice lines tables. This way there is no adverse effect on adjustment performance. To establish a relation between item ledger and value entries to sales document lines, two new fields, Document Type and Document Line No., have been added to the Item Ledger Entry table.

Ура, нужная “фича”. Особенно в разрезе появления в таблице “Item Ledger Entry” (32) новых полей
“Document Type”  “Document Line No.”.

Как же это использовать в 4.0 версии? Лезу в Upgrade Toolkit.

Upgrade Toolkit - инструмент для upgrade процесса, можно скачать с Partnersource.

Вижу что в  Upgrade ToolKit\Data Conversion Tools\400\Upgrade400500.2.fob есть отдельный объект, отвечающий за проставление значений в новые поля “Document Type”  “Document Line No.”.  Это объект codeunit  “Update Posted Document Links” (104006).
Этим кодом можно воспользоваться.

Добавляю поля "Document Type","Document Line No.","Shipped Qty. Not Returned" в
таблицу “Item Ledger Entry” (32) и поля "Document Type","Document Line No." в таблицу “Value Entry” (5802). Поля можно скопировать с базы данных 5.0.

Так же пользуюсь новой функцией GetDocType , что появилась в 5.0, в codeunit “Cost Calculation Management” (5836).

Запускаю заимствованный код.
(На достаточно большой базе процесс работы “Update Posted Document Links” занял порядка 20 минут)

Теперь можно писать требуемый sql запрос.

Use [Navision Demo Database (4-0) W1SP3]

select 1 find,
SalesInvLine.[Document No_], SalesInvLine.[Line No_], SalesInvLine.[No_],
sum(-ValueEntry.[Cost Amount (Actual)]) cost
from
dbo.[CRONUS International Ltd_$Sales Invoice Line] SalesInvLine,
dbo.[CRONUS International Ltd_$Value Entry] ValueEntry
where
(SalesInvLine.[Type] = 2) --SalesInvLine."Type"::Item
and
(SalesInvLine.[Document No_] = ValueEntry.[Document No_])
and
(2 = ValueEntry.[Document Type]) --ValueEntry."Document Type"::"Sales Invoice"
and
(SalesInvLine.[Line No_] = ValueEntry.[Document Line No_])
group by SalesInvLine.[Document No_], SalesInvLine.[Line No_], SalesInvLine.[No_]

union

select 0 find,
SalesInvLine2.[Document No_], SalesInvLine2.[Line No_], SalesInvLine2.[No_],
0 cost
from
dbo.[CRONUS International Ltd_$Sales Invoice Line] SalesInvLine2
where
(SalesInvLine2.[Type] = 2) --SalesInvLine."Type"::Item
and
not exists
(
select 1
from
dbo.[CRONUS International Ltd_$Value Entry] ValueEntry2
where
(ValueEntry2.[Document No_] = SalesInvLine2.[Document No_])
and
(ValueEntry2.[Document Type]) = 2 --ValueEntry."Document Type"::"Sales Invoice"
and
(ValueEntry2.[Document Line No_] = SalesInvLine2.[Line No_])
)