能否在Power BI Deneb中创建参数式动态多滑块用于项目日期调整?
用Deneb实现项目级动态日期调整滑块并对接DAX
一、Deneb(Vega-Lite)实现动态多滑块
可以通过Vega-Lite的动态重复布局,实现随项目数量自动扩展的多滑块组件,以下是完整配置及实现步骤:
步骤1:数据绑定
在Deneb视觉对象的字段面板中,将包含唯一项目名称的字段(如项目表[项目名称])拖入类别字段区域。
步骤2:Vega-Lite配置代码
{ "$schema": "https://vega.github.io/schema/vega-lite/v5.json", "description": "项目日期调整滑块组件", "data": {"name": "dataset"}, "repeat": {"row": {"field": "项目名称", "type": "nominal"}}, "spec": { "width": 300, "height": 60, "params": [ { "name": "adjustment", "value": 0, "bind": { "input": "range", "min": -3, "max": 3, "step": 1, "name": "调整月数: " } } ], "layer": [ { "mark": {"type": "text", "align": "right", "x": 80, "y": 0, "fontSize": 12}, "encoding": {"text": {"field": "项目名称", "type": "nominal"}} }, { "mark": {"type": "text", "align": "left", "x": 380, "y": 0, "fontSize": 12}, "encoding": {"text": {"signal": "adjustment"}} } ] }, "config": { "axis": {"domain": false, "ticks": false, "labels": false}, "view": {"stroke": "transparent"} } }
代码说明
repeat配置会自动遍历项目名称的所有唯一值,为每个项目生成独立的滑块行;params定义了滑块的范围(-3到3)、步长(1)及默认值(0);- 新增项目时,只要
项目表中添加了新的项目名称,Deneb视觉对象会自动加载并生成对应滑块。
二、将滑块值传入DAX度量值
Deneb本身无法直接将滑块数值传递到DAX,但可以通过辅助表+Power BI API的方案实现,具体步骤如下:
步骤1:创建辅助存储表
在Power BI中新建计算表,用于存储每个项目的调整月数:
项目调整值表 = SELECTCOLUMNS( '项目表', "项目名称", '项目表'[项目名称], "调整月数", 0 )
步骤2:修改Deneb代码添加值更新逻辑
在Vega-Lite配置中添加信号监听与API调用逻辑,滑块变化时自动更新辅助表(需在Power BI设置中开启"允许视觉对象使用JavaScript API"权限):
{ "$schema": "https://vega.github.io/schema/vega-lite/v5.json", "description": "项目日期调整滑块组件", "data": {"name": "dataset"}, "repeat": {"row": {"field": "项目名称", "type": "nominal"}}, "spec": { "width": 300, "height": 60, "signals": [ { "name": "currentProject", "update": "repeat.row" }, { "name": "adjustment", "value": 0, "bind": { "input": "range", "min": -3, "max": 3, "step": 1, "name": "调整月数: " }, "on": [ { "events": "change", "update": "updateAdjustment(currentProject, adjustment)" } ] } ], "layer": [ { "mark": {"type": "text", "align": "right", "x": 80, "y": 0, "fontSize": 12}, "encoding": {"text": {"signal": "currentProject"}} }, { "mark": {"type": "text", "align": "left", "x": 380, "y": 0, "fontSize": 12}, "encoding": {"text": {"signal": "adjustment"}} } ] }, "config": { "axis": {"domain": false, "ticks": false, "labels": false}, "view": {"stroke": "transparent"} }, "init": "function(chart) { window.updateAdjustment = function(project, value) { var pbiviz = chart.view.model._runtime.context.host; pbiviz.applyJsonFilter( { $schema: \"http://powerbi.com/product/schema#advanced\", target: \"项目调整值表\", filter: { target: \"项目调整值表[项目名称]\", operator: \"eq\", values: [project] }, query: { command: \"update\", columns: [{name: \"调整月数\", expression: {value: value}}] } }, \"项目调整值表\", 0 ); }; }" }
步骤3:DAX中引用调整值
编写度量值读取辅助表中的调整值,计算调整后的起始日期:
调整后起始日期 = VAR 选中项目 = SELECTEDVALUE('项目表'[项目名称]) VAR 调整月数 = LOOKUPVALUE('项目调整值表'[调整月数], '项目调整值表'[项目名称], 选中项目) RETURN EDATE(SELECTEDVALUE('项目表'[起始日期]), 调整月数)
内容的提问来源于stack exchange,提问作者GZ84
相关产品推荐
相关产品推荐

