# 変数の利用

## コアコンセプト

プログラミング言語における変数と同様に、ワークフローにおける**変数**は、プロセスを連携させ、整理するための重要なツールです。

ワークフローがトリガーされ、各ノードが実行される際、一部の設定項目では変数を利用できます。変数のソースは、そのノードの上流ノードのデータであり、以下のカテゴリが含まれます。

-   トリガーコンテキストデータ：アクションのトリガーやコレクションのトリガーなどの場合、単一のデータ行オブジェクトが変数としてすべてのノードで利用できます。具体的な動作は、各トリガーの実装によって異なります。
-   上流ノードデータ：プロセスが任意のノードに到達した際、それまでに完了したノードの結果データです。
-   ローカル変数：ノードが特定の分岐構造内にある場合、その分岐内で固有のローカル変数を利用できます。例えば、ループ構造では各イテレーションのデータオブジェクトを使用できます。
-   システム変数：現在時刻などの組み込みシステムパラメーターです。

[クイックスタート](../getting-started.md)では、変数の機能を何度も利用しました。例えば、演算ノードでは、トリガーコンテキストデータを参照する変数を使って計算を実行できます。

![演算ノードでの関数と変数の利用](https://static-docs.nocobase.com/837e4851a4c70a1932542caadef3431b.png)

更新ノードでは、トリガーコンテキストデータをフィルター条件の変数として使用し、演算ノードの結果を更新データのフィールド値変数として参照します。

![データ更新ノードの変数](https://static-docs.nocobase.com/2e147c93643e7ebc709b9b7ab4f3af8c.png)

## データ構造

変数の内部はJSON構造になっており、通常、JSONパスを使ってデータの特定の部分を利用できます。多くの変数はNocoBaseのコレクション構造に基づいているため、関連データはオブジェクトのプロパティとして階層的にツリーのような構造を形成します。例えば、クエリで取得したデータの関連データの特定のフィールドの値を選択できます。また、関連データが多対多の構造である場合、変数は配列になることがあります。

変数を選択する際、ほとんどの場合は最終的な値のプロパティを選択する必要があります。これは通常、数値や文字列などのシンプルなデータ型です。しかし、変数の階層に配列が含まれる場合、末端のプロパティも配列としてマッピングされます。配列データを正しく処理できるのは、対応するノードが配列をサポートしている場合に限られます。例えば、演算ノードでは、一部の計算エンジンに配列を処理するための専用関数があります。また、ループノードでは、ループオブジェクトとして直接配列を選択することもできます。

例として、クエリノードが複数のデータをクエリした場合、ノードの結果は、複数の同種データ行を含む配列になります。

```json
[
  {
    "id": 1,
    "title": "タイトル1"
  },
  {
    "id": 2,
    "title": "タイトル2"
  }
]
```

しかし、後続のノードでそれを変数として使用する場合、`ノードデータ/クエリノード/タイトル` の形式で変数を選択すると、対応するフィールド値にマッピングされた配列が得られます。

```json
["タイトル1", "タイトル2"]
```

多次元配列（多対多のリレーションフィールドなど）の場合、対応するフィールドがフラット化された一次元配列が得られます。

## システム組み込み変数

### システム時刻

実行されたノードに基づいて、実行時点のシステム時刻を取得します。この時刻のタイムゾーンは、サーバーで設定されているタイムゾーンです。

### 日付範囲パラメーター

クエリ、更新、削除ノードで、日付フィールドのフィルター条件を設定する際に利用できます。「等しい」比較でのみ使用がサポートされており、日付範囲の開始時刻と終了時刻は、いずれもサーバーで設定されているタイムゾーンに基づきます。

![日付範囲パラメーター](https://static-docs.nocobase.com/20240817175354.png)