Constrain
Constrain 语句可与 Let 或 Set 语句结合使用,用于定义脚本变量。通过 Constrain 语句,可以为这些变量的可能值定义约束条件。如果变量定义违反了限制条件,重载就会失败。通过约束,可以要求变量值与特定类型相匹配,在特定数值范围内,并与自己定义的可接受值相匹配。
语法:
Constrain variablename = json
其中:
约束类型
| 约束类型(键) |
含义 |
约束要求(值) |
实例 |
| "type"
|
将变量值限制为特定数据类型。 |
"text" 指定文本类型。
"number" 指定数字类型。
|
CONSTRAIN vExampleText = {"type": "text"}
CONSTRAIN vExampleNumeric = {"type": "number"}
|
|
"maxnum"
|
为变量设置最大值。 |
仅限数字(整数或浮点数)。允许使用科学符号。 |
CONSTRAIN vExample = {"maxnum": 5000}
|
|
"minnum"
|
为变量设置最小值。 |
仅限数字(整数或浮点数)。允许使用科学符号。 |
CONSTRAIN vExample = {"minnum": 250}
|
|
"valuesnum"
|
定义变量的可接受数值的列表。 |
以逗号分隔的方括号内数字的列表。例如:[1,2,3] |
CONSTRAIN vExample = {"valuesnum": [1,2,3]}
|
|
"valuestext"
|
定义变量的可接受文本值的列表。 |
以逗号分隔的方括号内字符串的列表。例如:["a","b","c"] |
CONSTRAIN vExample = {"valuestext": ["Department A", "Department B", "Department C"]}
|
何时使用 Constrain 声明
使用 Constrain 语句可防止不需要的变量值加载到分析应用程序中。以下部分概述了使用它的具体方法。
重载时间变量更新
Constrain 与重载时间变量更新结合使用时尤为有用。有了重载时间变量更新,您就可以在应用程序重载期间,使用重载 API 上的 variables 属性动态更新变量。Constrain 语句可防止将恶意或格式不当的变量定义纳入分析重载。
重载时间变量更新与 Constrain 语句一起支持以下用例:
-
模板化应用程序,可根据客户 ID 或姓名(可在加载时作为变量传递)等条件选择性加载数据
-
对分布在多个 Qlik Cloud 租户上的应用程序进行集中控制
-
将面向变量的工作流程和任务从 QlikView 和 Qlik Sense Client-Managed 迁移到云中
安全性、可靠性和协作性
即使在重载时间变量更新场景之外使用,Constrain 也能增强加载脚本编写的安全控制 - 例如,在协作开发加载脚本期间。例如,应用程序所有者可以为变量值定义约束条件,告知协作者需要满足哪些特定条件才能可靠、成功地重载应用程序。
注意事项
-
Constrain 变量的定义必须为有效的 JSON 对象。
-
您可以为一个变量指定多个约束条件。变量的所有约束条件都必须包含在单个约束对象内。有关示例,请参阅示例 - 多重约束。
-
如果您已将某个名称的脚本变量加载到应用程序中,那么今后为该变量定义约束条件和值的尝试可能会因原始变量和重新定义的变量之间的冲突而失败。
要解决这些冲突,可通过插入空白定义来重置变量约束和值。示例:
然后,您可以在加载脚本的后续部分里重新定义变量及其约束条件。有关长篇范例,请参阅示例 - 解决变量定义冲突 。
-
变量定义和约束定义的顺序并不重要。但是,如果发生与变量相关的重载失败事件,发生断点的行将有所不同。
-
Constrain 脚本语句只限制脚本变量的变量定义。您还可以通过使用公共 API 对脚本和最终用户变量(在工作表视图中创建或更新的变量,或使用 API 作为会话变量而创建或更新的变量)应用约束。有关更多信息,请参阅开发人员用于定义变量约束的替代方案。
开发人员用于定义变量约束的替代方案
您还可以使用公共 API 来定义变量约束,而不是在加载脚本中使用 Constrain 语句。通过 API 定义约束时,所有更新变量值的尝试 - 无论是直接在加载脚本中、在工作表视图中,还是通过重载 API 都将受到约束。
要通过公共 API 定义变量约束,请使用 Qlik Sense Engine (qix) API 中的 GenericVariableConstraints 对象:GenericVariableConstraints。
示例 - type
概述
打开数据加载编辑器,并将下面的加载脚本添加到新部分。
加载脚本包含:
加载脚本
CONSTRAIN a = {"type": "text"};
LET a = 1000;
结果
加载数据。
重载失败的原因是,约束要求变量 a 采用文本类型。变量定义是一个数字。
相比之下,如果在约束中指定 type 为 number ,重载就会成功。
示例 - maxnum
概述
打开数据加载编辑器,并将下面的加载脚本添加到新部分。
加载脚本包含:
CONSTRAIN b = {"maxnum": "3000"};
LET b = 3001;
结果
加载数据。
重载失败,因为约束要求变量 b 的最大值为 3000。变量定义的值计算为 3001。
相比之下,指定为 b 2999 将导致重载成功。
示例 - minnum
概述
打开数据加载编辑器,并将下面的加载脚本添加到新部分。
加载脚本包含:
CONSTRAIN c = {"minnum": "3000"};
LET c = 2999;
结果
加载数据。
重载失败,因为约束要求变量 c 的最小值为 3000。变量定义的值计算为 2999。
相比之下,指定为 c 3000 将导致重载成功。
示例 - valuesnum
概述
打开数据加载编辑器,并将下面的加载脚本添加到新部分。
加载脚本包含:
CONSTRAIN d = {"valuesnum": [2,3,4]};
LET d = 1;
结果
加载数据。
重载失败的原因是,变量 d 的值为 1,而这不在三个可能值的列表中。
相比之下,指定为 d 2 将导致重载成功。
示例 - valuestext
概述
打开数据加载编辑器,并将下面的加载脚本添加到新部分。
加载脚本包含:
CONSTRAIN e = {"valuestext": ["Department A", "Department B", "Department C"]};
SET e = Department D;
结果
加载数据。
重载失败的原因是变量 e 是 Department D ,不在约束定义的允许值列表中。
相比之下,指定 e 为 Department C 将导致重载成功。
示例 - SET 与 LET
这些示例显示了在变量定义过程中使用 SET 或 LET 时应用约束条件的不同之处。所有示例都使用了应用 type 要求的约束,但这些原则一般适用于所有约束类型。
概述
打开数据加载编辑器,并将下面的加载脚本添加到新部分。
加载脚本包含:
加载脚本
CONSTRAIN f = {"type": "number"};
SET f = 500*2;
结果
加载数据。
重载失败的原因是,约束要求变量 f 采用数字类型。变量定义包含一个数字表达式,但因为使用了 SET 语句,所以定义以文本形式求值。
概述
打开数据加载编辑器,并将下面的加载脚本添加到新部分。
加载脚本包含:
加载脚本
CONSTRAIN g = {"type": "text"};
LET g = 500*2;
加载数据。
重载失败的原因是,约束要求变量 g 采用文本类型。变量定义包含一个数值表达式,并使用了一个 LET 语句,导致定义被计算为一个数字。
概述
打开数据加载编辑器,并将下面的加载脚本添加到新部分。
加载脚本包含:
加载脚本
CONSTRAIN h = {"type": "text"};
SET h = 500*2;
加载数据。
重载成功。约束要求变量 h 采用文本类型。变量定义包含一个数字表达式,但因为使用了 SET 语句,所以定义以文本形式求值。
概述
打开数据加载编辑器,并将下面的加载脚本添加到新部分。
加载脚本包含:
加载脚本
CONSTRAIN i = {"type": "number"};
LET i = 500*2;
加载数据。
重载成功。约束要求变量 i 采用数字类型。变量定义包含一个数值表达式,并使用了一个 LET 语句,导致定义被计算为一个数字。
示例 - 多重约束
概述
打开数据加载编辑器,并将下面的加载脚本添加到新部分。
加载脚本包含:
加载脚本
CONSTRAIN j = {"minnum": 1, "maxnum": 5};
LET j = 2;
加载数据。
重载成功。变量 f 的值计算为 2,在可接受范围内。
概述
打开数据加载编辑器,并将下面的加载脚本添加到新部分。
加载脚本包含:
加载脚本
CONSTRAIN k = {"valuestext": ["abc","def","ghi"], "valuesnum": [0,1,3,5]};
LET k = 'def';
加载数据。
重载成功。变量 k 的值可在可接受值列表中找到。同样,将 k 指定为 3 将导致重载成功。
示例 - 解决变量定义冲突
概述
本例说明了为应用程序中已定义的变量添加约束条件时,发生变量定义冲突的方式。
加载脚本 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
];
加载数据。
重载成功。上面的脚本可以分成三部分,每个部分之间用空行隔开:
-
第一部分重新设置 vConflictExample 的约束条件和值定义。这将删除用加载脚本 1 载入应用程序的定义。
-
第二部分重新应用加载脚本 2 内失败的新约束和值定义。
-
第三部分简单地添加了模拟数据,这样我们就可打开工作表视图并检查变量值(见下图)。
在编辑模式下将工作表视图打开,然后打开
变量对话框。我们可以看到,已成功创建变量 vConflictExample。
工作表视图中的变量对话框显示 vConflictExample 的变量定义冲突已解决。