使用 Patch 函数创建和编辑记录

已完成

Patch 函数用于在使用窗体控件无法满足需求时创建和编辑数据源中的记录。 在需要重复对数据执行操作而无需用户交互时,最常使用 Patch。 在应用设计不允许使用窗体时,也可以使用这个函数。

使用 Patch 创建记录

Patch 函数可用于在数据源中创建新记录。 要创建新记录,可将公式分为三个部分。

  1. 包含想要编辑的数据源的名称。 这可以是表格数据源(如 Microsoft Dataverse 或 SharePoint),也可以是集合。 对于本示例,使用 CustomerOrders 作为数据源的名称。

  2. Defaults 函数将返回一条包含数据源默认值的记录。 如果数据源中的列没有默认值,则不会显示该属性。 将 Defaults 与数据源结合使用时,则通知 Patch 创建新记录。

  3. 包含要在新记录中填充的列。 此处您将指定要更新的列的名称,后跟要写入该列的值。 对于本示例,将使用一个字符串值来更新“Region”和“Country”列。

本示例公式如下:

Patch(CustomerOrders, Defaults(CustomerOrders), {Region: "Americas", Country: "Canada"})

本公式将在 CustomerOrders 数据源中创建一条新记录,并将“Region”设置为“Americas”,将“Country”设置为“Canada”。 请注意,无需定义任何主键信息(ID 列),这些信息将根据数据源的设置进行更新。

使用 Patch 编辑记录

还可以编辑数据源中的记录。 要编辑单条记录,可将公式分为三个部分。

  1. 包含想要编辑的数据源的名称。 这可以是表格数据源(如 Dataverse 或 SharePoint),也可以是集合。 对于本示例,使用 CustomerOrders 作为数据源的名称。

  2. 要在数据源中编辑的记录。 要指定记录,最常用的方法是使用 LookUp 函数从数据源中检索记录。 如果您使用的是“库”控件,并且想要更新当前记录,还可以选用 ThisItem 函数来引用记录。 对于本示例,将使用 LookUp 函数。

  3. 包含要进行的更改。 此处您将指定要更新的列的名称,后跟要写入该列的值。 对于本示例,将使用一个字符串值来更新“Region”和“Country”列。

本示例公式如下:

Patch(CustomerOrders, LookUP(CustomerOrders, ID = 1), {Region: "Asia", Country: "China"})

本公式通过将“Region”列设置为“Asia”以及将“Country”列设置为“China”,更新其 ID 在 CustomerOrders 表中为 1 的记录。 如果这些字段中存在现有值,则将覆盖这些值。

使用 Patch 更新列

大多数 Patch 函数的主要逻辑是使用正确的信息更新正确的列。 这是对大多数 Patch 函数问题进行故障排除的源。 以下要点可帮助您使用 Patch。

  • 确保更新数据源中所有所需的列。

  • 可以根据需要更新任意数量的可选列。

  • 确保列名称拼写正确且为大写。 列名称区分大小写。

  • 确保写入正确的数据类型。 例如,如果数据源中的列是数字类型,则无法向其写入字符串值,即使该字符串包含数字也是如此。

有四个源可以在公式中传递值来修补数据源:

  • 可对值进行硬编码。 例如,如果要使用“挂起”来修补记录的状态,则 Patch 公式如下所示:

    Patch(CustomerOrders, Default(CustomerOrders), {Status: "Pending"})
    

    本公式将创建一条新记录,并将“状态”列设置为字符串值“挂起”。

  • 可引用变量。 例如,可以使用以下公式在名为 varStatus 的变量中存储字符串“正在审核”。

    Set(varStatus, "Under Review")
    

    Patch 公式将为:

    Patch(CustomerOrders, Default(CustomerOrders), {Status: varStatus})
    

    本公式将创建一条新记录,并将“状态”列设置为字符串值“正在审核”。

  • 可从控件的属性来引用值。 例如,从包含区域的名为 Dropdown1 的下拉菜单中设置值。 Patch 公式如下所示:

    Patch(CustomerOrders, Default(CustomerOrders), {Status: Dropdown1.Selected.Value})
    

    本公式将创建一条新记录,并将“状态”列设置为下拉菜单中选定项的值。

  • 可使用公式的输出。 例如,使用 User() 函数中的 FullName 设置 Owner 列的值。 Patch 公式如下所示:

    Patch(CustomerOrders, Default(CustomerOrders), {Owner: User().FullName})
    

    本公式将创建一条新记录,并将 Owner 列设置为 Microsoft Entra ID 中当前用户的 FullName。

Patch 示例

我们来看看另一个示例,在本示例中,您将尝试构建一个解决方案,以便在用户到达时使用户登录到课堂中。 此类 Power Apps 解决方案十分常见,Patch 函数可以帮您快速实现预期效果。

Power Apps 解决方案 Patch 示例的屏幕截图。

解决方案剖析

在此处,我们将一个简单的画布应用连接到数据源 (TrainingClassSignIn)。 该数据源具有以下列:Training ClassFirstNameLastNameEmailAddressSignInStatus。 这是用户选择 Sign In 按钮时我们想要捕获的信息。 在编辑栏中,您会看到以下代码:

Patch(TrainingClassSignIn,Defaults(TrainingClassSignIn),{TrainingClass:TrainingClassDD.Selected.Value, FirstName:FirstNameInput.Text, LastName:LastNameInput.Text, EmailAddress:EmailAddressInput.Text, SignInStatus:"Attended"})

具体而言,每当有人选择 Sign In 按钮时,Power Apps 都会向 TrainingClassSignIn 数据源写入一条新记录。 至于用户登录时会写回哪些数据,您会发现它会从我们添加的不同控件中获取这些信息(公示中添加的颜色)。 您还会注意到,每次将提交新记录后,代码都会将 SignInStatus 设置为“已参加”。

如您所见,Patch 十分灵活且功能强大。 Patch 还有更多功能,包括更新多条记录和合并记录。 有关这些应用场景的详细信息,请参阅 Power Apps 中的 Patch 函数