Fungsi Patch di Power Apps

Mengubah atau membuat satu atau beberapa rekaman di sumber data, atau menggabungkan rekaman di luar sumber data.

Gunakan fungsi Patch untuk memodifikasi rekaman dalam situasi kompleks. Seperti, bila Anda melakukan pembaruan yang memerlukan interaksi pengguna atau formulir penggunaan yang mencakup beberapa layar.

Untuk memperbarui rekaman di sumber data secara lebih mudah untuk perubahan sederhana, gunakan kontrol Edit formulir sebagai gantinya. Bila anda menambahkan kontrol Edit formulir, Anda menyediakan formulir untuk diisi dan kemudian menyimpan perubahan ke sumber data kepada pengguna. Untuk informasi lebih lanjut, lihat Memahami formulir data.

Lihat video ini untuk mempelajari cara menggunakan fungsi Patch:

Gambaran Umum

Gunakan fungsi Patch untuk memodifikasi satu atau beberapa rekaman sumber data. Nilai bidang spesifik dimodifikasi tanpa mempengaruhi properti lainnya. Misalnya, rumus ini mengubah nomor telepon untuk pelanggan bernama Contoso:

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

Gunakan Patch dengan fungsi Defaults untuk membuat rekaman. Gunakan perilaku ini untuk membuat satu layar untuk pembuatan dan pengeditan rekaman. Misalnya, rumus ini membuat rekaman untuk pelanggan bernama Contoso:

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

Bahkan jika Anda tidak bekerja dengan sumber data, Anda dapat menggunakan Patch untuk menggabungkan dua rekaman atau lebih. Contohnya, rumus ini menggabungkan dua rekaman menjadi satu yang mengidentifikasi nomor telepon dan lokasi Contoso:

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

KETERANGAN

Mengubah dan membuat rekaman di sumber data

Untuk menggunakan fungsi ini dengan sumber data, tentukan sumber data, lalu tentukan rekaman dasar:

  • Untuk memodifikasi rekaman, rekaman dasar harus berasal dari sumber data. Rekaman dasar mungkin telah memiliki properti Item galeri, ditempatkan dalam variabel konteks, atau melalui jalur lain. Namun, anda dapat melacak rekaman dasar kembali ke sumber data. Hal ini penting karena rekaman akan berisi informasi tambahan untuk membantu menemukan rekaman kembali untuk modifikasi.
  • Untuk membuat rekaman, gunakan fungsi Defaults untuk membuat rekaman dasar dengan nilai default.

Kemudian tentukan satu atau beberapa rekaman yang diubah, yang masing-masing berisi nilai properti baru yang menimpa nilai properti dalam rekaman dasar. Rekaman perubahan diproses secara berurutan dari awal daftar argumen sampai akhir, dengan nilai properti yang lebih baru menimpa yang sebelumnya.

Nilai Patch yang dihasilkan adalah rekaman yang Anda modifikasi atau buat. Jika anda membuat rekaman, nilai yang dihasilkan dapat mencakup properti yang dihasilkan sumber data secara otomatis. Namun, nilai hasil tidak memberikan nilai untuk bidang tabel terkait.

Misalnya, Anda menggunakan Set(MyAccount, Patch(Accounts, First(Account), 'Account Name': "Example name")); dan kemudian MyAccount.'Primary Contact'.'Full Name'. Anda tidak dapat menghasilkan nama lengkap dalam kasus ini. Justru, untuk mengakses bidang tabel terkait, gunakan pencarian terpisah seperti:

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

Bila Anda memperbarui sumber data, satu atau beberapa masalah mungkin timbul. Gunakan fungsi Errors untuk mengidentifikasi dan memeriksa masalah, seperti yang dijelaskan Bekerja dengan Sumber Data.

Fungsi terkait mencakup fungsi Update untuk menggantikan seluruh rekaman, dan fungsi Collect untuk membuat rekaman. Gunakan fungsi UpdateIf untuk memodifikasi properti tertentu dari beberapa rekaman berdasarkan kondisi.

Mengubah dan membuat rangkaian rekaman dalam sumber data

Patch juga dapat digunakan untuk membuat atau memodifikasi beberapa rekaman dengan satu panggilan.

Daripada meneruskan rekaman dasar tunggal, tabel rekaman dasar dapat diberikan dalam argumen kedua. Rekaman perubahan juga disediakan dalam tabel, yang terkait satu demi satu dengan rekaman dasar. Jumlah rekaman di setiap tabel perubahan harus sama dengan jumlah rekaman di tabel dasar.

Bila menggunakan Patch dengan cara ini, nilai yang dihasilkan juga merupakan tabel dengan setiap rekaman yang sesuai satu untuk satu dengan rekaman dasar dan perubahan.

Menggabungkan rekaman di luar sumber data

Tentukan dua rekaman atau lebih yang ingin Anda gabungkan. Rekaman diproses secara berurutan dari awal daftar argumen sampai akhir, dengan nilai properti yang lebih baru menimpa yang sebelumnya.

Patch menghasilkan rekaman gabungan dan tidak memodifikasi argumennya atau rekaman di sumber data apa pun.

Sintaks

Mengubah dan membuat rekaman di sumber data

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

  • DataSource – Wajib. Sumber data yang berisi rekaman yang akan dimodifikasi atau berisi rekaman yang ingin Anda buat.
  • BaseRecord – Wajib. Rekaman untuk dimodifikasi atau dibuat. Jika rekaman berasal dari sumber data, rekaman ditemukan dan dimodifikasi. Jika hasil Defaults digunakan, rekaman dibuat.
  • ChangeRecord – Wajib. Satu atau beberapa rekaman yang berisi properti untuk dimodifikasi di BaseRecord. Rekaman perubahan diproses secara berurutan dari awal daftar argumen sampai akhir, dengan nilai properti yang lebih baru menimpa yang sebelumnya.

Mengubah dan membuat rangkaian rekaman dalam sumber data

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

  • DataSource – Wajib. Sumber data yang berisi rekaman yang akan dimodifikasi atau berisi rekaman yang ingin Anda buat.
  • BaseRecordTable – Wajib. Tabel rekaman untuk dimodifikasi atau dibuat. Jika rekaman berasal dari sumber data, rekaman ditemukan dan dimodifikasi. Jika hasil Defaults digunakan, rekaman dibuat.
  • ChangeRecordTable(s) – Wajib. Satu atau beberapa tabel rekaman yang berisi properti untuk diubah untuk setiap rekaman dari BaseRecordTable. Rekaman perubahan diproses secara berurutan dari awal daftar argumen sampai akhir, dengan nilai properti yang lebih baru menimpa yang sebelumnya.

Gabungkan Rekaman

Patch( Record1, Record2 [, …] )

  • Record - Wajib. Sedikitnya dua rekaman yang ingin digabungkan. Rekaman diproses secara berurutan dari awal daftar argumen sampai akhir, dengan nilai properti yang lebih baru menimpa yang sebelumnya.

Contoh

Mengubah dan membuat rekaman (di sumber data)

Di contoh ini, Anda akan memodifikasi atau membuat rekaman di sumber data, bernama IceCream, yang berisi data dalam tabel ini dan secara otomatis menghasilkan nilai di kolom ID:

Contoh Icecream.

Rumus KETERANGAN Hasil
Patch( IceCream,
Lookup( IceCream, Flavor = "Chocolate" ), { Quantity: 400 } )
Memodifikasi rekaman di sumber data IceCream:
  • Kolom ID rekaman untuk dimodifikasi berisi nilai 1. (Rekaman Rekaman memiliki ID tersebut.)
  • Nilai dalam kolom Quantity berubah menjadi 400.
{ ID: 1, Flavor: "Chocolate", Quantity: 400 }

Entri Chocolate dalam sumber data IceCream telah dimodifikasi.
Patch( IceCream, Defaults( IceCream ), { Flavor: "Strawberry" } ) Membuat rekaman di sumber data IceCream:
  • Kolom ID berisi nilai 3, dengan sumber data menghasilkan secara otomatis.
  • Kolom Quantity berisi 0, yang merupakan nilai default untuk kolom tersebut dalam sumber data IceCream data, seperti yang ditentukan fungsi Defaults.
  • Kolom Flavor berisi nilai Strawberry.
{ ID: 3, Flavor: "Strawberry", Quantity: 0 }

Entri Strawberry dalam sumber data IceCream telah dibuat.

Setelah rumus sebelumnya dievaluasi, sumber data diakhiri dengan nilai berikut:

Contoh icecream after.

Menggabungkan rekaman (di luar sumber data)

Rumus KETERANGAN Hasil
Patch( { Name: "James", Score: 90 }, { Name: "Jim", Passed: true } ) Menggabungkan dua rekaman di luar sumber data:
  • Nilai pada kolom Name untuk setiap rekaman tidak sesuai. Hasil berisi nilai (Jim) di rekaman yang lebih dekat ke akhir daftar argumen, bukan nilai (James) di rekaman yang lebih dekat dengan awal.
  • Rekaman pertama berisi kolom (Score) yang tidak ada di rekaman kedua. Hasilnya berisi kolom tersebut dengan nilainya (90).
  • Rekaman kedua berisi kolom (Passed) yang tidak ada di rekaman pertama. Hasilnya berisi kolom tersebut dengan nilainya (true).
{ Name: "Jim", Score: 90, Passed: true }

Penggunaan As atau thisrecord

Menggunakan kata kunci As atau thisrecord dalam formula untuk menghindari konteks penilaian yang ambigu.

Pada contoh di bawah, pertimbangkan pencarian pertama dalam pernyataan If. (OrderID = A[@OrderID]) diharapkan untuk membandingkan OrderId dalam lingkup pencarian dengan OrderId kumpulan A dalam cakupan ForAll. Dalam kasus ini, Anda mungkin ingin A[@OrderId] diselesaikan sebagai parameter lokal. Namun ambigu.

Power Apps saat ini menafsirkan sisi kiri OrderId maupun sisi kanan A[@OrderId] sebagai bidang di cakupan pencarian. Oleh karena itu, pencarian akan selalu menemukan baris pertama di [dbo].[Orders1] karena kondisi selalu benar (yaitu, setiap OrderId baris apa pun sama dengan dirinya sendiri.)

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

Penggunaan As atau thisrecord

Bila memungkinkan, gunakan operator As atau thisrecord untuk menghapus ambiguitas sisi kiri. As direkomendasikan untuk skenario di atas.

Bila rumus anda menggunakan beberapa cakupan dengan ForAll, Filter, dan Lookup di sumber data atau tabel yang sama, kemungkinan parameter cakupan dapat bertabrakan dengan bidang yang sama di tempat lain. Oleh karena itu, sebaiknya gunakan operator As atau thisrecord untuk menangani nama bidang dan menghindari ambiguitas.

Misalnya, Anda dapat menggunakan operator As untuk menghapus ambiguitas dalam contoh di bawah ini.

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

Atau, Anda dapat menggunakan thisrecord untuk tujuan yang sama.

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

Untuk mempelajari lebih lanjut tentang penggunaan operator As dan thisrecord Lihat artikel operator.