共用方式為


合併庫存交易

隨著時間的推移,庫存交易表 (InventTrans) 將繼續增長並佔用更多的資料庫空間。 因此,對資料表的查詢將逐漸變慢。 本文介紹如何使用 庫存交易合併 功能來合併有關庫存交易的數據,以説明提高系統性能。

附註

只有財務更新的庫存交易才能合併到選定的已關閉分類帳期間。 要合併,財務更新的出庫庫存交易的發貨狀態 必須為已售出,入庫庫存交易的收貨狀態 必須為已購買

當您合併庫存交易時,所有相關交易都將移動到 InventTransArchive 表中。 庫存發貨交易記錄和庫存收貨交易記錄根據物料 ID (itemId) 和庫存維度 ID (inventDimId) 的組合分別合併,並將它們放入匯總發貨和匯總收貨交易記錄中。

itemId 如果和 inventDimId 組合僅包含一個收貨或發貨交易,則不會合併該交易。

附註

整合庫存事務後,您可以使用 具有長期保留 Dataverse 功能的存檔 功能將記錄移動到 InventTransArchive 數據湖, Microsoft Azure 從而進一步優化存儲和系統性能。 有關詳細資訊,請參閱 將庫存交易數據存檔在中 Dynamics 365 Supply Chain Management

在您的系統中啟用此功能

如果您的系統尚未包含本文中描述的功能,請轉到 功能管理,然後打開 庫存交易合併 功能。 此功能在啟用后無法禁用。

合併庫存交易之前要考慮的事項

在合併庫存交易之前,您應該考慮以下業務方案,因為它們會受到操作的影響:

  • 當您審核來自相關文件 (如訂購單明細) 的庫存交易時,它們將顯示為已合併。 若要查看合併交易,您必須轉到 庫存管理 > 定期任務 > 清理 > 庫存交易合併
  • 合併期間無法取消庫存結算。
  • 無法為合併期間完成標準成本轉換。
  • 當您合併庫存交易時,來自庫存交易的庫存報表會受到影響。 這些報告包括存貨賬齡報告和存貨價值報告。
  • 如果在合併期間的時間範圍內運行庫存預測,則可能會受到影響。

前提條件

庫存交易只能在滿足以下條件的期間合併:

  • 分類帳期間必須結算。
  • 庫存結算必須在合併的至期間日期當天或之後執行。
  • 該期間必須在合併的開始日期之前至少一年。
  • 不得有任何現有的庫存重新計算。

合併您的庫存交易

若要合併庫存交易,請跟隨以下步驟。

  1. 移至 庫存管理>定期任務>清理>庫存交易合併

    此時將顯示庫存交易合併 頁面,並顯示合併流程記錄的清單。

  2. 在操作窗格上,選擇 庫存交易合併 以建立庫存交易合併。

  3. 在庫存交易合併 對話方塊的參數 快速選項卡上,設定以下欄位:

    • 關閉分類帳期間 的開始日期–選擇要包括在合併中的最早交易日期。
    • 已關閉分類帳期間 中的結束日期–選擇要包括在合併中的最新交易日期。

    附註

    只有符合先決條件的期間可供選擇。

  4. 在背景執行快速索引標籤,依需要設定批次處理詳細資料。 跟隨批處理作業的 Microsoft Dynamics 365 Supply Chain Management常用步驟。

  5. 請選取確定

  6. 您會收到一條訊息,請您確認是否要繼續。 請先仔細閱讀訊息,如果你想繼續,請選取是的

    您會收到一條訊息,指出您的庫存交易合併作業已新增到批次佇列。 作業開始合併選定期間的庫存交易。

檢視合併庫存交易

庫存交易合併 頁面顯示完整的合併歷史記錄。 格線中的每一行都顯示合併的建立日期、建立合併的使用者及其狀態等資訊。

在頁面頂部的下拉清單中,選擇以下值之一以篩選格線中顯示的合併:

  • 活動 –僅顯示活動合併。
  • 全部 –顯示所有合併。

對於格線中的每個合併,提供以下資訊:

  • 活動 –複選標記表示合併處於活動狀態。
  • 開始日期 –可包含在合併中的最早交易的日期。
  • 結束日期 –可包含在合併中的最新交易的日期。
  • 排程人 –建立合併的用戶帳戶。
  • 執行–建立合併的日期。
  • 停止目前更新 –複選標記表示合併正在進行中,但已暫停。
  • 狀態 –合併的處理狀態。 可能的值為等待進行中,和已完成

格線上方的工具列提供了以下按鈕,您可以使用這些按鈕來處理選定的合併:

  • 合併交易 –查看所選合併的完整詳細資訊。 出現的「合併交易 」頁面顯示合併中的所有交易。

    若要在 合併交易 頁上查看有關特定交易的詳細資訊,請在格線中選擇該交易,然後在操作窗格上選擇 合併交易詳細資訊顯示的合併交易詳細資料 頁面顯示分類帳過帳、相關子分類帳參考和財務維度等資訊。

  • 暫停 –暫停目前正在處理的選定合併。 只有在生成歸檔工作後,暫停才會生效。 因此,在暫停生效之前可能會有短暫的延遲。 如果合併已暫停,則其 「停止當前更新 」欄位中會顯示一個複選標記。

  • 恢復 –恢復對目前已暫停的選定合併的處理。

擴充您的程式碼以支援自訂欄位

InventTrans 如果表包含一個或多個自定義欄位,則可能需要擴展代碼以支援它們,具體取決於它們的命名方式。

  • 如果表中的自定義欄位 InventTrans 與表中的欄位名稱 InventtransArchive 相同,則表示它們是 1:1 映射的。 因此,您只需將自訂欄位放入 inventTrans 表格的 InventoryArchiveFields 欄位組中即可。
  • 如果 InventTrans 表格中的自訂欄位名稱與 InventtransArchive 表格中的欄位名稱不相符,則您需要新增程式碼來對應它們。 例如,如果您有一個名為 InventTrans.CreatedDateTime的系統欄位,則必須在 InventTransArchive 表格中建立一個具有不同名稱 (例如 InventtransArchive.InventTransCreatedDateTime) 的欄位並向 InventTransArchiveProcessTaskInventTransArchiveSqlStatementHelper 類別新增擴充,如下列範例程式碼所示。

以下範例程式碼顯示如何為 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;
    }
}