funktion Patch

Gäller för: Arbetsyteappar Copilot Studio Desktop-flöden Modelldrivna appar Power Platform CLI Dataverse-funktioner

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

Patch Använd funktionen för att ändra poster i komplexa situationer, till exempel när du gör uppdateringar som inte kräver någon användarinteraktion 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å den här videon om du vill lära dig hur du Patch använder funktionen:

Overview

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

Patch( Customers, LookUp( 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" } )

Note

När du patchar en samling genom att använda en post från en datakälla med standardvärden, uppdaterar patchoperationen samlingen med både de angivna patchvärdena och standardvärdena från datakällan. DataSource för patchsatsen och DataSource för funktionen Defaults måste matcha för att skapa en ny post.

Även om du inte arbetar med en datakälla kan du använda Patch för 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" } )

Description

Ä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:

  • För att ändra en post måste basposten komma från en datakälla. Du kan få basposten via ett galleris egenskap Items , placera den i en kontextvariabel eller hämta den via någon annan väg. Men du måste kunna spåra basposten tillbaka till datakällan. Detta krav är viktigt eftersom handlingen innehåller extra information som hjälper dig att hitta den igen för redigering.
  • 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 Patch för är den post som du ändrade eller skapade. Om du har skapat en post kan returvärdet innehålla egenskaper som datakällan genererade 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'

När du uppdaterar en datakälla kan ett eller flera problem uppstå. Använd IfError och IsError med returvärdet från Patch för att identifiera och svara på fel, som felhantering beskriver. 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

Du kan också använda Patch den för att skapa eller ändra flera poster med ett enda samtal.

Istället för att skicka en enda baspost, tillhandahåll en tabell över basposter i det andra argumentet. Ange även ändringsposter i en tabell, som motsvarar en-till-en 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 en-till-en med bas- och ändringsposten.

Sammanslagning av poster utanför en datakälla

Ange två eller flera poster som du vill sammanfoga. Funktionen bearbetar poster i ordning från början av argumentlistan till slut, där senare egenskapsvärden går före tidigare.

Patch returnerar den sammanfogade 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 – Obligatoriskt. Posten som ska ändras eller skapas. Om posten kommer från en datakälla hittar och modifierar funktionen posten. Om resultatet av Defaults används skapar funktionen en post. DataKällan för korrigeringsinstrukmentet och DataSource för funktionen Defaults måste matcha för att skapa en ny post.
  • ChangeRecords – Obligatoriskt. En eller flera poster som innehåller egenskaper som ska ändras i BaseRecord. Funktionen bearbetar ändringar i ordning från början av argumentlistan till slutet, där senare egenskapsvärden går före tidigare.

Ä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 – Obligatoriskt. En tabell med poster som ska ändras eller skapas. Om posten kommer från en datakälla hittar och modifierar funktionen posten. Om resultatet av Defaults används skapar funktionen en post. DataKällan för korrigeringsinstrukmentet och DataSource för funktionen Defaults måste matcha för att skapa en ny post.
  • ChangeRecordTables – Obligatoriskt. En eller flera tabeller med poster som innehåller egenskaper som ska ändras för varje post i BaseRecordTable. Funktionen bearbetar ändringar i ordning från början av argumentlistan till slutet, där senare egenskapsvärden går före tidigare.

Merge records

Patch( Record1, Record2 [, ...] )

  • Poster – obligatoriskt. Minst två poster som du vill sammanfoga. Funktionen behandlar poster i ordning från början av argumentlistan till slutet, där senare egenskapsvärden går före tidigare.

Examples

Ändra eller skapa en post i en datakälla

I dessa exempel ändrar eller skapar du en post i en datakälla som heter IceCream. Datakällan innehåller datan i denna tabell och genererar automatiskt värdena i ID-kolumnen:

Skärmdump av exempeltabellen för IceCream-datakällan som visar smaker och mängder.

För att skapa en minnesversion av denna datakälla så att du kan prova dessa exempel, utvärdera denna formel:

ClearCollect( IceCream,
    { ID: 1, Flavor: "Chocolate", Quantity: 100 },
    { ID: 2, Flavor: "Vanilla", Quantity: 200 }
)
Formula Description Result
Patch( Glass,
LookUp( glass, smak = "choklad" ), { mängd: 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, Smak: "Choklad", Kvantitet: 400 }

Chokladposten i Glass-datakällan är modifierad.
Patch( Glass, standard( Glass ), { Smak: "Jordgubb" } ) 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, Smak: "Jordgubb", Mängd: 0 }

Jordgubbsposten i IceCream-datakällan skapas.

Efter att de tidigare formlerna har utvärderats slutar datakällan med dessa värden:

Skärmdump av IceCream-datakällan efter Patch att formlerna har utvärderats.

Sammanslagning av poster utanför en datakälla

Formula Description Result
Patch( { Namn: "James", Poäng: 90 }, { Namn: "Jim", Godkänd: 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).
{ Namn: "Jim", Poäng: 90, Godkänd: true }

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

När du använder Patch tabeller istället för enskilda poster kan du skapa eller ändra flera poster i ett enda anrop. Returvärdet är en tabell med poster som motsvarar en-till-en med indatatabellerna.

Detta exempel uppdaterar kvantiteten för flera smaker i Glass-datakällan samtidigt:

Patch(
    IceCream,
    Table(
        { ID: 1, Flavor: "Chocolate", Quantity: 150 },
        { ID: 2, Flavor: "Vanilla", Quantity: 200 }
    ),
    Table(
        { Quantity: 300 },
        { Quantity: 400 }
    )
)

Resultatet är en tabell med de uppdaterade posterna: { ID: 1, Flavor: "Chocolate", Quantity: 300 } och { ID: 2, Flavor: "Vanilla", Quantity: 400 }.

Detta exempel skapar flera nya poster med hjälp av Defaults:

Patch(
    IceCream,
    Table( Defaults( IceCream ), Defaults( IceCream ) ),
    Table(
        { Flavor: "Mint", Quantity: 60 },
        { Flavor: "Peach", Quantity: 80 }
    )
)

Note

När du använder Patch med tabeller måste antalet poster i varje ändringstabell matcha antalet poster i bastabellen. Annars uppstår ett fel.

För att upptäcka fel när du ändrar flera poster, använd IfError. IfError är den föredragna mekanismen och fungerar över Power Fx-värdar:

IfError(
    Patch(
        IceCream,
        baseRecords,
        changeRecords
    ),
    Notify( "Some records failed to update: " & FirstError.Message, NotificationType.Error )
)

Patch med Dataverse-kolumntyper

Följande exempel gäller specifikt Microsoft Dataverse datakällor. Postformer varierar beroende på datakälla (till exempel har SharePoint och SQL Server olika format).

Choice-kolumnen: För att sätta en Choice-kolumn, använd enumvärdet direkt. Detta exempel sätter en kolumn för Statusval i en tabell för konton:

Patch(
    Accounts,
    LookUp( Accounts, 'Account Name' = "Contoso" ),
    { 'Status': 'Status (Accounts)'.Active }
)

Uppslagskolumn: För att sätta en uppslagskolumn, ange en post med primärnyckeln för den relaterade tabellen. Detta exempel sätter primärkontaktens uppslagning på en kontopost :

Patch(
    Accounts,
    LookUp( Accounts, 'Account Name' = "Contoso" ),
    { 'Primary Contact': LookUp( Contacts, 'Full Name' = "John Smith" ) }
)

Note

Dessa kolumntypexempel är Dataverse-specifika. Andra datakällor, såsom SharePoint eller SQL Server, kan kräva olika postformer för liknande kolumntyper. Se dokumentationen för din specifika datakälla för rätt format.

Delegering i formler som använder Patch

Funktionen i sig Patch är inte föremål för delegering eftersom den skriver till datakällan istället för att förfråga. Dock kan delegeringsvarningar förekomma i formler som används Patch om postvalsdelen av formeln (såsom Filter, LookUp eller ForAll) involverar en fråga som överskrider gränserna för delegering av datakällor.

När du ser en delegeringsvarning i en formel som inkluderar Patch, kontrollera om varningen gäller för datahämtningsfunktionerna snarare än för Patch sig själv. För mer information om delegering, se Förstå delegering i en canvas-app.

Vanliga fel med Patch funktionen

När du använder Patch funktionen kan fel uppstå på grund av datakällans anslutning, behörigheter eller datakonflikter. Använd IfError och IsError för att upptäcka fel och svara på rätt sätt.

  • "Nätverksfel vid användning Patch av funktion": Detta fel indikerar vanligtvis att appen inte kan nå datakällan. Vanliga orsaker är en förlorad internetanslutning, att datakällan tillfälligt är otillgänglig eller otillräckliga behörigheter för den nuvarande användaren. Slå in samtalet Patch i IfError för att ge ett meningsfullt meddelande till användarna.

  • "Konflikter finns med ändringar på servern": Detta fel uppstår när en annan användare eller process ändrar samma post mellan det att din app läser posten och skriver ändringen. Uppdatera datakällan genom att anropa Refresh-funktionen och försök om operationen.

  • Behörighetsfel: Om användaren inte har behörighet att skapa eller ändra poster i datakällan misslyckas anropet Patch . Använd IfError för att upptäcka behörighetsrelaterade fel och vägleda användaren.

För allmänna felhanteringsmönster, se Felhantering.

Användning av Som eller ThisRecord

Använd nyckelorden As eller ThisRecord i din formel för att undvika oklar utvärderingskontext.

I följande exempel, betrakta det första Lookup i påståendet If . (OrderID = A[@OrderID]) förväntas jämföra OrderId i omfattningen Lookup med OrderId samlingen A av ForAll i omfattningen. I det här fallet vill A[@OrderId] du troligen lösa som en lokal parameter. Men det är tvetydigt.

Power Apps tolkar för närvarande både vänstersidan OrderId och högersidan A[@OrderId] som ett fält i Lookup-scopet. Därför Lookup hittar alltid den första raden i [dbo].[Orders1] eftersom villkoret alltid är sant (det vill säga, varje rad 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

Använd när det är möjligt, operatorn As eller nyckelordet ThisRecord för att särskilja vänstersidan. Som rekommenderas för det föregående scenariot.

När din formel använder flera scopes med ForAll, Filter, och Lookup på samma datakälla eller tabell, kan scope-parametrar kollidera med samma fält någon annanstans. Använd därför operatorn As eller ThisRecord för att lösa fältnamnet och undvika tvetydighet.

Till exempel kan du använda operatorn As för att särskilja i följande exempel.

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

För att lära dig mer om användningen av operatorn As och ThisRecord, se artikeln Operators .