Funkcja Patch
Dotyczy: Aplikacje kanwy Aplikacje oparte na modelu Interfejs Power Platform wiersza polecenia Przepływy pulpitu
Służy do modyfikowania i tworzenia co najmniej jednego rekordu w źródle danych, a także do scalania rekordów poza źródłem danych.
Za pomocą funkcji Patch można modyfikować rekordy w złożonych sytuacjach, takich jak wykonywanie aktualizacji, które nie wymagają interakcji z użytkownikiem, albo w przypadku używania formularzy obejmujących wiele ekranów.
Aby ułatwić aktualizowanie rekordów w źródle danych w celu ich uproszczonych zmian, należy zamiast tego programu użyć formantu Edit form. Dodanie kontrolki Edit form powoduje, że użytkownicy otrzymują formularz do wypełnienia, a następnie zmiany zapisywane są w źródle danych. Aby uzyskać więcej informacji, zobacz Omówienie formularzy danych.
Obejrzyj ten film, aby dowiedzieć się, jak używać funkcji Patch:
Omówienie
Funkcja Patch służy do modyfikowania co najmniej jednego rekordu źródła danych. Wartości konkretnych pól są modyfikowane bez wpływu na inne właściwości. Na przykład poniższa formuła zmienia numer telefonu klienta o nazwie Contoso:
Patch( Customers, First( Filter( Customers, Name = "Contoso" ) ), { Phone: "1-212-555-1234" } )
Użycie funkcji Patch z funkcją Defaults umożliwia tworzenie rekordów. Za pomocą takiego połączenia można zbudować pojedynczy ekran przeznaczony do tworzenia i edycji rekordów. Na przykład poniższa formuła tworzy rekord dla klienta o nazwie Contoso:
Patch( Customers, Defaults( Customers ), { Name: "Contoso" } )
Nawet jeśli nie pracujesz ze źródłem danych, możesz użyć funkcji Patch do scalenia co najmniej dwóch rekordów. Na przykład następująca formuła scala dwa rekordy w jeden rekord, który identyfikuje zarówno numer telefonu, jak i lokalizację dla klienta Contoso:
Patch( { Name: "Contoso", Phone: "1-212-555-1234" }, { Name: "Contoso", Location: "Midtown" } )
Opis
Modyfikowanie lub tworzenie rekordu w źródle danych
Aby użyć tej funkcji ze źródłem danych, należy wskazać źródło danych, a następnie określić rekord bazowy:
- Jeśli wymagane jest zmodyfikowanie rekordu, rekord bazowy musi pochodzić ze źródła danych. Rekord bazowy może pochodzić z właściwości Items galerii, mógł zostać umieszczony w zmiennej kontekstowej albo może pochodzić z innej ścieżki. Jednak istnieje możliwość prześledzenia rekordu bazowego do źródła danych. Jest to istotne, ponieważ rekord zawiera dodatkowe informacje ułatwiające ponowne znalezienie rekordu w celu modyfikacji.
- Aby utworzyć rekord, należy użyć funkcji Defaults celem utworzenia rekordu bazowego z wartościami domyślnymi.
Następnie należy określić co najmniej jeden rekord zmiany. Każdy z tych rekordów powinien zawierać nowe wartości właściwości, które przesłonią wartości właściwości w rekordzie bazowym. Rekordy zmian są przetwarzane w kolejności od początku listy argumentów do końca, a późniejsze wartości właściwości przesłaniają wartości wcześniejsze.
Wartością zwracaną funkcji Patch jest zmodyfikowany lub utworzony rekord. Jeśli rekord został utworzony, zwracana wartość może zawierać właściwości wygenerowane automatycznie przez źródło danych. Jednak wartość zwrócona nie zawiera wartości pól tabeli pokrewnej.
Można na przykład użyć funkcji Set(MyAccount, Patch(Accounts, First(Account), 'Account Name': "Example name"));
, a następnie MyAccount.'Primary Contact'.'Full Name'
. W tym przypadku nie może zostać wyświetlona pełna nazwa. Zamiast tego można uzyskać dostęp do pól tabeli pokrewnej, należy użyć oddzielnego wyszukiwania, takiego jak:
LookUp(Accounts, Account = MyAccount.Account).'Primary Contact'.'Full Name'
W przypadku aktualizacji źródła danych może wystąpić co najmniej jeden problem. Użyj funkcji IfError i IsError z wartością zwrotną z funkcji Patch, aby wykrywać błędy i reagować na nie zgodnie z częścią Obsługa błędów. Możesz również użyć funkcji Errors do zidentyfikowania i zbadania błędów zgodnie z częścią Praca ze źródłami danych.
Do funkcji powiązanych należy Update, która umożliwia zastąpienie całego rekordu, a także funkcja Collect, której można użyć w celu utworzenia rekordu. Użyj funkcji UpdateIf można zmodyfikować konkretne właściwości wielu rekordów na podstawie warunku.
Modyfikowanie lub tworzenie zbioru rekordów w źródle danych
Patch może być również używany do tworzenia lub modyfikowania wielu rekordów za pomocą jednego połączenia.
Zamiast przekazywać pojedynczy rekord bazowy, w drugim argumencie można udostępnić tabelę rekordów bazowych. Rekordy zmian również są przekazywane w tabeli, przy czym każdemu rekordowi bazowemu musi odpowiadać jeden rekord zmiany. Liczba rekordów w każdej tabeli zmian musi być taka sama jak liczba rekordów w tabeli bazowej.
Gdy funkcja Patch jest używana w ten sposób, wartość zwracana jest także tabelą, której każdy rekord odpowiada jednemu rekordowi bazowemu i rekordowi zmiany.
Scalanie rekordów poza źródłem danych
Określ co najmniej dwa rekordy, które chcesz scalić. Rekordy są przetwarzane w kolejności od początku listy argumentów do końca, a późniejsze wartości właściwości przesłaniają wartości wcześniejsze.
Patch zwraca scalony rekord i nie modyfikuje jego argumentów ani rekordów w żadnych źródłach danych.
Składnia
Modyfikowanie lub tworzenie rekordu w źródle danych
Poprawka(DataSource,BaseRecord,ChangeRecord1 [, ChangeRecord2 , ... ])
- Źródło danych– wymagane. Źródło danych, które zawiera rekord przeznaczony do modyfikacji lub będzie zawierać rekord do utworzenia.
- Rekord podstawowy– wymagane. Rekord, który zostanie zmodyfikowany lub utworzony. Jeśli rekord pochodzi ze źródła danych, zostanie on znaleziony i zmodyfikowany. Jeśli zostanie użyty wynik funkcji Defaults, rekord zostanie utworzony.
- ChangeRecords – Wymagane. Co najmniej jeden rekord, który zawiera właściwości przeznaczone do zmodyfikowania w RekordzieBazowym. Rekordy zmian są przetwarzane w kolejności od początku listy argumentów do końca, a późniejsze wartości właściwości przesłaniają wartości wcześniejsze.
Modyfikowanie lub tworzenie zbioru rekordów w źródle danych
Poprawka(DataSource,BaseRecordsTable,ChangeRecordTable1 [, ChangeRecordTable2 , ... ] )
- Źródło danych– wymagane. Źródło danych, które zawiera rekordy przeznaczone do modyfikacji lub będzie zawierać rekordy do utworzenia.
- BaseRecordTable – Wymagane. Tabela rekordów przeznaczonych do zmodyfikowania lub utworzenia. Jeśli rekord pochodzi ze źródła danych, zostanie on znaleziony i zmodyfikowany. Jeśli zostanie użyty wynik funkcji Defaults, rekord zostanie utworzony.
- ChangeRecordTables – Wymagane. Co najmniej jedna tabela rekordów, która zawiera właściwości przeznaczone do zmodyfikowania dla każdego rekordu z tabeli TabelaRekordówBazowych. Rekordy zmian są przetwarzane w kolejności od początku listy argumentów do końca, a późniejsze wartości właściwości przesłaniają wartości wcześniejsze.
Scalanie rekordów
Łatka( Rekord1,Rekord2 [, ...] )
- Zapisy - Wymagane. Co najmniej dwa rekordy przeznaczone do scalenia. Rekordy są przetwarzane w kolejności od początku listy argumentów do końca, a późniejsze wartości właściwości przesłaniają wartości wcześniejsze.
Przykłady
Modyfikowanie lub tworzenie rekordu w źródle danych
Te przykłady przedstawiają modyfikowanie lub tworzenie rekordu w źródle danych o nazwie IceCream, które zawiera dane w tej tabeli i automatycznie generuje wartości w IDkolumnie ID:
Formuła | opis | Result |
---|---|---|
Łatka( Lody, LookUp( IceCream, Flavor = "Chocolate" ), { Quantity: 400 } ) |
Modyfikuje rekord w źródle danych IceCream:
|
{ ID: 1, Flavor: "Chocolate", Quantity: 400 } Wpis Chocolate w źródle danych IceCream został zmodyfikowany. |
Łatka( Lody, Domyślne( Lody ), { Smak: "Truskawka") } | Tworzy rekord w źródle danych IceCream:
|
{ ID: 3, Flavor: "Strawberry", Quantity: 0 } Wpis Strawberry w źródle danych IceCream został utworzony. |
Gdy poprzednie formuły zostaną poddane ocenie, źródło danych będzie zawierało następujące wartości:
Scalanie rekordów poza źródłem danych
Formuła | Opis | Wynik |
---|---|---|
Patch( { Imię: "James", Wynik: 90 }, { Imię: "Jim", Passed: true } ) | Scala dwa rekordy poza źródłem danych:
|
{ Name: "Jim", Score: 90, Passed: true } |
Użycie funkcji Jako lub ThisRecord
Użycie słowa kluczowego Jako w formule ThisRecord umożliwia uniknięcie niejednoznacznego kontekstu oceny.
W poniższym przykładzie Weź pod uwagę pierwsze wyszukiwanie w instrukcji If
. (OrderID = A[@OrderID])
Oczekuje się, że porówna zakres OrderId
wyszukiwania z OrderId
kolekcją A
w zakresie. ForAll
W tym przypadku może A[@OrderId]
być konieczne rozpoznanie jako parametr lokalny. Jednak jest niejednoznaczny.
Power Apps obecnie interpretuje zarówno po lewej stronie OrderId
, jak i po prawej stronie A[@OrderId]
jako pole w zakresie wyszukiwania. Dlatego wyszukiwanie zawsze znajdzie pierwszy wiersz w [dbo].[Orders1]
, ponieważ warunek jest zawsze prawdziwy (to znaczy, że OrderId
każdego wiersza jest sobie równe).
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"
}
)
)
)
Użycie Jako lub ThisRecord
Jeśli jest to możliwe, można użyć operatora Jako lub ThisRecord, aby odróżnić lewą stronę. Zgodnie z zaleceniami w powyższym scenariuszu.
Jeśli w formule zastosowano wiele zakresów za pomocą funkcji ForAll
, Filter
i Lookup
na tym samym źródło danych lub tabeli, parametry zakresu mogą kolidują z tym samym polem w innym miejscu. Z tego względu zaleca się użycie operatora Jako lub ThisRecord w celu rozpoznawania nazwy pola i unikania wieloznaczności.
Za pomocą operatora Jako można na przykład odróżnić poniższy przykład.
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"
}
)
)
)
Alternatywnie można korzystać z programu ThisRecord w tym samym celu.
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"
}
)
)
)
Aby dowiedzieć się więcej o korzystaniu z operatora Jako i ThisRecord zobacz artykuł Operatory.