Udostępnij przez


Funkcja Patch

Dotyczy: Aplikacje kanwy Copilot Studio Desktop przepływy oparte na modelu Aplikacje oparte na modelu Funkcje interfejsu wiersza polecenia platformy Power Platform

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.

Funkcja służy do modyfikowania Patch rekordów w złożonych sytuacjach, takich jak w przypadku aktualizacji, które nie wymagają interakcji użytkownika lub używają 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 wideo, aby dowiedzieć się, jak używać Patch funkcji:

Omówienie

Patch Użyj funkcji , aby zmodyfikować co najmniej jeden rekord ź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, LookUp( Customers, Name = "Contoso" ), { Phone: "1-212-555-1234" } )

Użyj Patch funkcji Defaults, aby utworzyć rekordy . 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" } )

Uwaga / Notatka

W przypadku stosowania poprawek kolekcji przy użyciu rekordu ze źródła danych z wartościami domyślnymi operacja stosowania poprawek aktualizuje kolekcję przy użyciu zarówno określonych wartości poprawek, jak i wartości domyślnych ze źródła danych. Źródło danych instrukcji patch i źródło danych funkcji Defaults muszą być zgodne w celu utworzenia nowego rekordu.

Nawet jeśli nie pracujesz ze źródłem danych, możesz użyć Patch polecenia , aby scalić co najmniej dwa rekordy. 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 podstawowy mógł przechodzić przez właściwość Items galerii, został umieszczony w zmiennej kontekstowej lub przechodzi przez inną ścieżkę. Jednak istnieje możliwość prześledzenia rekordu bazowego do źródła danych. Jest to ważne, ponieważ rekord zawiera dodatkowe informacje ułatwiające ponowne znalezienie rekordu do 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.

Zwracana wartość Patch to rekord, który został zmodyfikowany lub utworzony. Jeśli utworzono rekord, wartość zwracana 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'

Podczas aktualizowania źródła danych może wystąpić co najmniej jeden problem. Użyj funkcji IfError i IsError z wartością zwracaną z Patch , aby wykryć błędy i reagować na nie, zgodnie z opisem obsługi 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żna również użyć do tworzenia lub modyfikowania 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.

W przypadku użycia Patch w ten sposób wartość zwracana jest również tabelą z każdym rekordem odpowiadającym jeden dla jednego z rekordami podstawowymi i zmień rekordy.

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 argumentów ani rekordów w żadnych źródłach danych.

Składnia

Modyfikowanie lub tworzenie rekordu w źródle danych

Patch( Źródło danych, BaseRecord, ChangeRecord1 [, ChangeRecord2, ... ])

  • DataSource – 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. Źródło danych instrukcji patch i źródło danych funkcji Defaults muszą być zgodne w celu utworzenia nowego rekordu.
  • 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

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. Źródło danych instrukcji patch i źródło danych funkcji Defaults muszą być zgodne w celu utworzenia nowego rekordu.
  • 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

Patch( 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:

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 Result
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. (OrderID = A[@OrderID]) Oczekuje się, że porówna OrderId zakres 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.