Relate 和 Unrelate 函数

适用于:画布应用模型驱动应用

通过一对多或多对多关系关联和取消关联两个表的记录。

描述

Relate 函数通过 Microsoft Dataverse 中的一对多或多对多关系链接两个记录。 Unrelate 函数可逆转此过程并删除链接。

对于一对多关系,“多”表有一个指向“一”表记录的外键字段。 Relate 将此字段设置为指向“一”表的特定记录,而 Unrelate 将此字段设置为空白。 如果在调用 Relate 时已经设置了此字段,现有链接会丢失,而转向新链接。 您也可以使用 Patch 函数或 Edit form 控件设置此字段;无需使用 Relate 函数。

对于多对多关系,链接记录的系统维护着一个隐藏的联接表。 您不能直接访问此联接表;它只能通过一对多投影读取,可以通过 RelateUnrelate 函数设置。 两个相关表都没有外键。

您在第一个参数中指定的表的数据将刷新以反映更改,但您在第二个参数中指定的表的数据不会。 必须使用 Refresh 函数手动刷新数据来显示操作的结果。

这些函数从不创建或删除记录。 它们仅关联或取消关联已经存在的两个记录。

只能在行为公式中使用这些函数。

备注

这些函数是预览功能的一部分,并且仅当启用功能关系数据、选项集和 CDS 的其他新功能时,它们的行为才可用。 这是默认情况下针对新应用启用的应用级别设置。 若要查找此功能切换开关,请选择设置,然后选择即将发布的功能。 您的反馈对我们非常重要 - 请通过 Power Apps 社区论坛告诉我们您的想法。

语法

Relate( Table1RelatedTable, Table2Record )

  • Table1RelatedTable - 必需。 对于 Table1 的记录,Table2 的表记录通过一对多或多对多关系关联。
  • Table2Record - 必需。 要添加到关系中的 Table2 记录。

Unrelate( Table1RelatedTable, Table2Record )

  • Table1RelatedTable - 必需。 对于 Table1 的记录,Table2 的表记录通过一对多或多对多关系关联。
  • Table2Record - 必需。 要从关系中删除的 Table2 记录。

示例

考虑具有以下关系的产品表,如 Power Apps 门户的表查看器中所示:

关系显示名称 相关表 关系类型
产品预留 预留 一对多
产品 ↔ 联系人 联系人​​ 多对多

产品预留通过一对多关系关联。 将预留表的第一个记录与产品表的第一个记录关联:

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 ) )

接下来的演练使用带有 GalleryCombo box 控件的应用对这些表精确执行这些操作,来选择所涉及的记录。

这些示例取决于您环境中安装的示例数据。 创建一个包含示例数据的试用环境将示例数据添加到现有环境中

一对多

Relate 函数

首先,您将创建一个简单的应用,以查看和重新分配与产品关联的预留。

  1. 从空白开始创建平板电脑应用

  2. 视图选项卡上,选择数据源

  3. 数据窗格中,选择添加数据> 选择产品
    “产品”表是上面加载的示例数据的一部分。

  4. 插入选项卡上,添加一个空白的垂直 Gallery 控件。

  5. 确保刚才添加的控件名为 Gallery1,然后移动并调整其大小以填充屏幕左侧区域。

  6. 属性选项卡上,将 Gallery1Items 属性设置为 Products,并将其 Layout 设置为 Image and title

    配置 ProductsGallery。

  7. Gallery1 中,确保将 Label 控件命名为 Title1,然后将其 Text 属性设置为 ThisItem.Name

    在 Gallery1 中配置标签。

  8. 选择屏幕以避免将下一项插入 Gallery1。 添加第二个空白垂直 Gallery 控件,确保将其命名为 Gallery2

    Gallery2 将显示用户在 Gallery1 中选择的任何产品的预留。

  9. 移动并调整 Gallery2 的大小,以填充屏幕的右上象限。

  10. (可选)在 Gallery2 上方添加蓝色 Label 控件,如下一图所示。

  11. 在公式栏中,将 Gallery2Items 属性设置为 Gallery1.Selected.Reservations

    配置 Gallery2 项。

  12. 在属性窗格中,将 Gallery2Layout 设置为 Title

    配置 Gallery2 布局。

  13. Gallery2 中,添加一个 Combo box 控件,确保将其命名为 ComboBox1,然后移动并调整其大小,以避免阻挡 Gallery2 中的其他控件。

  14. 属性选项卡上,将 ComboBox1Items 属性设置为 Products

    将 Items 属性设置为 Products。

  15. 属性选项卡中向下滚动,将 ComboBox1Allow multiple selection 属性设置为 Off

    将“Allow multiple selection”设置为 Off。

  16. 在公式栏中,将 ComboBox1DefaultSelectedItems 属性设置为 ThisItem.'Product Reservation'

    将 ReserveCombo 设置为 DefaultSelectedItems。

  17. Gallery2 中,将 NextArrow2OnSelect 属性设置为此公式:

    Relate( ComboBox1.Selected.Reservations, ThisItem )
    

    当用户选择此图标时,当前预留将更改为用户在 ComboBox1 中选择的产品。

    配置 NextArrow2。

  18. 按 F5 在“预览”模式下测试应用。

使用此应用,用户可以将预留从一个产品移到另一个产品。 对于一个产品的预留,用户可以在 ComboBox1 中选择其他产品,然后选择 NextArrow2 更改该预留。

在一对多应用中演示 Relate 函数。

Unrelate 函数

此时,您可以将关系从一个记录移至另一个记录,但不能完全删除该关系。 您可以使用 Unrelate 函数从任何产品断开预留记录的连接。

  1. 视图选项卡上,选择数据源

  2. 数据窗格中,选择添加数据源>Microsoft Dataverse>预留>连接

  3. Gallery2 中,将 NextArrow2OnSelect 公式设置为此公式:

    If( IsBlank( ComboBox1.Selected ),
        Unrelate( Gallery1.Selected.Reservations, ThisItem ),
        Relate( ComboBox1.Selected.Reservations, ThisItem )
    );
    Refresh( Reservations )
    

    配置“右侧”图标。

  4. 通过选中它并按 Ctrl-C 来将 Gallery2 复制到剪贴板。

  5. 通过按 Ctrl-V 将 Gallery2 的副本粘贴到同一屏幕,然后将其移动到屏幕的右下象限。

  6. (可选)如果您在 Gallery2 上方添加了标签,请对该标签重复前面的两个步骤。

  7. 确保将 Gallery2 的副本命名为 Gallery2_1,然后将其 Items 属性设置为以下公式:

    Filter( Reservations, IsBlank( 'Product Reservation' ) )
    

    将出现委派警告,但是,这对于在此示例中的少量数据无关紧要。

    设置 Gallery2_1 的 Items 属性。

进行了这些更改后,如果联系人尚未保留产品,用户可以清除该联系人的 ComboBox1 中的选择。 未保留产品的联系人显示在 Gallery2_1 中,用户可以在其中将每个联系人分配给产品。

在一对多应用中演示 Relate 和 Unrelate 函数。

多对多

创建多对多关系

示例数据不包括多对多关系,但您将在“产品”表和“联系人”表之间创建一个这样的关系。 用户可以将每个产品与多个联系人关联,也可以将每个联系人与多个产品关联。

  1. 此页面,在左导航栏中选择数据,然后选择

    打开表列表。

  2. 更改表筛选器以包含所有表。

    默认情况下,不会显示示例表。

    删除表筛选器。

  3. 向下滚动,打开产品表,选择关系

  4. 选择添加关系>多对多

  5. 选择关系的联系人表。

  6. 选择完成>保存表

将联系人与一个或多个产品关联和取消关联

您将创建另一个与本主题前面创建的应用相似的应用,但是新应用将提供多对多关系。 每个联系人将能够保留多个产品,而不仅保留一个。

  1. 在适用于平板电脑的空白应用中,完成本主题中所述的第一个过程创建 Gallery1

  2. 添加另一个空白垂直 Gallery 控件,确保将其命名为 Gallery2,然后将其移至屏幕的右上角。

    在本主题稍后部分,您将在 Gallery2 下添加一个 Combo box 控件。

  3. 在公式栏中,将 Gallery2Items 属性设置为 Gallery1.Selected.Contacts

    配置 ContactsGallery - Items 属性。

  4. 属性选项卡上,将 Layout 设置为 Image and title

    配置 ContactsGallery - 布局。

  5. Gallery2 中,确保将 Label 控件命名为 Title2,然后将其 Text 属性设置为 ThisItem.'Full Name'

    在完成此过程并将联系人分配给产品之前,该控件中不会显示任何文本。

    显示联系人名称。

  6. 删除 NextArrow2,插入取消图标,并确保其命名为 icon1

  7. 取消图标的 OnSelect 属性设置为以下公式:

    Unrelate( Gallery1.Selected.Contacts, ThisItem )
    

    配置“取消”图标。

  8. 视图选项卡上,选择数据源

  9. 数据窗格中,选择添加数据源>Microsoft Dataverse>联系人>连接

  10. Gallery2 下,添加一个 Combo box 控件,确保其命名为 ComboBox1,然后将其 Items 属性设置为 Contacts

    配置组合框的 Items 属性。

  11. 属性选项卡上,将 Allow multiple selection 设置为 Off

    配置组合框的 Layout 属性。

  12. 插入一个添加图标,并将其 OnSelect 属性设置为以下公式:

    Relate( Gallery1.Selected.Contacts, ComboBox1.Selected )
    

    配置“添加”图标。

使用此应用,用户现在可以自由地将一组联系人与每个产品关联或取消关联。

  • 要将联系人添加到产品,请在屏幕底部的组合框中选择联系人,然后选择添加图标。

  • 要从产品中删除联系人,请为该联系人选择取消图标。

    与一对多不同,多对多关系允许用户将同一联系人与多个产品相关联。

在多对多应用中演示 Relate 和 Unrelate 函数。

反向:将产品与多个联系人关联和取消关联

多对多关系是对称的。 您可以扩展示例,将产品添加到联系人,然后在两个屏幕之间翻转来显示此关系如何从任一方向出现。

  1. Screen1OnVisible 属性设置为 Refresh( Products )

    当您更新一对多或多对多关系时,只会刷新关联取消关联调用的第一个参数表的数据。 如果要在此应用的屏幕之间翻转,则必须手动刷新第二个实体。

    将 OnVisible 属性设置为 Refresh 函数。

  2. 复制 Screen1

    副本将被命名为 Screen1_1,其构成从联系人角度查看关系的基础。

    复制屏幕。

  3. 要创建反向视图,请在 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 )

    结果看起来会与上一屏幕非常相似,但关系来自联系人一方。

    从联系人开始显示多对多关系。

  4. 插入一个上下箭头图标并将其 OnSelect 属性设置为 Navigate( Screen1, None )。 使用公式 Navigate( Screen1_1, None )Screen1 上执行相同的操作。

    在屏幕间添加导航。

使用此新屏幕,用户可以将联系人添加到产品,然后翻转到联系人视图,查看关联的产品。 关系在两个屏幕之间是对称的,并且在之间共享。

从任意一方演示多对多关系。