Funzione Patch

Si applica a: App Canvas App basate su modello Power Platform CLI Flussi Desktop

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

Usare la funzione Patch per modificare i record in situazioni complicate, ad esempio quando si eseguono aggiornamenti che non richiedono alcun intervento dell'utente o usano 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.

Guarda questo video per imparare a usare la funzione Patch:

Panoramica

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

Patch( Customers, First( Filter( 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" } )

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

Descrizione

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, un record di base deve provenire da un'origine dati. Il record di base potrebbe provenire da una proprietà Items di una raccolta, potrebbe trovarsi in una variabile di contesto oppure provenire da altre origini. In ogni caso, è possibile rilevare l'origine dati del record di base. Ciò è importante in quanto il record includerà informazioni aggiuntive che consentiranno di ritrovarlo successivamente per eventuali modifiche.
  • 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 può 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 alcuni problemi. Usa IfError e IsError con il valore restituito da Patch per rilevare e rispondere agli errori, come descritto in 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

Patch può essere utilizzato anche per creare o modificare più record con una singola chiamata.

È possibile infatti specificare una tabella di record di base nel secondo argomento, anziché indicare un record di base singolo. I record di modifiche vengono anche specificati in una tabella, con una corrispondenza uno a uno con i record di base. Il numero di record di ogni tabella di modifiche deve essere identico al numero di record della tabella di base.

Quando si usa la funzione Patch in questo modo, il valore restituito è anche una tabella in cui ogni record ha una corrispondenza uno a uno con i record di base e di modifiche.

Unire record esterni a un'origine dati

Specificare due o più record da unire. I record vengono elaborati seguendo l'ordine dall'inizio alla fine dell'elenco degli argomenti, in cui gli ultimi valori delle proprietà sovrascrivono i valori precedenti.

Patch restituisce il record unito e non modifica i suoi argomenti o record in nessuna origine dati.

Sintassi

Modificare o creare un record in un'origine dati

Patch( Originedati, RecordBase, CambiaRecord1 [, CambiaRecord2, … ])

  • 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 proviene da un'origine dati, il record viene trovato e modificato. Se viene usato il risultato della funzione Defaults, viene creato un record.
  • ChangeRecords – Obbligatorio. Uno o più record che contengono le proprietà da modificare in BaseRecord. 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.

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

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

  • 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 proviene da un'origine dati, il record viene trovato e modificato. Se viene usato il risultato della funzione Defaults, viene creato un record.
  • ChangeRecordTables – Obbligatorio. Una o più tabelle di record che contengono proprietà da modificare per ogni record della BaseRecordTable. 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.

Per unire record

Patch( Registro1, Registro2 [, …] )

  • Record - Obbligatorio. Almeno due record che si vuole unire. I record vengono elaborati seguendo l'ordine dall'inizio alla fine dell'elenco degli argomenti, in cui gli ultimi valori delle proprietà sovrascrivono i valori precedenti.

Esempi

Modificare o creare un record in un'origine dati

In questi esempi verrà modificato o creato un record in un'origine dati, denominata IceCream, che contiene i dati in questa tabella e che genera automaticamente i valori nella colonna ID:

Esempio icecream.

Formula Description Result
Patch (gelato,
LookUp( IceCream, Flavor = "Chocolate" ), { Quantity: 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, Flavor: "Chocolate", Quantity: 400 }

La voce Chocolate nell'origine dati IceCream è stata modificata.
Patch( IceCream, Defaults( IceCream ), { 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, Flavor: "Strawberry", Quantity: 0 }

La voce Strawberry nell'origine dati IceCream è stata creata.

Dopo aver valutato le formule precedenti, l'origine dati restituisce i valori seguenti:

Esempio di gelato dopo.

Unire record esterni a un'origine dati

Formula Descrizione Risultato
Patch( { Nome: "James", Punteggio: 90 }, { Nome: "Jim", Superato: 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).
{ Name: "Jim", Score: 90, Passed: true }

Utilizzo di As o ThisRecord

Utilizzando As o ThisRecord la parola chiave nella formula evita un contesto di valutazione ambiguo.

Nell'esempio seguente, considera la prima ricerca nell'istruzione If. (OrderID = A[@OrderID]) si prevede di confrontare l' OrderId nell'ambito di ricerca con l' OrderId della raccolta A nell'ambito ForAll . In questo caso, probabilmente vorrai che A[@OrderId] venga risolto come parametro locale. Ma è ambiguo.

Power Apps attualmente interpreta entrambi i parametri OrderId sul lato sinistro e A[@OrderId] sul lato destro come campo nell'ambito di ricerca. Pertanto, la ricerca troverà sempre la prima riga in [dbo].[Orders1] perché la condizione è sempre vera (ovvero, qualsiasi riga OrderId è 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, utilizza l'operatore As o ThisRecord per chiarire le ambiguità del lato sinistro. Come consigliato per lo scenario sopra descritto.

Quando la formula utilizza più ambiti con ForAll, Filter e Lookup sulla stessa origine dati o tabella, è possibile che i parametri dell'ambito possano entrare in conflitto con uno stesso campo altrove. Pertanto, è consigliabile utilizzare l'operatore As o ThisRecord per risolvere il nome del campo ed evitare ambiguità.

Ad esempio, puoi utilizzare l'operatore As per chiarire le ambiguità nell'esempio seguente.

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'utilizzo dell'operatore As e ThisRecord vedi l'articolo Operatori.