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

如何修改Power BI API调用以获取Dataverse表全量审计数据?

解决Dataverse Audits表API仅返回前500行的问题

当前问题

你现在通过以下Power Query代码访问Dataverse的audits表,但只能获取前500行数据:

let
    Source = Web.Contents("https://xxx-prod-xxx.api.crm11.dynamics.com/api/data/v9.2/audits")
in
    Source

适配Dataverse的完整分页解决方案

Dataverse的OData API采用@odata.nextLink机制实现分页,而非普通页码参数,以下是针对你的场景改造后的完整代码:

1. 创建通用API调用函数

先定义可复用的API调用函数,替换成你的Dataverse实例地址:

let
    API = (url as text) =>
        let
            Response = Web.Contents(url),
            ParsedJson = Json.Document(Response)
        in
            ParsedJson
in
    API

2. 编写自动分页查询逻辑

通过List.Generate循环检查并获取所有分页数据,直到没有下一页链接为止:

let
    // 初始化API函数和第一页地址
    APICall = API,
    FirstPageUrl = "https://xxx-prod-xxx.api.crm11.dynamics.com/api/data/v9.2/audits?$top=500", // 显式指定每页500行(Dataverse单页上限)
    // 生成所有分页数据的列表
    AllPages = List.Generate(
        () => [
            PageData = APICall(FirstPageUrl),
            HasNext = Record.HasFields(APICall(FirstPageUrl), "@odata.nextLink")
        ],
        each [HasNext],
        each [
            PageData = APICall([PageData][@odata.nextLink]),
            HasNext = Record.HasFields([PageData], "@odata.nextLink")
        ],
        each [PageData][value]
    ),
    // 合并所有分页的记录
    CombinedData = List.Combine(AllPages),
    // 转换为表格格式(按需保留或删除)
    ResultTable = Table.FromList(CombinedData, Splitter.SplitByNothing(), null, null, ExtraValues.Error)
in
    ResultTable

代码关键说明

  • $top=500:显式指定每页获取500行(Dataverse API单页返回上限)
  • @odata.nextLink:Dataverse返回的下一页数据地址,每次调用后检查该字段是否存在,判断是否还有未获取的数据
  • List.Generate:自动循环调用API,收集每一页的value字段(存储当前页的audits记录),最后合并所有页的数据

更简便的替代方案

如果你不需要手动编写API逻辑,直接使用Power BI内置的Dataverse连接器(在「获取数据」中搜索"Dataverse"),它会自动处理分页逻辑,直接获取完整的audits表数据,无需手动编写分页代码。

内容的提问来源于stack exchange,提问作者Ami Khan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 17:34:57