# Unless

unless 前缀和后缀用于创建确定是否应计算语句或 exit 子句的条件子句。它可以被看作是完整的 if..end if 语句的简洁替代形式。

语法：

(Unless condition statement | exitstatement Unless condition )

如果condition评估结果为 False，则仅将执行 statement 或 exitstatement。

unless 前缀可以在已有一个或多个其他语句的语句中使用，包括其他 when 或 unless 前缀。

参数

| 参数 | 说明 |
| --- | --- |
| 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。

* 加载到名为 Transactions 的表中的数据集，除非变量 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 | 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 |

因为变量 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 | 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 |
| 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 语句将不再执行。