首页 文章

自定义Power BI可视化中的“总行数”

提问于
浏览
3

我有一个关于在Power BI中创建custom visualization的问题 .

我想实现内置矩阵可视化中可用的"total row"功能 . 主要概念是自动汇总每个值并按行分组 . 这就是矩阵可视化的样子:
Built-in matrix "total rows" functionality

但是,说实话,我不知道如何实现这一目标 . 我尝试不同的东西,但我无法在dataViews中收到这些分组值 .

我试图分析内置的matrix.ts code,但它与自定义可视化代码完全不同 . 我找到了customizeQuery方法,它将subtotalType属性设置为行和列 - 我试图在我的代码中添加它,但我没有找到分组值 .

目前我的capabilities.dataViewMappings设置如下:

dataViewMappings: [
            {
                conditions: [
                    { 'Rows': { max: 3 } }
                ],
                matrix: {
                    rows: {
                        for: { in: 'Rows' },
                    },
                    values: {
                        for: { in: 'Values' }
                    },
                },
            }
        ]

有谁知道我们如何才能实现这种“总排”功能?

UPDATE 1

我已经找到了解决方案:当我们实现 customizeQuery 方法(与matrix.ts代码中的customizeQuery方法相同),然后在 powerbi.visuals.plugins.[visualisationName+visualisationAddDateEpoch].customizeQuery 中添加对它的引用然后它按预期工作(我收到 dataViews[0].matrix.row.root 具有行总值的子元素 .

现在唯一的问题是我不知道如何正确地添加这个对 customizeQuery 方法的引用 . 例如, [visualisationName+visualisationAddDateEpoch]Custom1451458639997 ,我不会't know what those number will be (I know only the name). I created the code in my visualisation constructor as below (and it'工作):

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;
            }
        }
    }

但在我看来,这段代码非常脏,不够优雅 . 我想改进它 - 告诉Power BI我们实现自定义 customizeQuery 方法的正确方法是什么,它应该使用它?

UPDATE 2

update 1 中的代码仅适用于Web浏览器中的Power BI(基于Web) . 在Power BI桌面上,不会调用 customizeQuery 方法 . 告诉Power BI使用我们的自定义 customizeQuery 方法的正确方法是什么?在使用PowerBIVisualPlayground的PowerBI-visuals repository代码中,我们可以在plugin.ts文件中声明它(与完成矩阵视觉的方式相同):

export let matrix: IVisualPlugin = {
    name: 'matrix',
    watermarkKey: 'matrix',
    capabilities: capabilities.matrix,
    create: () => new Matrix(),
    customizeQuery: Matrix.customizeQuery,
    getSortableRoles: (visualSortableOptions?: VisualSortableOptions) => Matrix.getSortableRoles(),
};

但是,在我看来,从Power BI Dev Tools我们无法在这部分代码中添加额外的东西 . 有任何想法吗?

1 回答

  • 0

    您似乎错过了功能中的列映射 . 看一下matrix capabilities(也在下面复制以供参考),作为第一步,最初采用该结构 . 矩阵计算行和列的交集,因此如果没有能力中的列,那么你会得到你想要的东西 .

    其次,在矩阵dataview中传递给你'll get a ' 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' }
                }
            }
        }],
    

相关问题