# Unless

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

語法：

(Unless condition statement | exitstatement Unless condition )

只有在 condition 評估為 False 時，才會執行 statement 或 exitstatement。

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

引數

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

## 什麼情況下使用

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

下列行顯示三個可能如何使用 `Unless` 函數的範例：

`exit script 
 unless A=1;` `unless A=1 
 LOAD  * from myfile.csv;` `unless A=1 
 when B=2 drop table Tab1;`

## 區域設定

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

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

## 範例 1 – Unless 前置詞

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

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

概述

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

載入指令碼包含：

* 建立變數 A，其會有 1 的值。

* 資料集載入到名為「交易」的表格中，除非變數 A = 2。

載入指令碼

```
LET A = 1;

UNLESS A = 2

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 的值，所以評估了追蹤 `Unless` 前置詞的條件，並傳回 `FALSE` 的結果。因此，指令碼還是會執行 `Load` 陳述式。在結果表格中，可看到 `Transactions` 表格的所有記錄。

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

## 範例 2 – Unless 後置詞

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

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

概述

開啟資料載入編輯器並將下面的載入指令碼新增至新的索引標籤。

載入指令碼開始於將初始資料集載入到名為 `Transactions` 的表格中。然後該指令碼會終止，除非 `Transactions` 表格中的記錄少於 10 筆。

若此條件不會讓指令碼終止，更多的交易集就會串連至 `Transactions` 表格中，並且重覆此流程。

載入指令碼

```
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 unless 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 unless 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 unless 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 |

在載入指令碼的三個資料集中，每一個都有七筆記錄。

第一個資料集（從交易 `id` 1 到 7）會載入到應用程式中。`Unless` 條件會評估 `Transactions` 表格是否少於 10 列。這評估為 `TRUE`，而且第二個資料集（從交易 `id` 8 到 14）會載入到應用程式中。第二個 `Unless` 條件會評估 `Transactions` 表格中是否少於 10 筆記錄。這評估為 `FALSE`，指令碼也會因此終止。

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

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

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

概述

開啟資料載入編輯器並將下面的載入指令碼新增至新的索引標籤。

在此範例中，包含一筆交易的資料集已建立為名為 `Transactions` 的表格。接著觸發「for」迴圈，其中會有兩個巢狀 Unless 陳述式評估：

1. 除非 `Transactions` 表格中有超過 100 筆記錄

2. 除非 `Transactions` 表格中的記錄數為 6 的倍數

如果這些條件是 `FALSE`，即會產生另外七筆記錄並串連至現有的 `Transactions` 表格中。在兩筆交易其中一筆傳回 `TRUE` 的值前，此流程會重覆進行。

載入指令碼

```
Transactions:
Load
        0 as id
Autogenerate 1;

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

結果

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

結果表格

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

「For」迴圈發生的巢狀 Unless 陳述式會評估以下項目：

1. `Transactions` 表格中是否超過 100 列？

2. `Transactions` 表格中的記錄總數是否為 6 的倍數？

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

這些陳述式會傳回 `FALSE` 的值五次，此時 `Transactions` 表格中共有 36 列資料。

接下來，第二個 `Unless` 陳述式會傳回 `TRUE` 的值，因此再也不會執行此項之後的 LOAD 陳述式。