合併庫存交易
隨著時間的推移,庫存交易表 (InventTrans
) 將繼續增長並佔用更多的資料庫空間。 因此,對資料表的查詢將逐漸變慢。 本文介紹如何使用 庫存交易合併 功能來合併有關庫存交易的數據,以説明提高系統性能。
附註
只有財務更新的庫存交易才能合併到選定的已關閉分類帳期間。 要合併,財務更新的出庫庫存交易的發貨狀態 必須為已售出,入庫庫存交易的收貨狀態 必須為已購買。
當您合併庫存交易時,所有相關交易都將移動到 InventTransArchive
表中。 庫存發貨交易記錄和庫存收貨交易記錄根據物料 ID (itemId
) 和庫存維度 ID (inventDimId
) 的組合分別合併,並將它們放入匯總發貨和匯總收貨交易記錄中。
itemId
如果和 inventDimId
組合僅包含一個收貨或發貨交易,則不會合併該交易。
附註
整合庫存事務後,您可以使用 具有長期保留 Dataverse 功能的存檔 功能將記錄移動到 InventTransArchive
數據湖, Microsoft Azure 從而進一步優化存儲和系統性能。 有關詳細資訊,請參閱 將庫存交易數據存檔在中 Dynamics 365 Supply Chain Management。
在您的系統中啟用此功能
如果您的系統尚未包含本文中描述的功能,請轉到 功能管理,然後打開 庫存交易合併 功能。 此功能在啟用后無法禁用。
合併庫存交易之前要考慮的事項
在合併庫存交易之前,您應該考慮以下業務方案,因為它們會受到操作的影響:
- 當您審核來自相關文件 (如訂購單明細) 的庫存交易時,它們將顯示為已合併。 若要查看合併交易,您必須轉到 庫存管理 > 定期任務 > 清理 > 庫存交易合併。
- 合併期間無法取消庫存結算。
- 無法為合併期間完成標準成本轉換。
- 當您合併庫存交易時,來自庫存交易的庫存報表會受到影響。 這些報告包括存貨賬齡報告和存貨價值報告。
- 如果在合併期間的時間範圍內運行庫存預測,則可能會受到影響。
前提條件
庫存交易只能在滿足以下條件的期間合併:
- 分類帳期間必須結算。
- 庫存結算必須在合併的至期間日期當天或之後執行。
- 該期間必須在合併的開始日期之前至少一年。
- 不得有任何現有的庫存重新計算。
合併您的庫存交易
若要合併庫存交易,請跟隨以下步驟。
移至 庫存管理>定期任務>清理>庫存交易合併。
此時將顯示庫存交易合併 頁面,並顯示合併流程記錄的清單。
在操作窗格上,選擇 庫存交易合併 以建立庫存交易合併。
在庫存交易合併 對話方塊的參數 快速選項卡上,設定以下欄位:
- 關閉分類帳期間 的開始日期–選擇要包括在合併中的最早交易日期。
- 已關閉分類帳期間 中的結束日期–選擇要包括在合併中的最新交易日期。
附註
只有符合先決條件的期間可供選擇。
在在背景執行快速索引標籤,依需要設定批次處理詳細資料。 跟隨批處理作業的 Microsoft Dynamics 365 Supply Chain Management常用步驟。
請選取確定。
您會收到一條訊息,請您確認是否要繼續。 請先仔細閱讀訊息,如果你想繼續,請選取是的。
您會收到一條訊息,指出您的庫存交易合併作業已新增到批次佇列。 作業開始合併選定期間的庫存交易。
檢視合併庫存交易
庫存交易合併 頁面顯示完整的合併歷史記錄。 格線中的每一行都顯示合併的建立日期、建立合併的使用者及其狀態等資訊。
在頁面頂部的下拉清單中,選擇以下值之一以篩選格線中顯示的合併:
- 活動 –僅顯示活動合併。
- 全部 –顯示所有合併。
對於格線中的每個合併,提供以下資訊:
- 活動 –複選標記表示合併處於活動狀態。
- 開始日期 –可包含在合併中的最早交易的日期。
- 結束日期 –可包含在合併中的最新交易的日期。
- 排程人 –建立合併的用戶帳戶。
- 已 執行–建立合併的日期。
- 停止目前更新 –複選標記表示合併正在進行中,但已暫停。
- 狀態 –合併的處理狀態。 可能的值為等待、進行中,和已完成。
格線上方的工具列提供了以下按鈕,您可以使用這些按鈕來處理選定的合併:
合併交易 –查看所選合併的完整詳細資訊。 出現的「合併交易 」頁面顯示合併中的所有交易。
若要在 合併交易 頁上查看有關特定交易的詳細資訊,請在格線中選擇該交易,然後在操作窗格上選擇 合併交易詳細資訊。 顯示的合併交易詳細資料 頁面顯示分類帳過帳、相關子分類帳參考和財務維度等資訊。
暫停 –暫停目前正在處理的選定合併。 只有在生成歸檔工作後,暫停才會生效。 因此,在暫停生效之前可能會有短暫的延遲。 如果合併已暫停,則其 「停止當前更新 」欄位中會顯示一個複選標記。
恢復 –恢復對目前已暫停的選定合併的處理。
擴充您的程式碼以支援自訂欄位
InventTrans
如果表包含一個或多個自定義欄位,則可能需要擴展代碼以支援它們,具體取決於它們的命名方式。
- 如果表中的自定義欄位
InventTrans
與表中的欄位名稱InventtransArchive
相同,則表示它們是 1:1 映射的。 因此,您只需將自訂欄位放入inventTrans
表格的InventoryArchiveFields
欄位組中即可。 - 如果
InventTrans
表格中的自訂欄位名稱與InventtransArchive
表格中的欄位名稱不相符,則您需要新增程式碼來對應它們。 例如,如果您有一個名為InventTrans.CreatedDateTime
的系統欄位,則必須在InventTransArchive
表格中建立一個具有不同名稱 (例如InventtransArchive.InventTransCreatedDateTime
) 的欄位並向InventTransArchiveProcessTask
和InventTransArchiveSqlStatementHelper
類別新增擴充,如下列範例程式碼所示。
以下範例程式碼顯示如何為 InventTransArchiveProcessTask
類別新增所需擴充的範例。
[ExtensionOf(classStr(InventTransArchiveProcessTask))]
Final class InventTransArchiveProcessTask_Extension
{
protected void addInventTransFields(SysDaSelection _selectionObject)
{
_selectionObject.add(fieldStr(InventTrans, ModifiedBy))
.add(fieldStr(InventTrans, CreatedBy)).add(fieldStr(InventTrans, CreatedDateTime));
next addInventTransFields(_selectionObject);
}
protected void addInventTransArchiveFields(SysDaSelection _selectionObject)
{
_selectionObject.add(fieldStr(InventTransArchive, InventTransModifiedBy))
.add(fieldStr(InventTransArchive, InventTransCreatedBy)).add(fieldStr(InventTransArchive, InventTransCreatedDateTime));
next addInventTransArchiveFields(_selectionObject);
}
}
以下範例程式碼顯示如何為 InventTransArchiveSqlStatementHelper
類別新增所需擴充的範例。
[ExtensionOf(classStr(InventTransArchiveSqlStatementHelper))]
final class InventTransArchiveSqlStatementHelper_Extension
{
private str inventTransModifiedBy;
private str inventTransCreatedBy;
private str inventTransCreatedDateTime;
protected void initialize()
{
next initialize();
inventTransModifiedBy = new SysDictField(tablenum(InventTrans), fieldNum(InventTrans, ModifiedBy)).name(DbBackend::Sql);
inventTransCreatedDateTime = new SysDictField(tablenum(InventTrans), fieldNum(InventTrans, CreatedDateTime)).name(DbBackend::Sql);
inventTransCreatedBy = new SysDictField(tablenum(InventTrans), fieldNum(InventTrans, CreatedBy)).name(DbBackend::Sql);
}
protected str buildInventTransArchiveSelectionFieldsStatement()
{
str ret;
ret = next buildInventTransArchiveSelectionFieldsStatement();
if (inventTransModifiedBy)
{
ret += ',';
ret += strFmt('%1', new SysDictField(tablenum(InventTransArchive), fieldNum(InventTransArchive, InventTransModifiedBy)).name(DbBackend::Sql));
}
if (inventTransCreatedBy)
{
ret += ',';
ret += strFmt('%1', new SysDictField(tablenum(InventTransArchive), fieldNum(InventTransArchive, InventTransCreatedBy)).name(DbBackend::Sql));
}
if (inventTransCreatedDateTime)
{
ret += ',';
ret += strFmt('%1', new SysDictField(tablenum(InventTransArchive), fieldNum(InventTransArchive, InventTransCreatedDateTime)).name(DbBackend::Sql));
}
return ret;
}
protected str buildInventTransTargetFieldsStatement()
{
str ret;
ret = next buildInventTransTargetFieldsStatement();
if (inventTransModifiedBy)
{
ret += ',';
ret += strFmt('%1', inventTransModifiedBy);
}
if (inventTransCreatedBy)
{
ret += ',';
ret += strFmt('%1', inventTransCreatedBy);
}
if (inventTransCreatedDateTime)
{
ret += ',';
ret += strFmt('%1', inventTransCreatedDateTime);
}
return ret;
}
}