Patch Función

Aplícase a: Aplicacións de lenzo Copilot Studio Fluxos de escritorio Aplicacións baseadas en modelos Funcións de Power Platform CLI Dataverse

Modifica ou crea un ou varios rexistros nunha orixe de datos ou fusiona rexistros fóra dunha orixe de datos.

Use a Patch función para modificar rexistros en situacións complexas, como cando realiza actualizacións que non requiren interacción do usuario ou usa formularios que abranguen varias pantallas.

Para actualizar rexistros nunha orixe de datos máis facilmente para cambios sinxelos, use o control Editar formulario no seu lugar. Cando engade un control Editar formulario, proporcionas aos usuarios un formulario para cubrir e logo gardar os cambios nunha orixe de datos. Para obter máis información, consulte Comprender os formularios de datos.

Mira este vídeo para aprender a usar a Patch función:

Overview

Utiliza a Patch función para modificar un ou máis rexistros dunha fonte de datos. Actualiza os valores de campos específicos sen afectar outras propiedades. Por exemplo, esta fórmula cambia o número de teléfono dun cliente chamado Contoso:

Patch( Customers, LookUp( Customers, Name = "Contoso" ), { Phone: "1-212-555-1234" } )

Utilízase Patch coa función Por defecto para crear rexistros. Use este comportamento para crear unha pantalla única para crear e editar rexistros. Por exemplo, esta fórmula crea un rexisrto para un cliente chamado Contoso:

Patch( Customers, Defaults( Customers ), { Name: "Contoso" } )

Note

Cando parcheas unha colección usando un rexistro dunha fonte de datos con valores predeterminados, a operación actualiza a colección tanto cos valores especificados como cos valores predeterminados da fonte de datos. A DataSource da instrución patch e a función DataSource da función Defaults deben coincidir para crear un novo rexistro.

Aínda que non esteas a traballar cunha fonte de datos, podes usar Patch para fusionar dous ou máis rexistros. Por exemplo, esta fórmula fusiona dous rexistros nun que identifica tanto o número de teléfono como a localización de Contoso:

Patch( { Name: "Contoso", Phone: "1-212-555-1234" }, { Name: "Contoso", Location: "Midtown" } )

Description

Modificar ou crear un rexistro nunha orixe de datos

Para usar esta función cunha orixe de datos, especifique a orixe de datos e, a continuación, especifique un rexistro base:

  • Para modificar un rexistro, o rexistro base debe proceder dunha fonte de datos. Poderías obter o rexistro base a través da propiedade Items dunha galería, colocalo nunha variable de contexto ou obtelo por outro camiño. Pero debes ser capaz de rastrexar o rexistro base ata a fonte de datos. Este requisito é importante porque o rexistro inclúe información adicional que che axuda a atopalo de novo para a súa modificación.
  • Para crear un rexistro, use a función Defaults para crear un rexistro base con valores predeterminados.

A continuación, especifique un ou varios rexistros de cambios, cada un dos cales contén novos valores de propiedade que anulan os valores da propiedade no rexistro base. Os rexistros de cambios son procesados en orde dende o comezo da lista de argumentos ata o final, os valores de propiedades posteriores anulan aos anteriores.

O valor de retorno é Patch o rexistro que modificou ou creou. Se creou un rexistro, o valor de volta pode incluír propiedades que a fonte de datos xerou automaticamente. Non obstante, o valor devolto non proporciona un valor para os campos dunha táboa relacionada.

Por exemplo, vostede usa Set(MyAccount, Patch(Accounts, First(Account), 'Account Name': "Example name")); e logo MyAccount.'Primary Contact'.'Full Name'. Non pode obter un nome completo neste caso. Pola contra, para acceder aos campos dunha táboa relacionada, use unha busca independente como:

LookUp(Accounts, Account = MyAccount.Account).'Primary Contact'.'Full Name'

Ao actualizar unha fonte de datos, poden xurdir un ou máis problemas. Use IfError e IsError co valor de retorno de para detectar e responder aos erros, como describe o Patch de erros. Tamén pode usar a función Errors para identificar e examinar cuestións, como Traballar con fontes de datos describe.

As funcións relacionadas inclúen a función Update para substituír un rexistro enteiro e a función Collect para crear un rexistro. Use a función UpdateIf para modificar propiedades específicas de varios rexistros en función dunha condición.

Modificar ou crear un conxunto de rexistros nunha orixe de datos

Tamén podes usalo Patch para crear ou modificar múltiples rexistros cunha soa chamada.

En lugar de pasar un único rexistro base, proporciona unha táboa de rexistros base no segundo argumento. Proporciona tamén rexistros de cambio nunha táboa, correspondente un por un cos rexistros base. O número de rexistros en cada táboa de cambios debe ser o mesmo que o número de rexistros na táboa base.

Cando se usa Patch deste xeito, o valor de retorno tamén é unha táboa coa que cada rexistro corresponde un por un cos rexistros base e cambio.

Combinar rexistros fóra dunha orixe de datos

Especifique dous ou máis rexistros que desexa fusionar. A función procesa os rexistros na orde desde o comezo da lista ata o final, coas propiedades posteriores superando aos anteriores.

Patch Devolve o rexistro fusionado e non modifica os seus argumentos ou rexistros en ningunha fonte de datos.

Syntax

Modificar ou crear un rexistro nunha orixe de datos

Patch( DataSource, BaseRecord, ChangeRecord1 [, ChangeRecord2, ... ])

  • DataSource – Obrigatorio. A orixe de datos que contén o rexistro que desexa modificar ou conterá o rexistro que desexa crear.
  • BaseRecord – Obrigatorio. O rexistro que se vai modificar ou crear. Se o rexistro procede dunha fonte de datos, a función atopa e modifica o rexistro. Se se usa o resultado de Defaults , a función crea un rexistro. O DataSource da instrución patch e o DataSource da función Defaults deben coincidir para crear un novo rexistro.
  • ChangeRecords – Obrigatorio. Un ou máis rexistros que conteñen propiedades para modificar no BaseRecord. Os procesos de función cambian os rexistros en orde desde o inicio ata o final da lista de argumentos, coas propiedades posteriores que superan aos anteriores.

Modificar ou crear un conxunto de rexistros nunha orixe de datos

Patch( DataSource, BaseRecordsTable, ChangeRecordTable1 [, ChangeRecordTable2, ... ] )

  • DataSource – Obrigatorio. A orixe de datos que contén os rexistros que desexa modificar ou conterá os rexistros que desexa crear.
  • BaseRecordTable – Obrigatorio. Unha táboa de rexistros para modificar ou crear. Se o rexistro procede dunha fonte de datos, a función atopa e modifica o rexistro. Se se usa o resultado de Defaults , a función crea un rexistro. O DataSource da instrución patch e o DataSource da función Defaults deben coincidir para crear un novo rexistro.
  • ChangeRecordTables – Obrigatorio. Unha ou varias táboas de rexistros que conteñen propiedades que se vab modificar para cada rexistro de BaseRecordTable. Os procesos de función cambian os rexistros en orde desde o inicio ata o final da lista de argumentos, coas propiedades posteriores que superan aos anteriores.

Merge records

Patch( Record1, Record2 [, ...] )

  • Rexistros - Obrigatorio. Seleccione polo menos dous rexistros que desexe combinar. A función procesa os rexistros en orde desde o inicio ata o final da lista de argumentos, coas propiedades posteriores que prevalecen sobre os anteriores.

Examples

Modificar ou crear un rexistro (nunha orixe de datos)

Nestes exemplos, modificas ou creas un rexistro nunha fonte de datos chamada IceCream. A fonte de datos contén os datos desta táboa e xera automaticamente os valores na columnaID:

Captura de pantalla da táboa de exemplo da fonte de datos de IceCream que mostra sabores e cantidades.

Para crear unha versión en memoria desta fonte de datos para que poidas probar estes exemplos, avalía esta fórmula:

ClearCollect( IceCream,
    { ID: 1, Flavor: "Chocolate", Quantity: 100 },
    { ID: 2, Flavor: "Vanilla", Quantity: 200 }
)
Formula Description Result
Patch( Xeado,
LookUp( Xeado, Sabor = "Chocolate" ), { Cantidade: 400 } )
Modifica un rexistro na orixe de datos IceCream:
  • A columna ID do rexistro para modificar contén o valor de 1. (O rexistro Chocolate ten ese ID.)
  • O valor na columna Quantity cambia a 400.
{ ID: 1, Sabor: "Chocolate", Cantidade: 400 }

A entrada de Chocolate na fonte de datos de IceCream está modificada.
Patch( Xeado, Defaults( Xeado ), { Sabor: "Fresa" } ) Crea un rexistro na orixe de datos IceCream:
  • A columna ID contén o valor 3, que a orixe de datos xera automaticamente.
  • A columna Quantity contén 0, que é o valor predeterminado para esa columna na orixe de datos IceCream, como a función Defaults especifica.
  • A columna Flavor contén o valor de Strawberry.
{ ID: 3, Sabor: "Amorodo", Cantidade: 0 }

Créase a entrada de Strawberry na fonte de datos de IceCream .

Despois de avaliar as fórmulas anteriores, a fonte de datos remata con estes valores:

Captura de pantalla da fonte de datos de IceCream despois de avaliar as Patch fórmulas.

Combinar rexistros (fóra dunha orixe de datos)

Formula Description Result
Patch( { Nome: "James", Puntuación: 90 }, { Nome: "Jim", Pasado: verdadeiro } ) Combina dous rexistros fóra dunha orixe de datos:
  • Os valores da columna Name de cada rexistro non coinciden. O resultado contén o valor (Jim) no rexistro que está máis preto do final da lista de argumentos en vez do valor (James) no rexistro que está máis preto do comezo.
  • O primeiro rexistro contén unha columna (Score) que non existe no segundo rexistro. O resultado contén esa columna co seu valor (90).
  • O segundo rexistro contén unha columna (Passed) que non existe no primeiro rexistro. O resultado contén esa columna co seu valor (true).
{ Nome: "Jim", Puntuación: 90, Pasado: verdadeiro }

Modificar ou crear un conxunto de rexistros (nunha fonte de datos)

Cando usas Patch con táboas en lugar de rexistros individuais, podes crear ou modificar múltiples rexistros nunha soa chamada. O valor de retorno é unha táboa de rexistros que corresponde un a un coas táboas de entrada.

Este exemplo actualiza a Cantidade para múltiples sabores na fonte de datos de IceCream á vez:

Patch(
    IceCream,
    Table(
        { ID: 1, Flavor: "Chocolate", Quantity: 150 },
        { ID: 2, Flavor: "Vanilla", Quantity: 200 }
    ),
    Table(
        { Quantity: 300 },
        { Quantity: 400 }
    )
)

O resultado é unha táboa cos rexistros actualizados: { ID: 1, Flavor: "Chocolate", Quantity: 300 } e { ID: 2, Flavor: "Vanilla", Quantity: 400 }.

Este exemplo crea múltiples rexistros novos usando Defaults:

Patch(
    IceCream,
    Table( Defaults( IceCream ), Defaults( IceCream ) ),
    Table(
        { Flavor: "Mint", Quantity: 60 },
        { Flavor: "Peach", Quantity: 80 }
    )
)

Note

Cando usas Patch con táboas, o número de rexistros en cada táboa de cambios debe coincidir co número de rexistros na táboa base. Se non, prodúcese un erro.

Para detectar erros cando modificas múltiples rexistros, usa IfError. IfError é o mecanismo preferido e funciona entre os hosts Power Fx:

IfError(
    Patch(
        IceCream,
        baseRecords,
        changeRecords
    ),
    Notify( "Some records failed to update: " & FirstError.Message, NotificationType.Error )
)

Patch con tipos de columna de Dataverse

Os seguintes exemplos aplícanse especificamente ás fontes de datos Microsoft Dataverse. As formas dos rexistros varían segundo a fonte de datos (por exemplo, SharePoint e SQL Server teñen formatos diferentes).

Columna de elección: Para establecer unha columna de Elección, usa directamente o valor de enum. Este exemplo establece unha columna de elección de Estado nunha táboa de Contas :

Patch(
    Accounts,
    LookUp( Accounts, 'Account Name' = "Contoso" ),
    { 'Status': 'Status (Accounts)'.Active }
)

Columna de consulta: Para establecer unha columna Lookup, proporciona un rexistro coa clave primaria da táboa relacionada. Este exemplo establece a consulta de Contacto Principal nun rexistro de Contas :

Patch(
    Accounts,
    LookUp( Accounts, 'Account Name' = "Contoso" ),
    { 'Primary Contact': LookUp( Contacts, 'Full Name' = "John Smith" ) }
)

Note

Estes exemplos de tipo columna son específicos de Dataverse. Outras fontes de datos, como SharePoint ou SQL Server, poden requirir formas de rexistro diferentes para tipos de columnas similares. Consulta a documentación da túa fonte de datos específica para o formato correcto.

Delegación en fórmulas que usan Patch

A Patch función en si non está suxeita a delegación porque escribe na fonte de datos en lugar de consultala. Con todo, poden aparecer avisos de delegación en fórmulas que se usan Patch se a parte de selección de rexistro da fórmula (como Filter, LookUp ou ForAll) implica unha consulta que supera os límites de delegación da fonte de datos.

Cando ves unha advertencia de delegación nunha fórmula que inclúe Patch, comproba se a advertencia se aplica ás funcións de recuperación de datos e non a Patch si mesma. Para máis información sobre delegación, consulta Entender a delegación nunha aplicación canvas.

Erros comúns coa Patch función

Cando usas a Patch función, poden producirse erros debido á conectividade da fonte de datos, permisos ou conflitos de datos. Usa IfError e IsError para detectar erros e responder adecuadamente.

  • "Erro de rede ao usar Patch función": Este erro normalmente indica que a aplicación non pode acceder á fonte de datos. As causas comúns inclúen a perda da conexión a internet, a fonte de datos temporalmente indispoñible ou permisos insuficientes para o usuario actual. Envolve a Patch chamada en IfError para proporcionar unha mensaxe significativa aos usuarios.

  • "Existen conflitos con cambios no servidor": Este erro prodúcese cando outro usuario ou proceso modifica o mesmo rexistro entre o momento en que a túa aplicación le o rexistro e escribe o cambio. Actualiza a fonte de datos chamando á función Refresh e tenta de novo a operación.

  • Erros de permiso: Se o usuario non ten permiso para crear ou modificar rexistros na fonte de datos, a Patch chamada falla. Usa IfError para detectar erros relacionados cos permisos e guiar ao usuario.

Para patróns xerais de xestión de erros, véxase Xestión de erros.

Uso de Como ou Esterexistro

Usa a palabra clave As ou ThisRecord na túa fórmula para evitar contextos ambiguos de avaliación.

No seguinte exemplo, considérese o primeiro Lookup da If afirmación. (OrderID = A[@OrderID]) espérase que compare o OrderId no Lookup ámbito coa OrderId colección A de no ForAll ámbito. Neste caso, probablemente queiras A[@OrderId] resolver como un parámetro local. Pero é ambiguo.

Actualmente, Power Apps interpreta tanto o lado esquerdo OrderId como o lado dereito A[@OrderId] como un campo no ámbito Lookup. Por iso, Lookup sempre atopa a primeira fila en [dbo].[Orders1] porque a condición é sempre verdadeira (é dicir, calquera fila OrderId é igual a ela mesma).

ClearCollect(
    A,
    Filter(
        '[dbo].[Orders1]',
        OrderId = 8888888
    )
);
ForAll(
    A,
    If(
        LookUp(
            '[dbo].[Orders1]',
            OrderId = A[@OrderId],
            "OK"
        ) = "OK",
        Patch(
            '[dbo].[Orders1]',
            LookUp(
                '[dbo].[Orders1]',
                OrderId = A[@OrderId]
            ),
            {
      OrderName: "val1"
       }
   ),
   Patch(
            '[dbo].[Orders1]',
            Defaults('[dbo].[Orders1]'),
            {
      OrderName: "val2"
       }
   )
    )
)

Uso de Como ou Esterexistro

Sempre que sexa posible, usa o operador As ou a palabra clave ThisRecord para desambiguar o lado esquerdo. Como se recomenda no escenario anterior.

Cando a túa fórmula usa múltiples ámbitos con ForAll, Filter, e Lookup na mesma fonte de datos ou táboa, os parámetros de alcance poden colidir cun mesmo campo noutro lugar. Por iso, usa o operador As ou ThisRecord para resolver o nome do campo e evitar ambigüidades.

Por exemplo, podes usar o operador As para desambiguar no seguinte exemplo.

ClearCollect(
    A,
    Filter(
        '[dbo].[Orders1]',
        OrderId = 8888888
    )
);
ForAll(
    A,
    If(
        LookUp(
            '[dbo].[Orders1]' As B,
            B.OrderId = A[@OrderId],
            "OK"
        ) = "OK",
        Patch(
            '[dbo].[Orders1]',
            LookUp(
                '[dbo].[Orders1]' As C,
                C.OrderId = A[@OrderId]
            ),
            {
      OrderName: "val1"
       }
   ),
   Patch(
            '[dbo].[Orders1]',
            Defaults('[dbo].[Orders1]'),
            {
      OrderName: "val2"
       }
   )
    )
)

Tamén pode usar Esterexistro co mesmo propósito.

ClearCollect(
    A,
    Filter(
        '[dbo].[Orders1]',
        OrderId = 8888888
    )
);
ForAll(
    A,
    If(
        LookUp(
            '[dbo].[Orders1]',
            ThisRecord.OrderId = A[@OrderId],
            "OK"
        ) = "OK",
        Patch(
            '[dbo].[Orders1]',
            LookUp(
                '[dbo].[Orders1]',
                ThisRecord.OrderId = A[@OrderId]
            ),
            {
      OrderName: "val1"
       }
   ),
   Patch(
            '[dbo].[Orders1]',
            Defaults('[dbo].[Orders1]'),
            {
      OrderName: "val2"
       }
   )
    )
)

Para saber máis sobre o uso do operador As e ThisRecord, consulte o artigo Operators .