On-demand 模板应用程序中的绑定表达式

模板应用程序中的数据绑定指定使用相应选择应用程序中的哪些数据来构造将数据加载到 On-Demand 应用程序中时所发出的查询。

可以修改绑定表达式 $(od_FIELDNAME) 的基本格式以便优化选择项并确保模板应用程序正确加载数据。

警告: 应更改最初使用 On-demand App GenerationQlik Sense 扩展创建的模板应用程序,以便使用下述方式来绑定字段中的大量选择项。

绑定字段中的大量选择项

Qlik associative engine 会限制可同时在单个 LET 语句中串联的值数量。要避免此限制,可使用 INLINE LOAD 语句高效地构造逗号分隔的值列表。

首先,必须构造脚本子例程以处理 INLINE 表格。

SUB BuildValueList(VarName, TableName, ColName, QuoteChrNum) IF $(QuoteChrNum) = 0 THEN LET LOADEXPR = 'Concat($(ColName),' & chr(39) & ',' & chr(39) & ') AS CombinedData'; ELSE LET CHREXPR = ' chr(' & '$(QuoteChrNum)' & ') '; LET LOADEXPR = 'Concat( $(CHREXPR) & $(ColName) & $(CHREXPR)' & ',' & chr(39) & ',' & chr(39) & ') AS CombinedData'; ENDIF _TempTable: LOAD $(LOADEXPR) Resident $(TableName); Let vNoOfRows = NoOfRows('_TempTable'); IF $(vNoOfRows)> 0 THEN LET $(VarName) = Peek('CombinedData',0,'_TempTable'); ENDIF drop table _TempTable; drop table '$(TableName)'; END SUB;
备注: 调用 BuildValueList 子例程必须为 QuoteChrNum 参数使用特定值。当子例程处理的字段为数值时,该参数必须设置为 0。对于字符数据,该参数必须设置为 39。

然后,应使用 INLINE 表格编写绑定,以便为要加载的字段值创建结构(无论值数量如何)。

SET ORIGIN=''; OdagBinding: LOAD * INLINE [ VAL $(odso_ORIGIN){"quote": "", "delimiter": ""} ]; SET ORIGIN_COLNAME='ORIGIN'; CALL BuildValueList('ORIGIN', 'OdagBinding', 'VAL', 39);

$(od_ORIGIN) {"quote": "", "delimiter": "") 表达式将替换为选择应用程序中 ORIGIN 字段值的列表,以换行符分隔。如果 ORIGIN 字段包含 BOSJFKORD 三个值,则扩展的 INLINE 表格将如下所示:

SET ORIGIN=''; OdagBinding: LOAD * INLINE [ VAL BOS JFK ORD ]; SET ORIGIN_COLNAME='ORIGIN'; CALL BuildValueList('ORIGIN', 'OdagBinding', 'VAL', 39);

调用 BuildValueListORIGIN 变量的值将为:

'BOS','JFK’,'JFK'

绑定可选值和排除值

有时,需要使用无法在选择应用程序中直接选择的字段来在 On-demand 模板应用程序脚本的查询中创建筛选条件。例如,销售记录可以使用区域代码(例如 REGION_CODE),而选择应用程序使用更易识别的 REGION_NAME 字段来创建区域选择项。选择应用程序的模型可以使用一个单独的表格将 REGION_CODEREGION_NAME 关联,以便用户可以从 REGION_NAME 中选择用来控制选择状态的值。

尽管选择 REGION_NAME 的值会导致这些值置于选中状态,但 REGION_CODE 的值仅处于可选状态,即显示为白色而非绿色。此外,如果选择应用程序工作表的设计将 REGION_CODE 从它的筛选窗格集中排除,则无法将 On-demand 应用程序脚本中的绑定表达式 $(od_REGION_CODE) 扩展为所选区域的列表,因为实际上永远不会选中 REGION_CODE 值,即永远不会显示为绿色。

为了处理这种情况,可以使用额外的语法来更精确地控制每个数据绑定中使用的选择状态值。每个 On-demand 绑定表达式中字段名称部分中的 od_ 前缀可以包括一个字母组合,该字母组合表示要在绑定中使用的值是否为从选中状态和可选状态中提取的值。以 REGION_CODE 为例,有效的组合为:

有效组合,使用 REGION_CODE
模式 扩展
$(ods_REGION_CODE) REGION_CODE 的选中(绿色)值
$(odo_REGION_CODE) REGION_CODE 的可选(白色)值
$(odso_REGION_CODE) REGION_CODE 的选中值或可选值
$(od_REGION_CODE) $(ods_REGION_CODE) 相同,仅限 REGION_CODE 的选中(绿色)值

对于销售数据示例的 On-demand 应用程序,下面的数据绑定表达式确保 REGION_CODE 的选中值或可选值包括在 REGION_CODE 绑定中:

$(odso_REGION_CODE)

绑定数值

在要绑定到 On-demand 应用程序的数据由数字(而非字符串)组成时,最好针对数值字段禁用加引号行为。例如,如果销售记录包括一个数值 DAY_OF_WEEK 列,您希望选择应用程序的用户选择 DAY_OF_WEEK 的任意组合,则可以增强用于加载选择应用程序的聚合查询,以便将 DAY_OF_WEEK 既包括在 SELECT 列表中又包括在 GROUP BY 列表中。如果在选择 DAY_OF_WEEK 值时在其两侧加引号,而且数据库不支持将字符串类型自动转换为数值,则可能会生成运行时查询错误。

为了处理这种情况,可以向绑定表达式的 FIELDNAME 部分的末尾添加一个语法后缀,以便强制字段绑定功能使用选择应用程序中的数值(而非字符串值)。在下面的 WHERE 子句中,后缀为 _n

WHERE DAY_OF_WEEK IN ( $(od_DAY_OF_WEEK_n) );

这将扩展为:

WHERE DAY_OF_WEEK IN ( 1,2 );

需要一定数量的选择项

在某些情况下,对于特定字段,可能必须要求 On-demand 应用程序查询中包含特定数量或特定范围的值。例如,如果 On-demand 应用程序的查询中包含 BETWEEN 子句(用来获取开始日期和结束日期之间的所有销售额),则 YEARQUARTER 字段的绑定表达式可以有一个后缀语法 [2],该语法将要求为 YEARQUARTER 正好选择两个值,如下所示:

$(od_YEARQUARTER)[2]

选择应用程序上的 On-Demand 应用程序导航点将保持禁用状态,但前提是为 YEARQUARTER 选择的不是两个值。将显示一则消息来指示必须为 YEARQUARTER 正好选择两个值。

选择数量约束会在选择应用程序和 On-Demand 应用程序之间创建一个先决条件链接。这不同于未使用数量约束的绑定表达式。例如,当模板应用程序的脚本中包含绑定表达式而不包含数量约束(如下所示)时:

$(od_MYFIELD)

既不要求选择应用程序包含名为 MYFIELD 的字段,又不要求为该字段选择任何值(如果该字段存在的话)。如果选择应用程序不包含名为 MYFIELD 的字段,或者用户只是忘了从中做出任何选择,则 On-Demand 应用程序导航点仍可以在为了满足记录限制值条件而进行其他选择时变成启用状态。

另一方面,如果绑定表达式为:

$(od_MYFIELD)[1+]

现在会针对选择应用程序施加两个要求:

  • 选择应用程序必须包含一个名为 MYFIELD 的字段。
  • 用户必须至少为 MYFIELD 选择一个值。

在使用这种类型的绑定表达式时必须格外小心,因为它会限制哪些选择应用程序可以与模板应用程序一起使用。 您不应当在模板应用程序的绑定上使用该数量限制,除非您确定自己希望将该选择数量要求应用在和该模板应用程序关联的所有选择应用程序上。

为了执行数据绑定过程,On-Demand 应用程序服务使用对脚本中的注释不敏感的字符串替代方式。这意味着您不应在注释中使用绑定表达式,除非在应用程序生成后您希望这些注释包含绑定值列表。

可能会施加其他数量约束。下表概述了选择数量约束的不同组合。

选择项数量约束的不同组合
约束模式 选择要求
$(od_YEARQUARTER)[2] 必须正好选择 2 个 YEARQUARTER 值。
$(od_YEARQUARTER)[2-4] 必须选择 2 到 4 个 YEARQUARTER 值。
$(od_YEARQUARTER)[2+] 必须至少选择 2 个 YEARQUARTER值。
$(od_YEARQUARTER)[2-] 最多只能选择 2 个 YEARQUARTER 值。
备注: 在应用程序生成过程期间执行了检查,确定是否达到模板应用程序中的所有数量限制。如果不符合数量限制,生成该应用程序的请求将被拒绝,并显示错误信息。

更改值引号字符和分隔符字符

将从 On-demand 选择应用程序选择的字段中的值列表插入到模板应用程序脚本中时,将使用单引号将值括起来并用逗号分隔。这些是引号和分隔符的默认字符。可在附加到每个字段的绑定语句的语法中更改这些值。例如:

$(odso_ORIGIN){"quote": "|", "delimiter": ";"}

然后,在构造来自选择应用程序的绑定值列表时,将使用这些新值。例如,如果所选值是一年的前三个月,则会将列表构造为:

|January|;|February|;|March|

引号字符和分隔符字符的默认值适用于大多数标准 SQL 数据库。但这些值可能不适用于某些 SQL 数据库,也不适用于许多动态数据源(例如,NoSQL 和 REST)。对于这些源,需要附加此绑定表达式以更改引号字符和分隔符字符。

Bind data containing commas and/or quotation marks

If the data in any of the fields used for bind variables contains commas, you need to change the default behavior of the INLINE load statement to not interpret commas as field separators. 使用格式规范将分隔符更改为从未在绑定的字段中的值中出现的字符,如在下面示例中所示的 '|' 字符:

Also, if any of the bound fields contain single quotation marks, you need to add a Replace command to the LOAD statement that will add an extra single quotation mark after each single quotation mark in the value. This prevents the quote characters from being interpreted as the end of the string that is used in the WHERE clause.  Note that database products may use different techniques for escaping single quotation marks.

例如:

OdagBinding: LOAD Replace(VAL,'''','''''') AS VAL INLINE [ VAL $(odso_ORIGIN){"quote": "", "delimiter": ""} ] (ansi, txt, delimiter is '|', embedded labels);