Funzione Patch

Si applica a: App canvas Flussi desktop di Copilot Studio App basate su modello Funzioni dell'interfaccia della riga di comando di Power Platform Dataverse

Modifica o crea uno o più record in un'origine dati oppure unisce record esterni a un'origine dati.

Usare la Patch funzione per modificare i record in situazioni complesse, ad esempio quando si eseguono aggiornamenti che non richiedono alcuna interazione dell'utente o usare moduli che si estendono su più schermate.

Per aggiornare i record in un origine dati più facilmente per semplici modifiche, utilizzare invece il controllo Edit form. Quando si aggiunge un controllo Edit form, si fornisce agli utenti un modulo da compilare e in cui salvare le modifiche a un'origine dati. Per altre informazioni, vedere Informazioni sui moduli dati.

Guardare questo video per informazioni su come usare la Patch funzione:

Overview

Usare la Patch funzione per modificare uno o più record di un'origine dati. Aggiorna i valori di campi specifici senza influenzare altre proprietà. Questa formula, ad esempio, modifica il numero di telefono per un cliente denominato Contoso:

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

Usare Patch con la funzione Defaults per creare record. Usare questo comportamento per compilare un singola schermata per la creazione e modifica di record. Questa formula, ad esempio, crea un record per un cliente denominato Contoso:

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

Note

Quando si patcha una collezione usando un record da una sorgente dati con valori predefiniti, l'operazione aggiorna la collezione sia con i valori specificati sia quelli predefiniti dalla fonte dati. La DataSource dell'istruzione patch e la funzione DataSource delle Impostazioni Predefinite devono corrispondere per creare un nuovo record.

Anche se non si usa un'origine dati, è possibile usare Patch per unire due o più record. Ad esempio, questa formula unisce due record in un unico record che identifica sia il numero di telefono sia la località per Contoso:

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

Description

Modificare o creare un record in un'origine dati

Per usare questa funzione con un'origine dati, specificare l'origine dati e quindi specificare un record di base:

  • Per modificare un record, il record base deve provenire da una fonte di dati. Potresti ottenere il record base tramite la proprietà Items di una galleria, inserirlo in una variabile di contesto o ottenerlo tramite qualche altro percorso. Ma devi essere in grado di tracciare il record base fino alla fonte dei dati. Questo requisito è importante perché il record include informazioni aggiuntive che ti aiutano a ritrovarlo per la modifica.
  • Per creare un record, usare la funzione Defaults che crea un record di base con valori predefiniti.

Specificare quindi uno o più record di modifiche che contengono nuovi valori di proprietà che eseguono l'override dei valori di proprietà del record di base. I record di modifiche vengono elaborati seguendo l'ordine dall'inizio alla fine dell'elenco degli argomenti, in cui gli ultimi valori delle proprietà sovrascrivono i valori precedenti.

Il valore restituito di Patch è il record modificato o creato. Se è stato creato un record, il valore restituito potrebbe includere proprietà generate automaticamente dall'origine dati. Tuttavia, il valore restituito non fornisce un valore per i campi di una tabella correlata.

Ad esempio, si utilizza Set(MyAccount, Patch(Accounts, First(Account), 'Account Name': "Example name")); e quindi MyAccount.'Primary Contact'.'Full Name'. In questo caso, non è possibile avere un nome completo. Per accedere ai campi di una tabella correlata, utilizza una ricerca separata come:

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

Quando si aggiorna un'origine dati, potrebbero verificarsi uno o più problemi. Usare IfError e IsError con il valore restituito da Patch per rilevare e rispondere agli errori, come descritto nella gestione degli errori . Puoi anche usare la funzione Errors per identificare ed esaminare i problemi, come illustrato nell'articolo relativo all'uso delle origini dati.

Le funzioni correlate includono la funzione Update, che può essere usata per sostituire un intero record, e la funzione Collect, che può essere usata per creare un record. Usare la funzione UpdateIf per modificare proprietà specifiche di più record in base a una condizione.

Modificare o creare un set di record in un'origine dati

Puoi anche usare Patch la creazione o la modifica di più record con una singola chiamata.

Invece di passare un singolo record base, fornire una tabella dei record base nel secondo argomento. Fornire anche i record delle modifiche in una tabella, corrispondendo uno per uno ai record base. Il numero di record di ogni tabella di modifiche deve essere identico al numero di record della tabella di base.

Quando si usa Patch in questo modo, il valore di ritorno è anche una tabella con ogni record corrispondente uno per uno con i record base e di cambiamento.

Unire record esterni a un'origine dati

Specificare due o più record da unire. La funzione elabora i record nell'ordine dall'inizio alla fine della lista degli argomenti, con i valori delle proprietà successivi che sovrastano quelli precedenti.

Patch restituisce il record unito e non modifica gli argomenti o i record in alcuna origine dati.

Syntax

Modificare o creare un record in un'origine dati

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

  • DataSource: obbligatorio. L'origine dati che contiene il record da modificare o che conterrà il record che si vuole creare.
  • BaseRecord – Obbligatorio. Il record da modificare o da creare. Se il record proviene da una fonte di dati, la funzione trova e modifica il record. Se viene utilizzato il risultato di Defaults , la funzione crea un record. L'origine dati dell'istruzione patch e l'origine dati della funzione Defaults devono corrispondere per creare un nuovo record.
  • ChangeRecords – Obbligatorio. Uno o più record che contengono le proprietà da modificare in BaseRecord. I processi funzionali cambiano i record in ordine dall'inizio alla fine della lista degli argomenti, con i valori delle proprietà successivi che sovrappongono quelli precedenti.

Modificare o creare un set di record in un'origine dati

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

  • DataSource: obbligatorio. L'origine dati che contiene i record da modificare o che conterrà i record che si vuole creare.
  • BaseRecordTable – Obbligatorio. La tabella di record da modificare o da creare. Se il record proviene da una fonte di dati, la funzione trova e modifica il record. Se viene utilizzato il risultato di Defaults , la funzione crea un record. L'origine dati dell'istruzione patch e l'origine dati della funzione Defaults devono corrispondere per creare un nuovo record.
  • ChangeRecordTables – Obbligatorio. Una o più tabelle di record che contengono proprietà da modificare per ogni record della BaseRecordTable. I processi funzionali cambiano i record in ordine dall'inizio alla fine della lista degli argomenti, con i valori delle proprietà successivi che sovrappongono quelli precedenti.

Merge records

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

  • Record - Obbligatorio. Almeno due record che si vuole unire. La funzione elabora i record in ordine dall'inizio alla fine della lista degli argomenti, con i valori delle proprietà successivi che sovrappongono quelli precedenti.

Examples

Modificare o creare un record in un'origine dati

In questi esempi, modifichi o crei un record in una sorgente di dati chiamata IceCream. La sorgente dati contiene i dati in questa tabella e genera automaticamente i valori nella colonna ID:

Screenshot della tabella di esempio della sorgente di dati IceCream che mostra aromi e quantità.

Per creare una versione in memoria di questa fonte di dati così da poter provare questi esempi, valuta questa formula:

ClearCollect( IceCream,
    { ID: 1, Flavor: "Chocolate", Quantity: 100 },
    { ID: 2, Flavor: "Vanilla", Quantity: 200 }
)
Formula Description Result
Patch( Gelato,
LookUp( Gelato, Sapore = "Cioccolato" ), { Quantità: 400 } )
Modifica un record nell'origine dati IceCream:
  • La colonna ID del record da modificare contiene il valore 1. Il record Chocolate ha quell'ID.
  • Il valore nella colonna Quantity viene sostituito con il valore 400.
{ ID: 1, Gusto: "Cioccolato", Quantità: 400 }

La voce Chocolate nella fonte dati IceCream è stata modificata.
Patch( Gelato, Defaults( Gelato ), { Gusto: "Fragola" } ) Crea un record nell'origine dati IceCream:
  • La colonna ID contiene il valore 3, generato automaticamente dall'origine dati.
  • La colonna Quantity contiene 0, che corrisponde al valore predefinito per tale colonna nell'origine dati IceCream, come specificato dalla funzione Defaults.
  • La colonna Flavor contiene il valore Strawberry.
{ ID: 3, Gusto: "Fragola", Quantità: 0 }

Viene creata la voce Strawberry nella fonte dati IceCream .

Dopo aver valutato le formule precedenti, la sorgente di dati termina con questi valori:

Screenshot della fonte dei dati di IceCream dopo che le Patch formule sono state valutate.

Unire record esterni a un'origine dati

Formula Description Result
Patch( { Nome: "James", Punteggio: 90 }, { Nome: "Jim", Passato: vero } ) Unisce due record esterni a un'origine dati:
  • I valori nella colonna Name di ogni record non corrispondono. Il risultato contiene il valore (Jim) nel record più vicino alla fine dell'elenco degli argomenti anziché il valore (James) nel record più vicino all'inizio.
  • Il primo record contiene una colonna (Score) che non esiste nel secondo record. Il risultato contiene tale colonna con il valore (90).
  • Il secondo record contiene una colonna (Passed) che non esiste nel primo record. Il risultato contiene tale colonna con il valore (true).
{ Nome: "Jim", Punteggio: 90, Passato: vero }

Modifica o crea un insieme di record (in una fonte dati)

Quando usi Patch con tabelle invece di record singoli, puoi creare o modificare più record in una singola chiamata. Il valore di ritorno è una tabella di record che corrisponde uno per uno alle tabelle di input.

Questo esempio aggiorna la Quantità per più gusti nella sorgente di dati IceCream contemporaneamente:

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

Il risultato è una tabella con i record aggiornati: { ID: 1, Flavor: "Chocolate", Quantity: 300 } e { ID: 2, Flavor: "Vanilla", Quantity: 400 }.

Questo esempio crea più nuovi record usando i Default:

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

Note

Quando si usa Patch con tabelle, il numero di record in ogni tabella di modifica deve corrispondere al numero di record nella tabella base. In caso contrario si verificherà un errore.

Per rilevare errori quando modifichi più record, usa IfError. IfError è il meccanismo preferito e funziona tra host Power Fx:

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

Patch con tipi di colonne Dataverse

I seguenti esempi si applicano specificamente alle fonti di dati Microsoft Dataverse. Le forme dei record variano a seconda della fonte dati (ad esempio, SharePoint e SQL Server hanno formati diversi).

Colonna scelta: Per impostare una colonna Scelta, usa direttamente il valore enum. Questo esempio imposta una colonna di scelta Stato su una tabella Conti :

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

Colonna di ricerca: Per impostare una colonna di Ricerca, fornisci un record con la chiave primaria della tabella correlata. Questo esempio imposta la ricerca Primary Contact su un record Account :

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

Note

Questi esempi di tipo colonna sono specifici per Dataverse. Altre fonti di dato, come SharePoint o SQL Server, potrebbero richiedere forme di record diverse per tipi di colonne simili. Consulta la documentazione della tua fonte dati specifica per il formato corretto.

Delega nelle formule che utilizzano Patch

La Patch funzione stessa non è soggetta a delega perché scrive nella sorgente dati invece di interrogarla. Tuttavia, avvisi di delega potrebbero comparire in formule che utilizzano Patch se la parte di selezione dei record della formula (come Filter, LookUp o ForAll) comporta una query che supera i limiti di delega della sorgente dati.

Quando vedi un avviso di delega in una formula che include Patch, verifica se l'avviso si applica alle funzioni di recupero dati piuttosto che a Patch se stesso. Per maggiori informazioni sulla delega, vedi Comprendi la delega in un'app canvas.

Errori comuni con la Patch funzione

Quando usi la Patch funzione, possono verificarsi errori dovuti alla connettività della fonte dati, ai permessi o a conflitti di dati. Usa IfError e IsError per rilevare errori e rispondere in modo appropriato.

  • "Errore di rete quando si utilizza Patch la funzione": Questo errore tipicamente indica che l'app non riesce a raggiungere la fonte dati. Le cause comuni includono la perdita della connessione internet, la fonte dei dati temporaneamente indisponibile o permessi insufficienti per l'utente attuale. Inserisci la Patch chiamata in IfError per fornire un messaggio significativo agli utenti.

  • "Esistono conflitti con le modifiche sul server": Questo errore si verifica quando un altro utente o processo modifica lo stesso record tra il momento in cui l'app legge il record e scrive la modifica. Aggiorna la sorgente dati chiamando la funzione Refresh e riprova l'operazione.

  • Errori di permesso: Se l'utente non ha il permesso di creare o modificare i record nella fonte dati, la Patch chiamata fallisce. Usa IfError per individuare errori legati ai permessi e guidare l'utente.

Per i modelli generali di gestione degli errori, vedi Gestione degli errori.

Utilizzo di As o ThisRecord

Usa la parola chiave As o ThisRecord nella tua formula per evitare contesti di valutazione ambigui.

Nel seguente esempio, consideriamo il primo Lookup della If dichiarazione. (OrderID = A[@OrderID]) si prevede che confronti il OrderId nel Lookup campo con il OrderId del collezione A nel ForAll scopo. In questo caso, probabilmente vorrai A[@OrderId] risolverlo come parametro locale. Ma è ambiguo.

Attualmente Power Apps interpreta sia il lato sinistro OrderId sia il lato destro A[@OrderId] come un campo nell'ambito Lookup. Pertanto, Lookup trova sempre la prima riga in [dbo].[Orders1] perché la condizione è sempre vera (cioè, quella di OrderId ogni riga è uguale a se stessa).

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

Utilizzo di As o ThisRecord

Quando possibile, usa l'operatore As o la parola chiave ThisRecord per disambiguare il lato sinistro. Come raccomandato per lo scenario precedente.

Quando la tua formula utilizza più ambiti con ForAll, Filter, e Lookup sulla stessa fonte di dati o tabella, i parametri di ambito potrebbero collocare con lo stesso campo altrove. Pertanto, usa l'operatore As o ThisRecord per risolvere il nome del campo ed evitare ambiguità.

Ad esempio, puoi usare l'operatore As per disambiguare nel seguente esempio.

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

In alternativa, puoi utilizzare ThisRecord per lo stesso scopo.

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 saperne di più sull'uso dell'operatore As e di ThisRecord, consulta l'articolo sugli Operatori .