# When

when 前置詞及後置詞用來建立條件式子句，其可決定是否應該執行陳述式或結束子句。它可視為完整 if..end if 陳述式的精簡替代選項。

語法：

(when condition statement | exitstatement when condition )

傳回的資料類型： 布林值

在 Qlik Sense 中，布林值 true 值以 -1 代表，而 false 值以 0 代表。

只有在條件評估為 TRUE 時，才會執行 statement 或 exitstatement。

`Unless` 前置詞可用在已有一或數個其他陳述式的陳述式上，包含其他 `When` 或 `When` 前置詞。

什麼情況下使用

`When` 陳述式會傳回布林值結果。一般來說，當使用者想要載入或排除指令碼部份時，此函數類型會作為條件使用。

引數

| 引數 | 描述 |
| --- | --- |
| condition | 評估為 TRUE 或 FALSE 的邏輯運算式 |
| statement | 除了控制陳述式之外的任何 Qlik Sense 指令碼陳述式。 |
| exitstatement | exit for、exit do 或 exit sub 子句，或者 exit script 陳述式。 |

## 區域設定

除非另有說明，否則此主題中的範例皆使用下列日期格式：MM/DD/YYYY。日期格式是在資料載入指令碼的 `SET DateFormat` 陳述式中指定。由於地區設定和其他因素，您系統中的預設日期格式可能會不同。您可以變更以下範例中的格式，以滿足您的需求。或者，您可以在載入指令碼中變更格式，以符合這些範例。

應用程式中的預設地區設定是根據安裝 Qlik Sense 之電腦或伺服器的地區系統設定。若您存取的 Qlik Sense 伺服器設定為瑞典，資料載入編輯器將會對日期、時間和貨幣使用瑞典文地區設定。這些地區格式設定與 Qlik Sense 使用者介面中顯示的語言無關。Qlik Sense 將會以您正在使用的瀏覽器語言顯示。

函數範例

| 範例 | 結果 |
| --- | --- |
| ` exit script when A=1;  ` | 當陳述式 `A=1` 評估為 TRUE 時，即會停止指令碼。 |
| `when A=1 LOAD * from myfile.csv;` | 當陳述式 `A=1` 評估為 TRUE 時，即會載入 `myfile.csv`。 |
| `when A=1 unless B=2 drop table Tab1;` | 當指令碼 `A=1` 評估為 TRUE 時，如果 `B=2` 評估為 FALSE，即會捨棄 `Tab1` 表格。 |

## 範例 1 – When 前置詞

[](https://help.qlik.com/en-US/sense/Subsystems/Hub/Content/Sense_Hub/Scripting/ScriptPrefixes/When.htm)

#### 載入指令碼和結果

概述

開啟資料載入編輯器並將下面的載入指令碼新增至新的區段。

載入指令碼包含：

* 傳送至名為「`Transactions`」之表格中具有日期和金額的資料集。

* `Let` 陳述式表示變數 `A` 已建立並具有 `1` 的值。

* `When` 條件提供如果 `A` 等於 `1`，即會繼續載入指令碼的條件。

載入指令碼

```
LET A = 1; 

WHEN A = 1 
 
Transactions: 
LOAD  
*  
Inline [ 
id, date, amount 
1, 08/30/2018, 23.56 
2, 09/07/2018, 556.31 
3, 09/16/2018, 5.75 
4, 09/22/2018, 125.00 
5, 09/22/2018, 484.21 
6, 09/22/2018, 59.18 
7, 09/23/2018, 177.42 
]; 
```

結果

載入資料並開啟工作表。建立新的表格並將這些欄位新增為維度：

* `id`
* `date`
* `amount`

結果表格

| id | 日期 | 金額 |
| --- | --- | --- |
| 1 | 08/30/2018 | 23.56 |
| 2 | 09/07/2018 | 556.31 |
| 3 | 09/16/2018 | 5.75 |
| 4 | 09/22/2018 | 125.00 |
| 5 | 09/22/2018 | 484.21 |
| 6 | 09/22/2018 | 59.18 |
| 7 | 09/23/2018 | 177.42 |

因為變數 `A` 在指令碼開始時被指派 `1` 的值，所以評估了追蹤 `When` 前置詞的條件，並傳回 TRUE 的結果。因為其傳回 TRUE 的結果，所以指令碼還是會執行 LOAD 陳述式。可看到結果表格中的所有記錄。

若此變數值設為不等於 `1` 的任意值，即不會將任何資料載入到資料模型中。

## 範例 2 – When 後置詞

[](https://help.qlik.com/en-US/sense/Subsystems/Hub/Content/Sense_Hub/Scripting/ScriptPrefixes/When.htm)

#### 載入指令碼和結果

概述

開啟資料載入編輯器並將下面的載入指令碼新增至新的區段。

載入指令碼包含：

* 傳送至名為「`Transactions`」之表格中具有日期和金額的三個資料集。

  * 第一個資料集包含交易 1 至 7。

  * 第三個資料集包含交易 8 至 14。

  * 第三個資料集包含交易 15 至 21。

* `When` 條件判斷「`Transactions`」表格是否包含超過十列。若任何 `When` 陳述式評估為 TRUE，即會停止載入指令碼。此條件會放在三個資料集的結尾處。

載入指令碼

```
Transactions: 
LOAD  
*  
Inline [ 
id, date, amount 
1, 08/30/2018, 23.56 
2, 09/07/2018, 556.31 
3, 09/16/2018, 5.75 
4, 09/22/2018, 125.00 
5, 09/22/2018, 484.21 
6, 09/22/2018, 59.18 
7, 09/23/2018, 177.42 
]; 
 
exit script when NoOfRows('Transactions') > 10 ; 

Concatenate
LOAD 
*  
Inline [ 
id, date, amount 
8, 10/01/2018, 164.27 
9, 10/03/2018, 384.00 
10, 10/06/2018, 25.82 
11, 10/09/2018, 312.00 
12, 10/15/2018, 4.56 
13, 10/16/2018, 90.24 
14, 10/18/2018, 19.32 
]; 

exit script when NoOfRows('Transactions') > 10 ; 
 
Concatenate 
LOAD 
*  
Inline [ 
id, date, amount 
15, 10/01/2018, 164.27 
16, 10/03/2018, 384.00 
17, 10/06/2018, 25.82 
18, 10/09/2018, 312.00 
19, 10/15/2018, 4.56 
20, 10/16/2018, 90.24 
21, 10/18/2018, 19.32 
]; 
 
exit script when NoOfRows('Transactions') > 10 ; 
```

結果

載入資料並開啟工作表。建立新的表格並將這些欄位新增為維度：

* `id`
* `date`
* `amount`

結果表格

| id | 日期 | 金額 |
| --- | --- | --- |
| 1 | 08/30/2018 | 23.56 |
| 2 | 09/07/2018 | 556.31 |
| 3 | 09/16/2018 | 5.75 |
| 4 | 09/22/2018 | 125.00 |
| 5 | 09/22/2018 | 484.21 |
| 6 | 09/22/2018 | 59.18 |
| 7 | 09/23/2018 | 177.42 |
| 8 | 10/01/2018 | 164.27 |
| 9 | 10/03/2018 | 384.00 |
| 10 | 10/06/2018 | 25.82 |
| 11 | 10/09/2018 | 312.00 |
| 12 | 10/15/2018 | 4.56 |
| 13 | 10/16/2018 | 90.24 |
| 14 | 10/18/2018 | 19.32 |

在三個資料集中，每一個都有七筆交易。第一筆資料集包含交易 1 至 7 並載入到應用程式中。此 LOAD 陳述式之後的 `When` 條件評估為 FALSE，因為「`Transactions`」表格中少於十列。LOAD 指令碼繼續至下一個資料集。

第二個資料集包含交易 8 至 14 並載入到應用程式中。第二個 `When` 條件評估為 TRUE，因為「`Transactions`」表格超過十列。因此，指令碼會終止。

## 範例 3 – 多個 When 前置詞

[](https://help.qlik.com/en-US/sense/Subsystems/Hub/Content/Sense_Hub/Scripting/ScriptPrefixes/When.htm)

#### 載入指令碼和結果

概述

開啟資料載入編輯器並將下面的載入指令碼新增至新的區段。

載入指令碼包含：

* 包含單一筆交易的資料集已建立為名為「`Transactions`」的表格。

* 觸發的 `For` 迴圈包含兩個巢狀的 `When` 條件，其評估是否有以下情況：

  1. 「`Transactions`」表格中有少於 `100` 筆記錄。

  2. 「`Transactions`」中的記錄數不是 `6` 的倍數。

載入指令碼

```
RowsCheck = NoOfRows('Transactions') < 100 or mod(NoOfRows('Transactions'),6) <> 0;
Transactions: 
Load 
	0 as id 
Autogenerate 1; 
For i = 1 to 100 
	when(RowsCheck)
		Concatenate 
	Load 
		if(isnull(Peek(id)),1,peek(id)+1) as id 
	Autogenerate 7;     
next i 
```

結果

載入資料並開啟工作表。建立新的表格並將此欄位新增為維度：

* `id`

結果表格只會顯示前五個交易 ID，但載入指令碼會建立 36 列並在符合 `When` 條件後終止。

結果表格

| id |
| --- |
| 0 |
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
| 其他 30 多列 |

`For` 迴圈中的巢狀 `When` 條件會評估下列問題：

* 「`Transactions`」表格中是否少於 100 列？

* 「`Transactions`」表格中的記錄總數是否為 6 的倍數？

每次 `When` 陳述式傳回 TRUE 的值時，即會產生另外七筆記錄並串連至現有的「`Transactions`」表格中。

`When` 條件會傳回 TRUE 值五次。此時，「`Transactions`」表格共有 36 列。

當「`Transactions`」建立 36 列資料時，第二個 `When` 陳述式會傳回 FALSE 的值，因此再也不會執行此項之後的 LOAD 陳述式。