Fungsi Pembaruan

Saat fungsi Pembaruan dipanggil objek, objek ditugaskan kembali ke dalam mesin untuk dievaluasi ulang, berdasarkan data dan status baru. Objek dapat berjenis TypedXmlDocument atau kelas .NET atau DataConnection atau TypedDataTable.

Anda juga dapat menggunakan fungsi Pembaruan untuk meningkatkan performa mesin dan mencegah skenario perulangan tanpa akhir seperti yang dijelaskan dalam topik ini.

Biasanya, Anda menggunakan Assert untuk menempatkan objek baru dalam memori kerja mesin aturan, dan menggunakan Perbarui untuk memperbarui objek yang sudah ada dalam memori kerja. Saat Anda menegaskan objek baru, kondisi dalam semua aturan dievaluasi. Saat Anda memperbarui objek yang ada, hanya kondisi yang menggunakan fakta yang diperbarui akan dievaluasi ulang, dan tindakan ditambahkan ke agenda jika kondisi ini dinyatakan benar.

Menggunakan fungsi Pembaruan pada fakta .NET

Ambil dua aturan yang mengikuti sebagai contoh. Misalkan objek ItemA dan ItemB sudah ada dalam memori kerja. Aturan 1 mengevaluasi properti Id pada ItemA, mengatur properti Id pada ItemB, lalu menetapkan ulang ItemB setelah perubahan. Ketika ItemB ditetapkan ulang, item diperlakukan sebagai objek baru dan mesin mengevaluasi kembali semua aturan yang menggunakan itemb objek dalam predikat atau tindakan. Ini memastikan bahwa Aturan 2 dievaluasi ulang terhadap nilai baru ItemB.Id, seperti yang diatur dalam Aturan 1. Aturan 2 mungkin gagal saat pertama kali dievaluasi, tetapi bernilai true untuk kedua kalinya dievaluasi.

Aturan 1

IF ItemA.Id == 1  
THEN ItemB.Id = 2  
Assert(ItemB)  

Aturan 2

IF ItemB.Id == 2  
THEN ItemB.Value = 100  

Kemampuan untuk menassert ulang objek ke dalam memori kerja memungkinkan pengguna kontrol eksplisit atas perilaku dalam skenario rantai maju. Efek samping dari penetapan ulang dalam contoh ini, bagaimanapun, adalah bahwa Aturan 1 juga dievaluasi kembali. Karena ItemA.Id tidak diubah, Aturan 1 kembali mengevaluasi ke true dan tindakan Assert(ItemB) diaktifkan lagi. Akibatnya, aturan menciptakan situasi perulangan tanpa akhir.

Nota

Jumlah perulangan maksimum default evaluasi ulang aturan adalah 2^32. Untuk aturan tertentu, eksekusi kebijakan dapat berlangsung untuk waktu yang lama. Anda dapat mengurangi jumlah dengan menyesuaikan properti Kedalaman Loop Eksekusi Maksimum dari versi kebijakan.

Anda harus dapat menegaskan ulang objek tanpa membuat perulangan tanpa akhir, dan fungsi Pembaruan menyediakan kemampuan ini. Seperti penegasan kembali, fungsi Pembaruan melakukan Pencabutan dan Pernyataan pada instans objek terkait yang telah diubah oleh tindakan aturan, namun ada dua perbedaan utama.

  • Tindakan pada agenda untuk aturan di mana tipe instance hanya digunakan dalam tindakan (bukan predikat) akan tetap di agenda.

  • Aturan yang hanya menggunakan jenis instans dalam tindakan tidak akan dievaluasi ulang.

    Oleh karena itu, aturan yang menggunakan tipe instance baik dalam predikat saja maupun dalam predikat dan tindakan akan dievaluasi kembali, dan tindakannya akan ditambahkan ke agenda yang sesuai.

    Mengubah contoh sebelumnya untuk menggunakan fungsi Pembaruan memastikan bahwa hanya Aturan 2 yang dievaluasi ulang karena ItemB digunakan dalam kondisi Aturan 2. Aturan 1 tidak dievaluasi ulang karena ItemB hanya digunakan dalam tindakan Aturan 1, menghilangkan skenario perulangan.

Aturan 1

IF ItemA.Id == 1  
THEN ItemB.Id = 2  
Update(ItemB)  

Aturan 2

IF ItemB.Id == 2  
THEN ItemB.Value = 100  

Namun, masih mungkin untuk membuat skenario perulangan. Misalnya, pertimbangkan aturan berikut.

Aturan 1

IF ItemA.Id == 1  
THEN ItemA.Value = 20  
Update(ItemA)  

Karena ItemA digunakan dalam predikat, ItemA dievaluasi ulang saat Pembaruan dipanggil pada ItemA. Jika nilai ItemA.Id tidak diubah di tempat lain, Aturan 1 terus dievaluasi ke true, menyebabkan Pembaruan sekali lagi dipanggil pada A. Perancang aturan harus memastikan bahwa skenario perulangan seperti ini tidak dibuat.

Pendekatan yang sesuai untuk ini akan berbeda berdasarkan sifat aturan. Berikut ini adalah mekanisme sederhana untuk menyelesaikan masalah dalam contoh sebelumnya.

Fungsi Pembaruan dapat digunakan dalam Komposer Aturan Bisnis dengan referensi ke kelas , seperti halnya fungsi Assert, Retract, atau RetractByType .

Aturan 1

IF ItemA.Id == 1 and ItemA.Value != 20  
THEN ItemA.Value = 20  
Update(ItemA)  

Menambahkan pemeriksaan pada ItemA.Value mencegah Aturan 1 mengevaluasi ke true lagi setelah tindakan Aturan 1 dijalankan untuk pertama kalinya.

Menggunakan fungsi Pembaruan pada fakta XML

Ambil dua aturan yang mengikuti sebagai contoh. Misalkan itu. Aturan 1 mengevaluasi jumlah total item dalam pesan pesan pesanan pembelian, dan aturan2 menetapkan status menjadi "Perlu persetujuan" jika jumlah total lebih besar dari atau sama dengan 10.

Aturan 1

IF 1 == 1  
THEN ProcessPO.Order:/Order/Items/TotalCount = (ProcessPO.Order:/Order/Items/TotalCount + ProcessPO:/Order/Items/Item/Count)  

Aturan 2

IF ProcessPO.Order:/Order/Items/TotalCount >= 10  
THEN ProcessPO.Order:/Order/Status = "Needs approval"  

Jika Anda meneruskan pesan pesanan pembelian (PO) berikut sebagai input ke kebijakan ini, Anda melihat bahwa status tidak diatur ke "Perlu persetujuan" meskipun jumlah total item adalah 14. Ini karena bahwa aturan2 dievaluasi hanya di awal ketika nilai bidang TotalCount adalah 0, dan aturan tidak dievaluasi setiap kali jumlah total yang tersedia diperbarui. Agar kondisi dievaluasi ulang setiap kali TotalCount diperbarui, Anda perlu memanggil fungsi Pembaruan pada simpul induk (Item) dari simpul yang dimodifikasi (TotalCount). Jika Anda mengubah Rule1 seperti yang ditunjukkan di bawah ini, dan mengujinya sekali lagi, Anda akan melihat nilai bidang Status yang diatur ke "Perlu Persetujuan".

<ns0:Order xmlns:ns0="http://ProcessPO.Order">  
    <Items>  
        <Item>  
            <Id>ITM1</Id>  
            <Count>2</Count>  
        </Item>  
        <Item>  
            <Id>ITM2</Id>  
            <Count>5</Count>  
        </Item>  
        <Item>  
            <Id>ITM3</Id>  
            <Count>7</Count>  
        </Item>  
        <TotalCount>0</TotalCount>  
    </Items>  
    <Status>No approval needed</Status>  
</ns0:Order>  

Aturan 1 yang dimodifikasi adalah sebagai berikut:

Aturan 1

IF 1 == 1  
THEN ProcessPO.Order:/Order/Items/TotalCount = (ProcessPO.Order:/Order/Items/TotalCount + ProcessPO:/Order/Items/Item/Count) AND  
Update(ProcessPO.Order:/Order/Items)  

Menggunakan fungsi Pembaruan pada fakta database

TypedDataTable

Jika Pembaruan dipanggil pada TypedDataTable, Pembaruan dipanggil oleh mesin pada semua TypedDataRows terkait. Pembaruan juga dapat dipanggil pada TypedDataRows individual.

Koneksi Data

Pembaruan DataConnection tidak didukung. Gunakan Assert sebagai gantinya.

Lihat Juga

Fungsi Kontrol Mesin