在庫トランザクションの連結

時間の経過と共に、在庫トランザクション テーブル (InventTrans) は拡大し、データベース容量を消費します。 したがって、テーブルに対して実行されるクエリの速度は徐々に低下します。 この記事では、システム パフォーマンスを向上させるために、在庫トランザクションの連結 機能を使用して在庫トランザクションに関するデータを連結する方法について説明します。

注意

選択した決算済元帳期間に連結できるのは、財務更新済の在庫トランザクションのみです。 連結するには、財務更新済の出荷在庫トランザクションの払出ステータスが売却済で、入庫在庫トランザクションの受入ステータスが購買済である必要があります。

在庫トランザクションを連結すると、関連のすべてのトランザクションが InventTransArchive テーブルに移動されます。 在庫払出トランザクションと在庫受入トランザクションは、品目ID (itemId) と在庫分析コード ID (inventDimId) の組み合わせに基づいて個別に連結され、集計された払出トランザクションと受入トランザクションに転記されます。

itemIdinventDimId の組み合わせに払出トランザクションまたは受入トランザクションが 1 つだけ含まれている場合、トランザクションは連結されません。

注意

在庫トランザクションを連結した後は、Dataverse 長期保有でアーカイブする を使って InventTransArchive レコードを Microsoft Azure データ レイクに移動し、ストレージおよびシステムのパフォーマンスをさらに最適化できます。 詳細については、Dynamics 365 Supply Chain Management で在庫トランザクション データをアーカイブする を参照してください。

システムで機能を有効化する

この記事で説明する機能がシステムにまだ含まれていない場合は、機能管理 に移動して、在庫トランザクション連結 機能を有効にします。 † この機能は、有効化した後で無効にすることはできません。

在庫トランザクションを連結する前に考慮する点

在庫トランザクションをアーカイブする前に、次の業務シナリオを考慮する必要があります。これらは操作の影響を受けるためです。

  • 発注書明細行などの関連ドキュメントから在庫トランザクションを監査する場合、在庫トランザクションは連結済として表示されます。 連結されたトランザクションを確認するには、在庫管理 > 定期処理タスク > クリーンアップ > 在庫トランザクションの連結 の順に移動する必要があります。
  • 連結された期間の在庫決算はキャンセルできます。
  • 連結された期間に対して標準原価換算は行えません。
  • 在庫トランザクションを連結すると、在庫トランザクションから取得された在庫レポートが影響を受ける可能性があります。 これらのレポートには、在庫エイジング レポートおよび在庫金額レポートが含まれます。
  • 在庫予測は、連結された期間の期間中に実行されると影響を受ける場合があります。

前提条件

在庫トランザクションは、次の条件が満たされた期間にのみ連結できます。

  • 元帳期間は決済されている必要があります。
  • 在庫決算は、連結の終了日以降に実行する必要があります。
  • 期間は、連結の期間 "開始" 日の少なくとも 1 年前でなければなりません。
  • 既存の在庫再計算が作成されていない必要があります。

在庫トランザクションの連結

在庫トランザクションを連結するには、以下の手順に従います。

  1. 在庫管理>定期処理タスク>クリーンアップ>在庫トランザクションの連結の順に移動します。

    在庫トランザクションの連結 ページが表示され、連結されているプロセス レコードの一覧が表示されます。

  2. アクション ウィンドウで、在庫トランザクションの連結 を選択して、在庫トランザクションの連結を作成します。

  3. 在庫トランザクションの連結 ダイアログ ボックスの パラメーター FastTab で、次のフィールドを設定します:

    • 元帳の決算済期間の開始日 – 連結に含める最も早いトランザクションの日付を選択します。
    • 元帳の決算済期間の終了日 – 連結に含める最新のトランザクションの日付を選択します。

    注意

    前提条件 を満たす期間のみを選択できます。

  4. バックグラウンドで実行クイック タブで、必要に応じてバッチ処理の詳細を設定します。 Microsoft Dynamics 365 Supply Chain Management のバッチ ジョブの通常の手順に従います 。

  5. OK を選択します。

  6. 続行を確認するメッセージが表示されます。 メッセージを慎重に読み、続行する場合ははいを選択します。

    在庫トランザクション連結ジョブがバッチ キューに追加されたというメッセージが表示されます。 選択した期間の在庫トランザクションの連結がジョブによって開始されます。

連結在庫トランザクションを表示する

在庫トランザクションの連結 ページには、完全な連結履歴が表示されます。 グリッドの各行には、連結が作成された日付、作成したユーザー、ステータスなどの情報が表示されます。

ページの上部にあるドロップダウン リストで、次のいずれかの値を選択して、グリッドに表示される連結をフィルター処理します。

  • アクティブ – アクティブな連結のみを表示します。
  • すべて - すべての連結を表示します。

グリッド内の連結ごとに、次の情報が提供されます。

  • 有効 – チェック マークは、連結が有効かどうかを示します。
  • 開始日 – 連結に含まれる最も古いトランザクションの日付。
  • 終了日 – 連結に含まれる最新のトランザクションの日付。
  • スケジュール作成者 – 連結を作成したユーザー アカウント。
  • 実行日 – 連結が作成された日時。
  • 現在の更新の停止 – チェック マークは、連結が進行中で、一時停止中であることを示します。
  • 状態 – 連結の処理ステータス。 このフィールドの値は、待機中進行中、および完了済です。

グリッドの上にあるツール バーには、選択した連結を操作する場合に使用できる次のボタンが表示されます。

  • 連結されたトランザクション – 選択した連結の詳細を表示します。 連結されたトランザクション ページには、連結内のすべてのトランザクションが表示されます。

    連結されたトランザクション ページで特定のトランザクションに関する詳細情報を表示するには、グリッドで特定のトランザクションを選択し、アクション ウィンドウで連結されたトランザクションの詳細を選択します。 表示される連結されたトランザクションの詳細ページには、元帳転記、関連する補助元帳参照、財務分析コードなどの情報が表示されます。

  • 一時停止 – 現在処理されている選択した連結を一時停止します。 一時停止は、アーカイブ タスクが生成された後にのみ有効になります。 そのため、一時停止が有効になる前に、短い遅延が発生する場合があります。 連結が一時停止されている場合は、現在の更新の停止フィールドにチェック マークが表示されます。

  • 再開 – 現在一時停止されている選択した連結を再開します。

カスタム フィールドをサポートするためにコードを拡張する

InventTrans テーブルに 1 つ以上のカスタム フィールドが含まれている場合は、名前の付け方に応じて、サポートするようにコードを拡張する必要がある場合があります。

  • InventTrans テーブルのカスタム フィールドが InventtransArchive テーブルと同じフィールド名である場合は、1:1 でマップされていることを意味します。 したがって、カスタム フィールドを inventTrans テーブルの InventoryArchiveFields フィールド グループに入力するだけで済みます。
  • InventTrans テーブルのカスタム フィールド名が InventtransArchive テーブルのフィールド名と一致しない場合は、マップするコードを追加する必要があります。 たとえば、InventTrans.CreatedDateTime というシステム フィールドがある場合、次のサンプル コードに示すように、別の名前 (InventtransArchive.InventTransCreatedDateTime など) で InventTransArchive テーブルのフィールドを作成し、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;
    }
}