Megosztás:


Patch függvény

A következőkre vonatkozik: Vászonalapú alkalmazások Copilot Studio Desktop folyamatok Modellalapú alkalmazások Power Platform CLI Dataverse-függvények

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 függvény használatával Patch összetett helyzetekben módosíthatja a rekordokat, például ha olyan frissítéseket végez, amelyek nem igényelnek felhasználói beavatkozást, vagy több képernyőre kiterjedő ű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.

Ebből a videóból megtudhatja, hogyan használhatja a függvényt Patch :

Áttekintés

A függvény használatával Patch módosíthatja egy adatforrás egy vagy több rekordját. 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, LookUp( Customers, Name = "Contoso" ), { Phone: "1-212-555-1234" } )

Rekordok létrehozásához használja Patch az Alapértelmezettek függvénnyel. 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" } )

Megjegyzés:

Ha egy gyűjteményt az alapértelmezett értékeket tartalmazó adatforrás rekordjával javít, a javítás művelet a megadott javításértékekkel és az adatforrás alapértelmezett értékeivel frissíti a gyűjteményt. A patch utasítás adatforrásának és az Alapértelmezettek függvény adatforrásának egyeznie kell egy új rekord létrehozásához.

Még ha nem is használ adatforrást, Patch két vagy több rekord egyesíthető. 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. Előfordulhat, hogy az alaprekord egy katalógus Items tulajdonságán keresztül jött létre, környezeti változóban lett elhelyezve, vagy valamilyen más elérési úton haladt végig. Az alaprekordnak azonban mindig visszavezethetőnek kell lennie az adatforrásra. Ez azért fontos, mert a rekord további információkat tartalmaz a rekord módosításához.
  • 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 visszaadott Patch érték a módosított vagy létrehozott rekord. Ha létrehozott egy rekordot, a visszatérési érték tartalmazhat olyan tulajdonságokat, amelyeket az adatforrás automatikusan létrehozott. 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 egy vagy több probléma merülhet fel. Használja az IfError és az IsError függvényt a visszatérési értékkel Patch a hibák észleléséhez és megválaszolásához, ahogyan azt a Hibakezelés írja le. 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

Patch Több rekord létrehozására vagy módosítására is használható egyetlen hívással.

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.

Ha ezt a módot használja Patch , a visszatérési érték is egy tábla, amelyben minden rekord egy-az-egyhez felel meg az alapnak, és módosítja a rekordokat.

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.

Patch visszaadja az egyesített rekordot, és nem módosítja az argumentumait vagy rekordjait egyetlen adatforrásban sem.

Szintaxis

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

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

  • DataSource – 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. A patch utasítás adatforrásának és az Alapértelmezettek függvény adatforrásának egyeznie kell egy új rekord létrehozásához.
  • ChangeRecords – 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 – 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. A patch utasítás adatforrásának és az Alapértelmezettek függvény adatforrásának egyeznie kell egy új rekord létrehozásához.
  • ChangeRecordTables – 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( Rekord1, Rekord2 [, ...] )

  • Rekordok – 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 Ismertetés Result
Patch( IceCream,
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( IceCream, Defaults( IceCream ), { Flavor: "Strawberry" } ) 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 Result
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. (OrderID = A[@OrderID]) várhatóan összehasonlítja OrderId a keresési hatókört a OrderId hatókörben A lévő gyűjtemény ForAll értékkel. 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. Ahogy a fenti forgatókönyv esetében ajánlott.

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.