You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 05:44:52