Patch függvény

A következőkre vonatkozik: Vászonalapú alkalmazások Modellvezérelt alkalmazások Power Platform CLI

Módosít vagy létrehoz egy vagy több rekordot egy adatforrásban, vagy egyesíti a rekordokat az adatforráson kívül.

A Patch függvény rekordok módosítására használható összetett helyzetekben, például amikor olyan frissítéseket végez, amelyek nem igényelnek felhasználói műveleteket, vagy több képernyős űrlapokat használnak.

Ha az egyszerű változtatásokhoz könnyebben szeretné frissíteni a adatforrás bejegyzéseit, használja inkább az Űrlap szerkesztése vezérlőt. Amikor hozzáad egy Űrlap szerkesztése vezérlőt, akkor egy kitöltendő űrlapot biztosít a felhasználóknak, majd egy adatforrásba menti a módosításokat. További információ: Az adatűrlapok megismerése.

A videó megnézve megismeri a Patch függvény használatát:

Áttekintés

A Patch függvénnyel az adatforrás egy vagy több rekordja módosítható. Adott mezők értékeinek megváltoztatása a többi tulajdonságot nem befolyásolja. Az alábbi képlet például megváltoztatja a Contoso nevű ügyfélhez tartozó telefonszámot:

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

Rekordokat a Patch és a Defaults függvények együttes használatával lehet létrehozni. Ennek köszönhetően akár egyetlen képernyőről elvégezhető a rekordok létrehozása és szerkesztése. Az alábbi képlet például a Contoso nevű ügyfélhez hoz létre egy rekordot:

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

A Patch adatforrás használata nélkül is alkalmazható két vagy több rekord egyesítéséhez. Ez a képlet például két rekordot egyesít egy olyanná, amely a Contoso telefonszámát és helyét is azonosítja:

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

Ismertetés

Rekordok módosítása vagy létrehozása adatforrásban

A függvény adatforrással történő használatához először az adatforrást, majd egy alaprekordot kell megadni:

  • A rekord módosításához az alaprekordnak adatforrásból kell származnia. Az alaprekord származhat egy katalógus Elemek tulajdonságából, egy környezeti változóból, illetve egyéb elérési útvonallal is rendelkezhet. Az alaprekordnak azonban mindig visszavezethetőnek kell lennie az adatforrásra. Ez azért fontos, mert a rekord további információkat tartalmaz arra az esetre, ha ismét meg kell keresni módosítás céljából.
  • Rekord létrehozásához a Defaults függvénnyel lehet alapértelmezett értékekkel rendelkező alaprekordot létrehozni.

Ezt követően meg kell adni legalább egy módosítási rekordot, amely új tulajdonságértékeket tartalmaz az alaprekordban szereplők felülírásához. A módosítási rekordok feldolgozása az argumentumlista elejétől a végéig sorrendben történik, és a későbbi tulajdonságértékek felülírják a korábbiakat.

A Patch visszaadott értéke a módosított vagy létrehozott rekord. Rekord létrehozása esetén a visszaadott érték az adatforrás által automatikusan létrehozott tulajdonságokat tartalmazhat. A visszatérési érték azonban nem ad értéket a kapcsolódó tábla mezőinek.

Például a Set(MyAccount, Patch(Accounts, First(Account), 'Account Name': "Example name"));, majd a MyAccount.'Primary Contact'.'Full Name' képletet használja. Ebben az esetben nem kaphatja meg a teljes nevet. Ehelyett egy kapcsolódó tábla mezőinek eléréséhez használjon külön keresést, például:

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

Adatforrás frissítésekor hibák fordulhatnak elő. Használja az IfError és IsError függvényeket a Patch függvény által visszaadott értékkel a hibák észleléséhez és kezeléséhez, amint azt a Hibakezelés című szakasz is ismerteti. Továbbá az Errors függvénnyel azonosíthatók és megvizsgálhatók a hibák, ahogyan azt az adatforrások használatát ismertető cikk leírja.

A kapcsolódó függvények közé tartozik az Update függvény is, amely egy teljes rekord lecserélésére használható, valamint a Collect függvény, amely rekordok létrehozására szolgál. Az UpdateIf függvénnyel több rekord megadott tulajdonságai módosíthatók valamilyen feltétel alapján.

Rekordkészlet módosítása vagy létrehozása adatforrásban

A Patch több rekord egyetlen hívással történő létrehozásához vagy módosításához is használható.

Egyetlen alaprekord átadása helyett alaprekordok egy táblája adható meg a második argumentumban. A módosítási rekordok egy táblában is szerepelnek, ahol egy az egyhez társítással megfeleltethetők az alaprekordoknak. A módosítási táblákban szereplő rekordok számának meg kell egyeznie az alaptáblában található rekordok számával.

A Patch ily módon történő használata esetén a visszaadott érték szintén egy olyan tábla, ahol az egyes rekordok egy az egyhez társítással megfeleltethetők az alap- és módosítási rekordoknak.

Rekordok egyesítése adatforráson kívül

Meg kell adni legalább két, egyesíteni kívánt rekordot. A rekordok feldolgozása az argumentumlista elejétől a végéig sorrendben történik, és a későbbi tulajdonságértékek felülírják a korábbiakat.

A Patch visszaadja az egyesített rekordot anélkül, hogy a hozzá tartozó argumentumokat vagy rekordokat bármilyen adatforrásban módosítaná.

Szintaxis

Rekordok módosítása vagy létrehozása adatforrásban

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

  • DataSource (Adatforrás) – kötelező. Az adatforrás, amely a módosítani kívánt rekordot tartalmazza, vagy amely a létrehozandó rekordot tartalmazni fogja.
  • BaseRecord – Kötelező. A módosítani vagy létrehozni kívánt rekord. Az adatforrásból származó rekordokat a rendszer megkeresi és módosítja. A Defaults eredményének használata esetén létrejön egy rekord.
  • ChangeRecord(s) – Kötelező. Egy vagy több olyan rekord, amely a BaseRecord elemben módosítandó tulajdonságokat tartalmazza. A módosítási rekordok feldolgozása az argumentumlista elejétől a végéig sorrendben történik, és a későbbi tulajdonságértékek felülírják a korábbiakat.

Rekordkészlet módosítása vagy létrehozása adatforrásban

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

  • DataSource (Adatforrás) – kötelező. Az adatforrás, amely a módosítani kívánt rekordokat tartalmazza, vagy amely a létrehozandó rekordokat tartalmazni fogja.
  • BaseRecordTable – Kötelező. A módosítani vagy létrehozni kívánt rekordok táblája. Az adatforrásból származó rekordokat a rendszer megkeresi és módosítja. A Defaults eredményének használata esetén létrejön egy rekord.
  • ChangeRecordTable(s) – Kötelező. Egy vagy több olyan rekordtábla, amely a BaseRecordTable rekordjai esetében módosítandó tulajdonságokat tartalmazza. A módosítási rekordok feldolgozása az argumentumlista elejétől a végéig sorrendben történik, és a későbbi tulajdonságértékek felülírják a korábbiakat.

Bejegyzések összefésülése

Patch( Record1, Record2 [, …] )

  • Record(s) – kötelező. Legalább két, egyesíteni kívánt rekord. A rekordok feldolgozása az argumentumlista elejétől a végéig sorrendben történik, és a későbbi tulajdonságértékek felülírják a korábbiakat.

Példák

Rekordok módosítása vagy létrehozása (adatforrásban)

Az alábbi példákban a Jégkrém nevű adatforrásban fogunk rekordot létrehozni vagy módosítani. Az adatokat ez a tábla tartalmazza, az Azonosítóoszlop értékei pedig automatikusan jönnek létre:

Példa fagylalt.

Képlet Description Result
Patch( Jégkrém,
LookUp( IceCream, Flavor = "Csokoládé" ), { Quantity: 400 } )
Módosít egy rekordot az IceCream adatforrásban:
  • A módosítani kívánt rekord Azonosító oszlopában az 1 érték szerepel. (Ez az azonosító a Csokoládé rekordhoz tartozik.)
  • A Mennyiség oszlopban szereplő érték 400 egységre módosul.
{ ID: 1, Flavor: "Csokoládé", Quantity: 400 }

Az IceCream adatforrás Csokoládé bejegyzése módosult.
Patch( Jégkrém, Defaults( Jégkrém ), { Flavor: "Eper" } ) Létrehoz egy rekordot az IceCream adatforrásban:
  • Az Azonosító oszlopban szereplő érték 3, amelyet az adatforrás automatikusan hoz létre.
  • A Mennyiség oszlopban 0 szerepel, így ez az adott oszlop alapértelmezett értéke az IceCream adatforrásban, ahogyan azt a Defaults függvény meghatározza.
  • Az Íz oszlopban az Eper érték szerepel.
{ ID: 3, Flavor: "Strawberry", Quantity: 0 }

Az IceCream adatforrás Eper bejegyzése létrejött.

A korábbi képletek kiértékelése után az adatforrás végleges értékei a következők:

Példa fagylalt után.

Rekordok egyesítése (adatforráson kívül)

Képlet Ismertetés Eredmény
Patch( { Name: "James", Score: 90 }, { Name: "Jim", Passed: true } ) Két rekord egyesítése adatforráson kívül:
  • Az egyes rekordok Név oszlopában szereplő érték nem egyezik. Az eredmény az argumentumlista végéhez közelebbi rekordban szereplő Jim értéket tartalmazza az argumentumlista elejéhez közelebbi rekordban lévő James érték helyett.
  • Az első rekord tartalmazza a Pontszám oszlopot, amely a második rekordban nem szerepel. Az eredmény az értékével (90) együtt tartalmazza az adott oszlopot.
  • A második rekord tartalmazza a Megfelelt oszlopot, amely az első rekordban nem szerepel. Az eredmény az értékével (igaz) együtt tartalmazza az adott oszlopot.
{ Name: "Jim", Score: 90, Passed: true }

Az As vagy a ThisRecord használata

Az As vagy a ThisRecord kulcsszó használata a képletben elkerüli a kétértelmű értékelési környezetet.

Az alábbi példában érdemes megfontolni az If utasításban szereplő első keresést. Az (OrderID = A[@OrderID]) az elvárás szerint összehasonlítja a keresési hatókörben szereplő OrderId elemet az OrderId elemével az A gyűjteménynek a ForAll hatókörben. Ebben az esetben valószínűleg helyi paraméterként kívánja feloldani a A[@OrderId] elemet. De ez nem egyértelmű.

Power Apps jelenleg a bal oldali OrderId elemet és a jobb oldalt A[@OrderId] elemet a keresési hatókör egyik mezőjének értelmezi. Ezért a keresés mindig megtalálja az első sort itt: [dbo].[Orders1], mert a feltétel mindig igaz (vagyis bármely sor OrderId értéke megegyezik önmagával).

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

Az As vagy a ThisRecord használata

Amikor csak lehetséges, használja az As operátort vagy a ThisRecord lehetőséget, hogy megkülönböztesse a bal oldalt. Az As a fenti esethez javasolt.

Ha a képlet több hatókört használ a ForAll, a Filter és a Lookup alkalmazásával ugyanazon adatforráson vagy táblán, előfordulhat, hogy a hatóköri paraméterek esetleg ütköznek ugyanazzal a mezővel máshol. Ezért ajánlott az As operátor vagy a ThisRecord használata a mezőnév feloldásához és a kétértelműség elkerüléséhez.

Például az As operátor használatával feloldható az ellentmondás az alábbi példában.

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

Másik lehetőségként a ThisRecord is használható ugyanerre a célra.

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

Ha többet szeretne megtudni az As operátor és a ThisRecord használatáról, lásd az Operátorok cikket.