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

如何从实时连接模式的精简PBIX报表中提取度量值Lineage ID?

从实时连接的精简PBIX中提取度量值Lineage ID并关联DAX表达式

可以实现,但精简PBIX(实时连接模式)本身不直接存储数据集的Lineage ID,需要通过解析报表布局的JSON结构提取度量值的关联标识符,再与数据集DMV的LineageTag匹配。以下是具体实现步骤:

1. 解析精简PBIX的报表布局,提取度量值信息

实时连接的PBIX解压后,Report/Layout/Report.json包含了报表中所有对象的引用信息。你需要从中提取:

  • 度量值的显示名称(报表中展示的名称)
  • 对应的lineageTag(与数据集DMV中LineageTag匹配的唯一标识)

用PowerQuery实现解析的示例代码:

let
    // 解压PBIX并读取Report.json
    PBIXPath = "C:\YourPath\YourReport.pbix",
    TempFolder = "C:\Temp\PBIXExtract",
    ExtractPBIX = Shell.Execute("powershell", "-Command Expand-Archive -Path '" & PBIXPath & "' -DestinationPath '" & TempFolder & "' -Force"),
    ReportJsonPath = TempFolder & "\Report\Layout\Report.json",
    ReportJson = Json.Document(File.Contents(ReportJsonPath)),

    // 递归遍历JSON,提取所有度量值引用
    ExtractMeasureReferences = (json as any) as list =>
        let
            IsList = Value.Is(json, List.Type),
            IsRecord = Value.Is(json, Record.Type),
            ProcessList = if IsList then List.Transform(json, ExtractMeasureReferences) else {},
            ProcessRecord = if IsRecord then
                let
                    CheckMeasure = if Record.HasFields(json, {"lineageTag", "displayName"}) and Record.Field(json, "objectType") = "Measure" then
                        {[DisplayName = Record.Field(json, "displayName"), LineageTag = Record.Field(json, "lineageTag")]}
                    else {},
                    ProcessFields = List.Transform(Record.FieldNames(json), (field) => ExtractMeasureReferences(Record.Field(json, field)))
                in
                    CheckMeasure & List.Combine(ProcessFields)
            else {},
            Result = if IsList then List.Combine(ProcessList) else if IsRecord then List.Combine(ProcessRecord) else {}
        in
            Result,

    MeasureReferences = ExtractMeasureReferences(ReportJson),
    // 去重并整理成表格
    MeasureTable = Table.FromList(MeasureReferences, Splitter.SplitByNothing(), null, null, ExtraValues.Error),
    ExpandColumns = Table.ExpandRecordColumn(MeasureTable, "Column1", {"DisplayName", "LineageTag"}, {"显示名称", "LineageTag"}),
    RemoveDuplicates = Table.Distinct(ExpandColumns, {"显示名称", "LineageTag"})
in
    RemoveDuplicates

2. 从数据集DMV获取度量值的LineageTag与DAX表达式

通过PowerQuery连接到Power BI数据集,执行DMV查询获取度量值信息:

let
    // 连接到Power BI数据集(实时连接的数据源)
    Source = AnalysisServices.Database("powerbi://api.powerbi.com/v1.0/myorg/YourWorkspace", "YourDataset"),
    // 执行DMV查询
    DMVQuery = Source{[Name="$SYSTEM.TMSCHEMA_MEASURES"]}[Data],
    // 保留需要的列
    CleanedDMV = Table.SelectColumns(DMVQuery, {"LineageTag", "Name", "Expression"})
in
    CleanedDMV

3. 关联报表与数据集的度量值,生成目标表格

将两个表格通过LineageTag列合并,得到包含报表显示名称和对应DAX表达式的结果:

let
    // 加载前面步骤生成的两个表格
    ReportMeasures = /* 第一步的结果 */,
    DatasetMeasures = /* 第二步的结果 */,
    // 合并表格
    MergedTables = Table.NestedJoin(ReportMeasures, {"LineageTag"}, DatasetMeasures, {"LineageTag"}, "DatasetMeasures", JoinKind.LeftOuter),
    // 展开DAX表达式列
    ExpandDAX = Table.ExpandTableColumn(MergedTables, "DatasetMeasures", {"Expression"}, {"DAX表达式"}),
    // 整理列顺序
    ReorderedColumns = Table.ReorderColumns(ExpandDAX, {"显示名称", "DAX表达式", "LineageTag"})
in
    ReorderedColumns

注意事项

  • 若报表中存在报表级度量值(非引用数据集的度量),这类度量的LineageTag不会在数据集DMV中存在,需根据需求过滤或单独处理。
  • 部分情况下,报表布局JSON中的度量值引用可能嵌套在visualContainers、filters或pageLevelFilters等节点下,递归遍历逻辑需确保覆盖所有可能的位置。

内容的提问来源于stack exchange,提问作者Przemyslaw Remin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 22:45:27