我正在尝试使用Power BI Desktop使用CRM的新Web API方法连接到CRM Online(2016 Spring Wave 1)实例。
当我将我的api放入像Chrome这样的浏览器时,我会得到结果。例如,如果我使用https://xxx.crm.dynamics.com/api/data/v8.0/my_records?$select=my_recordid
,我可以看到列出的所有结果(批量为5000)
但是,当我在PowerBI中尝试相同的操作时,我收到错误,告诉我某个字段已经存在(参见屏幕截图)
我已经看到了包含URL的一些方法
= Json.Document(Web.Contents("<same url as above>")
但这似乎不是一个好方法,我不知道如何使用这种方法进行分页。
那么有没有人设法让Power BI使用新的Web API调用?
答案 0 :(得分:2)
我创建了一个新的CRM在线试用版实例,并在Power BI中使用WebAPI URL(https://xxx.crm.dynamics.com/api/data/v8.0/my_records?$select=my_recordid
)进行了重试,这次它运行了。
这必须与我所拥有的自定义有关。
另外,我注意到即使我在我的WebAPI请求中包含了$select=my_recordid
过滤器,该PowerBI仍然加载了所有列名称;但是,只有我的过滤器中指定的列具有值。
这可以解释为什么即使我在$select
答案 1 :(得分:0)
我对这个问题迟到了,但我在“Json.Document(Web.Contents())”方法上取得了很大的成功。分页问题的技巧是将调用包装在递归函数中。为方便起见,我已经包装了这个递归函数,以便我可以传入Saved View / Advanced查找的名称并获取该查询的结果。
作为要点:https://gist.github.com/d4hines/b5d9900fc1ea9d26311d2145505837cb
(OrgUrl as text, QueryName as text, UserView as logical) =>
let
GetQueryByName =
//https://mycrm.mydomain.com/MYORG
(OrgUrl as text, QueryName as text, UserView as logical) =>
let
QueryType = if UserView then "user" else "saved"
,return = OData.Feed(
OrgUrl & "/api/data/v8.0/" & QueryType & "queries?$select="& QueryType & "queryid&$filter=name eq '" & QueryName & "'"
)[userqueryid]{0}
in
return,
QueryAll =
(nextURL, prev) =>
let
prevList = if prev <> null then prev else {},
responseData = Json.Document(Web.Contents(nextURL, [Headers=[Prefer="odata.include-annotations=""OData.Community.Display.V1.FormattedValue"""]])),
return = if responseData[#"@odata.nextLink"]? <> null then @QueryAll(responseData[#"@odata.nextLink"], prevList & responseData[value]) else responseData[value] & prevList
in return,
NamedQuery = OrgUrl & "/api/data/v8.0/contacts?userQuery=" & GetQueryByName(OrgUrl, QueryName, UserView),
return = Table.FromList(QueryAll(NamedQuery, null), Splitter.SplitByNothing(), null, null, ExtraValues.Error)
in return
如果有帮助的话,还有更多关于要点的说明。希望它可以帮助别人!