Notă
Accesul la această pagină necesită autorizare. Puteți încerca să vă conectați sau să modificați directoarele.
Accesul la această pagină necesită autorizare. Puteți încerca să modificați directoarele.
Se aplică la: Aplicații
pânză Copilot Studio
Desktop fluxuri
model aplicații bazate pe platforma
Power Platform CLI
Dataverse
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 Patch pentru a modifica înregistrările în situații complexe, cum ar fi atunci când efectuați actualizări care necesită nicio interacțiune cu utilizatorul sau utilizarea formularelor 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 :
Overview
Utilizați funcția Patch pentru a modifica una sau mai multe înregistrări ale unei surse de date. Actualizează valorile anumitor câmpuri fără a afecta alte proprietăți. De exemplu, această formulă schimbă numărul de telefon pentru un client numit Contoso:
Patch( Customers, LookUp( Customers, Name = "Contoso" ), { Phone: "1-212-555-1234" } )
Se utilizează 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" } )
Note
Când aplici patch-uri unei colecții folosind o înregistrare dintr-o sursă de date cu valori implicite, operațiunea de patch actualizează colecția atât cu valorile specificate, cât și cu valorile implicite din sursa de date. DataSource a instrucțiunii patch și DataSource a funcției Defaults trebuie să se potrivească pentru a crea o nouă înregistrare.
Chiar dacă nu lucrați cu o sursă de date, puteți utiliza Patch pentru a îmbina 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" } )
Description
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ă dintr-o sursă de date. Poți obține înregistrarea de bază prin proprietatea Items a unei galerii, să o plasezi într-o variabilă de context sau să o obții pe altă cale. Dar trebuie să poți urmări înregistrarea de bază până la sursa de date. Această cerință este importantă deoarece dosarul include informații suplimentare care te ajută să găsești din nou dosarul 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 Patch returnată este înregistrarea pe care ați modificat-o sau ați creat-o. Dacă ați creat o înregistrare, valoarea returnată poate include 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'
Atunci când actualizați o sursă de date, pot apărea una sau mai multe probleme. Utilizați IfError și IsError cu valoarea returnată de la Patch pentru a detecta și a răspunde la erori, așa cum descrie Gestionarea 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
De asemenea, poți folosi Patch pentru a crea sau modifica mai multe înregistrări printr-un singur apel.
În loc să se treacă o singură înregistrare de bază, se oferă un tabel cu înregistrările de bază în al doilea argument. Oferă și înregistrările modificărilor într-un tabel, corespunzând unu-la-unu înregistrărilor 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ă.
Când folosești Patch în acest mod, valoarea returnată este și un tabel cu fiecare înregistrare corespunzătoare unu-la-unu cu înregistrările de bază și schimbare.
Î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. Funcția procesează înregistrările în ordinea de la începutul listei de argumente până la final, valorile proprietăților ulterioare suprascriind pe cele anterioare.
Patch returnează înregistrarea îmbinată și nu modifică argumentele sau înregistrările sale în nicio sursă de date.
Syntax
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 dintr-o sursă de date, funcția găsește și modifică înregistrarea. Dacă se folosește rezultatul Defaults , funcția creează o înregistrare. Sursa de date a instrucțiunii de corecție și Sursa de date a funcției Defaults trebuie să corespundă pentru a crea o înregistrare nouă.
- ChangeRecords – Obligatoriu. Una sau mai multe înregistrări care conțin proprietăți de modificat în BaseRecord. Procesele funcțiilor schimbă înregistrările în ordine, de la începutul listei de argumente până la sfârșit, valorile proprietăților ulterioare suprascriind pe 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 dintr-o sursă de date, funcția găsește și modifică înregistrarea. Dacă se folosește rezultatul Defaults , funcția creează o înregistrare. Sursa de date a instrucțiunii de corecție și Sursa de date a funcției Defaults trebuie să corespundă pentru a crea o înregistrare nouă.
- ChangeRecordTables – Obligatoriu. Unul sau mai multe tabele de înregistrări care conțin proprietăți de modificat pentru fiecare înregistrare BaseRecordTable. Procesele funcțiilor schimbă înregistrările în ordine, de la începutul listei de argumente până la sfârșit, valorile proprietăților ulterioare suprascriind pe cele anterioare.
Merge records
Patch( Înregistrare1, Înregistrare2 [, ...] )
- Înregistrări - Obligatoriu. Cel puțin două înregistrări pe care le doriți să se îmbine. Funcția procesează înregistrările în ordine, de la începutul listei de argumente până la final, valorile proprietăților ulterioare suprascriind pe cele anterioare.
Examples
Modificați sau creați o înregistrare (într-o sursă de date)
În aceste exemple, modifici sau creezi o înregistrare într-o sursă de date numită IceCream. Sursa de date conține datele din acest tabel și generează automat valorile din coloanaID:
Pentru a crea o versiune în memorie a acestei surse de date, astfel încât să puteți încerca aceste exemple, evaluați această formulă:
ClearCollect( IceCream,
{ ID: 1, Flavor: "Chocolate", Quantity: 100 },
{ ID: 2, Flavor: "Vanilla", Quantity: 200 }
)
| Formula | Description | Result |
|---|---|---|
|
Patch( Înghețată, LookUp( IceCream, Aroma = "ciocolată" ), { Cantitate: 400 } ) |
Modifică o înregistrare în sursa de date Înghețată:
|
{ ID: 1, Aroma: "ciocolată", Cantitate: 400 } Intrarea Chocolate din sursa de date IceCream este modificată. |
| Patch( IceCream, Defaults( IceCream ), { Aroma: "Capsuni" } ) | Creează o înregistrare în sursa de date Înghețată:
|
{ ID: 3, Aromă: "Căpșună", Cantitate: 0 } Este creată intrarea Strawberry în sursa de date IceCream . |
După ce formulele anterioare sunt evaluate, sursa de date se încheie cu următoarele valori:
Îmbinați înregistrările (în afara unei surse de date)
| Formula | Description | Result |
|---|---|---|
| Patch( { Nume: "James", Scor: 90 }, { Nume: "Jim", Trecut: true } ) | Îmbină două înregistrări în afara unei surse de date:
|
{ Nume: "Jim", Scor: 90, Trecut: true } |
Modifică sau creează un set de înregistrări (într-o sursă de date)
Când folosești Patch cu tabele în loc de înregistrări individuale, poți crea sau modifica mai multe înregistrări într-un singur apel. Valoarea de returnare este un tabel de înregistrări care corespunde unu-la-unu tabelelor de intrare.
Acest exemplu actualizează Cantitatea pentru mai multe arome în sursa de date IceCream simultan:
Patch(
IceCream,
Table(
{ ID: 1, Flavor: "Chocolate", Quantity: 150 },
{ ID: 2, Flavor: "Vanilla", Quantity: 200 }
),
Table(
{ Quantity: 300 },
{ Quantity: 400 }
)
)
Rezultatul este un tabel cu înregistrările actualizate: { ID: 1, Flavor: "Chocolate", Quantity: 300 } și { ID: 2, Flavor: "Vanilla", Quantity: 400 }.
Acest exemplu creează mai multe înregistrări noi folosind Defaults:
Patch(
IceCream,
Table( Defaults( IceCream ), Defaults( IceCream ) ),
Table(
{ Flavor: "Mint", Quantity: 60 },
{ Flavor: "Peach", Quantity: 80 }
)
)
Note
Când folosești Patch cu tabele, numărul de înregistrări din fiecare tabel de modificare trebuie să corespundă cu numărul de înregistrări din tabelul de bază. Altfel, apare o eroare.
Pentru a detecta erorile când modifici mai multe înregistrări, folosește IfError.
IfError este mecanismul preferat și funcționează între gazdele Power Fx:
IfError(
Patch(
IceCream,
baseRecords,
changeRecords
),
Notify( "Some records failed to update: " & FirstError.Message, NotificationType.Error )
)
Patch cu tipurile de coloane Dataverse
Următoarele exemple se aplică în mod specific surselor de date Microsoft Dataverse. Formele înregistrărilor variază în funcție de sursa datelor (de exemplu, SharePoint și SQL Server au formate diferite).
Rubrica de alegere: Pentru a seta o coloană Choice, folosește direct valoarea enum. Acest exemplu setează o coloană de alegere a Statutului într-un tabel Conturi :
Patch(
Accounts,
LookUp( Accounts, 'Account Name' = "Contoso" ),
{ 'Status': 'Status (Accounts)'.Active }
)
Coloana de căutare: Pentru a seta o coloană Lookup, furnizați o înregistrare cu cheia principală a tabelului asociat. Acest exemplu setează căutarea Primary Contact pe o înregistrare Account :
Patch(
Accounts,
LookUp( Accounts, 'Account Name' = "Contoso" ),
{ 'Primary Contact': LookUp( Contacts, 'Full Name' = "John Smith" ) }
)
Note
Aceste exemple de tip coloană sunt specifice Dataverse-ului. Alte surse de date, cum ar fi SharePoint sau SQL Server, pot necesita forme diferite ale înregistrărilor pentru tipuri similare de coloane. Consultă documentația pentru sursa ta de date specifică pentru formatul corect.
Delegarea în formulele care folosesc Patch
Funcția Patch în sine nu este supusă delegării pentru că scrie în sursa de date, nu o interoghează. Totuși, avertismentele de delegare pot apărea în formulele care folosesc Patch dacă partea de selecție a înregistrărilor a formulei (cum ar fi Filter, LookUp sau ForAll) implică o interogare care depășește limitele de delegare a sursei de date.
Când vezi un avertisment de delegare într-o formulă care include Patch, verifică dacă avertismentul se aplică funcțiilor de recuperare a datelor și nu ei Patch însăși. Pentru mai multe informații despre delegare, vezi Înțelegerea delegării într-o aplicație canvas.
Erori comune cu funcția Patch
Când folosești funcția Patch , pot apărea erori din cauza conectivității sursei de date, permisiunilor sau conflictelor de date. Folosește IfError și IsError pentru a detecta erorile și a răspunde corespunzător.
"Eroare de rețea la folosirea Patch funcției": Această eroare indică de obicei că aplicația nu poate ajunge la sursa de date. Cauzele comune includ pierderea conexiunii la internet, sursa de date care este temporar indisponibilă sau permisiuni insuficiente pentru utilizatorul actual. Înfășoară apelul Patch în IfError pentru a oferi utilizatorilor un mesaj semnificativ.
"Există conflicte cu modificările de pe server": Această eroare apare atunci când un alt utilizator sau proces modifică aceeași înregistrare între momentul în care aplicația ta citește înregistrarea și scrie modificarea. Reîmprospătează sursa de date apelând funcția Refresh și încearcă din nou operația.
Erori de permisiune: Dacă utilizatorul nu are permisiunea de a crea sau modifica înregistrări în sursa de date, apelul Patch eșuează. Folosește IfError pentru a detecta erorile legate de permisiuni și pentru a ghida utilizatorul.
Pentru modele generale de gestionare a erorilor, vezi Gestionarea erorilor.
Utilizarea de As sau ThisRecord
Folosește cuvintele cheie As sau ThisRecord din formula ta pentru a evita contextul ambiguu al evaluării.
În exemplul următor, considerăm primul Lookup din If afirmație.
(OrderID = A[@OrderID])se așteaptă să compare în LookupOrderId domeniu cu OrderId colecția A din ForAll domeniul de aplicare. În acest caz, probabil vrei A[@OrderId] să rezolvi ca un parametru local. Dar este ambiguu.
Power Apps interpretează în prezent atât partea stângă OrderId, cât și partea dreaptă A[@OrderId] ca un câmp în domeniul Lookup. Prin urmare, Lookup găsește întotdeauna primul rând în [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, folosiți operatorul As sau cuvântul cheie ThisRecord pentru a clarifica partea din stânga. Așa cum este recomandat pentru scenariul precedent.
Când formula ta folosește mai multe scopuri cu ForAll, Filter, și Lookup pe aceeași sursă de date sau tabel, parametrii de scop pot intra în coliziune cu același câmp în altă parte. Prin urmare, folosiți operatorul As sau ThisRecord pentru a rezolva numele câmpului și a evita ambiguitatea.
De exemplu, poți folosi operatorul As pentru a dezambiguiza în exemplul următor.
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 Operators .