Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Berlaku pada: Azure Logic Apps (Standar)
Panduan ini memperlihatkan cara mengoptimalkan eksekusi aturan dengan menambahkan fungsi kontrol ke tindakan dalam aturan Anda menggunakan Microsoft Rules Composer. Fungsi kontrol membantu aplikasi atau kumpulan aturan Anda mengontrol fakta dalam memori kerja mesin aturan. Fungsi-fungsi ini termasuk fungsi Assert, Clear, Halt, Retract, RetractByType, Reassert, dan Update untuk objek .NET dan entitas TypedXmlDocument yang dapat Anda gunakan sebagai fakta. Keberadaan fakta dalam memori kerja mendorong kondisi yang dievaluasi oleh mesin dan tindakan yang dieksekusi.
Prasyarat
Unduh dan instal Microsoft Rules Composer.
File XML yang berisi set aturan yang ingin Anda kerjakan.
Untuk menambahkan fakta, tentukan nilainya di dalam dokumen XML yang Anda pilih dari jendela RuleSet Explorer. Atau, Anda dapat menggunakan pembuat fakta untuk menyediakan mesin aturan Anda dengan array yang berisi objek .NET sebagai fakta. Untuk informasi selengkapnya, lihat Membangun pembuat dan pengambil fakta.
Fungsi assert
Untuk menambahkan instans objek ke memori kerja mesin aturan, gunakan fungsi Assert di Microsoft Rules Composer. Mesin memproses setiap instans objek sesuai dengan kondisi dan tindakan yang ditentukan terhadap jenis instans, menggunakan fase pencocokan, resolusi konflik, dan tindakan.
Tabel berikut ini meringkas perilaku fungsi Assert untuk entitas dan jenis instans yang dinyatakan yang didukung, termasuk jumlah instans yang dihasilkan yang dibuat di mesin untuk setiap entitas yang dinyatakan dan jenis yang diterapkan ke setiap instans untuk identifikasi.
| Entitas | Jumlah instans yang dinyatakan | Jenis instans |
|---|---|---|
| Objek .NET | 1 (objek itu sendiri) | Kelas .NET yang sepenuhnya memenuhi syarat |
| TypedXmlDocument | 1-N TypedXmlDocument: Berdasarkan pengikatan selektor yang dibuat dan konten dokumen | JenisDokumen.Selector |
Menegaskan objek .NET
Mesin aturan secara bawaan mendukung jenis skalar .NET dasar dan objek untuk jenis referensi. Pemrosesan objek .NET yang telah ditegaskan adalah yang paling mudah dari semua jenis pemrosesan.
Di Microsoft Rules Composer, Anda dapat menegaskan objek .NET dari dalam aturan.
Di Microsoft Rules Composer, muat file XML yang berisi penyimpanan aturan yang ingin Anda kerjakan.
Di jendela RuleSet Explorer , temukan dan pilih aturan yang Anda inginkan.
Di panel THEN , di bawah Tindakan, tambahkan fungsi bawaan Assert sebagai tindakan.
Di jendela Facts Explorer , pilih Kelas .NET.
Dari tab Kelas .NET, seret metode konstruktor untuk objek yang Anda inginkan ke argumen dalam tindakan Assert.
Microsoft Rules Composer menerjemahkan metode konstruktor ke dalam panggilan CreateObject dalam definisi aturan.
Catatan
Meskipun mesin aturan memiliki fungsi CreateObject , fungsi tidak muncul sebagai fungsi terpisah di Microsoft Rules Composer.
Setiap objek ditegaskan ke dalam memori kerja sebagai instans objek terpisah, yang berarti bahwa setiap predikat yang mereferensikan jenis objek, seperti IF Object.Property = 1, menganalisis instans. Instans juga dapat digunakan untuk menentukan tindakan aturan yang mengacu pada jenis tersebut, berdasarkan hasil evaluasi kondisi aturan.
Misalnya, Anda memiliki aturan berikut:
Aturan 1
IF A.Value = 1
THEN A.Status = "good"
Aturan 2
IF B.Value = 1
THEN A.Status = "good"
Di Aturan 1, hanya instans A dengan nilai 1 yang memperbarui properti Statusnya. Namun, dalam Aturan 2, jika kondisi dievaluasi menjadi true, semua instans A memiliki statusnya diperbarui. Faktanya, jika ada beberapa instans B, instans A diperbarui setiap kali kondisi dievaluasi menjadi true untuk instans B.
Memastikan entitas TypedXmlDocument
Di Microsoft Rules Composer, Anda dapat menegaskan entitas TypedXmlDocument dari dalam aturan.
Di jendela RuleSet Explorer , temukan dan pilih aturan yang Anda inginkan.
Di panel THEN , di bawah Tindakan, tambahkan fungsi bawaan Assert sebagai tindakan.
Di jendela Facts Explorer , pilih Skema XML.
Dari tab Skema XML, seret simpul yang ingin Anda argumenkan dalam tindakan Tegaskan .
Dokumen XML pada dasarnya adalah teks, tetapi nilai bidang mungkin jenis apa pun, yang didasarkan pada jenis yang ditentukan saat aturan dibuat. Bidang adalah ekspresi XPath, sehingga mungkin mengembalikan nodeset, yang berarti bahwa item pertama dalam set akan digunakan sebagai nilai.
Ketika entitas TypedXmlDocument dinyatakan sebagai fakta, mesin aturan membuat instans anak TypedXmlDocument, berdasarkan selector yang ditentukan dalam aturan. Anda dapat memandang pemilih sebagai cara untuk mengisolasi simpul dalam dokumen XML, dan bidang sebagai penentu item tertentu di dalam pemilih. Mesin aturan mengelompokkan semua bidang dalam satu pemilih menjadi sebuah objek.
Selektor juga merupakan ekspresi XPath. Di dalam Facts Explorer, saat Anda memilih simpul pada tab Skema XML, Microsoft Rules Composer secara otomatis mengisi properti Pemilih XPath untuk semua simpul dan properti Bidang XPath untuk simpul apa pun yang tidak berisi simpul anak. Atau, Anda dapat memasukkan ekspresi XPath Anda sendiri untuk XPath Selector dan XPath Field jika perlu. Jika selektor cocok dengan beberapa bagian dalam dokumen XML, beberapa objek jenis ini dimasukkan ke dalam atau dihapus dari memori kerja dari mesin aturan.
Anda dapat menggunakan beberapa pemilih dalam dokumen yang sama. Dengan begitu, Anda dapat melihat berbagai bagian dokumen, misalnya, misalkan satu bagian adalah pesanan dan bagian lain berisi alamat pengiriman. Namun, perlu diingat bahwa objek yang dibuat ditentukan oleh string XPath yang membuatnya. Jika Anda menggunakan ekspresi XPath yang berbeda, hasilnya adalah entitas TypedXmlDocument yang unik, bahkan jika ekspresi diselesaikan ke simpul yang sama.
Misalnya, Anda memiliki XML berikut:
<root>
<order customer="Joe">
<item name="router" quantity="10" cost="550" />
<item name="switch" quantity="3" cost="300" />
</order>
<order customer="Jane">
<item name="switch" quantity="1" cost="300" />
<item name="cable" quantity="23" cost="9.99" />
</order>
</root>
Jika Anda menggunakan pemilih /root/order, atau urutan, objek berikut ditambahkan ke memori kerja mesin:
Objek 1
<order customer="Joe">
<item name="router" quantity="10" cost="550" />
<item name="switch" quantity="3" cost="300" />
</order>
Objek 2
<order customer="Jane">
<item name="switch" quantity="1" cost="300" />
<item name="cable" quantity="23" cost="9.99" />
</order>
Dalam setiap pemilih, XPath merujuk ke bidang individual. Jadi, jika Anda menggunakan pemilih /root/order/item, order/item, atau item, objek berikut ditambahkan ke memori kerja mesin dengan dua item untuk Joe dan dua item untuk Jane:
<root>
<order customer="Joe">
</order>
<order customer="Jane">
</order>
</root>
Setiap objek dapat mengakses tiga bidang: @name, @quantity, dan @cost. Anda dapat merujuk ke bidang induk karena objek adalah referensi ke dalam dokumen asli, misalnya, .. /@customer.
Di balik layar, mesin aturan dapat mengonversi nilai bidang teks ke salah satu jenis yang didukung melalui fungsi XmlConvert . Anda dapat menentukan opsi ini dengan mengatur jenis di Microsoft Rules Composer. Jika konversi tidak dimungkinkan, mesin akan melemparkan pengecualian. Anda dapat mengambil tipe bool dan tipe double hanya sebagai tipe mereka masing-masing, yaitu string atau objek.
Menghapus fungsi
Untuk mengatur ulang memori dan agenda kerja untuk instans mesin aturan, gunakan fungsi Hapus di Microsoft Rules Composer. Untuk informasi selengkapnya tentang memori kerja dan agenda, lihat Pengoptimalan mesin aturan.
Mengatur ulang memori kerja dan agenda kerja untuk mesin aturan Anda
Di jendela RuleSet Explorer , temukan dan pilih aturan tempat Anda ingin menghapus memori dan agenda kerja untuk mesin aturan Anda.
Di panel THEN , di bawah Tindakan, tambahkan fungsi Hapus bawaan sebagai tindakan.
Fungsi Clear tidak mengambil argumen.
Menghentikan fungsi
Untuk menghentikan eksekusi saat ini oleh mesin aturan, gunakan fungsi Halt di Microsoft Rules Composer.
Hentikan eksekusi aturan
Di jendela RuleSet Explorer , temukan dan pilih aturan tempat Anda ingin menghentikan eksekusi ruleset.
Di panel THEN , di bawah Tindakan, tambahkan fungsi bawaan Hentikan sebagai tindakan.
Fungsi Halt mengambil satu argumen Boolean . Jika Anda menentukan nilai sebagai true, mesin aturan akan menghapus agenda yang berisi aturan kandidat yang tertunda.
Metode Ruleset.Execute adalah pembungkus di sekitar metode RuleEngine.Execute , dan menggunakan kode yang mirip dengan kode berikut:
RuleEngine.Assert(facts);
RuleEngine.Execute();
RuleEngine.Retract(facts);
Jika Anda menggunakan metode Ruleset.Execute untuk menjalankan ruleset, mesin aturan mengembalikan kontrol ke metode Ruleset.Execute saat fungsi Halt dijalankan. Metode Ruleset.Execute menarik kembali fakta dan mengembalikan kontrol ke pemanggil. Dalam hal ini, eksekusi aturan yang dihentikan tidak dapat dilanjutkan.
Namun, jika Anda langsung menggunakan metode RuleEngine.Execute untuk menjalankan ruleset, Anda dapat melanjutkan eksekusi ruleset yang dihentikan dengan aturan tertunda berikutnya yang diaktifkan dengan memanggil RuleEngine.Execute lagi, asalkan Anda tidak mencabut objek apa pun yang diperlukan antara dua panggilan.
Catatan
Metode Ruleset.Execute menyimpan instans mesin aturan untuk performa yang lebih baik. Jika Anda langsung menggunakan metode RuleEngine.Execute, instans mesin aturan tidak di-cache.
Kode sampel berikut menunjukkan cara melanjutkan eksekusi ruleset yang dihentikan:
// Assert facts into working memory of the rules engine instance.
RuleEngine.Assert(facts);
// Execute the ruleset.
RuleEngine.Execute();
// The ruleset invokes the Halt method when executing actions.
// Control returns here when the Halt function is called.
// When engine halts, do the following tasks.
// Add your code here.
// Resume the halted rules engine execution.
RuleEngine.Execute();
// Retract or remove facts from working memory in the rules engine.
RuleEngine.Retract(facts);
Fitur penarikan kembali
Untuk menghapus objek dari set aturan dan dari memori kerja mesin aturan, gunakan fungsi Cabut di Microsoft Rules Composer.
Menarik kembali objek .NET
Di jendela RuleSet Explorer , temukan dan pilih aturan yang Anda inginkan.
Di panel THEN , di bawah Tindakan, tambahkan fungsi bawaan Tarik sebagai tindakan.
Di jendela Facts Explorer , pilih Kelas .NET.
Dari tab Kelas .NET, seret kelas yang Anda inginkan, bukan assembly atau metode, ke dalam argumen untuk parameter Retract .
Jika Anda menyeret metode ke fungsi Retract, mesin mencoba menghapus objek yang dikembalikan oleh metode tersebut.
Mencabut objek .NET memiliki dampak berikut:
Tindakan pada agenda yang menggunakan objek dihapus dari agenda.
Catatan
Tindakan lain yang lebih tinggi pada agenda mungkin sudah dijalankan sebelum Anda menggunakan fungsi Retract .
Aturan yang menggunakan objek dalam predikat akan mengeluarkan tindakan dari agenda, jika ada tindakan yang terdaftar dalam agenda.
Mesin tidak lagi mengevaluasi objek.
Mencabut satu atau beberapa entitas TypedXmlDocument
Anda dapat menarik kembali entitas TypedXmlDocument asli yang dimasukkan ke dalam mesin aturan, atau Anda juga dapat mencabut salah satu entitas turunan TypedXmlDocument yang dibuat dari entitas XmlDocument induk.
Misalkan Anda memiliki contoh XML berikut:
<order>
<orderline customer="Joe" linenumber="001">
<product name="router" quantity="10" cost="550" />
</orderline>
<orderline customer="Jane" linenumber="002">
<product name="switch" quantity="1" cost="300" />
</orderline>
</order>
Anda dapat menarik kembali entitas TypedXmlDocument yang terkait dengan objek pesanan, atau Anda dapat mencabut satu atau kedua entitas TypedXmlDocument yang terkait dengan objek orderline. Semua entitas TypedXmlDocument dikaitkan dengan entitas TypedXmlDocument tingkat atas yang awalnya dinyatakan, bukan dengan entitas TypedXmlDocument yang muncul di atas node TypedXmlDocument tingkat atas dalam hierarki pohon XML.
Misalnya, produk adalah entitas TypedXmlDocument di bawah objek orderline dan dikaitkan dengan entitas TypedXmlDocument untuk pesanan, bukan entitas TypedXmlDocument untuk orderline. Dalam kebanyakan kasus, perbedaan ini tidak penting. Namun, jika Anda mencabut objek pesanan, garis pesanan dan produk juga dicabut. Jika Anda mencabut objek orderline, hanya objek orderline yang dicabut, bukan objek produk.
Mesin hanya bekerja dengan dan melacak instans objek, yang merupakan instans TypedXmlDocument , yang dibuat mesin saat entitas TypedXmlDocument awalnya ditegaskan. Jika Anda membuat simpul tambahan, seperti simpul saudara untuk simpul yang dipilih melalui selektor dalam aturan kumpulan, simpul ini tidak dievaluasi dalam kumpulan aturan kecuali entitas TypedXmlDocument dibuat dan dinyatakan untuk mereka. Jika Anda menegaskan instans baru TypedXmlDocument tingkat bawah ini, mesin akan mengevaluasi instans tersebut dalam aturan, tetapi entitas TypedXmlDocument tingkat atas tidak memiliki pengetahuan tentang instans tersebut. Ketika TypedXmlDocument tingkat tertinggi dicabut, entitas TypedXmlDocument baru yang ditegaskan secara independen tidak dicabut secara otomatis. Akibatnya, jika simpul baru dibuat, lakukan Retract dan Reassert pada XmlDocument lengkap, yang merupakan langkah umum dan paling mudah untuk diambil.
Kelas TypedXmlDocument menyediakan metode berguna yang dapat Anda panggil dalam anggota .NET kustom sebagai bagian dari tindakan. Metode ini mencakup kemampuan untuk mendapatkan XmlNode yang terkait dengan TypedXmlDocument atau TypedXmlDocument induk.
Menarik kembali entitas TypedXmlDocument tingkat atas
Di jendela RuleSet Explorer , temukan dan pilih aturan yang Anda inginkan.
Di panel THEN , di bawah Tindakan, tambahkan fungsi bawaan Tarik sebagai tindakan.
Di jendela Facts Explorer , dan pilih Skema XML.
Dari tab XML Schemas, seret simpul tingkat atas untuk skema ke dalam argumen fungsi Retract.
Simpul atas ini berakhir di ekstensi .xsd dan mewakili simpul akar dokumen, bukan simpul elemen dokumen. Simpul memiliki selektor / yang mengacu pada TypedXmlDocument awal. Saat Anda mencabut TypedXmlDocument induk, semua entitas turunan TypedXmlDocument yang terkait dengan TypedXmlDocument dihapus dari memori kerja, termasuk semua entitas TypedXmlDocument yang dibuat dengan memanggil fungsi Assert, berdasarkan pemilih yang digunakan dalam ruleset.
Mencabut entitas anak TypedXmlDocument
Di jendela RuleSet Explorer , temukan dan pilih aturan yang Anda inginkan.
Di panel THEN , di bawah Tindakan, tambahkan fungsi bawaan Tarik sebagai tindakan.
Di jendela Facts Explorer , dan pilih Skema XML.
Dari tab Skema XML, seret simpul anak ke dalam argumen untuk fungsi Retract.
Fungsi RetractByType
Untuk menghapus semua objek dengan jenis yang ditentukan dari memori kerja mesin aturan, gunakan fungsi RetractByType di Microsoft Rules Composer. Fungsi ini berbeda dari fungsi Cabut , yang hanya menghapus item tertentu dengan jenis tertentu.
Mengambil kembali semua objek .NET dengan jenis tertentu
Di jendela RuleSet Explorer , temukan dan pilih aturan yang Anda inginkan.
Di panel THEN , di bawah Tindakan, tambahkan fungsi bawaan RetractByType sebagai tindakan.
Di jendela Facts Explorer , pilih Kelas .NET.
Dari tab Kelas .NET, seret kelas ke dalam argumen untuk fungsi RetractByType .
Menarik kembali semua entitas TypedXmlDocument dengan jenis tertentu
RetractByType menghapus semua entitas TypedXmlDocument dengan DocumentType.Selector yang sama.
Di jendela RuleSet Explorer , temukan dan pilih aturan yang Anda inginkan.
Di panel THEN , di bawah Tindakan, tambahkan fungsi bawaan RetractByType sebagai tindakan.
Di jendela Facts Explorer , pilih Skema XML.
Dari tab Skema XML, seret simpul yang sesuai ke fungsi RetractByType .
Konsisten dengan fungsi Cabut, jika Anda menggunakan fungsi RetractByType pada simpul akar dokumen, tindakan ini tidak hanya mencabut semua entitas TypedXmlDocument yang ditegaskan dengan DocumentType tersebut, tetapi juga semua entitas TypedXmlDocument turunan, atau simpul XmlNode dalam hierarki pohon, yang terkait dengan entitas TypedXmlDocument induk tersebut.
Fungsi penegasan ulang
Untuk memanggil fungsi Assert pada objek yang sudah ada di memori kerja mesin, gunakan fungsi Penetapan Ulang di Microsoft Rules Composer. Perilaku ini setara dengan mengeluarkan perintah Cabut untuk objek, diikuti oleh perintah Assert .
Misalnya, jika Anda menggunakan fungsi Reassert pada objek .NET, mesin aturan mengambil langkah-langkah berikut:
Menarik kembali objek .NET dari memori kerja.
Hapus tindakan apa pun pada agenda untuk aturan yang menggunakan objek dalam predikat atau tindakan.
Tegaskan objek .NET kembali ke memori kerja dan evaluasi sebagai objek yang baru ditegaskan.
Mengevaluasi ulang aturan apa pun yang menggunakan objek dalam predikat dan menambahkan tindakan aturan tersebut ke agenda yang sesuai.
Tambahkan ulang tindakan ke agenda untuk aturan apa pun yang telah dievaluasi sebagai true dan hanya menggunakan objek dalam tindakan mereka.
Menegaskan ulang objek .NET
Di jendela RuleSet Explorer , temukan dan pilih aturan yang Anda inginkan.
Di panel THEN , di bawah Tindakan, tambahkan fungsi bawaan Reassert sebagai tindakan.
Di jendela Facts Explorer , pilih Kelas .NET.
Dari tab .NET Classes , seret kelas ke dalam argumen untuk fungsi Reassert .
Menegaskan ulang entitas TypedXmlDocument
Di jendela RuleSet Explorer , temukan dan pilih aturan yang Anda inginkan.
Di panel THEN , di bawah Tindakan, tambahkan fungsi bawaan Reassert sebagai tindakan.
Di jendela Facts Explorer , pilih Skema XML.
Dari tab Skema XML, seret simpul entitas yang ingin Anda gunakan sebagai argumen dalam fungsi Reassert.
Jika Anda menetapkan ulang entitas TypedXmlDocument tingkat atas, entitas turunan TypedXmlDocument, yang dibuat ketika entitas TypedXmlDocument tingkat atas pertama kali ditegaskan, dapat bertingkah berbeda, tergantung pada status setiap entitas turunan TypedXmlDocument.
Misalnya, jika entitas anak baru atau yang sudah ada "kotor", yang berarti bahwa setidaknya satu bidang diubah dalam set aturan menggunakan tindakan, fungsi Assert atau fungsi Penegasan ulang dilakukan pada anak tersebut. Setiap anak yang ada yang tidak kotor tetap dalam memori kerja.
Catatan
Simpul tidak ditandai kotor dari operasi eksternal yang tidak terdeteksi oleh mesin pengolah, misalnya, aplikasi eksternal secara otomatis melalui pemrograman menambahkan, menghapus, atau memperbarui simpul tersebut.
Contoh berikut menunjukkan skenario yang disederhanakan yang menjelaskan perilaku entitas anak saat entitas induknya ditetapkan ulang. Misalkan Anda memiliki entitas TypedXmlDocument berikut dalam memori kerja: Induk, Anak1, Anak2, dan Anak3.
- Induk adalah entitas TypedXmlDocument level tertinggi.
- Setiap anak berisi sebuah bidang bernama ExampleField di mana nilainya diatur menjadi 1, contohnya
Child1.ExampleField= 1.
Misalkan tindakan aturan melakukan operasi berikut terhadap entitas anak:
- Nilai ExampleField untuk Child2 diperbarui dari 1 ke 0.
- Kode pengguna menghapus Child3.
- Kode pengguna menambahkan entitas anak TypedXmlDocument baru bernama NewChild ke Parent.
Contoh berikut menunjukkan representasi objek baru dalam memori kerja:
Parent
Child1 // Where Child1.ExampleField = 1
Child2 // Where Child2.ExampleField = 0
NewChild
Sekarang, misalkan Anda menegaskan ulang entitas Induk, yang menghasilkan perilaku berikut dari entitas Anak:
- Child2 dipertahankan kembali karena sekarang kotor setelah bidangnya diperbarui.
- Child3 dicabut dari memori kerja.
- NewChild dimasukkan ke dalam memori aktif.
- Child1 tetap tidak berubah dalam memori kerja karena tidak diperbarui sebelum Induk ditetapkan ulang.
Memperbarui fungsi
Untuk menetapkan ulang objek ke dalam mesin aturan untuk evaluasi ulang, berdasarkan data dan status baru, gunakan fungsi Pembaruan di Microsoft Rules Composer. Objek dapat memiliki jenis kelas .NET atau jenis TypedXmlDocument . Anda juga dapat menggunakan fungsi Pembaruan untuk meningkatkan performa mesin dan mencegah skenario perulangan tanpa akhir.
Penting
Jumlah perulangan maksimum default untuk reevaluasi aturan adalah 2^32, jadi untuk aturan tertentu, eksekusi ruleset mungkin berlangsung lama. Untuk mengurangi jumlah perulangan, ubah properti Kedalaman Maksimum Eksekusi Loop pada versi ruleset.
Memperbarui objek .NET
Di jendela RuleSet Explorer , temukan dan pilih aturan yang Anda inginkan.
Di panel THEN , di bawah Tindakan, tambahkan fungsi bawaan Pembaruan sebagai tindakan.
Di jendela Facts Explorer , pilih Kelas .NET.
Dari tab Kelas .NET, seret kelas ke dalam argumen untuk fungsi Perbarui .
Biasanya, Anda menggunakan Assert untuk menempatkan objek baru dalam memori kerja mesin aturan, dan menggunakan Pembaruan untuk memperbarui objek yang sudah ada dalam memori kerja. Ketika Anda menegaskan objek baru sebagai fakta, mesin memvalidasi kembali kondisi dalam semua aturan. Namun, ketika sebuah objek yang ada diperbarui, mesin hanya meninjau ulang kondisi yang menggunakan fakta terbaru dan menambahkan tindakan ke agenda jika kondisi tersebut bernilai benar.
Misalnya, Anda memiliki aturan berikut dan objek bernama ItemA dan ItemB sudah ada dalam memori kerja.
Aturan 1 mengevaluasi properti Id di ItemA, mengatur properti Id pada ItemB, lalu menetapkan ulang ItemB setelah perubahan. Ketika ItemB ditetapkan ulang, mesin memperlakukan ItemB sebagai objek baru, dan mesin mengevaluasi ulang semua aturan yang menggunakan ItemB dalam predikat atau tindakan. Perilaku ini memastikan bahwa mesin memvalidasi ulang Aturan 2 terhadap nilai baru dalam ItemB.Id sebagaimana diatur dalam Aturan 1.
Aturan 1
IF ItemA.Id == 1 THEN ItemB.Id = 2 Assert(ItemB)Aturan 2 mungkin gagal pada evaluasi pertama, tetapi menjadi benar selama evaluasi kedua.
Aturan 2
IF ItemB.Id == 2 THEN ItemB.Value = 100
Kemampuan untuk menassert ulang objek ke dalam memori kerja memberi Anda kontrol eksplisit atas perilaku dalam skenario rantai maju. Namun, contoh ini mengungkapkan efek samping dari penetapan ulang di mana Aturan 1 juga dievaluasi ulang. Dengan ItemA.Id tidak berubah, Aturan 1 kembali mengevaluasi ke true, dan tindakan Assert(ItemB) diaktifkan lagi. Akibatnya, aturan menciptakan situasi perulangan tanpa akhir.
Mencegah perulangan tanpa akhir
Anda harus dapat menegaskan ulang objek tanpa membuat perulangan tanpa akhir. Untuk menghindari skenario tersebut , Anda dapat menggunakan fungsi Perbarui . Seperti fungsi Reassert, fungsi Pembaruan melakukan fungsi Cabut dan Tegaskan pada instans objek terkait yang diubah oleh tindakan aturan, tetapi dengan perbedaan utama berikut:
Pada agenda, tindakan untuk aturan tetap berada di agenda ketika jenis instans hanya digunakan dalam tindakan, bukan predikat.
Aturan yang hanya menggunakan tipe instans dalam tindakan tidak ditinjau ulang.
Akibatnya, aturan yang menggunakan tipe instans, baik hanya dalam predikat atau dalam predikat dan tindakan, dievaluasi ulang, dan tindakan aturan ditambahkan ke agenda sesuai kebutuhan.
Dengan mengubah contoh sebelumnya untuk menggunakan fungsi Pembaruan , Anda dapat memastikan bahwa mesin hanya mengevaluasi ulang Aturan 2 karena kondisi untuk Aturan 2 menggunakan ItemB. Mesin tidak mengevaluasi ulang Aturan 1 karena ItemB hanya digunakan dalam tindakan untuk Aturan 1*, sehingga 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
Meskipun menggunakan fungsi Pembaruan dengan cara ini, kemungkinan masih ada untuk membuat skenario perulangan. Misalnya, pertimbangkan aturan berikut:
IF ItemA.Id == 1
THEN ItemA.Value = 20
Update(ItemA)
Predikat menggunakan ItemA, sehingga mesin mengevaluasi ulang aturan saat Pembaruan dipanggil pada ItemA. Jika nilai untuk ItemA.Id tidak diubah di tempat lain, Aturan 1 terus mengevaluasi sebagai benar, yang menyebabkan panggilan Pembaruan lagi pada ItemA.
Sebagai perancang aturan, Anda harus memastikan untuk menghindari pembuatan skenario perulangan tersebut. Pendekatan yang tepat untuk memperbaiki masalah ini berbeda berdasarkan sifat aturan.
Contoh berikut menunjukkan cara sederhana untuk menyelesaikan masalah dalam contoh sebelumnya dengan menambahkan pemeriksaan pada ItemA.Value yang mencegah aturan dievaluasi sebagai benar lagi setelah tindakan aturan dijalankan pertama kali.
IF ItemA.Id == 1 and ItemA.Value != 20
THEN ItemA.Value = 20
Update(ItemA)
Memperbarui entitas TypedXmlDocument
Di jendela RuleSet Explorer , temukan dan pilih aturan yang Anda inginkan.
Di panel THEN , di bawah Tindakan, tambahkan fungsi bawaan Pembaruan sebagai tindakan.
Di jendela Facts Explorer , pilih Skema XML.
Dari tab Skema XML, seret simpul entitas yang Anda inginkan ke dalam argumen pada fungsi Perbarui.
Misalnya, Anda memiliki aturan berikut:
Aturan 1 mengevaluasi jumlah total item dalam pesan pesanan pembelian.
IF 1 == 1 THEN ProcessPO.Order:/Order/Items/TotalCount = (ProcessPO.Order:/Order/Items/TotalCount + ProcessPO:/Order/Items/Item/Count)Aturan 2 menetapkan status menjadi "Perlu persetujuan" jika jumlah total lebih besar dari atau sama dengan 10.
Aturan 2
IF ProcessPO.Order:/Order/Items/TotalCount >= 10 THEN ProcessPO.Order:/Order/Status = "Needs approval"
Jika Anda meneruskan pesan order pembelian berikut sebagai input ke set aturan ini, Anda melihat bahwa status tidak disetel ke "Perlu persetujuan", meskipun TotalCount adalah 14. Perilaku ini terjadi karena Aturan 2 dievaluasi hanya pada awal saat nilai TotalCount adalah 0. Aturan tidak dievaluasi setiap kali TotalCount diperbarui.
<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>
Agar mesin mengevaluasi ulang kondisi setiap kali ketika TotalCount diperbarui, Anda harus memanggil fungsi Pembaruan pada simpul induk (Item) untuk simpul yang diperbarui (TotalCount). Jika Anda mengubah Aturan 1 sebagai berikut, dan menguji aturan sekali lagi, bidang Status diatur ke "Perlu persetujuan":
Aturan 1 (diperbarui)
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)