# Constrain

Constrain ステートメントは、スクリプト変数を定義するために Let または Set ステートメントと組み合わせて使用できます。Constrain ステートメントを使用すると、これらの変数の取り得る値に制約を定義できます。変数定義が制約に違反すると、リロードは失敗します。制約を使用すると、変数の値が特定の型に一致し、特定の数値範囲内にあり、定義した許容値と一致することを要求できます。

構文:

Constrain variablename = json

説明:

* variablename はスクリプト変数です。

* json は制約を指定する有効な JSON オブジェクトです。個々の制約は、キーと値のペアとしてこのオブジェクト内に追加されます。

制約タイプ

| 制約タイプ (キー) | 意味 | 制約要件 (値) | 例 |
| --- | --- | --- | --- |
| `"type"` | 変数の値を特定のデータ型に制限します。 | `"text"` はテキスト タイプを指定します。<br><br>`"number"` は数値型を指定します。 | ```<br>CONSTRAIN vExampleText = {"type": "text"}<br>```<br><br>```<br>CONSTRAIN vExampleNumeric = {"type": "number"}<br>``` |
| `"maxnum"` | 変数の最大値を設定します。 | 数値のみ (整数または浮動小数点)。科学的記数法は許可されます。 | ```<br>CONSTRAIN vExample = {"maxnum": 5000}<br>``` |
| `"minnum"` | 変数の最小値を設定します。 | 数値のみ (整数または浮動小数点)。科学的記数法は許可されます。 | ```<br>CONSTRAIN vExample = {"minnum": 250}<br>``` |
| `"valuesnum"` | 変数に許容される数値のリストを定義します。 | 角括弧で囲まれた数値のカンマ区切りリスト。例: `[1,2,3]` | ```<br>CONSTRAIN vExample = {"valuesnum": [1,2,3]}<br>``` |
| `"valuestext"` | 変数に許容されるテキストのリストを定義します。 | 角括弧で囲まれた文字列のカンマ区切りリスト。例: `["a","b","c"]` | ```<br>CONSTRAIN vExample = {"valuestext": ["Department A", "Department B", "Department C"]}<br>``` |

## Constrain ステートメントを使用する場面

Constrain ステートメントを使用して、不要な変数値が分析アプリケーションに読み込まれるのを防ぎます。 次のセクションでは、具体的な使用方法について説明します。

### リロード時の変数更新

Constrain は、リロード時の変数更新と組み合わせて使用すると特に便利です。リロード時の変数更新では、[Reloads API](https://qlik.dev/apis/rest/reloads/) の variables プロパティを使用して、アプリケーションのリロード中に変数を動的に更新できます。Constrain ステートメントは、悪意のある変数定義や不適切な形式の変数定義が分析のリロードに組み込まれるのを防ぎます。

リロード時の変数の更新は、Constrain ステートメントとともに、次のユース ケースをサポートします。

* 顧客 ID や名前などの条件に基づいてデータを選択的にロードするテンプレート アプリケーション (ロード時に変数として渡すことができます)

* 多数の Qlik Cloud テナントに分散されたアプリケーションを一元管理する

* QlikView と Qlik Sense Client-Managed からクラウドへの変数指向のワークフローとタスクを移行する

### セキュリティ、信頼性、コラボレーション

Constrain は、リロード時の変数更新シナリオ以外で使用する場合でも、共同ロード スクリプトの開発中など、ロード スクリプト作成のセキュリティ制御を強化します。たとえば、アプリケーション所有者は変数値の制約を定義し、アプリケーションが確実に正常にリロードされるために満たす必要がある特定の条件を共同作業者に通知できます。

## 考慮事項

* 変数の Constrain 定義は有効な JSON オブジェクトである必要があります。

* 1 つの変数に対して複数の制約を指定できます。変数のすべての制約は、単一の制約オブジェクト内に含める必要があります。例については、「[例 - 複数の制約](https://help.qlik.com/ja-JP/cloud-services/Subsystems/Hub/Content/Sense_Hub/Scripting/ScriptRegularStatements/Constrain.htm#Examples)」を参照してください。

* 特定の名前のスクリプト変数をすでにアプリケーションにロードしている場合、その変数の制約と値を定義しようとすると、元の変数と再定義された変数の競合により失敗する可能性があります。

  これらの競合を解決するには、空の定義を挿入して変数の制約と値をリセットします。例:

  ```
  CONSTRAIN x;
  LET x;
  ```

  ```
  CONSTRAIN x;
  SET x;
  ```

  その後、ロード スクリプトの後続のセクションで変数とその制約を再定義できます。長い形式の例については、 「[例 - 変数定義の競合の解決](https://help.qlik.com/ja-JP/cloud-services/Subsystems/Hub/Content/Sense_Hub/Scripting/ScriptRegularStatements/Constrain.htm#ConflictResolve)」を参照してください。

* 変数定義と制約定義の順序は重要ではありません。ただし、変数関連のリロードに失敗した場合、ブレークポイントが発生する行は異なります。

* Constrain スクリプト ステートメントは、スクリプト変数の変数定義のみを制限します。パブリック API を使用して、スクリプト変数およびエンド ユーザー変数 (シート ビューで作成または更新される変数、または API を使用してセッション変数として作成または更新される変数) に制約を適用することもできます。詳細については、「[変数制約を定義するための開発者の代替方法](https://help.qlik.com/ja-JP/cloud-services/Subsystems/Hub/Content/Sense_Hub/Scripting/ScriptRegularStatements/Constrain.htm#Developer)」を参照してください。

* 変数のどの値とも一致しないシナリオを回避するために、制約が検証されます。無効な制約の例:

  * {"minnum": 5000, "maxnum": 4}
  * {"type": "text", "maxnum": 4}

## 変数制約を定義するための開発者の代替方法

ロード スクリプト内の Constrain ステートメントを使用する代わりに、パブリック API を使用して変数制約を定義することもできます。API 経由で制約を定義すると、ロード スクリプト内で直接、シート ビューで、または [Reloads API](https://qlik.dev/apis/rest/reloads/) 経由で変数値を更新しようとするすべての試みは、制約の対象になります。

パブリック API 経由で変数制約を定義するには、Qlik Sense Engine (qix) API: [GenericVariableConstraints](https://qlik.dev/apis/json-rpc/qix/schemas/) の GenericVariableConstraints オブジェクトを使用します。

## 例 - type

[](https://help.qlik.com/en-US/cloud-services/Subsystems/Hub/Content/Sense_Hub/Scripting/ScriptRegularStatements/Constrain.htm)

#### "type" によるリロードの失敗

概要

データ ロード エディターを開き、以下のロード スクリプトを新しいセクションに追加します。

ロード スクリプトには次が含まれています:

* a の変数定義には number 型が必要であることを指定する Constrain ステートメント。

* 変数 a を定義する LET ステートメント。

ロード スクリプト

```
CONSTRAIN a = {"type": "text"};
LET a = 1000;
```

結果

データをロードします。

制約により変数 a にテキスト タイプが必要なため、リロードは失敗します。変数定義は数値です。

対照的に、制約で number の type を指定すると、リロードは成功します。

## 例 - maxnum

[](https://help.qlik.com/en-US/cloud-services/Subsystems/Hub/Content/Sense_Hub/Scripting/ScriptRegularStatements/Constrain.htm)

#### "maxnum" によるリロードの失敗

概要

データ ロード エディターを開き、以下のロード スクリプトを新しいセクションに追加します。

ロード スクリプトには次が含まれています:

* b の変数定義の最大値が 3000 であることを指定する Constrain ステートメント。

* 変数 b を定義する LET ステートメント。

```
CONSTRAIN b = {"maxnum": "3000"};
LET b = 3001;
```

結果

データをロードします。

制約により変数 b の最大値が 3000 である必要があるため、リロードは失敗します。変数定義は 3001 として評価されます。

対照的に、b を 2999 に指定すると、リロードは成功します。

## 例 - minnum

[](https://help.qlik.com/en-US/cloud-services/Subsystems/Hub/Content/Sense_Hub/Scripting/ScriptRegularStatements/Constrain.htm)

#### "minnum" によるリロードの失敗

概要

データ ロード エディターを開き、以下のロード スクリプトを新しいセクションに追加します。

ロード スクリプトには次が含まれています:

* b の変数定義の最小値が 3000 であることを指定する Constrain ステートメント。

* 変数 c を定義する LET ステートメント。

```
CONSTRAIN c = {"minnum": "3000"};
LET c = 2999;
```

結果

データをロードします。

制約により変数 c の最小値が 3000 である必要があるため、リロードは失敗します。変数定義は 2999 として評価されます。

対照的に、c を 3000 に指定すると、リロードは成功します。

## 例 - valuesnum

[](https://help.qlik.com/en-US/cloud-services/Subsystems/Hub/Content/Sense_Hub/Scripting/ScriptRegularStatements/Constrain.htm)

#### "valuesnum" によるリロードの失敗

概要

データ ロード エディターを開き、以下のロード スクリプトを新しいセクションに追加します。

ロード スクリプトには次が含まれています:

* d の変数定義は数値であり、2、3、または 4 でなければならないことを指定する Constrain ステートメント。

* 変数 d を定義する LET ステートメント。

```
CONSTRAIN d = {"valuesnum": [2,3,4]};
LET d = 1;
```

結果

データをロードします。

変数 d が 1 と評価されますが、これは 3 つの可能な値のリストに含まれていないため、リロードは失敗します。

対照的に、d を 2 に指定すると、リロードは成功します。

## 例 - valuestext

[](https://help.qlik.com/en-US/cloud-services/Subsystems/Hub/Content/Sense_Hub/Scripting/ScriptRegularStatements/Constrain.htm)

#### "valuestext" によるリロードの失敗

概要

データ ロード エディターを開き、以下のロード スクリプトを新しいセクションに追加します。

ロード スクリプトには次が含まれています:

* e の変数定義が次のいずれかのテキスト値である必要があることを指定する Constrain ステートメント。

  * Department A

  * Department B

  * Department C

* 変数 e を定義する SET ステートメント。

```
CONSTRAIN e = {"valuestext": ["Department A", "Department B", "Department C"]};
SET e = Department D;
```

結果

データをロードします。

変数 e が Department D であり、制約によって定義された許可された値のリストに含まれていないため、リロードは失敗します。

対照的に、e を Department C として指定すると、リロードは成功します。

## 例 - SET 対 LET

これらの例は、変数定義中に SET または LET を使用する場合に制約が適用される方法の違いを示しています。すべての例では type 要件を適用する制約を使用していますが、これらの原則は一般にすべての制約タイプに適用されます。

[](https://help.qlik.com/en-US/cloud-services/Subsystems/Hub/Content/Sense_Hub/Scripting/ScriptRegularStatements/Constrain.htm)

#### SET によるリロードの失敗

概要

データ ロード エディターを開き、以下のロード スクリプトを新しいセクションに追加します。

ロード スクリプトには次が含まれています:

* f の変数定義には number 型が必要であることを指定する Constrain ステートメント。

* 変数 f を定義する SET ステートメント。

ロード スクリプト

```
CONSTRAIN f = {"type": "number"};
SET f = 500*2;
```

結果

データをロードします。

制約により変数 f に数値タイプが必要なため、リロードは失敗します。変数定義には数値式が含まれていますが、SET ステートメントが使用されているため、定義はテキストとして評価されます。

[](https://help.qlik.com/en-US/cloud-services/Subsystems/Hub/Content/Sense_Hub/Scripting/ScriptRegularStatements/Constrain.htm)

#### LET によるリロードの失敗

概要

データ ロード エディターを開き、以下のロード スクリプトを新しいセクションに追加します。

ロード スクリプトには次が含まれています:

* g の変数定義には text 型が必要であることを指定する Constrain ステートメント。

* 変数 g を定義する LET ステートメント。

ロード スクリプト

```
CONSTRAIN g = {"type": "text"};
LET g = 500*2;
```

データをロードします。

制約により変数 g にテキスト タイプが必要なため、リロードは失敗します。変数定義に数値式が含まれており、LET ステートメントが使用されているため、定義は数値として評価されます。

[](https://help.qlik.com/en-US/cloud-services/Subsystems/Hub/Content/Sense_Hub/Scripting/ScriptRegularStatements/Constrain.htm)

#### SET によるリロードの成功

概要

データ ロード エディターを開き、以下のロード スクリプトを新しいセクションに追加します。

ロード スクリプトには次が含まれています:

* h の変数定義には text 型が必要であることを指定する Constrain ステートメント。

* 変数 h を定義する SET ステートメント。

ロード スクリプト

```
CONSTRAIN h = {"type": "text"};
SET h = 500*2;
```

データをロードします。

リロードは成功しました。制約では、変数 h にテキスト タイプが必要です。変数定義には数値式が含まれていますが、SET ステートメントが使用されているため、定義はテキストとして評価されます。

[](https://help.qlik.com/en-US/cloud-services/Subsystems/Hub/Content/Sense_Hub/Scripting/ScriptRegularStatements/Constrain.htm)

#### LET によるリロードの成功

概要

データ ロード エディターを開き、以下のロード スクリプトを新しいセクションに追加します。

ロード スクリプトには次が含まれています:

* i の変数定義には number 型が必要であることを指定する Constrain ステートメント。

* 変数 i を定義する LET ステートメント。

ロード スクリプト

```
CONSTRAIN i = {"type": "number"};
LET i = 500*2;
```

データをロードします。

リロードは成功しました。制約では、変数 i に数値タイプが必要です。変数定義に数値式が含まれており、LET ステートメントが使用されているため、定義は数値として評価されます。

## 例 - 複数の制約

[](https://help.qlik.com/en-US/cloud-services/Subsystems/Hub/Content/Sense_Hub/Scripting/ScriptRegularStatements/Constrain.htm)

#### 最小値と最大値の設定

概要

データ ロード エディターを開き、以下のロード スクリプトを新しいセクションに追加します。

ロード スクリプトには次が含まれています:

* j の変数定義が 1 〜 5 の範囲である必要があることを指定する Constrain ステートメント。

* 変数 j を定義する LET ステートメント。

ロード スクリプト

```
CONSTRAIN j = {"minnum": 1, "maxnum": 5};
LET j = 2;
```

データをロードします。

リロードは成功しました。変数 f は 2 と評価され、これは許容範囲内です。

[](https://help.qlik.com/en-US/cloud-services/Subsystems/Hub/Content/Sense_Hub/Scripting/ScriptRegularStatements/Constrain.htm)

#### リストからテキストと数字の両方を受け入れる

概要

データ ロード エディターを開き、以下のロード スクリプトを新しいセクションに追加します。

ロード スクリプトには次が含まれています:

* 許容される値のいずれかである限り、変数をテキストまたは数値にできる Constrain ステートメント。

* 変数 k を定義する LET ステートメント。

ロード スクリプト

```
CONSTRAIN k = {"valuestext": ["abc","def","ghi"], "valuesnum": [0,1,3,5]};
LET k = 'def';
```

データをロードします。

リロードは成功しました。変数 k の値は、許容値のリストにあります。同様に、k を 3 に指定すると、リロードは成功します。

## 例 - 変数定義の競合の解決

[](https://help.qlik.com/en-US/cloud-services/Subsystems/Hub/Content/Sense_Hub/Scripting/ScriptRegularStatements/Constrain.htm)

#### ロード スクリプトと結果

概要

この例では、以前のロードからアプリケーションですでに定義されている変数に制約を追加するときに、変数定義の競合が発生する可能性がある方法を示します。

ロード スクリプト 1: スクリプト変数の設定

データ ロード エディタ を開きます。次のスクリプトを追加します。

```
LET vConflictExample = 'Department C';
```

データをロードします。リロードは成功しました。変数 vConflictExample は、スクリプト変数としてアプリケーション内に作成されました。

ロードスクリプト 2: 以前にロードされたスクリプト変数に対する制約定義の試行

ロード スクリプト 1 を削除します。次のスクリプトを追加します。

```
CONSTRAIN vConflictExample = {"type": "number"};
LET vConflictExample = 123;
```

データをロードします。

新しい制約と値の定義に互換性がある場合でも、制約エラーによりリロードは失敗します。これは、ロード スクリプト 1 ですでに変数がテキスト値でアプリケーションにロードされており、その値がアプリケーション内に保持されているためです。この問題を解決するには、変数の制約と定義をリセットする必要があります。ロード スクリプト 3 を参照してください。

ロード スクリプト 3: 制約と値の定義のリセット

ロード スクリプト 2 を削除します。次のスクリプトを追加します。

```
CONSTRAIN vConflictExample;
LET vConflictExample;

CONSTRAIN vConflictExample = {"type": "number"};
LET vConflictExample = 123;

MockData:
LOAD 
* 
Inline [
id, date, amount
1, 05/30/2025, 23.56
];
```

データをロードします。

リロードは成功しました。上記のスクリプトは、それぞれが空白行で区切られた 3 つの部分に分けられます。

* 最初の部分では、vConflictExample の制約と値の定義をリセットします。これにより、ロード スクリプト 1 でアプリケーションにロードされた定義が削除されます。

* 2 番目の部分では、ロード スクリプト 2 で失敗した新しい制約と値の定義を再適用します。

* 3 番目の部分では、シート ビューを開いて変数の値を検査できるように、モック データを追加します (以下を参照)。

編集モードでシート ビューを開き、the 変数 icon [] ダイアログを開きます。変数 vConflictExample が正常に作成されたことがわかります。

シート表示の変数ダイアログには、vConflictExample の変数定義の競合が解決されたことが示されています。

シート表示の変数ダイアログには、vConflictExample の変数定義の競合が解決されたことが示されています。

シート表示の変数ダイアログには、vConflictExamplevConflictExample の変数定義の競合が解決されたことが示されています。 ![シート表示の変数ダイアログには、スクリプト変数が正常に作成されたことが示されています。](https://help.qlik.com/ja-JP/cloud-services/Subsystems/Hub/Content/Resources/Images/ui_script-variable_constrain-conflict-resolved.png)

## 詳細を見る

* [Let](https://help.qlik.com/ja-JP/cloud-services/Subsystems/Hub/Content/Sense_Hub/Scripting/ScriptRegularStatements/Let.htm)
* [Set](https://help.qlik.com/ja-JP/cloud-services/Subsystems/Hub/Content/Sense_Hub/Scripting/ScriptRegularStatements/Set.htm)
* [データ ロード エディタでの変数の使用](https://help.qlik.com/ja-JP/cloud-services/Subsystems/Hub/Content/Sense_Hub/Scripting/work-with-variables-in-data-load-editor.htm)