如何修改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
相关产品推荐
相关产品推荐

