在图表表达式中使用备用状态的示例

这些示例意在展示 QlikView 开发者和/或 QlikView 高级用户使用替换状态的最佳实践。这些示例存于以下文件中:‘Alternate States Functionality.qvw’

状态间的同步选择项

以下表达式可以用于单一图表中:

count({$} DISTINCT [Invoice Number])

count({State1} DISTINCT [Invoice Number])

count({State2} DISTINCT [Invoice Number])

使用该方法存在一个问题;QlikView 开发者必须为三个状态复制选择项(列表框和多选框),如此终端用户才能为各种状态作合适的选择。在很多情况下,QlikView 开发者将需要一个对于所有状态都可用的“一般”选择项。这样将允许终端用户为各种图表设置上下文,并且可以使用特定选择项显示不同状态间的差别。集合分析可以用于状态,以保持状态间某一选择项一致。

count({State1<Year = $::Year, Month = $::Month>} DISTINCT [Invoice Number])

count({State2<Year = $::Year, Month = $::Month>} DISTINCT [Invoice Number])

QlikView开发者将保持 State1 和 State2 中 Year 和 Month 的选择与默认状态中 Year 和 Month 的选择。必要时 QlikView 开发者可以在集合修饰符中添加元素以便保持不同状态间更多字段的一致性。

集合运算符

可以在状态中使用集合运算符 (+, *, -, /)。以下表达式有效并将计算默认状态或 State1 中的特殊发票数量。

示例:  

count({$ + State1} DISTINCT [Invoice Number])
计算同时为 <default> 状态和 State1 的不同发票数量。

count({1 - State1} DISTINCT [Invoice Number])
计算除 State1 之外的不同发票数量。

count({State1 * State2} DISTINCT [Invoice Number])
计算同时出现 <default> 状态和 State1 的不同发票数量。

备注: 以这种方式使用集合运算符时应小心谨慎。在某些情况下结果并非与预期一致。这是因为给定状态下的选择项生成了一个数据集,该数据集可能并不完全和其他与之合并的数据集兼容。当数据模式的复杂性增加时尤为如此。

默认字段值定义

另一种使用集合运算符的方法是使用元素函数 P() 和 E()。这些函数仅在集合表达式中可用。

示例:  

count({$<[Invoice Number] = p({State1} [Invoice Number])>} DISTINCT [Invoice Number])
此表达式是基于 State1 中可能存在的可用发票数量计算 <default> 状态的不同发票数量。

这几乎就是以下表达式,但并不完全等同:

count({$<[Invoice Number] = State::[Invoice Number]>} DISTINCT [Invoice Number])

这两个表达式的不同点在于,第一个表达式 State1 中的发票编号正值都传送至默认状态。在第二个表达式中, State1 中的选择值都传送至默认状态。如果用户没有在 State1 中选择任何发票编号, 那么发票编号将不会传送至默认状态

集合运算符在集合修饰符中运用最佳。以下表达式能从 State1 和 State2 中查找合适发票编号的交集并将值传送至默认状态的发票编号中。

示例:  

count({$<[Invoice Number] = p({State1} [Invoice Number]) * p({State2} [Invoice Number])>} DISTINCT [Invoice Number])
此表达式查找的 <default> 状态与 State1 的发票数量的交集是:

count({$<[Invoice Number] = p({$} [Invoice Number]) * p({State1} [Invoice Number])>} DISTINCT [Invoice Number])

这个表达式看似混乱,因为它在元素函数和集合标识符中使用了同一状态(此例中使用的是<默认>)。请记住,元素函数 p($) 得出的正值在默认状态中。集合/状态标识符 {$} 由元素函数的结果修改。任何现存于默认状态的发票选择项正被元素函数交集中的值覆盖。

值得注意的是,以上表达式并不完全正确,因为它没能实现默认状态与 State1 之间一般选择项的同步化。以下为能实现同步化的表达式:

示例:  

count({$<[Invoice Number] = p({$} [Invoice Number]) * p({State1<Year = $::Year, Month = $::Month>} [Invoice Number])>} DISTINCT [Invoice Number])

一如以往,QlikView 开发者可以在修饰符中添加字段以保持不同状态下的选择项保持一致性。