在模型驱动应用主窗体中嵌入 Power BI 报表
您可以使用 Power Apps 模型驱动应用中的 Power BI 报表将丰富的报表和分析带入您的主窗体,让用户完成更多任务。 这可以解锁跨系统聚合数据的能力,并将其自定义到单个记录的上下文。
必备条件
嵌入 Power BI 内容是一个可选功能,默认情况下所有环境均禁用。 在嵌入 Power BI 内容之前,必须将其启用。 详细信息:在组织中启用 Power BI 可视化效果化。
此功能需要导出解决方案、进行修改以添加 XML 片段,然后重新导入到环境。 请务必仅通过托管解决方案在您的目标环境中导入所做的更改。 请参阅导入、更新和导出解决方案获取为现有托管解决方案安装更新的指导。
不使用上下文筛选嵌入
您可以通过嵌入 Power BI 报表来使用它们,并获取完全相同的报表。 这不会将它们置于当前模型驱动窗体的上下文中,因此,您将在表的所有记录中获取相同报表。 例如,下列报表一次可以显示所有客户的地理位置,对于显示摘要信息很有用。
您可以通过以下步骤自定义主窗体 XML sections
节点,让它可以托管嵌入的 Power BI 报表和磁贴:
在您的开发环境中,创建一个解决方案并添加包含您希望嵌入的 Power BI 报表显示的主窗体的表。
- 如果表已存在于您将导入解决方案的目标环境中,在将表添加到解决方案时,选择选择组件选项。 然后,只添加表的主窗体。
- 如果表不存在于您将导入解决方案的目标环境中,在将表添加到解决方案时,选择包括所有组件。
将该解决方案作为托管解决方案导出。
提取解决方案包 zip 文件中的所有文件。 然后,编辑 customizations.xml 文件,并将下面提供的 XML 代码添加到 customizations.xml 文件中
<forms type="main">
节点内的<sections>
块内。
<section id="{d411658c-7450-e1e3-bc80-07021a04bcc2}" locklevel="0" showlabel="true" IsUserDefined="0" name="tab_4_section_1" labelwidth="115" columns="1" layout="varwidth" showbar="false">
<labels>
<label languagecode="1033" description="Unfiltered Power BI embedding demo"/>
</labels>
<rows>
<row>
<cell id="{7d18b61c-c588-136c-aee7-03e5e74a09a1}" showlabel="true" rowspan="20" colspan="1" auto="false" solutionaction="Added">
<labels>
<label languagecode="1033" description="Accounts (Parent Account)"/>
</labels>
<control id="unfilteredreport" classid="{8C54228C-1B25-4909-A12A-F2B968BB0D62}">
<parameters>
<PowerBIGroupId>00000000-0000-0000-0000-000000000000</PowerBIGroupId>
<PowerBIReportId>544c4162-6773-4944-900c-abfd075f6081</PowerBIReportId>
<TileUrl>https://app.powerbi.com/reportEmbed?reportId=544c4162-6773-4944-900c-abfd075f6081</TileUrl>
</parameters>
</control>
</cell>
</row>
<row/>
</rows>
</section>
重要
请务必使用 XML 示例中所示的控件 classid="{8C54228C-1B25-4909-A12A-F2B968BB0D62}"
。
- 对复制到 Power BI 报表的 customizations.xml 文件中的窗体 XML 进行以下更改。 此表介绍您需要更改为上一个 XML 示例中的元素的值。
属性 | 说明 |
---|---|
PowerBIGroupId | Power BI 工作区 ID。 如果您的报表在“我的工作区”中,**则工作区 ID 为 00000000-0000-0000-0000-000000000000。 否则,添加工作区 ID。 您可以在 Power BI 服务 URL 中查找工作区 ID。 详细信息:查找 Power BI 工作区和报表 ID。 |
PowerBIReportId | Power BI 报表 ID。 将此替换为要嵌入的报表。 您可以在 Power BI 服务 URL 中找到您的报表的 ID。 详细信息:查找 Power BI 工作区和报表 ID |
TileUrl | 您要嵌入的 Power BI 报表 URL。 请确保使用正确的 Power BI 子域名称(您可能需要将 app.powerbi.com 替换为您自己的名称)和报表 ID(将 reportId=544c4162-6773-4944-900c-abfd075f6081 替换为您自己的信息)。 例如,https://app.powerbi.com/reportEmbed?reportId=544c4162-6773-4944-900c-abfd075f6081 。 |
solutionaction="Added" | 如果表已存在于目标环境中,保留 XML 示例中提供的单元格元素的 solutionaction=Added 参数。 如果表不存在于目标环境中,删除 solutionaction=Added 参数。 |
- 使用之前提取的所有解决方案文件创建一个 zip 文件。 然后,在目标环境中导入解决方案。
使用上下文筛选嵌入
您可以通过对当前的模型驱动窗体应用上下文筛选器来使 Power BI 报表更有意义,以使报表根据当前行的属性进行筛选。 例如,通过使用客户名称筛选 Power BI 报表,以下报表显示客户的地理位置。 此选项允许单个报表显示表的所有行的加入上下文的信息。
筛选通过在 <parameter>
块中添加 <PowerBIFilter>
元素进行,如此处所示。 您可以使用窗体表的任何属性来构造筛选器表达式。 详细信息:通过构造筛选器了解如何创建您自己的筛选器。
<control id="filteredreport" classid="{8C54228C-1B25-4909-A12A-F2B968BB0D62}">
<parameters>
<PowerBIGroupId>00000000-0000-0000-0000-000000000000</PowerBIGroupId>
<PowerBIReportId>544c4162-6773-4944-900c-abfd075f6081</PowerBIReportId>
<TileUrl>https://xyz.powerbi.com/reportEmbed?reportId=544c4162-6773-4944-900c-abfd075f6081</TileUrl>
<PowerBIFilter>{"Filter": "[{\"$schema\":\"basic\",\"target\":{\"table\":\"table_name_of_power_bi_dataset\",\"column\":\"power_bi_field\"},\"operator\":\"In\",\"values\":[$a],\"filterType\":1}]", "Alias": {"$a": "field_name_in_powerapps_to_filter"}}</PowerBIFilter>
</parameters>
</control>
请注意,这使用与未筛选的报表嵌入相同的控件,因此控件类 ID 保持不变。
此表介绍前一个 XML 示例中使用的所有其他属性。
属性 | 描述 |
---|---|
PowerBIFilter | 通过作为参数传递窗体属性将 Power BI 报表置于上下文的筛选器表达式。 为了更加易读,筛选器按如下方式构造。 筛选表达式不能是逗号分隔的值列表。 |
{
"Filter": "[{
\"$schema\":\"basic\",
\"target\":{
\"table\":\"table_name_of_power_bi_dataset\",
\"column\":\"power_bi_field\"
},
\"operator\":\"In\",
\"values\":[$a, $b],
\"filterType\":1
}]",
"Alias": {
"$a": "field1_name_in_powerapps_to_filter",
"$b":"field2_name_in_powerapps_to_filter"
}
}
前一个表达式的目标部分标识应用筛选器的表和列。 运算符标识确定从 Power Apps 模型驱动型应用传递的数据的逻辑和值。 若要以通用方式参数化,通过使用别名构造值。 在上一个表达式中,传递了客户的 firstname 和 lastname,二者都在 Power BI 报表中的客户名称列搜索。 请注意 firstname 和 lastname 是客户表的属性的唯一名称,其值将在此处传递。
可以通过查看构造筛选器中的示例并为 $schema 和 filterType 提供适当的值来创建更复杂的筛选器表达式。 请确保使用 " 转义筛选器中的每个文字,以便可以正确生成 JSON。
导入前删除未经修改的属性
将解决方案导入到目标环境之前,确保 customizations.xml 文件的 formXml 部分中不包含未经修改的属性。 如果包含 Power BI控件 XML 的 XML 中有未经修改的属性,请先删除该属性,再将解决方案导入到目标环境中。 例如,将 <systemform unmodified="1">
替换为 <systemform>
。
查找 Power BI 工作区和报表 ID
- 此示例的工作区 ID 为 efc85277-2bdb-47bc-9762-363f64335108。
- 此示例的报表 ID 为 643ab643-7126-4a57-bd82-ca8f1fb676fc。
已知问题和限制
此集成只在统一接口客户端可用,并且在支持的 Web 浏览器和移动设备上。
在 Power Apps 窗体设计器中打开此窗体将不会以有意义的方式显示控件。 这是因为此控件在窗体设计器外自定义。
系统将使用用户的 Power Apps 用户名和密码自动进行身份验证后进入 Power BI。 如果具有匹配凭据的 Power BI 客户不存在,登录提示显示如下。
如果使用了不正确的客户登录 Power BI,数据将不会显示。 若要使用正确的凭据登录,请先注销,然后再次登录。
显示在 Power Apps 内的报表数据的视图与 Power BI 相同,Power Apps 安全角色和特权不会影响显示的数据。 因此,数据基本上与 Power BI 数据集创建者看到的相同。 若要应用类似于 Power Apps 安全角色和团队的数据访问限制,请使用使用 Power BI 的行级安全性 (RLS)。
如果窗体在导入解决方案并发布自定义项之后未显示 Power BI 报表,请在模型驱动窗体编辑器中打开它并保存,以便窗体 JSON 重新生成。
只有在没有上下文筛选的情况下才支持在窗体上嵌入 Power BI 磁贴。
嵌入 Power BI 报表不支持跨租户引用。 例如,即使已通过 Power BI 与 Fabrikam 租户中的用户共享了要嵌入的报表,当前仍不支持将属于 Contoso 租户的 Power BI 报表嵌入到属于 Fabrikam 租户的模型驱动应用中。
作为 Power BI 仪表板一部分的固定报表并不意味着它们就是交互式报表。 如果您希望使用交互式 Power BI 报表,请直接嵌入它们,而不是将其固定到仪表板。
常见问题
- 在可能需要时,未在控制参数的
TileUrl
节点中指定组 ID。 此示例包含组 ID。
<parameters>
<PowerBIGroupId>fd266a4c-9a02-4553-9310-80e05ee844f3</PowerBIGroupId>
<PowerBIReportId>544c4162-6773-4944-900c-abfd075f6081</PowerBIReportId>
<TileUrl>https://xyz.powerbi.com/reportEmbed?reportId=544c4162-6773-4944-900c-abfd075f6081&groupId=fd266a4c-9a02-4553-9310-80e05ee844f3</TileUrl>
</parameters>
- 字段在 Power BI 和 Dataverse 中具有不同的数据类型。 它们需要是相同类型,例如 Power BI 中的字符串和 Dataverse 中的字符串。
- 字符串字段在 Power BI 筛选器中没有转义引号。 请注意
values
具有[\"$a\"]
,而非[$a]
。
{
"Filter": "[{
\"$schema\":\"basic\",
\"target\":{
\"table\":\"table_name_of_power_bi_dataset\",
\"column\":\"power_bi_field\"
},
\"operator\":\"In\",
\"values\":[\"$a\"],
\"filterType\":1
}]",
"Alias": {
"$a": "field_name_in_powerapps_to_filter",
}
}