首页 > 解决方案 > QlikSense Field selectValues API - 当字段名称是混搭应用程序中的日期数据类型时不起作用

问题描述

当字段为日期格式时,Qliksense SelectValues Field API 中的问题

你好 ,

只是为您提供背景 - 我们在我们的 Web 应用程序中打开了多个 qlik 应用程序,当用户在主应用程序中进行选择时 - 我们在所有打开的应用程序中应用通用选择。对于数据模型中标记为日期的字段,我们遇到了这个奇怪的问题。请检查以下示例。

版本:2020 年 6 月补丁 7 v13.82.15

当字段为日期格式时,我遇到了 selectValues Field API 的问题。

1. 场景 1 - 字段:Month_Year 是日期数据类型:

比方说,我有 val 数组,其中我选择了日期类型字段“Month_Year”的值。

Var FieldName = "Month_Year";  // field in datamodel script :  Date#(Month_Year,'MMM YYYY') AS Month_Year

var valArray[]= {
                 0:"Jan 2020"
                 1:"Feb 2020"
                 2:"Mar 2020"
                 }

app.Field(FieldName ).selectValues(valArray);

它没有在所需的“应用程序”中选择值,因为 FieldName = Month_Year 派生为 Date#(Month_Year,'MMM YYYY')。

2. 场景 2 - 字段:Month_Year 是 TEXT() 字符串数据类型:

比方说,我有 val 数组,其中我选择了文本/字符串类型字段“Month_Year”的值。

Var FieldName = "Month_Year";  // field in datamodel script :  Text(Month_Year) AS Month_Year

var valArray[]= {
                  0:"Jan 2020"
                  1:"Feb 2020"
                  2:"Mar 2020"
                  }

app.Field(FieldName ).selectValues(valArray);

现在,如果我们将字段作为文本(月_年)作为月_年,则相同的字段正在字段中进行选择。

有人在您的 mash up 应用程序中遇到过这个问题吗?

标签: javascriptangularjsqliksense

解决方案


这是因为 Qlik 以双重表示形式存储值 - 数字和文本(特别是对于标记为日期的字段)。的实际值01/01/2020实际上是43831并将其显示为01 Jan 2020(或任何日期格式)。因此,当尝试选择Jan 2020没有发生任何事情时,因为这样的值不存在。

当您“打破”双重表示(使用该 Text()函数)时,选择有效,但可能会影响性能(主要基于应用程序中的数据量)

查看dual()函数文档以获取有关此行为的更多信息。

为了在这种情况下选择某些东西,您必须找到基础值或元素编号并选择它们。

就我个人而言,我正在为所需的字段创建临时列表框,当我必须选择时,我会找到qElemNumber所需的值,然后在列表框中选择它们

// let values = ['array', 'of', 'values',  'to', 'select']

// create the session object
let sessionObj = await qDoc.createSessionObject(lbDef);

// get the layout so we can loop through the data pages
let layout = await sessionObj.getLayout();

// get the qElemNumber for the required values
// WARNING: if the field contains more than 1000 (i think) DISTINCT values then we'll have to loop through all the databased
let index = layout.field.qListObject.qDataPages[0].qMatrix.filter(function (m) {
  return values.indexOf(m[0].qText) > -1
}).map(function (e) {
  return e[0].qElemNumber
});

// perform the selection
let selection = await sessionObj.selectListObjectValues('/field/qListObjectDef', index, toggle);

我在这里使用过这种方法


推荐阅读