Tip

このドキュメントはAIによって翻訳されました。不正確な情報については、英語版をご参照ください

ループ

ワークフロー:ループノードCommunity Edition+

はじめに

ループは、プログラミング言語における forwhileforEach といった構文構造に相当します。特定の回数、またはデータコレクション(配列)に対して操作を繰り返し実行したい場合に、ループノードを使用できます。

インストール

このプラグインは組み込み済みのため、インストールは不要です。

ノードの作成

ワークフローの設定画面で、フロー内のプラス(「+」)ボタンをクリックし、「ループ」ノードを追加します。

Creating a Loop Node

ループノードを作成すると、ループ内部に分岐が生成されます。この分岐内には、任意の数のノードを追加できます。これらのノードは、ワークフローのコンテキスト変数だけでなく、ループコンテキストのローカル変数も使用できます。例えば、ループコレクション内で各イテレーションで処理されるデータオブジェクトや、ループ回数のインデックス(インデックスは 0 から始まります)などです。ローカル変数のスコープはループ内部に限定されます。複数のループがネストしている場合は、各階層の具体的なループのローカル変数を使用できます。

ノードの設定

20241016135326

ループオブジェクト

ループは、ループオブジェクトのデータ型に応じて異なる処理を行います。

  1. 配列: 最も一般的なケースです。通常、クエリノードの複数のデータ結果や、事前ロードされた多対多のリレーションデータなど、ワークフローコンテキストの変数を選択できます。配列が選択された場合、ループノードは配列内の各要素を反復処理し、各ループで現在の要素をループコンテキストのローカル変数に割り当てます。

  2. 数値: 選択された変数が数値の場合、その数値がループ回数として使用されます。値は正の整数のみをサポートしており、負の数はループに入らず、小数の小数点以下は無視されます。ローカル変数内のループ回数のインデックスは、ループオブジェクトの値でもあります。この値は 0 から始まり、例えばループオブジェクトの数値が 5 の場合、各ループでのオブジェクトとインデックスは順に 0、1、2、3、4 となります。

  3. 文字列: 選択された変数が文字列の場合、その文字列の長さがループ回数として使用され、各ループでインデックスに従って文字列内の各文字が処理されます。

  4. その他: オブジェクト型を含むその他の型の値は、単一処理のループオブジェクトとして扱われ、一度だけループします。通常、このようなケースではループを使用する必要はありません。

変数を選択する以外に、数値型と文字列型では定数を直接入力することもできます。例えば、5(数値型)と入力するとループノードは5回ループし、abc(文字列型)と入力するとループノードは3回ループし、それぞれ abc の3文字を処理します。定数を使用したい場合は、変数選択ツールで希望の型を選択してください。

ループ条件

v1.4.0-beta 以降のバージョンでは、ループ条件に関するオプションが追加され、ノード設定でループ条件を有効にできるようになりました。

条件

条件ノードの条件設定と同様に、複数の条件を組み合わせて設定でき、現在のループ内の変数(ループオブジェクト、ループインデックスなど)も使用できます。

チェックタイミング

プログラミング言語の whiledo/while と同様に、設定された条件を各ループの開始前、または各ループの終了後に評価するかを選択できます。後置条件評価では、条件判定を行う前に、ループボディ内の他のノードを一度実行させることができます。

条件が満たされない場合

プログラミング言語の breakcontinue ステートメントと同様に、ループを終了するか、次のイテレーションに進むかを選択できます。

ループ内部ノードでエラーが発生した場合の処理

v1.4.0-beta 以降のバージョンでは、ループ内部のノードが実行に失敗した場合(条件が満たされない、エラーが発生するなど)に、その後のフローをどのように処理するかを設定できるようになりました。以下の3つの処理方法をサポートしています。

  • ワークフローを終了する(プログラミングの throw に相当)
  • ループを終了してワークフローを続行する(プログラミングの break に相当)
  • 次のループオブジェクトに進む(プログラミングの continue に相当)

デフォルトは「ワークフローを終了する」ですが、必要に応じて選択を変更できます。

例えば、注文時に各商品の在庫チェックを行い、在庫が十分であれば在庫を減らし、そうでなければ注文明細内の商品を無効として更新する、といったケースです。

  1. 以下の3つのコレクションを作成します。商品コレクション <-(1:m)-- 注文明細コレクション --(m:1)-> 注文コレクション。データモデルは以下の通りです。

    注文コレクション

    フィールド名フィールドタイプ
    注文商品明細一対多(注文明細)
    注文合計金額数値

    注文明細コレクション

    フィールド名フィールドタイプ
    商品多対一(商品)
    数量数値

    商品コレクション

    フィールド名フィールドタイプ
    商品名一行テキスト
    価格数値
    在庫整数
  2. ワークフローを作成します。トリガーには「コレクションイベント」を選択し、「注文」コレクションの「レコード追加時」にトリガーされるように設定します。さらに、「注文明細」コレクションと、その明細下の「商品」コレクションのリレーションデータを事前ロードするように設定する必要があります。

    Loop Node_Example_Trigger Configuration

  3. ループノードを作成し、ループオブジェクトとして「トリガーデータ / 注文明細」を選択します。これは、注文明細コレクション内の各レコードを処理することを意味します。

    Loop Node_Example_Loop Node Configuration

  4. ループノード内部に「条件判断」ノードを作成し、商品の在庫が十分であるかを確認します。

    Loop Node_Example_Condition Node Configuration

  5. 在庫が十分な場合は、「はい」の分岐で「計算ノード」と「データ更新」ノードを作成し、計算された削減後の在庫を対応する商品のレコードに更新します。

    Loop Node_Example_Calculation Node Configuration

    Loop Node_Example_Update Stock Node Configuration

  6. そうでない場合は、「いいえ」の分岐で「データ更新」ノードを作成し、注文明細のステータスを「無効」に更新します。

    Loop Node_Example_Update Order Detail Node Configuration

全体のワークフロー構造は以下の図の通りです。

Loop Node_Example_Workflow Structure

このワークフローの設定と有効化が完了すると、新しい注文が作成された際に、注文明細内の商品在庫が自動的にチェックされます。在庫が十分であれば在庫が減らされ、そうでなければ注文明細内の商品は無効として更新されます(これにより、有効な注文合計金額を計算できるようになります)。