Relate 和 Unrelate 函数
适用于: 画布应用 模型驱动应用
通过一对多或多对多关系关联和取消关联两个表的记录。
描述
Relate 函数通过 Microsoft Dataverse 中的一对多或多对多关系链接两个记录。 Unrelate 函数可逆转此过程并删除链接。
对于一对多关系,“多”表有一个指向“一”表记录的外键字段。 Relate 将此字段设置为指向 One 表的特定记录,而 Unrelate 将此字段设置为 空白。 如果在调用 Relate 时已经设置了此字段,现有链接会丢失,而转向新链接。 您也可以使用 Patch 函数或 Edit form 控件设置此字段;无需使用 Relate 函数。
对于多对多关系,链接记录的系统维护着一个隐藏的联接表。 您不能直接访问此联接表;它只能通过一对多投影读取,可以通过 Relate 和 Unrelate 函数设置。 两个相关表都没有外键。
您在第一个参数中指定的表的数据将刷新以反映更改,但您在第二个参数中指定的表的数据不会。 必须使用 Refresh 函数手动刷新数据来显示操作的结果。
这些函数从不创建或删除记录。 它们仅关联或取消关联已经存在的两个记录。
只能在行为公式中使用这些函数。
备注
这些函数是预览功能的一部分,并且仅当启用功能关系数据、选项集和 CDS 的其他新功能时,它们的行为才可用。 这是默认情况下针对新应用启用的应用级别设置。 若要查找此功能切换开关,请选择设置,然后选择即将发布的功能。 您的反馈对我们非常重要 - 请通过 Power Apps 社区论坛告诉我们您的想法。
语法
关联(Table1RelatedTable,Table2Record )
- Table1RelatedTable - 必需。 对于 Table1 的记录,Table2 的表记录通过一对多或多对多关系关联。
- Table2Record - 必需。 要添加到关系中的 Table2 记录。
Unrelate( Table1RelatedTable,Table2Record )
- Table1RelatedTable - 必需。 对于 Table1 的记录,Table2 的表记录通过一对多或多对多关系关联。
- Table2Record - 必需。 要从关系中删除的 Table2 记录。
示例
考虑具有以下关系的产品表,如 Power Apps 门户的表查看器中所示:
关系显示名称 | 相关表 | 关系类型 |
---|---|---|
产品预留 | 预留 | 一对多 |
产品 ↔ 联系方式 | 联系人 | 多对多 |
Products 和 Reservations 通过一对多关系关联。 将预留表的第一个记录与产品表的第一个记录关联:
Relate( First( Products ).Reservations, First( Reservations ) )
若要删除这些记录之间的关系,请执行以下操作:
Unrelate( First( Products ).Reservations, First( Reservations ) )
我们永远不会创建或删除记录,只会修改记录之间的关系。
产品和 联系人 通过多对多关系关联。 将联系人表的第一个记录与产品表的第一个记录关联:
Relate( First( Products ).Contacts, First( Contacts ) )
由于多对多关系是对称的,因此我们也可以反向进行此操作:
Relate( First( Contacts ).Products, First( Products ) )
若要删除这些记录之间的关系,请执行以下操作:
Unrelate( First( Products ).Contacts, First( Contacts ) )
或:
Unrelate( First( Contacts ).Products, First( Products ) )
接下来的演练使用带有 Gallery 和 Combo box 控件的应用对这些表精确执行这些操作,来选择所涉及的记录。
这些示例取决于您环境中安装的示例数据。 创建一个包含示例数据的试用环境或将示例数据添加到现有环境中。
一对多
Relate 函数
首先,您将创建一个简单的应用,以查看和重新分配与产品关联的预留。
在视图选项卡上,选择数据源。
在数据窗格中,选择添加数据> 选择产品。
“产品”表是上面加载的示例数据的一部分。在插入选项卡上,添加一个空白的垂直 Gallery 控件。
确保刚才添加的控件名为 Gallery1,然后移动并调整其大小以填充屏幕左侧区域。
在属性选项卡上,将 Gallery1 的 Items 属性设置为 Products,并将其 Layout 设置为 Image and title。
在 Gallery1 中,确保将 Label 控件命名为 Title1,然后将其 Text 属性设置为 ThisItem.Name。
选择屏幕以避免将下一项插入 Gallery1。 添加第二个空白垂直 Gallery 控件,确保将其命名为 Gallery2。
Gallery2 将显示用户在 Gallery1 中选择的任何产品的预留。
移动并调整 Gallery2 的大小,以填充屏幕的右上象限。
(可选)在 Gallery2 上方添加蓝色 Label 控件,如下一图所示。
在公式栏中,将 Gallery2 的 Items 属性设置为 Gallery1.Selected.Reservations。
在属性窗格中,将 Gallery2 的 Layout 设置为 Title。
在 Gallery2 中,添加一个 Combo box 控件,确保将其命名为 ComboBox1,然后移动并调整其大小,以避免阻挡 Gallery2 中的其他控件。
在属性选项卡上,将 ComboBox1 的 Items 属性设置为 Products。
在属性选项卡中向下滚动,将 ComboBox1 的 Allow multiple selection 属性设置为 Off。
在公式栏中,将 ComboBox1 的 DefaultSelectedItems 属性设置为 ThisItem.'Product Reservation'。
在 Gallery2 中,将 NextArrow2 的 OnSelect 属性设置为此公式:
Relate( ComboBox1.Selected.Reservations, ThisItem )
当用户选择此图标时,当前预留将更改为用户在 ComboBox1 中选择的产品。
按 F5 在“预览”模式下测试应用。
使用此应用,用户可以将预留从一个产品移到另一个产品。 对于一个产品的预留,用户可以在 ComboBox1 中选择其他产品,然后选择 NextArrow2 更改该预留。
Unrelate 函数
此时,您可以将关系从一个记录移至另一个记录,但不能完全删除该关系。 您可以使用 Unrelate 函数从任何产品断开预留记录的连接。
在视图选项卡上,选择数据源。
在数据窗格中,选择添加数据源>Microsoft Dataverse>预留>连接。
在 Gallery2 中,将 NextArrow2 的 OnSelect 公式设置为此公式:
If( IsBlank( ComboBox1.Selected ), Unrelate( Gallery1.Selected.Reservations, ThisItem ), Relate( ComboBox1.Selected.Reservations, ThisItem ) ); Refresh( Reservations )
通过选中它并按 Ctrl-C 来将 Gallery2 复制到剪贴板。
通过按 Ctrl-V 将 Gallery2 的副本粘贴到同一屏幕,然后将其移动到屏幕的右下象限。
(可选)如果您在 Gallery2 上方添加了标签,请对该标签重复前面的两个步骤。
确保将 Gallery2 的副本命名为 Gallery2_1,然后将其 Items 属性设置为以下公式:
Filter( Reservations, IsBlank( 'Product Reservation' ) )
将出现委派警告,但是,这对于在此示例中的少量数据无关紧要。
进行了这些更改后,如果联系人尚未保留产品,用户可以清除该联系人的 ComboBox1 中的选择。 未保留产品的联系人显示在 Gallery2_1 中,用户可以在其中将每个联系人分配给产品。
多对多
创建多对多关系
示例数据不包括多对多关系,但您将在“产品”表和“联系人”表之间创建一个这样的关系。 用户可以将每个产品与多个联系人关联,也可以将每个联系人与多个产品关联。
从此页面,在左导航栏中选择数据,然后选择表。
更改表筛选器以包含所有表。
默认情况下,不会显示示例表。
向下滚动,打开产品表,选择关系。
选择添加关系>多对多。
选择关系的联系人表。
选择完成>保存表。
将联系人与一个或多个产品关联和取消关联
您将创建另一个与本主题前面创建的应用相似的应用,但是新应用将提供多对多关系。 每个联系人将能够保留多个产品,而不仅保留一个。
在适用于平板电脑的空白应用中,完成本主题中所述的第一个过程创建 Gallery1。
添加另一个空白垂直 Gallery 控件,确保将其命名为 Gallery2,然后将其移至屏幕的右上角。
在本主题稍后部分,您将在 Gallery2 下添加一个 Combo box 控件。
在公式栏中,将 Gallery2 的 Items 属性设置为 Gallery1.Selected.Contacts。
在属性选项卡上,将 Layout 设置为 Image and title。
在 Gallery2 中,确保将 Label 控件命名为 Title2,然后将其 Text 属性设置为 ThisItem.'Full Name'。
在完成此过程并将联系人分配给产品之前,该控件中不会显示任何文本。
删除 NextArrow2,插入取消图标,并确保其命名为 icon1。
将取消图标的 OnSelect 属性设置为以下公式:
Unrelate( Gallery1.Selected.Contacts, ThisItem )
在视图选项卡上,选择数据源。
在数据窗格中,选择添加数据源>Microsoft Dataverse>联系人>连接。
在 Gallery2 下,添加一个 Combo box 控件,确保其命名为 ComboBox1,然后将其 Items 属性设置为 Contacts。
在属性选项卡上,将 Allow multiple selection 设置为 Off。
插入一个添加图标,并将其 OnSelect 属性设置为以下公式:
Relate( Gallery1.Selected.Contacts, ComboBox1.Selected )
使用此应用,用户现在可以自由地将一组联系人与每个产品关联或取消关联。
要将联系人添加到产品,请在屏幕底部的组合框中选择联系人,然后选择添加图标。
要从产品中删除联系人,请为该联系人选择取消图标。
与一对多不同,多对多关系允许用户将同一联系人与多个产品相关联。
反向:将产品与多个联系人关联和取消关联
多对多关系是对称的。 您可以扩展示例,将产品添加到联系人,然后在两个屏幕之间翻转来显示此关系如何从任一方向出现。
将 Screen1 的 OnVisible 属性设置为 Refresh( Products )。
当您更新一对多或多对多关系时,只会刷新关联或取消关联调用的第一个参数表的数据。 如果要在此应用的屏幕之间翻转,则必须手动刷新第二个实体。
复制 Screen1。
副本将被命名为 Screen1_1,其构成从联系人角度查看关系的基础。
要创建反向视图,请在 Screen1_1 的控件上更改以下公式:
- Screen1_1.OnVisible =
Refresh( Contacts )
- Gallery1_1.Items =
Contacts
- Title1_1.Text =
ThisItem.'Full Name'
- Label1_1.Text =
"Selected Contact Products"
- Gallery2_1.Items =
Gallery1_1.Selected.Products
- Title2_1.Text =
ThisItem.Name
- Icon1_1.OnSelect =
Unrelate( Gallery1_1.Selected.Products, ThisItem )
- ComboBox1_1.Items =
Products
- Icon2_1.OnSelect =
Relate( Gallery1_1.Selected.Products, ComboBox1_1.Selected )
结果看起来会与上一屏幕非常相似,但关系来自联系人一方。
- Screen1_1.OnVisible =
插入一个上下箭头图标并将其 OnSelect 属性设置为 Navigate( Screen1, None )。 使用公式 Navigate( Screen1_1, None ) 在 Screen1 上执行相同的操作。
使用此新屏幕,用户可以将联系人添加到产品,然后翻转到联系人视图,查看关联的产品。 关系在两个屏幕之间是对称的,并且在之间共享。