Funció Patch

S'aplica a: Aplicacions de llenç Aplicacions Power Platform basades en models CLI Fluxos d'escriptori

Modifica o crea un o diversos registres en una font de dades o combina els registres fora d'una font de dades.

Utilitzeu la funció Patch per modificar registres en situacions complexes, com ara quan feu actualitzacions que no requereixen interacció amb l'usuari o utilitzeu formularis que ocupen diverses pantalles.

Per actualitzar els registres d'una font de dades més fàcilment per a canvis senzills, utilitzeu el control Edita el formulari com a alternativa. Quan afegiu un control Edita el formulari, proporcioneu als usuaris un formulari que cal emplenar i, a continuació, desar els canvis en una font de dades. Per obtenir més informació, vegeu Entendre els formularis de dades.

Mireu aquest vídeo per aprendre a utilitzar la funció Patch:

Informació general

Utilitzeu la funció Patch per modificar un o diversos registres d'una font de dades. Els valors dels camps específics es modifiquen sense afectar altres propietats. Per exemple, aquesta fórmula canvia el número de telèfon d'un client anomenat Contoso:

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

Utilitzeu Patch amb la funció Defaults per crear registres. Utilitzeu aquest comportament per crear una única pantalla per crear i editar registres. Per exemple, aquesta fórmula crea un registre per a un client anomenat Contoso:

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

Encara que no treballeu amb una font de dades, podeu utilitzar Patch per combinar dos o més registres. Per exemple, aquesta fórmula combina dos registres en un que identifica el número de telèfon i la ubicació de Contoso:

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

Descripció

Modificar o crear un registre en una font de dades

Per utilitzar aquesta funció amb una font de dades, especifiqueu la font de dades i, a continuació, un registre base:

  • Per modificar un registre, el registre base ha de provenir d'una font de dades. El registre base pot provenir d'una propietat Items d'una galeria, haver-se col·locat en una variable de context o provenir d'un altre camí. Tanmateix, podeu fer el seguiment del registre base fins a la font de dades. Això és important perquè el registre inclourà informació addicional per ajudar a tornar a cercar el registre per modificar-lo.
  • Per crear un registre, utilitzeu la funció Defaults per crear un registre base amb valors per defecte.

A continuació, especifiqueu un o diversos registres de canvi, cadascun dels quals conté els valors nous que substitueixen els valors de la propietat del registre base. Els registres de canvi es processen per ordre des de l'inici de la llista d'arguments fins al final, amb els valors de propietat més recents que sobreescriuen els anteriors.

El valor de retorn de Patch és el registre que heu modificat o creat. Si heu creat un registre, el valor de retorn pot incloure propietats que la font de dades ha generat de manera automàtica. No obstant això, el valor de retorn no proporciona cap valor per als camps d'una taula relacionada.

Per exemple, utilitzeu Set(MyAccount, Patch(Accounts, First(Account), 'Account Name': "Example name")); i, a continuació, MyAccount.'Primary Contact'.'Full Name'. En aquest cas, no es pot donar cap nom complet. Per accedir als camps d'una taula relacionada, utilitzeu una cerca independent, com ara:

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

Quan actualitzeu una font de dades, pot ser que sorgeixin un o més problemes. Utilitzeu IfError i IsError amb el valor retornat de Patch per detectar i respondre a errors, com s'explica a Gestió d'errors. També podeu utilitzar la funció Errors per identificar i examinar els problemes, com es descriu a Treballar amb fonts de dades.

Entre les funcions relacionades hi ha la funció Update per substituir un registre sencer i la funció Collect per crear un registre. Utilitzeu la funció UpdateIf per modificar les propietats específiques de diversos registres en funció d'una condició.

Modificar o crear un conjunt de registres en una font de dades

Patch també es pot utilitzar per crear o modificar diversos registres amb una única trucada.

En lloc de passar un registre base únic, es pot proporcionar una taula de registres base al segon argument. També es proporcionen els registres de canvi en una taula, amb una correspondència individual amb els registres base. El nombre de registres de cada taula de canvi ha de ser el mateix que el nombre de registres de la taula base.

Quan s'utilitza Patch d'aquesta manera, el valor de retorn també és una taula amb una correspondència individual entre els registres base i de canvi.

Combinar registres fora d'una font de dades

Especifiqueu dos o més registres que voleu combinar. Els registres es processen per ordre des de l'inici de la llista d'arguments fins al final, amb els valors de propietat més recents que sobreescriuen els anteriors.

Patch torna el registre combinat i no en modifica els arguments ni els registres en cap font de dades.

Sintaxi

Modificar o crear un registre en una font de dades

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

  • DataSource: obligatori. La font de dades que conté el registre que voleu modificar o contindrà el registre que voleu crear.
  • BaseRecord: obligatori. El registre que es modificarà o crearà. Si el registre provenia d'una font de dades, es troba i es modifica el registre. Si s'utilitza el resultat de Defaults, es crea un registre.
  • ChangeRecord: obligatori. Un o diversos registres que contenen propietats per modificar a BaseRecord. Els registres de canvi es processen per ordre des de l'inici de la llista d'arguments fins al final, amb els valors de propietat més recents que sobreescriuen els anteriors.

Modificar o crear un conjunt de registres en una font de dades

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

  • DataSource: obligatori. La font de dades que conté els registres que voleu modificar o contindrà els registres que voleu crear.
  • BaseRecordTable: obligatori. Una taula de registres que es modificarà o crearà. Si el registre provenia d'una font de dades, es troba i es modifica el registre. Si s'utilitza el resultat de Defaults, es crea un registre.
  • ChangeRecordTable: obligatori. Una o diverses taules de registres que contenen propietats que es modificaran per a cada registre de BaseRecordTable. Els registres de canvi es processen per ordre des de l'inici de la llista d'arguments fins al final, amb els valors de propietat més recents que sobreescriuen els anteriors.

Combinar registres

Patch(Record1, Record2, […])

  • Record: obligatori. Almenys dos registres que voleu combinar. Els registres es processen per ordre des de l'inici de la llista d'arguments fins al final, amb els valors de propietat més recents que sobreescriuen els anteriors.

Exemples

Modificar o crear un registre (en una font de dades)

En aquests exemples, modificareu o creareu un registre en una font de dades, anomenada Gelat, que conté les dades d'aquesta taula i genera automàticament els valors a la columnaID:

Exemple de gelat.

Fórmula Descripció Resultat
Patch( Gelat,
LookUp( Gelat, Gust = "Xocolata" ), { Quantitat: 400 } )
Modifica un registre a la font de dades Gelat:
  • La columna ID del registre que es modificarà conté el valor 1. (El registre Xocolata té aquest identificador).
  • El valor de la columna Quantitat es canvia a 400.
{ ID:1, Gust: "Xocolata", Quantitat: 400 }

L'entrada Xocolata de la font de dades Gelat s'ha modificat.
Patch( Gelat, Defaults( Gelat), { Gust: "Maduixa" } ) Crea un registre a la font de dades Gelat:
  • La columna ID conté el valor 3, que la font de dades genera automàticament.
  • La columna Quantitat conté 0, que és el valor per defecte de la columna a la font de dades Gelat, tal com especifica la funció Defaults.
  • La columna Gust conté el valor Maduixa.
{ID: 3, Gust: "Maduixa", Quantitat: 0}

L'entrada Maduixa de la font de dades Gelat s'ha creat.

Un cop avaluades les fórmules anteriors, la font de dades finalitza amb aquests valors:

Exemple gelat després.

Combinar registres (fora d'una font de dades)

Fórmula Descripció Resultat
Patch( { Nom: "James", Puntuació: 90 }, { Nom: "Jim", Aprovat: true } ) Combina dos registres fora d'una font de dades:
  • Els valors de la columna Nom de cada registre no coincideixen. El resultat conté el valor (Jim) del registre més proper al final de la llista d'arguments en comptes del valor (James) del registre més proper a l'inici.
  • El primer registre conté una columna (Puntuació) que no existeix al segon registre. El resultat conté la columna amb el valor (90).
  • El segon registre conté una columna (Aprovat) que no existeix al primer registre. El resultat conté la columna amb el valor (true).
{Nom: "Jim", Puntuació: 90, Aprovat: true}

Ús de Com o Aquest registre

Utilitzar la paraula clau Com o Aquest registre a la fórmula evita el context d'avaluació ambigua.

A l'exemple següent, tingueu en compte la primera cerca a la If declaració. (OrderID = A[@OrderID]) està previst que es compari l'OrderId en l'àmbit de cerca amb l'OrderId de la col·lecció A a l'àmbit ForAll. En aquest cas, és possible que A[@OrderId] es resolgui com a paràmetre local. Però és ambigu.

Power Apps actualment s'interpreta per la banda esquerra OrderId i la dreta A[@OrderId] com a camp en l'àmbit de la cerca. Per tant, la cerca sempre trobarà la primera fila a [dbo].[Orders1] perquè la condició sempre és certa (és a dir, qualsevol fila OrderId és igual a si mateixa).

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

Utilitzant Com o Aquest registre

Sempre que sigui possible, utilitzeu l'operador Com o Aquest registre per desambiguar la banda esquerra. Com es recomana per a l'escenari anterior.

Quan la fórmula utilitza diversos àmbits amb ForAll, Filter, i Lookup en la mateixa font de dades o taula, és possible que els paràmetres d'àmbit xoquin amb el mateix camp en un altre lloc. Per tant, es recomana utilitzar l'operador Com o Aquest registre per resoldre el nom del camp i evitar l'ambigüitat.

Per exemple, podeu utilitzar l'operador Com per desambiguar-ho en l'exemple següent.

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

O bé, podeu utilitzar Aquest registre amb el mateix propòsit.

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

Per obtenir més informació sobre l'ús de l'operador Com i Aquest registre vegeu l'article Operadors.