Patch-funktion

Gäller: Arbetsyteappar Modellbaserade appar Power Platform CLI datorflöden

Ändrar eller skapar en eller flera poster i en datakälla, eller sammanfogar poster utanför en datakälla.

Använd funktionen Patch för att ändra poster i komplexa situationer, till exempel när du utför uppdateringar som inte kräver användaråtgärder eller använder formulär som sträcker sig över flera skärmar.

Om du vill uppdatera poster i en datakälla enklare att göra enklare ändringar kan du använda kontrollen Edit form istället. När du lägger till kontrollen Redigeringsformulär ger du användarna ett formulär som de kan fylla i för att spara ändringarna till en datakälla. För mer information se Understand data forms (Förstå dataformulär).

Titta på det här videoklippet och lär dig hur du använder Patch-funktionen:

Översikt

Använd funktionen Patch för att ändra en eller flera poster i en datakälla. Värdena för specifika fält ändras utan att påverka andra egenskaper. Den här formeln ändrar till exempel telefonnumret för en kund med namnet Contoso:

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

Använd Patch med funktionen Defaults för att skapa poster. Du kan använda den här metoden för att skapa en enda skärm som både skapar och redigerar poster. Den här formeln skapar en post för en kund med namnet Contoso:

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

Även om du inte arbetar med en datakälla kan du använda Patch till att sammanfoga två eller flera poster. Den här formeln sammanfogar till exempel två poster i en som identifierar både telefonnumret och platsen för Contoso:

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

Beskrivning

Ändra eller skapa en post i en datakälla

Använd den här funktionen med en datakälla, ange datakällan och sedan en baspost:

  • Om du vill ändra en post måste basposten komma från en datakälla. Basposten har kanske kommit via galleriegenskapen Items, har placerats i en sammanhangsvariabel, eller kommit via någon annan sökväg. Men du bör kunna spåra basposten tillbaka till datakällan. Detta är viktigt eftersom posten innehåller ytterligare information för att kunna hitta posten igen vid ändringar.
  • Skapa en post genom att använda funktionen Defaults för att skapa en baspost med standardvärden.

Ange sedan en eller flera ändringsposter, där var och en innehåller nya egenskapsvärden som åsidosätter egenskapsvärden i basposten. Ändringsposter bearbetas i ordning från argumentlistans början till slutet, där senare egenskapsvärden åsidosätter tidigare värden.

Returvärdet för Patch är den post som du har ändrat eller skapat. Om du har skapat en post kan returvärdet innehålla egenskaper som datakällan genererat automatiskt. Returvärdet ger emellertid inte något värde för fält i en relaterad tabell.

Du kan t.ex. Set(MyAccount, Patch(Accounts, First(Account), 'Account Name': "Example name")); . använda och sedan MyAccount.'Primary Contact'.'Full Name'. Du kan inte ge ett fullständigt namn i det här fallet. Om du vill komma åt fälten i en relaterad tabell kan du använda en separat sökning, t.ex. följande:

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

Ett eller flera problem kan uppstå när du uppdaterar en datakälla. Använd IfError och IsError med returvärdet från Patch för att identifiera och svara på fel, i enlighet med vad som beskrivs i Felhantering. Du kan även använda funktionen Fel för att identifiera och undersöka problem, enligt beskrivningen i Arbeta med datakällor.

Relaterade funktioner innefattar funktionen Update som du kan använda för att ersätta en hel post, och funktionen Collect som du kan använda för att skapa en post. Du kan använda funktionen UpdateIf till att ändra egenskaper för flera poster baserat på ett villkor.

Ändra eller skapa en uppsättning poster i en datakälla

Patch kan också användas för att skapa eller ändra flera poster med ett enda anrop.

I stället för att överföra en enda baspost kan en tabell med basposter anges i det andra argumentet. Ändringsposter finns även i en tabell, motsvarande ett-till-ett med basposterna. Antalet poster i varje ändringstabell måste vara samma som antalet poster i bastabellen.

När du använder Patch på detta sätt är returvärdet också en tabell där varje post motsvarar ett-till-ett med bas- och ändringsposterna.

Sammanslagning av poster utanför en datakälla

Ange två eller flera poster som du vill sammanfoga. Poster bearbetas i ordning från argumentlistans början till slutet, där senare egenskapsvärden åsidosätter tidigare värden.

Patch returnerar den sammanslagna posten och ändrar inte dess argument eller poster i några datakällor.

Syntax

Ändra eller skapa en post i en datakälla

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

  • DataSource – Krävs. Datakällan som innehåller den post som du vill ändra, eller som kommer att innehålla den post som du vill skapa.
  • BaseRecord – Krävs. Posten som ska ändras eller skapas. Om posten kom från en datakälla hittas posten och ändras. Om resultatet av Defaults används, skapas en post.
  • ChangeRecord(s) – Krävs. En eller flera poster som innehåller egenskaper som ska ändras i BaseRecord. Ändringsposter bearbetas i ordning från argumentlistans början till slutet, där senare egenskapsvärden åsidosätter tidigare värden.

Ändra eller skapa en uppsättning poster i en datakälla

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

  • DataSource – Krävs. Datakällan som innehåller de poster som du vill ändra, eller som kommer att innehålla de poster som du vill skapa.
  • BaseRecordTable – Krävs. En tabell med poster som ska ändras eller skapas. Om posten kom från en datakälla hittas posten och ändras. Om resultatet av Defaults används, skapas en post.
  • ChangeRecordTable(s) – Krävs. En eller flera tabeller med poster som innehåller egenskaper som ska ändras för varje post i BaseRecordTable. Ändringsposter bearbetas i ordning från argumentlistans början till slutet, där senare egenskapsvärden åsidosätter tidigare värden.

Koppla poster

Patch( Record1, Record2 [, …] )

  • Record(s) – Krävs. Minst två poster som du vill sammanfoga. Poster bearbetas i ordning från argumentlistans början till slutet, där senare egenskapsvärden åsidosätter tidigare värden.

Exempel

Ändra eller skapa en post i en datakälla

I det här exemplet ändrar eller skapar du en post i en datakälla med namnet IceCream , som innehåller data i den här tabellen och som automatiskt genererar värdena i ID-kolumnen:

Exempel på icecream.

Formel Description Result
Patch( IceCream,
LookUp( IceCream, Flavor = "Chocolate" ), { Quantity: 400 } )
Ändrar en post i datakällan IceCream:
  • ID-kolumnen i posten som ska ändras innehåller värdet 1. (Posten Chocolate har detta ID.)
  • Värdet i kolumnen Quantity ändras till 400.
{ ID: 1, Flavor: "Chocolate", Quantity: 400 }

Posten Chocolate i datakällan IceCream har ändrats.
Patch( IceCream, Defaults( IceCream ), { Flavor: "Strawberry" } ) Skapar en post i datakällan IceCream:
  • ID-kolumnen innehåller värdet 3, vilket datakällan genererar automatiskt.
  • Kolumnen Quantity innehåller 0, vilket är standardvärdet för kolumnen i datakällan IceCream som funktionen Defaults anger.
  • Kolumnen Flavor innehåller värdet Strawberry.
{ ID: 3, Flavor: "Strawberry", Quantity: 0 }

Posten Strawberry i datakällan IceCream har skapats.

När tidigare formler har utvärderats avslutas datakällan med följande värden:

Exempel-icecream efter.

Sammanslagning av poster utanför en datakälla

Formel Beskrivning Resultat
Patch( { Name: "James", Score: 90 }, { Name: "Jim", Passed: true } ) Sammanfogar två poster utanför en datakälla:
  • Värdena i kolumnen Name för varje post matchar inte. Resultatet innehåller värdet (Jim) i posten vilket är närmare slutet av argumentlistan, i stället för värdet (James) i posten som är närmare början.
  • Den första posten innehåller en kolumn (Score) som inte finns i den andra posten. Resultatet innehåller kolumnen med värdet (90).
  • Den andra posten innehåller en kolumn (Passed) som inte finns i den första posten. Resultatet innehåller kolumnen med värdet (true).
{ Name: "Jim", Score: 90, Passed: true }

Användning av Som eller ThisRecord

Om du använder nyckelordet Som eller ThisRecord i formeln undviker du en tvetydig utvärderingskontext.

I exemplet nedan bör du tänka på det första uppslaget i If-instruktionen. (OrderID = A[@OrderID]) förväntas jämföra OrderId i uppslagsomfånget med OrderId i samlingen A i ForAll-omfånget. I det här fallet vill du troligen att A[@OrderId] ska lösas som en lokal parameter. Men det är tvetydigt.

Power Apps tolkar för närvarande både vänster OrderId och höger A[@OrderId] som ett fält i uppslagsomfånget. Därför hittar uppslag alltid den första raden i [dbo].[Orders1] eftersom villkoret alltid är sant (det vill säga att varje rads OrderId är lika med sig själv).

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

Användning av Som eller ThisRecord

När det är möjligt kan du använda operatören Som eller ThisRecord för att göra vänster sida entydig. Som rekommenderas för ovanstående scenario.

När en formel använder flera omfång med ForAll, Filter och Lookup i samma datakälla eller tabell, kan det hända att omfångsparametrarna kolliderar med samma fält någon annanstans. Därför bör du använda operatören Som eller ThisRecord för att lösa fältnamnet och undvika tvetydighet.

Du kan till exempel använda operatören Som för att skapa entydighet i exemplet nedan.

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

Du kan också använda ThisRecord för samma ändamål.

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

Om du vill veta mer om användningen av operatören Som och ThisRecord läser du artikeln Operatörer.