如何从 Qlik Sense JSON-RPC API 过滤和提取数据

How to filter and extract data from Qlik Sense JSON-RPC API

我已经能够使用 websockets 成功连接到 Qlik Sense JSON-RPC API (QIX)。而且我能够看到所有 tables、字段和 table 数据。 table 有数百万行,查询所有数据需要数小时。我希望能够按时间戳字段之一进行过滤以仅获取最新数据。

这是我在连接到 wss://{tenant}.us.qlikcloud.com/app/{app_id}

后目前正在进行的 API 次通话
{
  "jsonrpc": "2.0",
  "id": 1,
  "handle": -1,
  "method": "OpenDoc",
  "params": {
    "qDocName": "{app_id}"
  }
}

{
  "jsonrpc": "2.0",
  "id": 1,
  "handle": 1,
  "method": "GetTablesAndKeys",
  "params": {
    "qWindowSize": {"qcx": 1, "qcy": 1},
    "qNullSize": {"qcx": 1, "qcy": 1},
    "qCellHeight": 1,
    "qSyntheticMode": true,
    "qIncludeSysVars": false,
    "qIncludeProfiling": false
  }
}

{
  "jsonrpc": "2.0",
  "id": 1,
  "handle": 1,
  "method": "GetTableData",
  "params": {
    "qOffset": 0,
    "qRows": 1000,
    "qSyntheticMode": true,
    "qTableName": "{table_name}"
  }
}

如何GetTableData应用过滤器?

大意是:

  • 在必填字段中输入 selection(select 您需要的值)
  • 使用必填字段创建超立方体(会话对象)(如果 want/can 并将其用作数据占位符,则可以在 UI 中创建 table)
  • “请求”Qlik 向您发送数据。
  • 一旦创建了 selection,Qlik 将过滤应用程序中的所有对象(不仅是会话对象)并减少仅与您的 selection 相关的数据。选择是 Qlik 中的核心概念

示例脚本(JavaScript 和 Enigma.js

const valuesToSelect = [
  {
    qText: "Value 1",
  },
  {
    qText: "Value 2",
  },
];

const global = await session.open();
const app = await global.openDoc("some-app-id");
const field = await app.getField("MyField"); // get the field instance
const selectionResult = await field.selectValues(valuesToSelect); // make selections in the field

// prepare the hypercube properties
// specifying the dimensions we want to be displayed
const hypercubeProps = {
  qInfo: {
    qType: "my-hypercube",
  },
  qHyperCubeDef: {
    qDimensions: [
      {
        qDef: { qFieldDefs: ["MyOtherField"] },
      },
      {
        qDef: { qFieldDefs: ["MyYetAnotherField"] },
      },
    ],
    qMeasures: [
      // Measures can be added to the cube as well. If aggregation is needed
      //   {
      //     qDef: { qDef: "=Sum(Value)" },
      //   },
    ],
    qInitialDataFetch: [
      {
        qHeight: 5000,
        qWidth: 2,
      },
    ],
  },
};

const sessionObject = await app.createSessionObject(hypercubeProps); // create our session object
let sessionObjectLayout = await sessionObject.getLayout(); // get its layout. this will populate the data in it

console.log(sessionObjectLayout.qHyperCube.qDataPages); // print the data pages

Hypercubes 在 Qlik 中经常使用并且非常重要。特别是当需要动态创建对象时。超立方体有很多属性,处理起来可能会很麻烦 (IMO)。

资料页

{
    qHeight: 5000,    
    qWidth: 2
}

上面指定了多少cells的数据最初被检索。这些数字不是随机的。 Qlik 允许每个请求返回最多 10 000 单元格 的数据。在我们的示例中,我们要求 Qlik 创建具有 2 个维度的立方体。所以 2 维 * 5000 = 10000 个数据单元格。 这也意味着如果我们有超过 10000 个数据单元格,我们将不得不向 Qlik 询问其余数据。在我们的例子中,我们可以使用 GetHyperCubeData 方法来检索下一个 page/batch 数据(同样最多 10000 cells/data 点)

对数据进行分页可能会很棘手,尤其是当我们必须处理旋转数据时。

列表框对象

只是提一下,在处理单个字段时可能 better/easier 与 ListBox object instead of cubes/tables. Some JS examples can be found here

交互