我有一个关于在Power BI中创建custom visualization的问题。
我想实现"总行"内置矩阵可视化中可用的功能。主要概念是自动汇总每个值并按行分组。这就是它在矩阵可视化上的样子:
但是,说实话,我不知道如何实现这一目标。我尝试了不同的东西,但我无法在dataViews中收到这些分组值。
我尝试分析内置的matrix.ts code,但它与自定义可视化代码完全不同。我发现了customizeQuery方法,它将subtotalType属性设置为行和列 - 我尝试在我的代码中添加它,但我没有看到dataViews有任何差异(我没有找到分组值)。
目前我的capabilities.dataViewMappings设置如下:
dataViewMappings: [
{
conditions: [
{ 'Rows': { max: 3 } }
],
matrix: {
rows: {
for: { in: 'Rows' },
},
values: {
for: { in: 'Values' }
},
},
}
]
有谁知道我们如何才能实现这一目标"总排"功能?
更新1
我已经找到了解决方案:当我们实现customizeQuery
方法时(与matrix.ts代码中的customizeQuery方法相同),然后在{添加对它的引用{1}}然后它按预期工作(我在powerbi.visuals.plugins.[visualisationName+visualisationAddDateEpoch].customizeQuery
子元素中接收到具有行总值的元素。
现在唯一的问题是,我并不确切知道如何正确添加此dataViews[0].matrix.row.root
方法的引用。例如customizeQuery
是[visualisationName+visualisationAddDateEpoch]
,我不知道这些数字是什么(我只知道名字)。我在我的可视化构造函数中创建了代码,如下所示(并且它正在工作):
Custom1451458639997
但在我看来,这段代码非常脏,不够优雅。我想改进它 - 告诉Power BI我们实现自定义 constructor() {
var targetCustomizeQuery = this.constructor.customizeQuery;
var name = this.constructor.name;
for(pluginName in powerbi.visuals.plugins) {
var patt = new RegExp(name + "[0-9]{13}");
if(patt.test(pluginName)) {
powerbi.visuals.plugins[pluginName].customizeQuery = targetCustomizeQuery;
break;
}
}
}
方法的正确方法是什么,它应该使用它?
更新2
更新1 中的代码仅适用于Web浏览器中的Power BI(基于Web)。在Power BI桌面上,不会调用customizeQuery
方法。告诉Power BI使用我们的自定义customizeQuery
方法的正确方法是什么?在使用PowerBIVisualPlayground的PowerBI-visuals repository代码中,我们可以在plugin.ts
文件中声明它(与完成矩阵视觉的方式相同):
customizeQuery
但是,在我看来,从Power BI Dev Tools我们无权访问这部分代码。有什么想法吗?
答案 0 :(得分:0)
您似乎错过了功能中的列映射。看一下matrix capabilities(也在下面复制以供参考),作为第一步,最初采用该结构。矩阵计算行和列的交集,因此如果没有能力列,那么你会怀疑你得到你想要的东西。
其次,在传递给Update的矩阵数据视图中,您将获得一个' DataViewMatrixNode'使用 isSubtotal:true 查看unit tests for matrix以查看结构。
dataViewMappings: [{
conditions: [
{ 'Rows': { max: 0 }, 'Columns': { max: 0 }, 'Values': { min: 1 } },
{ 'Rows': { min: 1 }, 'Columns': { min: 0 }, 'Values': { min: 0 } },
{ 'Rows': { min: 0 }, 'Columns': { min: 1 }, 'Values': { min: 0 } }
],
matrix: {
rows: {
for: { in: 'Rows' },
/* Explicitly override the server data reduction to make it appropriate for matrix. */
dataReductionAlgorithm: { window: { count: 500 } }
},
columns: {
for: { in: 'Columns' },
/* Explicitly override the server data reduction to make it appropriate for matrix. */
dataReductionAlgorithm: { top: { count: 100 } }
},
values: {
for: { in: 'Values' }
}
}
}],