-
背景:Power BI一般作为一个展示和分析数据的平台存在,即使是我们用Direct
Query的mode也是受制于连接的数据库的表刷新,不能实现实时动态数据变化展示。 -
解决思路:当Power Apps里面输入了新的数据时,数据会写入到database的table表里面,然后通过Direct
Query来连接的Power BI,发布到app.powerbi后,刷新页面就会得到最新的数据。 -
解决方案:为了实现实时动态和用户输入的数据交互,就做了一个Power BI和Power Apps的解决方案。
在Power Apps里面可以根据不同的用户来生成各个用户自己的原始数据,在Power BI中用Row Level Security来实现不同用户只能看到自己的数据。
方案很简单,主要包括三个部分。
1,在Azure的database里面创建了几张表;
2,把创建的表作为数据源应用到Power Apps里;
3,把创建的表作为数据源应用到Power BI里面;
解决方案具体步骤如下:
- 根据需求在数据库中创建table表
创建表也没啥说的,有一个主键是必要的。
- 将创建好的table表应用到Power Apps里面。
我的Power Apps是office365里的一个套件。
1.创建一个新的app,从引入一个SQL Server的数据源开始。
b.创建数据库连接。
c.找到之前创建的表名称
d. 连接之后,就会自动生成增删改查的页面。
代码都是直接生成的。下图中页面上的每一个内容都可以在上图Tree view里面找到内容。(我的项目中不要增加+,我修改去掉了)
常用的就是属性,检查和预览。
e. 创建好之后,保存,share分享给需要通过Power Apps来修改table表中参数的人或者组。这里即使数据库表没有权限,但是也可以通过Power Apps来修改table表中的数据内容。
- 将创建好的table表应用到Power BI中。
先在visualizations里面拉一个Power Apps这个控件,然后把table中用到的字段拉到PowerApps Data里面。
选中已经创建好的Power Apps,就会生成和Power Apps网页中创建的一样的内容。增删改查的内容和网页创建中预览的一样。(我的项目中我把增加的功能去掉了。)
解决方案基本就是这三个部分了。
本来Power BI只是一个分析数据的工具,现在结合Power Apps可以实现实时修改,实时展示。
之前有财务用户提出,想对于报表中的数据结果给一些实时的comments,然后直接在报告中展示。用Power BI+Power Apps完全可以实现。
(点击带有“Insert comments”名称的Bookmark button,显示出Power Apps,然后在Power Apps里面输入要写的comments。提交数据。用带有“close”的bookmark button关闭Power Apps界面。刷新页面,得到带有comments的报表结果。)
也许有人会问,这个和what-if有啥区别啊,用what-if差不多也可以实现这个问题啊。而且还不用设计到自己创建数据库表和Power Apps啊。hmmm…个人觉得主要是三点:
what-if中的数值变量是有数据范围的,如果数据范围太大,用single values就会出问题,有些太小的值根本不能输入。
例如: GENERATESERIES(0, 20000, 1)
我设想的是输入0到20000之间的任意一个数,步长增加为1,但是当我输入1,2这样的小值的时候,输入框的地方就只能看到0,大概从20开始输入才正常一些。
what-if输入的只能是数值,不能是字符;
变量太多的话,模型中要创建多个what-if的变量维度。不如Power Apps里面方便。
如果对Power Apps不了解的,可以参考下面的官网了解下。
https://docs.microsoft.com/zh-cn/powerapps/powerapps-overview
增删改查这样的操作,基本不用写代码,直接Power Apps里面自动生成了。而且在原有基础上可以自定义的很多。不过,Power Apps对网络有一定要求。我开发的时候都是用的外网。因为"App checker",用国内网络的时候,经常好像有延迟一样。修改了问题但是check下,还是说问题还在~~~我觉得这个也许就是Power Apps在国内不太常用的原因。Power Apps目前还没有像Power BI那样在国内有代理。
最后:
现在写起来,觉得还是挺简单的,错觉~~对于不同的用户,初次登录要给这个用户一个默认值。之后,用户如果修改了默认值,数据库中会保留修改后的结果。保留修改部分还是简单的,因为如以上操作2,Power Apps已经自动生成了Tree view。但是对于初始化默认值部分,可以参考代码如下。先判这个email是否有值,没有就固定生成一个值。代码按顺序执行。Patch函数是提交数据。
If(
CountRows(
Filter(
'[dbo].[Input_value_New]',
email = User().Email && PK = "UN001"
)
) = 0,
Patch(
'[dbo].[Input_value_New]',
Defaults('[dbo].[Input_value_New]'),
{
email: User().Email,
description: "Ønsket innntet",
...........
order: 1,
PK: "UN001"
}
)
);
Navigate(
Screen2,
ScreenTransition.None
)