咬牙在复活节之前把项目上线了,最近事情不多,准备弄弄增量更新。突然发现现在Datasets数据集里面的parameter已经很不错了。先来一篇Datasets数据集里面的Parameter应用来预预热。节后发增量更新的内容。
功能实现概述
datasets数据集里面的参数,主要是创建于Power BI Desktop中。当报表发布到Power BI Server之后,在Datasets setting里面可以随意改变参数Parameter。
应用场景
当以平面文件为数据源,可以把平面文件的路径path作Parameter,当路径修改的时候,不需要打开Power BI的pbix文件,直接修改路径的parameter就可以了。
还有比如,数据量很大(不是上亿条每天的那种,那种还是增量更新更划算一些)的Power BI报表,一般我们可以在Power BI Server上定时刷新,其实速度还是可以的。但是,import的报表数据,需要在本地刷一次才能保存修改,然后上传到Power BI Server上。有时候数据量太大,这一次刷新会消耗很多时间。这时巧用Parameter是个不错的选择。
再者,之前写的SASURL的数据源,也可以创建Parameter,然后将Parameter写在function和M Query里面。等SAS token过期的时候,就不用再打开报表修改啦~~
3. 实战应用
a. 以平面文件为数据源。
导入Excel数据源
导入完成后,查看Transform data
点击Advanced Editor
得到如下内容:
let
Source = Excel.Workbook(File.Contents("C:\Users\YA\Desktop\study\DAX分享\DAX分享23\datasource.xlsx"), null, true),
Sheet1_Sheet = Source{[Item="Sheet1",Kind="Sheet"]}[Data],
#"Promoted Headers" = Table.PromoteHeaders(Sheet1_Sheet, [PromoteAllScalars=true]),
#"Changed Type" = Table.TransformColumnTypes(#"Promoted Headers",{{"StoreKey", Int64.Type}, {"ProductKey", Int64.Type}, {"CustomerKey", Int64.Type}, {"Quantity", Int64.Type}, {"Unit Price", type number}, {"Unit Discount", Int64.Type}, {"Unit Cost", type number}, {"Net Price", type number}, {"Order Date", type datetime}, {"Due Date", type datetime}, {"Delivery Date", type datetime}, {"Sales Amount", type number}, {"Order Year Month", type date}, {"Order Year Month sort", Int64.Type}})
in
#"Changed Type"
2. 创建变量
点击Transform data->Transform data
点击Manage Parameters里面的New Parameter
为Excel源数据路径创建一个parameter
这里数据类型,选择Text类型。OK。如果要修改Parameter,可以直接点击Manage Parameter来修改。
3. 用Parameter替换原来的路径内容
let
Source = Excel.Workbook(File.Contents(P_Path), null, true),
Sheet1_Sheet = Source{[Item="Sheet1",Kind="Sheet"]}[Data],
#"Promoted Headers" = Table.PromoteHeaders(Sheet1_Sheet, [PromoteAllScalars=true]),
#"Changed Type" = Table.TransformColumnTypes(#"Promoted Headers",{{"StoreKey", Int64.Type}, {"ProductKey", Int64.Type}, {"CustomerKey", Int64.Type}, {"Quantity", Int64.Type}, {"Unit Price", type number}, {"Unit Discount", Int64.Type}, {"Unit Cost", type number}, {"Net Price", type number}, {"Order Date", type datetime}, {"Due Date", type datetime}, {"Delivery Date", type datetime}, {"Sales Amount", type number}, {"Order Year Month", type date}, {"Order Year Month sort", Int64.Type}})
in
#"Changed Type"
对于没有paramter的报表,在Transform data里面看到的"Edit parameters是灰色的。创建之后就会变成下面的样子。创建之后可点这里修改。
4. 完成之后保存报表并发布到Power BI。在此,我发布到了test group这个workspace。我用的是Pro的账号。
发布完成。
5. 在Datasets里面修改Parameter
首先定位到workspace。在test group这个workspace里面找到parameter-file1这个datasets。右面竖向三个点,右键Settings.
得到下面的页面
当修改了屏幕文件的路径的时候,只要在这个页面上修改就可以了。非常方便。修改文件里面的内容,麻烦移步pbix内。
b. 这个如果应用在SASURL的项目里,就更好啦。不知道什么是SASURL的可以参考以下内容:
学习笔记1:Power BI访问SASURI获取数据
学习笔记2:以SASURL为数据源报表的自动刷新
按照以上介绍的方法,加载数据源,创建Parameter。
主要创建了link以及st,se,sv,tn和sig几个参数如下:
打开函数function的advanced editor,配置到Function中,如下图所示
直接抄下面所有内容就好~~记得改函数名(RecursiveTableStorag-ASSA)哦~~
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(link, [ Headers=[Accept="application/json;odata=nometadata"], Query = queryCombine ])),
resultAsList = result[value],
lastInList = List.Last(resultAsList),
tokens = CreateContinuationTokens(lastInList[PartitionKey], lastInList[RowKey]),
a1 = List.Combine({resultAsList, #"RecursiveTableStorag-ASSA"( query, tokens)}),
a2 = resultAsList,
resultList = if List.Count(resultAsList) > 1 then a1 else a2
in
resultList
in
Func
修改table的M Query部分,用参数代替具体值
看的仔细的小伙伴,肯定发现,我还多一个daterange_end的参数。
这个参数主要是控制上传到Power BI Server的数据范围。SASURL数据源里面的数据太多了。所以创建了一个据今天多少天的column,然后只上传部分数据,节省在本地加载数据的时间,然后在Power BI Server上修改变量,来加载更多的数据。这个距今天多少天的column定义如下:
部分M Query代码如下:
#"Added Custom3" = Table.AddColumn(#"Changed Type", "datediff", each Duration.Days([Date]-[Today])),
#"Filtered Rows1" = Table.SelectRows(#"Added Custom3", each [datediff] <= daterange_end)
一切就绪,发布到Power BI Server上,在Datasets的Setting里
还不错哦~~以后这个SAS token过期了,就不用打开pbix修改了,直接在Power BI上面就可以修改了。挺方便的~~
今天写的有点多了~~
感谢关注~~