Deli putem


Funkcija Patch

Važi za: Canvas aplikacije Model-driven aplikacije Power Platform CLI Desktop tokove

Menja ili kreira jedan ili više zapisa u izvoru podataka ili spaja zapise izvan izvora podataka.

Koristite funkciju Patch da biste izmenili zapise u složenim situacijama, kao što su one kada radite ispravke koje ne zahtevaju interakciju korisnika ili koristite obrasce koji se prostiru na više ekrana.

Da biste lakše ažurirali zapise u izvoru podataka za jednostavne izmene, bolje je da koristite kontrolu obrazac za uređivanje. Kada dodate kontrolu obrazac za uređivanje, korisnicima dajete obrazac za popunjavanje i zatim se izmene čuvaju u izvoru podataka. Za više informacija, pogledajte Objašnjenje obrazaca podataka.

Pogledajte ovaj video zapis da biste saznali kako da koristite funkciju Patch:

Pregled

Koristite funkciju Patch da biste izmenili jedan ili više zapisa u izvoru podataka. Vrednosti specifičnih polja se menjaju bez uticaja na druga svojstva. Na primer, ova formula menja telefonski broj za klijenta po imenu Contoso:

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

Upotreba funkcije Patch sa funkcijom Defaults za kreiranje zapisa. Koristite ovo ponašanje za izgradnju jednog ekrana za kreiranje i uređivanje zapisa. Na primer, ova formula kreira zapis za klijenta po imenu Contoso:

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

Čak i ako ne radite sa izvorom podataka, možete da koristite Patch za objedinjavanje dva ili više zapisa. Na primer, ova formula spaja dva zapisa u jedan koji identifikuje i telefonski broj i lokaciju za Contoso:

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

Opis

Izmena ili kreiranje zapisa u izvoru podataka

Da biste ovu funkciju koristili sa izvorom podataka, navedite izvor podataka, a zatim odredite osnovni zapis:

  • Da biste izmenili zapis, osnovni zapis mora da potiče iz izvora podataka. Osnovni zapis je možda došao preko svojstva galerije Items, smešten je u promenljivu konteksta ili preko neke druge putanje. Ali, možete pratiti osnovni zapis do izvora podataka. Ovo je važno jer će zapis sadržavati dodatne informacije koje će vam pomoći da se ponovo pronađe zapis radi izmene.
  • Da biste kreirali zapis, koristite funkciju Defaults za kreiranje osnovnog zapisa sa podrazumevanim vrednostima.

Zatim odredite jedan ili više zapisa promena, od kojih svaki sadrži nove vrednosti svojstava koje nadjačavaju vrednosti svojstava u osnovnom zapisu. Zapisi o promenama obrađuju se od početka liste argumenata do kraja, pri čemu će kasnije vrednosti svojstva zameniti ranije.

Povratna vrednost funkcije Patch je zapis koji ste izmenili ili kreirali. Ako ste kreirali zapis, povratna vrednost može uključivati svojstva koja je izvor podataka automatski generisao. Međutim, povratna vrednost ne pruža vrednost za polja povezane tabele.

Na primer, koristite Set(MyAccount, Patch(Accounts, First(Account), 'Account Name': "Example name"));, a zatim MyAccount.'Primary Contact'.'Full Name'. U ovom slučaju ne možete dati puno ime. Umesto toga, da biste pristupili poljima povezane tabele, koristite zasebno pronalaženje kao što je:

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

Kada ažurirate izvor podataka, može se pojaviti jedan ili više problema. Koristite IfError i IsError sa povratnom vrednošću iz funkcije Patch da biste otkrili greške i odgovorili na njih, kao što je opisano u odeljku Rukovanje greškama. Možete i da koristite funkciju Errors za prepoznavanje i ispitivanje problema, kao što je opisano u odeljku Rad sa izvorima podataka.

Srodne funkcije uključuju funkciju Update za zamenu celog zapisa i funkciju Collect za kreiranje zapisa. Koristite funkciju UpdateIf za promenu specifičnih svojstava više zapisa na osnovu stanja.

Uređujte ili kreirajte skup zapisa u izvoru podataka

Patch se takođe može koristiti za kreiranje ili izmenu više zapisa jednim pozivom.

Umesto da prođe jedan osnovni zapis, u drugom argumentu može se dati tabela osnovnih zapisa. Zapisi o promenama su dati i u tabeli, koja se slaže jedan-na-jedan sa osnovnim zapisima. Broj zapisa u svakoj tabeli promena mora biti isti kao i broj zapisa u osnovnoj tabeli.

Kada Patch koristite na ovaj način, povratna vrednost je takođe tabela sa svakim zapisom koja odgovara jedan za jednim sa osnovom i zapisima promena.

Spajanje zapisa izvan izvora podataka

Navedite dva ili više zapisa koje želite spojiti. Zapisi se obrađuju se od početka liste argumenata do kraja, pri čemu će kasnije vrednosti svojstva nadjačati ranije.

Patch vraća spojeni zapis i ne menja svoje argumente ili zapise u bilo kojem izvoru podataka.

Sintaksa

Izmena ili kreiranje zapisa u izvoru podataka

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

  • DataSource – Obavezno. Izvor podataka koji sadrži zapis koji želite da izmenite ili će sadržati zapis koji želite da kreirate.
  • BaseRecord – Obavezno. Zapis za izmenu ili kreiranje. Ako je zapis došao iz izvora podataka, biće pronađen i promenjen. Ako se koristi rezultat za Defaults, kreira se zapis.
  • ChangeRecord(s) – Obavezno. Jedan ili više zapisa koji sadrže svojstva za izmenu u BaseRecord. Zapisi o promenama obrađuju se od početka liste argumenata do kraja, pri čemu će kasnije vrednosti svojstva zameniti ranije.

Uređujte ili kreirajte skup zapisa u izvoru podataka

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

  • DataSource – Obavezno. Izvor podataka koji sadrži zapise koje želite da izmenite ili će sadržati zapise koje želite da kreirate.
  • BaseRecordTable – Obavezno. Tabela zapisa koju možete menjati ili kreirati. Ako je zapis došao iz izvora podataka, biće pronađen i promenjen. Ako se koristi rezultat za Defaults, kreira se zapis.
  • ChangeRecordTable(s) – Obavezno. Jedna ili više tabela zapisa koja sadrži svojstva koja se menjaju za svaki zapis za BaseRecordTable. Zapisi o promenama obrađuju se od početka liste argumenata do kraja, pri čemu će kasnije vrednosti svojstva zameniti ranije.

Objedinjavanje zapisa

Patch( Record1, Record2 [, …] )

  • Record(s) – Obavezno. Bar dva zapisa koja želite da objedinite. Zapisi se obrađuju se od početka liste argumenata do kraja, pri čemu će kasnije vrednosti svojstva zameniti ranije.

Primeri

Izmena ili kreiranje zapisa (u izvoru podataka)

U ovim primerima ćete modifikovati ili kreirati zapis u izvoru podataka po imenu IceCream, koji sadrži podatke u ovoj tabeli i automatski generiše vrednosti u IDkolone:

Primer sladoleda.

Formula Opis rezultat
Patch( IceCream,
LookUp( IceCream, Flavor = "Chocolate" ), { Quantity: 400 } )
Izmenjuje zapis u izvoru podataka IceCream:
  • Kolona ID zapisa koji treba izmeniti sadrži vrednost 1. (Zapis Čokolada ima taj ID.)
  • Vrednost u koloni Količina se menja u 400.
{ ID: 1, Flavor: "Chocolate", Quantity: 400 }

Unos Čokolada u izvor podataka IceCream je izmenjen.
Patch( IceCream, Defaults( IceCream ), { Flavor: "Strawberry" } ) Kreira zapis u izvoru podataka IceCream:
  • Kolona ID sadrži vrednost 3, koji izvor podataka automatski generiše.
  • Kolona Količina sadrži 0, što je podrazumevana vrednost za tu kolonu u IceCream izvoru podataka, kako određuje funkcija Defaults.
  • Kolona Flavor sadrži vrednost Strawberry.
{ ID: 3, Flavor: "Strawberry", Quantity: 0 }

Unos Strawberry u izvor podataka IceCream je kreiran.

Nakon izračunavanja prethodnih formula, izvor podataka se završava ovim vrednostima:

Primer sladoleda posle.

Spajanje zapisa (izvan izvora podataka)

Formula Opis Rezultat
Patch( { Name: "James", Score: 90 }, { Name: "Jim", Passed: true } ) Spaja dva zapisa izvan izvora podataka:
  • Vrednosti u koloni Ime za svaki zapis se ne podudara. Rezultat sadrži vrednost (Jim) u zapisu koji je bliži kraju liste argumenata umesto vrednosti (James) u zapisu koji je bliži početku.
  • Prvi zapis sadrži kolonu (Rezultat) koja ne postoji u drugom zapisu. Rezultat sadrži tu kolonu sa njenom vrednošću (90).
  • Drugi zapis sadrži kolonu (Preneto) koja ne postoji u prvom zapisu. Rezultat sadrži tu kolonu sa njenom vrednošću (tačno).
{ Name: "Jim", Score: 90, Passed: true }

Upotreba As ili ThisRecord

Upotrebom ključne reči As ili ThisRecord u formuli izbegava se dvosmisleno tumačenje konteksta.

U primeru ispod, razmotrite prvo pretraživanje u izjavi If. Očekuje se da (OrderID = A[@OrderID]) uporedi OrderId u opsegu pronalaženja pomoću OrderId kolekcije A u opsegu ForAll. U ovom slučaju, verovatno želite da A[@OrderId] bude razrešen kao lokalni parametar. Ali to je dvosmisleno.

Power Apps trenutno tumači oba OrderId na levoj strani i A[@OrderId] na desnoj strani kao polje u opsegu pronalaženja. Stoga će funkcija traženja uvek pronaći prvi red u [dbo].[Orders1] jer je uslov uvek tačan (tj., svaki OrderId u redu je jednak samom sebi.)

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

Upotreba As ili ThisRecord

Kad god je to moguće koristite operator As ili ThisRecord da leva strana ne bude dvosmislena. As preporučuje se za gornji scenario.

Kada formula koristi više opsega pomoću funkcija ForAll, Filter i Lookup na istom izvoru podataka ili tabeli, može doći do preklapanja parametara opsega sa istim poljem na nekom drugom mestu. Zbog toga se preporučuje korišćenje operatora As ili ThisRecord da bi se rešio naziv polja i izbegla dvosmislenost.

Na primer, možete da koristite operator As za otklanjanje dvosmislenosti u donjem primeru.

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

Odnosno, možete koristiti operator ThisRecord u istu svrhu.

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

Da biste saznali više o korišćenju operatora As i ThisRecord, pogledajte članak Operatori.