想写的东西很多,先把上次学习笔记1的坑填一下。
上次写了用SASURL做数据源开发了报表。学习笔记1:Power BI访问SASURI获取数据 开发好之后,Publish到了Power BI Server的workspace。用户要求定时刷新。
于是,在workspace里面,在Dataset的Setting属性里准备设置刷新schedule refresh,结果发现了如下错误。
没有看到具体的错误信息,还是无从下手所以选择了dataset里面的“refresh now”。进而从Refresh history里面得到了详细的错误信息如下:
嗯,找到不能定时刷新的原因了。是因为dynamic data source不能在Power BI Server上刷新dataset.
下一步查找官网,链接如下:
https://docs.microsoft.com/en-us/power-bi/connect-data/refresh-data
内容很长,在dynamic data source来说,有两个特殊情况是可以在Power BI Server上动态刷新数据的。比如Web.Contents M Query.
这个函数,之前在创建Function的时候,是用到过的。于是想到了之前学习的那个链接。果然作者也是有后续的解决方案的。
原文链接如下
https://medium.com/@martijnlentink/use-missing-skip-test-connection-in-scheduled-refresh-in-power-bi-5b3fa9a30daf
(需要科学上网)
内容有点长,里面一些功能微软已经更新了。所以不需要自己skiptest connection,也不用run powershell了。只要修改function的内容,Publish到Power BI server上,然后设置下SkipTestConnection就可以了。
修改function 内容如下:就是把原来的URL变量,直接用URL内容替换了。
let
Base64Encode = (str as text) => Binary.ToText(Text.ToBinary(str, BinaryEncoding.Base64)),
CreateContinuationTokens = (partitionkey as text, rowkey as text) =>
let
tokenPrefix = "1",
combineToken = "!",
encodedPartition = Base64Encode(partitionkey),
encodedRow = Base64Encode(rowkey),
nextPartKey = Text.Combine({tokenPrefix, Text.From(Text.Length(encodedPartition)), encodedPartition}, combineToken),
nextRowKey = Text.Combine({tokenPrefix, Text.From(Text.Length(encodedRow)), encodedRow}, combineToken),
result = [ NextPartitionKey = nextPartKey, NextRowKey = nextRowKey]
in
result,
Func = (query as record, optional continuationTokens as record) =>
let
queryCombine = if continuationTokens = null then query else Record.Combine({query, continuationTokens}),
result = Json.Document(Web.Contents("https://storagename.table.core.windows.net/tablename", [ Headers=[Accept="application/json;odata=nometadata"], Query = queryCombine ])),
resultAsList = result[value],
lastInList = List.Last(resultAsList),
tokens = CreateContinuationTokens(lastInList[PartitionKey], lastInList[RowKey]),
resultList = if List.Count(resultAsList) > 1 then List.Combine({resultAsList, #"RecursiveTableStorag-ASA"(query, tokens)}) else resultAsList
in
resultList
in
Func
所以相应的Query里面的内容也要变化。去掉了URL内容。
let
queryParameters = [ st = "2019-08-20T10:00:00Z",
se = "2030-08-25T10:00:00Z",
sp = "r",
sv = "2018-05-30",
tn = "tablename",
sig = "abcdefghijklmnopqrstuvwxyz"
],
tabledata = Table.FromRecords(RecursiveTableStorage(queryParameters)),
distinctRows = Table.Distinct(tabledata, {"PartitionKey", "RowKey"}),
in
distinctRows
Power BI Desktop里面的内容就修改完成了。
发布到Power BI Server之后。
在Datasets里的Data source credentials 里面找到Edit credentials.
配置如下内容:
之后就可以schedule refresh了。很不错吧。
谢谢关注,转发分享。
谢谢你的关注。我会继续努力的!