Funcția Patch

Se aplică pentru: Aplicații Canvas Aplicații bazate pe model Power Platform CLI Fluxuri desktop

Modifică sau creează una sau mai multe înregistrări într-o sursă de date sau fuzionează înregistrări în afara unei surse de date.

Utilizați funcția Correcție pentru a modifica înregistrările în situații complexe, cum ar fi când efectuați actualizări care nu necesită interacțiunea utilizatorului sau utilizați formulare care se întind pe mai multe ecrane.

Pentru a actualiza mai ușor înregistrările într-o sursă de date pentru modificări simple, utilizați în schimb controlul Editare formular. Când adăugați un control Editare formular, le oferiți utilizatorilor un formular de completat și apoi salvați modificările la o sursă de date. Pentru mai multe informații, consultați Înțelegeți formularele de date.

Urmăriți acest videoclip pentru a afla cum să utilizați funcția Patch:

Prezentare generală

Utilizați funcția Patch pentru a modifica una sau mai multe înregistrări ale unei surse de date. Valorile unor anumite câmpuri sunt modificate fără a afecta alte proprietăți. De exemplu, această formulă schimbă numărul de telefon pentru un client numit Contoso:

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

Utilizați Patch cu funcția Defaults pentru a crea înregistrări. Utilizați acest comportament pentru a crea un singur ecran atât pentru crearea, cât și pentru editarea înregistrărilor. De exemplu, această formulă creează o înregistrare pentru un client numit Contoso:

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

Chiar dacă nu lucrați cu o sursă de date, puteți utiliza Patch ca să îmbine două sau mai multe înregistrări. De exemplu, această formulă îmbină două înregistrări în una care identifică atât numărul de telefon, cât și locația pentru Contoso:

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

Descriere

Modificați sau creați o înregistrare într-o sursă de date

Pentru a utiliza această funcție cu o sursă de date, specificați sursa de date, apoi specificați o înregistrare de bază:

  • Pentru a modifica o înregistrare, înregistrarea de bază trebuie să provină de la o sursă de date. Este posibil ca înregistrarea de bază să fi trecut printr-o proprietate Elemente a galeriei, a fost plasată într-o variabilă de context sau a parcurs altă cale. Însă, puteți urmări înregistrarea de bază înapoi la sursa de date. Acest lucru este important, deoarece înregistrarea va include informații suplimentare pentru a vă ajuta să găsiți din nou înregistrarea din nou pentru modificare.
  • Pentru a crea o înregistrare, utilizați funcția Defaults pentru a crea o înregistrare de bază cu valori implicite.

Apoi specificați una sau mai multe înregistrări de modificare, fiecare dintre acestea conține valori de proprietate noi care înlocuiesc valorile proprietății în înregistrarea de bază. Înregistrările de schimbare sunt procesate în formularul de la începutul listei de argumente până la sfârșit, valorile de proprietate ulterioare fiind peste cele anterioare.

Valoarea de returnare a Patch este înregistrarea modificată sau creată. Dacă ați creat o înregistrare, este posibil ca valoarea returnată să includă proprietăți pe care sursa de date le-a generat automat. Cu toate acestea, valoarea returnată nu oferă o valoare pentru câmpurile unui tabel asociat.

De exemplu, utilizați Set(MyAccount, Patch(Accounts, First(Account), 'Account Name': "Example name")); și apoi MyAccount.'Primary Contact'.'Full Name'. Nu puteți da un nume complet în acest caz. În schimb, pentru a accesa câmpurile unui tabel asociat, utilizați o căutare separată, cum ar fi:

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

Când actualizați o sursă de date, pot apărea una sau mai multe probleme. Utilizați IfError și IsError cu valoarea de returnare de la Corecție pentru a detecta și a răspunde la erori, așa cum descrie Manipularea erorilor. Puteți să folosiți funcția Errors pentru a identifica și examinați problemele, așa cum Lucrul cu surse de date descrie.

Funcțiile conexe includ funcția Update pentru a înlocui o înregistrare întreagă și funcția Collect pentru a crea o înregistrare. Folosiți funcția UpdateIf pentru a modifica proprietățile specifice ale mai multor înregistrări bazate pe o condiție.

Modificați sau creați un set de înregistrări într-o sursă de date

Patch poate fi, de asemenea, utilizat pentru a crea sau a modifica mai multe înregistrări cu un singur apel.

În loc să transmiteți o singură înregistrare de bază, în al doilea argument poate fi furnizat un tabel de înregistrări de bază. Înregistrările de modificare sunt furnizate și într-un tabel, corespunzând unu-la-unu cu înregistrările de bază. Numărul de înregistrări din fiecare tabel de modificare trebuie să fie același cu numărul de înregistrări din tabelul de bază.

Atunci când se utilizează Patch în acest mod, valoarea de returnare este, de asemenea, un tabel cu fiecare înregistrare corespunzătoare unu-la-unu cu înregistrările de bază și modificare.

Îmbinați înregistrările în afara unei surse de date

Specificați două sau mai multe înregistrări pe care doriți să le îmbinați. Înregistrările sunt procesate în comanda de la începutul listei de argumente până la sfârșit, valorile de proprietate ulterioare fiind peste cele anterioare.

Patch returnează înregistrarea îmbinată și nu modifică argumentele sau înregistrările în nicio sursă de date.

Sintaxă

Modificați sau creați o înregistrare într-o sursă de date

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

  • DataSource – Obligatoriu. Sursa de date care conține înregistrarea pe care doriți să o modificați sau va conține înregistrarea pe care doriți să o creați.
  • BaseRecord – Obligatoriu. Înregistrarea de modificat sau de creat. Dacă înregistrarea provine de la o sursă de date, înregistrarea este găsită și modificată. Dacă este utilizat rezultatul pentru Defaults, se creează o înregistrare.
  • ChangeRecord(s) – Obligatoriu. Una sau mai multe înregistrări care conțin proprietăți de modificat în BaseRecord. Înregistrările de schimbare sunt procesate în formularul de la începutul listei de argumente până la sfârșit, valorile de proprietate ulterioare fiind peste cele anterioare.

Modificați sau creați un set de înregistrări într-o sursă de date

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

  • DataSource – Obligatoriu. Sursa de date care conține înregistrările pe care doriți să o modificați sau va conține înregistrările pe care doriți să le creați.
  • BaseRecordTable – Obligatoriu. Un tabel de înregistrări de modificat sau creat. Dacă înregistrarea provine de la o sursă de date, înregistrarea este găsită și modificată. Dacă este utilizat rezultatul pentru Defaults, se creează o înregistrare.
  • ChangeRecordTable(s) – Obligatoriu. Unul sau mai multe tabele de înregistrări care conțin proprietăți de modificat pentru fiecare înregistrare BaseRecordTable. Înregistrările de schimbare sunt procesate în formularul de la începutul listei de argumente până la sfârșit, valorile de proprietate ulterioare fiind peste cele anterioare.

Îmbinarea înregistrărilor

Patch( Record1, Record2 [, …] )

  • Record(s) – Obligatoriu. Cel puțin două înregistrări pe care le doriți să se îmbine. Înregistrările sunt procesate în comanda de la începutul listei de argumente până la sfârșit, valorile de proprietate ulterioare fiind peste cele anterioare.

Exemple

Modificați sau creați o înregistrare (într-o sursă de date)

În aceste exemple, veți modifica sau crea o înregistrare într-o sursă de date, numită IceCream, care conține datele din acest tabel și generează automat valorile din IDcoloană:

Exemplu de înghețată.

Formula Descriere Rezultat
Patch( IceCream,
LookUp( IceCream, Flavor = "Chocolate" ), { Quantity: 400 } )
Modifică o înregistrare în sursa de date Înghețată:
  • Coloana ID a înregistrării de modificat conține valoarea 1. (Înregistrarea Ciocolată are acel ID.)
  • Valoarea din Cantitate se schimbă în coloană la 400.
{ ID: 1, Flavor: "Chocolate", Quantity: 400 }

Introducerea Ciocolată în sursa de date Înghețată a fost modificată.
Patch( IceCream, Defaults( IceCream ), { Flavor: "Strawberry" } ) Creează o înregistrare în sursa de date Înghețată:
  • Coloana ID conține valoarea 3, pe care sursa de date o generează automat.
  • Coloana Cantitate conține 0, care este valoarea implicită pentru acea coloană din sursa de date Înghețată, conform specificațiilor funcției Defaults.
  • Coloana Aromă conține valoarea Căpșună.
{ ID: 3, Aromă: "Căpșună", Cantitate: 0 }

Introducerea Căpșună în sursa de date Înghețată a fost creată.

După ce au fost evaluate formulele anterioare, sursa de date se încheie cu aceste valori:

Exemplu de inghetata dupa.

Îmbinați înregistrările (în afara unei surse de date)

Formula Descriere Rezultat
Patch( { Name: "James", Score: 90 }, { Name: "Jim", Passed: true } ) Îmbină două înregistrări în afara unei surse de date:
  • Valorile din coloana Nume fiecărei înregistrări nu se potrivesc. Rezultatul conține valoarea (Ștefan) în înregistrare care este mai aproape de finalul listei de argumente în loc de valoare (Ioan) în înregistrarea care este mai aproape de început.
  • Prima înregistrare conține o coloană (Scor) care nu există în a doua înregistrare. Rezultatul conține acea coloană cu valoarea sa (90).
  • A doua înregistrare conține o coloană (Reușit) care nu există în prima înregistrare. Rezultatul conține acea coloană cu valoarea sa (true).
{ Name: "Jim", Score: 90, Passed: true }

Utilizarea de As sau ThisRecord

Folosind cuvântul cheie As sau ThisRecord din formulă se evită contextul de evaluare ambiguu.

În exemplul de mai jos, luați în considerare prima căutare în afirmația If. (OrderID = A[@OrderID]) este de așteptat să compare OrderId în domeniul de căutare cu OrderId al colecției A în scopul ForAll. În acest caz, probabil că doriți A[@OrderId] să fie rezolvat ca parametru local. Dar este ambiguu.

Power Apps în prezent interpretează atât partea stângă OrderId cât și partea dreaptă A[@OrderId] ca un câmp în domeniul de căutare. Prin urmare, căutarea va găsi întotdeauna primul rând din [dbo].[Orders1] deoarece condiția este întotdeauna adevărată (adică orice rând OrderId este egal cu el însuși.)

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

Utilizând As sau ThisRecord

Ori de câte ori este posibil, utilizați operatorul As sau ThisRecord pentru a dezambiguiza partea stângă. As este recomandat pentru scenariul de mai sus.

Când formula dvs. folosește mai multe scopuri cu ForAll, Filter și Lookup pe același sursă de date sau tabel, este posibil ca parametrii domeniului să se ciocnească cu același câmp în altă parte. Prin urmare, se recomandă utilizarea operatorului As sau ThisRecord pentru a rezolva numele câmpului și a evita ambiguitatea.

De exemplu, puteți utiliza operatorul As pentru a dezambigua în exemplul de mai jos.

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

Alternativ, puteți utiliza ThisRecord în același scop.

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

Pentru a afla mai multe despre utilizarea operatorului As și ThisRecord consultați articolul Operatori.