在 Power Apps 中使用关系

已完成

Power Apps 确实可以提供一系列丰富的功能和控件,专门用于在应用中建立和利用关系。 在大多数应用中,关系通常涉及两个主要应用程序。

首先,如前所述,需要先跨多个表存储数据,然后再利用关系无缝连接这些数据。 本单元将指导您连接表(例如客户和发票),演示如何在它们之间建立有意义的关联。

其次,直接访问子记录时,通常使用关系从父记录中获取信息。 在本案例中,您将了解如何在发票记录上下文中检索客户名称。 此功能允许您有效访问和显示相关记录中的相关信息,从而增强应用的可用性和可理解性。

在 Power Apps 中连接父表和子表

本例将演示如何使用 Power Apps 筛选器和 LookUp 函数引用父级和子级关系。

在本关系中,客户表为父表,表明一个客户可以有很多发票。 注意,“客户”表没有引用“发票”表。 就本例而言,本表的数据源名称是 CustomerTable。 本表如下所示。

ID CustomerName CustomerPhoneNumber
1 Contoso 513-555-1212
2 Fabrikam 206-555-1313
3 Tailspin Toys 404-555-1414

“发票”表是本关系中的子级。 就本例而言,本表的数据源名称是 InvoiceTable。 本表如下所示。

ID InvoiceDate InvoiceDescription InvoiceAmount CustomerID
1 5/16/2020 部件 412.33 1
2 5/1/2020 服务 205.44 3
3 5/6/2020 出差 132.98 1
4 5/31/2020 部件 75.55 2

在 Power Apps 中,如果您将这些表构建为数据源,则可以使用“库”控件来显示“客户”表的内容。 使用“库”控件执行以下步骤:

  1. 在画布中插入控件。

  2. Items 属性设置为 CustomerTable

库将显示表中所有客户记录的列表。 这是 Gallery1

要显示 InvoiceTable 的全部内容,请执行以下步骤:

  1. 在画布中插入控件。

  2. 可以将 Items 属性设置为您的 InvoiceTable

此库将显示表中所有发票记录的列表。 这是 Gallery2

现在,要想仅显示 Gallery1 中选定客户的发票,需要修改 Gallery2 的“Items”属性,方法如下所示:

Filter(InvoiceTable, CustomerID = Gallery1.Selected.ID)

该公式包括以下几个部分。

公式参数 公式输入 注释
source InvoiceTable
logical_test CustomerID = Gallery1.Selected.ID CustomerID 是 InvoiceTable 中的列名称。 Gallery1.Selected. 本 ID 是库中选定记录 ID 列的值。

该公式使 Gallery2 显示 Gallery1 中选定客户的发票记录。

从子级查找父级存储的信息

有些时候,需要从子记录向上或“自下而上”导航到关联的父记录。 如果正在检查发票记录(例如 ID 为 2)的详细信息,而且知道它与 ID 为 3 的客户存在关联,则可能会希望从父表中提取更多详细信息。

在这种情况下,您可以通过引用父表中的关联记录,使用表之间的关系检索与客户相关的信息,例如他们的姓名或电话号码。 这种方法允许您根据子记录中的可用信息从父表中的链接记录收集相关详细信息,从而提供全面视图,促进相关数据之间的交叉引用。 在 Power Apps 中,可使用 LookUp 函数实现此目的!

借助 LookUp 函数,您可查询满足评估标准的单个记录的数据源。 在以下示例中,我们将使用上例中的表,但要从空白屏幕开始,以避免混淆。

要显示 InvoiceTable 的全部内容,请执行以下步骤:

  1. 在画布中插入控件。

  2. Items 属性设置为 InvoiceTable

  3. 布局设置为“标题”、“副标题”和“正文”。

  4. 数据窗格中,将标题设置为 InvoiceDate,将副标题设置为 InvoiceAmount,将正文设置为 CustomerID

此库将显示表中所有发票记录的列表。 如果您希望您的日期字段如下图所示,可以将标题字段修改为:Text(ThisItem.InvoiceDate,DateTimeFormat.ShortDate) This is Gallery3

含有所有发票记录列表的库屏幕截图。

显示每个客户的 ID 值无法为应用用户提供足够信息。 要显示客户名称而非 ID,可以执行以下操作:

Gallery3 中,选择正文的标签,然后将 Text 属性设置为:

LookUp(CustomerTable, ID = ThisItem.CustomerID, CustomerName)

该公式包括以下几个部分:

公式参数 公式输入 注释
source CustomerTable
logical_test ID = ThisItem.CustomerID 本 ID 是 CustomerTable 中的列名称。 ThisItem.CustomerID 是库中当前记录的 CustomerID 列的值。
result CustomerName 与 logical_test 匹配的记录将会返回的列。

进行更改后,Gallery3 现在提供供应商名称。

含有发票记录的用户友好型库的屏幕截图。

性能说明

在库中执行从子记录到其父记录的查找可能会对性能产生重大影响。 在演示的场景中,利用库中的 LookUp 函数将多次触发数据源查询:针对 InvoiceTable 中的每条记录都进行一次查询。

设想以下场景:如果您的 InvoiceTable 包含数百条记录,则 LookUp 函数将执行相同次数的查询。 这意味着可能会发生数百次单独的数据源调用。 因此,这可能会导致网络流量增加和处理时间延长,最终影响应用性能。

在实施数据源调用之前,尤其是在处理多个记录的库中,权衡性能至关重要。 优化此类查询(可能通过缓存数据或重构逻辑以尽可能减少重复调用)对于保持最佳应用性能至关重要。 在库上下文中实施此类运算时,请始终考虑数据的规模以及对性能的潜在影响。

针对本情形的更好选择是使用集合或其他方式来查询和存储所有客户记录,然后针对集合执行查找。 有关数据性能的更多信息,请参阅有关 Power Apps 性能注意事项的博客文章。

下个单元将会介绍 Microsoft Dataverse 如何通过自动深入钻研来消除与相关数据有关的所有问题。