計画最適化の拡張性

この記事では、マスター プランに関連し、計画の最適化でサポートされている拡張性のシナリオについて説明します。

ヒント

拡張機能の開発が終了し、エンドツーエンドのテスト環境を設定する場合は、計画最適化のための統合開発者エクスペリエンス (プレビュー)を参照してください。

マスター プランが完了したときのカスタム処理

計画の最適化の最も一般的な拡張性シナリオは、計画の更新後にカスタム処理を適用することです。 たとえば、計画オーダー テーブル (ReqPO) に列を追加したり、生成された計画から統計情報を派生することができます。 このシナリオを可能にする主要な拡張性ポイントは、MpsMasterPlanningEvents クラス内の jobCompletedSuccessfully メソッドです 。 ジョブが失敗した後に処理を適用するには、同じクラス内の jobFailed メソッドを使用します。

重要

現在の拡張性ポイントを使用する後処理アクションは、フィルターで直接指定された品目 (使用されている場合) にのみ適用され、サブコンポーネントには適用されません。 したがって、計画の最適化実行ダイアログですべての BOM レベルを含めるまたは含める BOM レベル オプションを有効にした結果として含まれる追加品目は、これらの後処理アクションによる影響を受けません。 フィルターの使用方法の詳細については、品目のサブセットの計画を実行するを参照してください

ジョブが正常に完了したメソッド

このセクションでは、jobCompletedSuccessfully メソッドの使用方法を示しています。

public static void jobCompletedSuccessfully(MpsMasterPlanningJobCompletedSuccessfullyEventArgs _args)

ここでは、計画オーダーにカスタム CstmOrderPriority フィールドを設定する拡張機能の例を示します。

[ExtensionOf(classStr(MpsMasterPlanningEvents))]
public static final class MpsMasterPlanningEvents_Cstm_Extension
{
    public static void jobCompletedSuccessfully(MpsMasterPlanningJobCompletedSuccessfullyEventArgs _args)
    {
        ttsbegin;

        var affectedPlannedOrdersQuery = _args.parmPostProcessingQueryBuilder().buildAffectedPlannedOrdersQuery();
        var affectedPlannedOrdersQueryRun = new QueryRun(affectedPlannedOrdersQuery);

        while (affectedPlannedOrdersQueryRun.next())
        {
            ReqPO reqPO = affectedPlannedOrdersQueryRun.get(tableNum(ReqPO));
            reqPO.selectForUpdate(true);
            reqPO.CstmOrderPriority = reqPO.ReqDate - systemDateGet() < 7 ? CstmPlannedOrderPriority::Urgent : CstmPlannedOrderPriority::Regular;
            reqPO.doUpdate();
        }

        ttscommit;

        next jobCompletedSuccessfully(_args);
    }

}

カスタム ロジックを追加する場合は、次の制約とベスト プラクティスを考慮してください。

  • この jobCompletedSuccessfully メソッドは、トランザクション スコープ外で呼び出されます。 したがって、カスタム ロジックの実行を開始したときに、ユーザーには既にプランが表示されています。 カスタマイズで計画オーダーに他のフィールドを設定する場合、これらのフィールドの値が最終的に一貫性することをユーザーに通知することが重要です (つまり、計画ジョブが完了した直後にその値が期限切れになる可能性があります)。
  • 別のマスター プラン ジョブを、jobCompletedSuccessfully メソッドが呼び出されたときに開始できます。 新しいジョブは、計画の全体または一部に影響を与える可能性があります。 新しいジョブでは、jobCompletedSuccessfully で処理された計画ジョブの一部として作成または更新された、同じ計画オーダーまたは要求トランザクションを更新または削除することができます。 更新の競合の例外は、このイベントが拡張されたときに処理する必要があります。
  • このメソッドを拡張する場合は、単一のトランザクション スコープを使用しないでください。 単一のマスター プランの実行で、数百万の要求トランザクションと数十万の計画オーダーを生成することができます。 これらのすべてのトランザクションと計画オーダーが単一のトランザクションのスコープで処理されると、多くの SQL ロックが発生し、その他の計画プロセスがブロックされます。 さらに、トランザクションが長期間保持されている場合は、SQL データベースに「ゴースト レコード」が作成されます。 ゴースト レコードは、システム内のすべてのプロセスに悪影響を与えます。
  • MpsMasterPlanningJobCompletedSuccessfullyEventArgs に含まれるクエリには、エラーのあるものも含め元のフィルターに含まれていたすべてのアイテムが含まれます。
  • jobCompletedSuccessfully に含まれるクエリには、計画の最適化実行ダイアログですべての BOM レベルを含めるまたは含める BOM レベル オプションを有効にした結果として追加されたアイテムは含まれません。

ジョブ失敗メソッド

計画の最適化ジョブが失敗した場合は、別のプロセス (再試行操作など) を開始する必要があります。 このために、Supply Chain Management のバージョン 10.0.31 以上でサポートされているjobFailed メソッドを使用できます。

カスタム ロジックを追加する場合、jobFailed メソッドに含まれるクエリには、計画の最適化実行ダイアログですべての BOM レベルを含めるまたは含める BOM レベル オプションを有効にした結果として追加されたアイテムは含まれないことに留意してください。