Funktionen Patch i Power Apps

Redigerer eller opretter en eller flere poster i en datakilde eller fletter poster uden for en datakilde.

Brug funktionen Patch til at redigere poster i komplekse situationer. Når du f.eks. udfører opdateringer, som ikke kræver brugerinteraktion eller brugerformularer, der strækker sig over flere skærme.

Hvis du vil opdatere poster i en datakilde lettere for enkle ændringer, skal du i stedet bruge kontrolelementet Edit Form. Når du tilføjer et Edit form-kontrolelement, kan du give brugerne en formular, som de skal udfylde, og du kan derefter gemme ændringerne i en datakilde. Du kan finde flere oplysninger i Forstå dataformularer.

Se denne video for at få mere at vide om, hvordan du bruger funktionen Patch:

Oversigt

Brug funktionen Patch til at ændre en eller flere poster i en datakilde. Værdierne for specifikke felter ændres uden at påvirke andre egenskaber. Denne formel ændrer f.eks. telefonnummeret til en kunde, der hedder Contoso:

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

Brug Patch sammen med funktionen Defaults for at oprette poster. Brug denne funktionalitet til at opbygge et enkelt skærmbillede, hvor der både kan oprettes og redigeres poster. Denne formel vil f.eks. oprette en post for kunden Contoso:

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

Selvom du ikke arbejder med en datakilde, kan du bruge Patch til at flette to eller flere poster. Denne formel fletter f.eks. to poster til én, der identificerer både telefonnummeret og adressen for Contoso:

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

Beskrivelse

Rediger eller opret en post i en datakilde

Hvis du vil bruge denne funktion med en datakilde, skal du angive datakilden og derefter angive en basispost:

  • Hvis du vil redigere en post, skal basisposten komme fra en datakilde. Basisposten kan komme via et galleris Items-egenskab, den kan være placeret i en kontekstafhængig variabel, eller den kan komme et andet sted fra. Imidlertid kan du til enhver tid spore basisposten tilbage til datakilden. Dette er vigtigt, da posten vil indeholde ekstra oplysninger, der kan hjælpe med at finde posten igen, hvis den skal ændres.
  • Hvis du vil oprette en post, skal du bruge funktionen Defaults til at oprette en basispost med standardværdier.

Angiv derefter en eller flere ændringsposter, der hver indeholder de nye egenskabsværdier, som tilsidesætter egenskabsværdierne i basisposten. Ændringsposter behandles i rækkefølge fra start til slut på argumentlisten, hvor egenskabsværdier sidst på listen tilsidesætter tidligere egenskabsværdier.

Returværdien for Patch er den post, du har ændret eller oprettet. Hvis du har oprettet en post, kan returværdien indeholde egenskaber, som datakilden har genereret automatisk. Returværdien indeholder dog ikke en værdi for felter i en relateret tabel.

Du kan f.eks bruge Set(MyAccount, Patch(Accounts, First(Account), 'Account Name': "Example name")); og derefter MyAccount.'Primary Contact'.'Full Name'. Du kan ikke give et fuldt navn i dette tilfælde. Hvis du i stedet vil have adgang til felterne i en relateret tabel, skal du bruge et separat opslag, f.eks.:

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

Når du opdaterer en datakilde, kan der opstå et eller flere problemer. Brug funktionen Errors til at identificere og undersøge problemer som beskrevet i Arbejd med datakilder.

Relaterede funktioner omfatter funktionen Update, som du kan bruge til at erstatte en hel post, samt funktionen Collect, som du kan bruge til at oprette en post. Brug funktionen UpdateIf til at ændre bestemte egenskaber i flere poster baseret på en betingelse.

Rediger eller opret et sæt af poster i en datakilde

Patch kan også bruges til at oprette eller ændre flere poster med et enkelt kald.

I stedet for at overføre en enkelt basispost kan du angive en tabel med basisposter i det andet argument. Ændringsposterne leveres også i en tabel, som stemmer overens med basisposterne 1-til-1. Antallet af poster i hver ændringstabel skal være det samme som antal poster i basistabellen.

Når du bruger Patch på denne måde, er returværdien også en tabel, hvor hver post svarer direkte til basis- og ændringsposterne.

Flet poster uden for en datakilde

Angiv to eller flere poster, du vil flette. Poster behandles i rækkefølge fra start til slut på argumentlisten, hvor egenskabsværdier sidst på listen tilsidesætter tidligere egenskabsværdier.

Patch returnerer den flettede post uden at ændre dens argumenter eller poster i andre datakilder.

Syntaks

Rediger eller opret en post i en datakilde

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

  • DataSource – påkrævet. Den datakilde, der indeholder den post, du vil redigere eller oprette.
  • BaseRecord – påkrævet. Den post, der skal ændres eller oprettes. Hvis posten stammer fra en datakilde, bliver posten fundet og ændret. Hvis resultatet af Defaults bruges, oprettes der en post.
  • ChangeRecord(s) – påkrævet. En eller flere poster, der indeholder egenskaber, som skal ændres i Basispost. Ændringsposter behandles i rækkefølge fra start til slut på argumentlisten, hvor egenskabsværdier sidst på listen tilsidesætter tidligere egenskabsværdier.

Rediger eller opret et sæt af poster i en datakilde

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

  • DataSource – påkrævet. Den datakilde, som indeholder de poster, du vil redigere eller oprette.
  • BaseRecordTable – påkrævet. En tabel med poster, der skal ændres eller oprettes. Hvis posten stammer fra en datakilde, bliver posten fundet og ændret. Hvis resultatet af Defaults bruges, oprettes der en post.
  • ChangeRecordTable(s) – påkrævet. En eller flere tabeller med poster, som indeholder de egenskaber, der skal ændres for hver post i BaseRecordTable. Ændringsposter behandles i rækkefølge fra start til slut på argumentlisten, hvor egenskabsværdier sidst på listen tilsidesætter tidligere egenskabsværdier.

Flette poster

Patch( Record1, Record2 [, …] )

  • Record(s) – påkrævet. Mindst to poster, du vil flette. Poster behandles i rækkefølge fra start til slut på argumentlisten, hvor egenskabsværdier sidst på listen tilsidesætter tidligere egenskabsværdier.

Eksempler

Rediger eller opret en post (i en datakilde)

I disse eksempler skal du ændre eller oprette en post i en datakilde med navnet IceCream, der indeholder dataene i denne tabel og automatisk genererer værdierne i ID-kolonnen:

Eksempel på IceCream.

Formel Beskrivelse Resultat
Patch( IceCream,
Lookup( IceCream, Flavor = "Chocolate" ), { Quantity: 400 } )
Ændrer en post i datakilden IceCream:
  • Kolonnen ID for den post, der skal ændres, indeholder værdien 1. (Posten Chocolate har det id.)
  • Værdien i kolonnen Quantity ændres til 400.
{ ID: 1, Flavor: "Chocolate", Quantity: 400 }

Posten Chocolate i datakilden IceCream er blevet ændret.
Patch( IceCream, Defaults( IceCream ), { Flavor: "Strawberry" } ) Ændrer en post i datakilden IceCream:
  • Kolonnen ID indeholder værdien 3, som datakilden genererer automatisk.
  • Kolonnen Quantity indeholder 0, som er standardværdien for kolonnen i datakilden IceCream som specificeret med funktionen Defaults.
  • Kolonnen Flavor indeholder værdien Strawberry.
{ ID: 3, Flavor: "Strawberry", Quantity: 0 }

Posten Strawberry i datakilden IceCream er blevet oprettet.

Når de tidligere formularer er blevet evalueret, har datakilden disse værdier:

Eksempel på IceCream efter.

Flet poster (uden for en datakilde)

Formel Beskrivelse Resultat
Patch( { Name: "James", Score: 90 }, { Name: "Jim", Passed: true } ) Fletter to poster uden for en datakilde:
  • Værdierne i kolonnen Name matcher ikke for hver post. Resultatet indeholder værdien (Jim) i den post, der er tættere på slutningen af argumentlisten i stedet for værdien (James) i den post, der er tættere på starten.
  • Den første post indeholder kolonnen (Score), som ikke findes i den anden post. Resultatet indeholder den kolonne med dens værdi (90).
  • Den anden post indeholder en kolonne (Passed), som ikke findes i den første post. Resultatet indeholder den kolonne med den værdi (sand).
{ Name: "Jim", Score: 90, Passed: true }

Brug af As eller ThisRecord

Hvis du bruger nøgleordet As eller ThisRecord i formlen, undgår du en tvetydig evalueringskontekster.

I eksemplet nedenfor skal du overveje det første opslag i If-sætningen. (OrderID = A[@OrderID]) forventes at sammenligne OrderId i opslagsområdet med OrderId for samlingen A i ForAll-området. I dette tilfælde ønsker du sandsynligvis, at A[@OrderId] fortolkes som en lokal parameter. Men det er tvetydigt.

Power Apps fortolker i øjeblikket både OrderId på venstre side og A[@OrderId] på højre side som et felt i opslagsområdet. Opslaget finder derfor altid den første række i [dbo].[Orders1], fordi betingelsen altid er sand (dvs. at OrderId for en hvilken som helst række er lig med sig selv).

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

Brug af As eller ThisRecord

Når det er muligt, skal du bruge operatoren As eller funktionen ThisRecord for at kunne skelne venstre side. As anbefales i ovennævnte scenario.

Når formlen bruger flere områder med ForAll, Filter og Lookup i samme datakilde eller tabel, er det muligt, at områdeparametrene kolliderer med det samme felt et andet sted. Det anbefales derfor at bruge operatoren As eller ThisRecord til at fortolke feltnavnet og undgå flertydighed.

Du kan f.eks. bruge operatoren As til skelne i eksemplet nedenfor.

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 også bruge ThisRecord til samme formå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"
        }
    )
    )
)

Du kan få mere at vide om brugen af operatoren As og ThisRecord i artiklen Operatorer.