Funkcja Patch

Dotyczy: Aplikacje kanwy Aplikacje oparte na modelu Power Platform CLI

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

Funkcji Patch można także użyć do utworzenia lub zmodyfikowania wielu rekordów za pomocą jednego wywołania.

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.

Funkcja Patch zwraca scalony rekord i nie modyfikuje jego argumentów ani rekordów w żadnym źródle danych.

Składnia

Modyfikowanie lub tworzenie rekordu w źródle danych

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

  • DataSource – wymagane. Źródło danych, które zawiera rekord przeznaczony do modyfikacji lub będzie zawierać rekord do utworzenia.
  • BaseRecord – 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.
  • ChangeRecord(s) – 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

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

  • DataSource – 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.
  • ChangeRecordTable(s) – 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

Patch( Rekord1, Rekord2 [, …] )

  • Rekord(y) – 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:

Przykład icecream.

Formuła opis Result
Patch( IceCream,
LookUp( IceCream, Flavor = "Chocolate" ), { Quantity: 400 } )
Modyfikuje rekord w źródle danych IceCream:
  • Kolumna ID rekordu przeznaczonego do modyfikacji zawiera wartość 1. (Rekord Chocolate ma ten identyfikator ID).
  • Wartość w kolumnie Quantity ulega zmianie na 400.
{ ID: 1, Flavor: "Chocolate", Quantity: 400 }

Wpis Chocolate w źródle danych IceCream został zmodyfikowany.
Patch( IceCream, Defaults( IceCream ), { Flavor: "Strawberry" } ) Tworzy rekord w źródle danych IceCream:
  • Kolumna ID zawiera wartość 3, którą źródło danych generuje automatycznie.
  • Kolumna Quantity zawiera liczbę 0, która jest wartością domyślną dla tej kolumny w źródle danych IceCream, co określa funkcja Defaults.
  • Kolumna Flavor zawiera wartość Strawberry.
{ 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:

Przykład po Icecream.

Scalanie rekordów poza źródłem danych

Formuła Opis Wynik
Patch( { Name: "James", Score: 90 }, { Name: "Jim", Passed: true } ) Scala dwa rekordy poza źródłem danych:
  • Wartości w kolumnie Name poszczególnych rekordów nie są zgodne. Wynik zawiera wartość (Jim) z rekordu, który jest bliżej końca listy argumentów, zamiast wartości (James) z rekordu, który jest bliżej początku.
  • Pierwszy rekord zawiera kolumnę (Score), która nie istnieje w drugim rekordzie. Wynik zawiera tę kolumnę z jej wartością (90).
  • Drugi rekord zawiera kolumnę (Passed), która nie istnieje w pierwszym rekordzie. Wynik zawiera tę kolumnę z jej wartością (true).
{ 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. Oczekuje się, że (OrderID = A[@OrderID]) porówna OrderId w zakresie wyszukiwania z OrderId kolekcji 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ę. Jako zgodnie z zaleceniem opisanym 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.