我已成功使用 websockets 连接到 Qlik Sense JSON-RPC API (QIX)。我可以看到所有的表、字段和表数据。这些表有数百万行,查询所有数据需要几个小时。我希望能够按时间戳字段之一进行过滤以仅获取最新数据。
以下是我当前在连接到
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
应用过滤器?
总体思路是:
示例脚本(带有 Enigma.js 的 JavaScript)
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 个cells 数据。在我们的示例中,我们要求 Qlik 创建二维立方体。因此 2 维 * 5000 = 10000 个数据单元。 这也意味着,如果我们有超过 10000 个数据单元格,我们将不得不向 Qlik 询问其余数据。在我们的例子中,我们可以使用 GetHyperCubeData 方法来检索下一页/批次数据(同样最多 10000 个单元格/数据点)
对数据进行分页可能很棘手,尤其是当我们必须处理数据透视数据时。
仅提一下,在处理单个字段时,与 ListBox 对象而不是多维数据集/表格交互可能会更好/更容易。一些 JS 示例可以在这里找到
我有一系列博客文章介绍了引擎 API 的基础知识,这可能有助于提供一些背景信息:
它包括如何执行选择并从超立方体获取数据。
关于“GetTableData”方法:它仅用于数据预览,而不是获取所有数据,并且该方法不受选择状态的影响。因此,如果您想要这种过滤或者您的表很大,那么您应该依赖于 Stefan Stoichev 在之前的评论中描述的流程类型。