2016-06-14 196 views
1

我正在尝试使用Power BI桌面连接到使用CRM的新Web API方法的CRM Online(2016 Spring Wave 1)实例。Power BI连接到CRM 2016 Web API

当我把我的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>") 

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

所以有没有人设法让权力与商业智能的新的Web API调用的工作?

回答

2

我创建了一个新的CRM在线试用实例,并使用电力BI中的WebAPI URL(https://xxx.crm.dynamics.com/api/data/v8.0/my_records?$select=my_recordid)这一次,它的工作重试。

它必须是与我有到位的定制。

另外,我注意到,即使我包括在我的WebAPI请求$select=my_recordid过滤器,即PowerBI仍然加载所有列的名称;不过,只有在我的过滤器中指定的列才有值。

这可以解释为什么当我指定的$select

0

的单一属性,我起步比较晚对这个问题甚至发生错误,但我已经与“Json.Document(网络良好的成功。内容())“方法。分页问题的窍门是将这个调用包装在一个递归函数中。为了方便起见,我已经封装了递归函数,以便我可以传入保存视图/高级查找的名称并获取该查询的结果。

其要点是: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 

上有依据更多的指令是否有帮助。希望它能帮助别人!