Power BI连接到CRM 2016 Web API

时间:2016-06-14 08:27:50

标签: powerbi dynamics-crm-2016

我正在尝试使用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中尝试相同的操作时,我收到错误,告诉我某个字段已经存在(参见屏幕截图)

PowerBI error screenshot

我已经看到了包含URL的一些方法

= Json.Document(Web.Contents("<same url as above>")

但这似乎不是一个好方法,我不知道如何使用这种方法进行分页。

那么有没有人设法让Power BI使用新的Web API调用?

2 个答案:

答案 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

如果有帮助的话,还有更多关于要点的说明。希望它可以帮助别人!