مشاركة عبر


إضافة وظائف التحكم في الإجراءات لتحسين تنفيذ القواعد باستخدام Microsoft Rules Composer

ينطبق على: Azure Logic Apps (قياسي)

يصف هذا الدليل كيفية تحسين تنفيذ القواعد عن طريق إضافة وظائف التحكم إلى الإجراءات في القواعد باستخدام Microsoft Rules Composer. تساعد وظائف التحكم التطبيق أو مجموعة القواعد على التحكم في الحقائق في ذاكرة عمل محرك القواعد. تتضمن هذه الدالات وظائف Assert و Clear و Halt و RetractByType و RetractByType و Reassert و Update لكائن .NET و كيانات TypedXmlDocument التي يمكنك استخدامها كحقائق. وجود الحقائق في ذاكرة العمل يدفع الشروط التي يقيمها المحرك والإجراءات التي تنفذ.

المتطلبات الأساسية

  • قم بتنزيل Microsoft Rules Composer وتثبيته.

  • ملف XML الذي يحتوي على مجموعة القواعد التي تريد العمل عليها.

    لإضافة حقائق، حدد قيمها في مستندات XML التي تشير إليها من نافذة مستكشف RuleSet. أو يمكنك استخدام منشئ الحقائق لتوفير محرك القواعد الخاص بك مع صفيف يحتوي على كائنات .NET كحقائق. لمزيد من المعلومات، راجع إنشاء منشئي الحقائق والمستردين.

الدالة Assert

لإضافة مثيلات كائن إلى ذاكرة عمل محرك القواعد، استخدم الدالة Assert في Microsoft Rules Composer. يعالج المحرك كل مثيل كائن وفقا للشروط والإجراءات المكتوبة مقابل نوع المثيل باستخدام مراحل إجراء حل تعارض المطابقة.

يلخص الجدول التالي سلوك الدالة Assert للكيانات وأنواع المثيلات المؤكدة المدعومة، بما في ذلك عدد المثيلات الناتجة التي تم إنشاؤها في المحرك لكل كيان مؤكد والنوع المطبق على كل مثيل لتحديد الهوية.

الكيان عدد المثيلات المؤكدة نوع المثيل
كائن .NET 1 (الكائن نفسه) فئة .NET مؤهلة بالكامل
TypedXmlDocument 1-N TypedXmlDocument(s): استنادا إلى روابط المحدد التي تم إنشاؤها ومحتوى المستند DocumentType.Selector

تأكيد كائن .NET

يدعم محرك القواعد في الأصل الأنواع والعناصر العددية الأساسية ل .NET للأنوع المرجعية. معالجة كائن .NET المؤكدة هي الأكثر وضوحا من أنواع المعالجة.

في Microsoft Rules Composer، يمكنك تأكيد كائن .NET من داخل قاعدة.

  1. في Microsoft Rules Composer، قم بتحميل ملف XML الذي يحتوي على مخزن القواعد الذي تريد العمل عليه.

  2. في نافذة RuleSet Explorer ، ابحث عن القاعدة التي تريدها وحددها.

  3. في جزء THEN، ضمن Actions، أضف الدالة Assert المضمنة كإجراء.

  4. في نافذة مستكشف الحقائق، حدد فئات .NET.

  5. من علامة التبويب فئات .NET، اسحب أسلوب الدالة الإنشائية للكائن الذي تريده إلى الوسيطة في الإجراء تأكيد.

    يترجم Microsoft Rules Composer أسلوب الدالة الإنشائية إلى استدعاء CreateObject في تعريف القاعدة.

    إشعار

    على الرغم من أن محرك القواعد يحتوي على دالة CreateObject ، إلا أن الدالة لا تظهر كدالة منفصلة في Microsoft Rules Composer.

يتم تأكيد كل كائن في ذاكرة العمل كمثيل كائن منفصل، ما يعني أن كل دالة تقييم تشير إلى نوع الكائن، مثل IF Object.Property = 1، تحلل المثيل. يتوفر المثيل أيضا لإجراءات القاعدة التي تشير إلى النوع، استنادا إلى نتائج شروط القاعدة.

على سبيل المثال، افترض أن لديك القواعد التالية:

القاعدة 1

IF A.Value = 1
THEN A.Status = "good"

القاعدة 2

IF B.Value = 1
THEN A.Status = "good"

في القاعدة 1، يتم تحديث خاصية الحالة الخاصة بالمثيلات A بقيمة 1 فقط. ومع ذلك، في القاعدة 2، إذا تم تقييم الشرط إلى صحيح، يتم تحديث حالة جميع المثيلات A . في الواقع، إذا كان هناك مثيلات B متعددة، يتم تحديث مثيلات A في كل مرة يتم فيها تقييم الشرط إلى true لمثيل B.

تأكيد كيان TypedXmlDocument

في Microsoft Rules Composer، يمكنك تأكيد كيان TypedXmlDocument من داخل قاعدة.

  1. في نافذة RuleSet Explorer ، ابحث عن القاعدة التي تريدها وحددها.

  2. في جزء THEN، ضمن Actions، أضف الدالة Assert المضمنة كإجراء.

  3. في نافذة مستكشف الحقائق، حدد مخططات XML.

  4. من علامة التبويب مخططات XML، اسحب العقدة التي تريدها إلى الوسيطة في الإجراء تأكيد.

مستندات XML عبارة عن نص بشكل أساسي، ولكن قد تكون قيم الحقول أي نوع، والتي تستند إلى النوع المحدد عند إنشاء القاعدة. الحقول هي تعبيرات XPath، لذلك قد ترجع مجموعة عقدة، ما يعني أنه يتم استخدام العنصر الأول في المجموعة كقيمة.

عند تأكيد كيان TypedXmlDocument كحقيقة، يقوم محرك القواعد بإنشاء مثيلات فرعية TypedXmlDocument، استنادا إلى المحددات المعرفة في القاعدة. يمكنك التفكير في المحددات كطريقة لعزل العقد في مستند XML، والحقول على أنها تحدد عناصر معينة داخل المحدد. يجمع محرك القواعد جميع الحقول داخل محدد واحد ككائن.

المحددات هي أيضا تعبيرات XPath. في مستكشف الحقائق، عند تحديد عقدة في علامة التبويب مخططات XML، يقوم Microsoft Rules Composer تلقائيا بتعبئة خاصية محدد XPath لكافة العقد وخاصية حقل XPath لأي عقدة لا تحتوي على عقد تابعة. بدلا من ذلك، يمكنك إدخال تعبيرات XPath الخاصة بك لمحدد XPath وحقل XPath إذا لزم الأمر. إذا تطابق المحدد مع أجزاء متعددة في مستند XML، يتم تأكيد كائنات متعددة من هذا النوع في ذاكرة عمل محرك القواعد أو التراجع منها.

يمكنك استخدام محددات متعددة داخل المستند نفسه. وبهذه الطريقة، يمكنك عرض أجزاء مختلفة من المستند، على سبيل المثال، افترض أن أحد المقاطع هو الطلب ويحتوي قسم آخر على عنوان الشحن. ومع ذلك، ضع في اعتبارك أن الكائنات التي تم إنشاؤها يتم تعريفها بواسطة سلسلة XPath التي أنشأتها. إذا كنت تستخدم تعبير XPath مختلفا، تكون النتيجة كيان TypedXmlDocument فريدا، حتى إذا تم حل التعبير إلى نفس العقدة.

على سبيل المثال، افترض أن لديك XML التالي:

<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>

إذا كنت تستخدم المحدد /root/order، أو الترتيب، تتم إضافة العناصر التالية إلى ذاكرة عمل المحرك:

الكائن 1

<order customer="Joe">
    <item name="router" quantity="10" cost="550" />
    <item name="switch" quantity="3" cost="300" />
</order>

الكائن 2

<order customer="Jane">
    <item name="switch" quantity="1" cost="300" />
    <item name="cable" quantity="23" cost="9.99" />
</order>

داخل كل محدد، تشير XPaths إلى الحقول الفردية. لذلك، إذا كنت تستخدم المحدد /root/order/item أو order/item أو العنصر، تتم إضافة العناصر التالية إلى ذاكرة عمل المحرك مع عنصرين ل Joe والعنصرين ل Jane:

<root>
    <order customer="Joe">
    </order>
    <order customer="Jane">
    </order>
</root>

يمكن لكل كائن الوصول إلى ثلاثة حقول: @name @quantity @cost. يمكنك الرجوع إلى الحقول الأصل لأن الكائن هو مرجع إلى المستند الأصلي، على سبيل المثال، .. /@customer.

خلف الكواليس، يمكن لمشغل القواعد تحويل قيمة حقل نص إلى أي من الأنواع المدعومة من خلال الدالة XmlConvert . يمكنك تحديد هذا الخيار عن طريق تعيين النوع في Microsoft Rules Composer. إذا لم يكن التحويل ممكنا، يطرح المحرك استثناء. يمكنك استرداد الأنواع المنطقية والمزدوجة فقط كنوع كل منها، إما سلاسل أو كائنات.

مسح الدالة

لإعادة تعيين ذاكرة العمل وجدول الأعمال لمثيل محرك القواعد، استخدم الدالة Clear في Microsoft Rules Composer. لمزيد من المعلومات حول ذاكرة العمل وجدول الأعمال، راجع تحسين محرك القواعد.

إعادة تعيين ذاكرة العمل وجدول الأعمال لمحرك القواعد

  1. في نافذة RuleSet Explorer ، ابحث عن القاعدة وحددها حيث تريد مسح ذاكرة العمل وجدول الأعمال لمحرك القواعد.

  2. في جزء THEN، ضمن Actions، أضف الدالة Clear المضمنة كإجراء.

    لا تأخذ الدالة Clear أي وسيطات.

إيقاف الدالة

لإيقاف التنفيذ الحالي بواسطة مشغل القواعد، استخدم الدالة Stop في Microsoft Rules Composer.

إيقاف تنفيذ مجموعة القواعد

  1. في نافذة RuleSet Explorer ، ابحث عن القاعدة وحددها حيث تريد إيقاف تنفيذ مجموعة القواعد.

  2. في جزء THEN، ضمن Actions، أضف الدالة Halt المضمنة كإجراء.

تأخذ الدالة Halt وسيطة منطقية واحدة. إذا حددت القيمة على أنها true، يقوم محرك القواعد بمسح جدول الأعمال الذي يحتوي على قواعد المرشح المعلقة.

الأسلوب Ruleset.Execute هو برنامج تضمين حول الأسلوب RuleEngine.Execute، ويستخدم التعليمات البرمجية المشابهة للتعليمات البرمجية التالية:

RuleEngine.Assert(facts);
RuleEngine.Execute();
RuleEngine.Retract(facts);

إذا كنت تستخدم الأسلوب Ruleset.Execute لتنفيذ مجموعة قواعد، يقوم محرك القواعد بإرجاع عنصر التحكم إلى الأسلوب Ruleset.Execute عند تنفيذ الدالة Halt . يسحب الأسلوب Ruleset.Execute الحقائق ويعيد عنصر التحكم إلى المتصل. في هذه الحالة، لا يمكن استئناف تنفيذ مجموعة القواعد المتوقفة.

ومع ذلك، إذا كنت تستخدم الأسلوب RuleEngine.Execute مباشرة لتنفيذ مجموعة القواعد، يمكنك استئناف تنفيذ مجموعة القواعد المتوقفة مع تشغيل القاعدة المعلقة التالية عن طريق استدعاء RuleEngine.Execute مرة أخرى، شريطة ألا تتراجع عن أي كائنات مطلوبة بين الاستدعاءين.

إشعار

يقوم الأسلوب Ruleset.Execute بالتخزين المؤقت لمثيلات محرك القواعد للحصول على أداء أفضل. إذا كنت تستخدم أسلوب RuleEngine.Execute مباشرة، فلن يتم تخزين مثيلات محرك القواعد مؤقتا.

يوضح نموذج التعليمات البرمجية التالي كيفية استئناف تنفيذ مجموعة القواعد المتوقفة:

// 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);

التراجع عن الدالة

لإزالة الكائنات من مجموعة قواعد ومن ذاكرة عمل محرك القواعد، استخدم الدالة Retract في Microsoft Rules Composer.

التراجع عن كائن .NET

  1. في نافذة RuleSet Explorer ، ابحث عن القاعدة التي تريدها وحددها.

  2. في جزء THEN، ضمن Actions، أضف الدالة Retract المضمنة كإجراء.

  3. في نافذة مستكشف الحقائق، حدد فئات .NET.

  4. من علامة التبويب فئات .NET، اسحب الفئة التي تريدها، وليس التجميع أو الأسلوب، إلى الوسيطة للمعلمة Retract.

    إذا قمت بسحب أسلوب إلى الدالة Retract ، يحاول المحرك سحب الكائن الذي تم إرجاعه بواسطة الأسلوب .

يكون لسحب كائن .NET التأثير التالي:

  • تتم إزالة الإجراءات على جدول الأعمال التي تستخدم الكائنات من جدول الأعمال.

    إشعار

    قد تكون الإجراءات الأخرى الأعلى على جدول الأعمال قد نفذت بالفعل قبل استخدام الدالة Retract .

  • القواعد التي تستخدم العنصر في دالة تقييم تتم إزالة إجراءاتها من جدول الأعمال، إذا كانت هناك أي إجراءات على جدول الأعمال.

  • لم يعد المحرك يقيم الكائن.

التراجع عن كيان أو كيانات TypedXmlDocument

يمكنك التراجع عن كيان TypedXmlDocument الأصلي الذي تم تأكيده في محرك القواعد، أو يمكنك التراجع عن أحد الكيانات التابعة TypedXmlDocument التي تم إنشاؤها من كيان XmlDocument الأصل.

لنفترض أن لديك مثال XML التالي:

<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>

يمكنك إما التراجع عن الكيان TypedXmlDocument المقترن بكائن أمر ، أو يمكنك التراجع عن واحد أو كل من كيانات TypedXmlDocument المقترنة بكائن سطر الأوامر. ترتبط كافة كيانات TypedXmlDocument بالكيان TypedXmlDocument من المستوى الأعلى الذي تم تأكيده في الأصل، وليس مع الكيان TypedXmlDocument الذي يظهر أعلى عقدة TypedXmlDocument ذات المستوى الأعلى في التسلسل الهرمي لشجرة XML.

على سبيل المثال، المنتج هو كيان TypedXmlDocument أسفل كائن سطر الطلب ويقترن بالكيان TypedXmlDocument للطلب، وليس الكيان TypedXmlDocument ل orderline. في معظم الحالات، هذا التمييز ليس مهما. ومع ذلك، إذا قمت بسحب كائن الطلب ، يتم أيضا التراجع عن سطر الطلب وعناصر المنتج . إذا قمت بسحب الكائن orderline ، يتم فقط التراجع عن هذا الكائن، وليس عنصر المنتج .

يعمل المحرك فقط مع ويتعقب مثيلات الكائن، وهي مثيلات TypedXmlDocument ، التي أنشأها المحرك عند تأكيد كيان TypedXmlDocument في البداية. إذا قمت بإنشاء عقد إضافية، مثل العقد التابعة لعقدة تم تحديدها من خلال محدد في مجموعة القواعد، فلن يتم تقييم هذه العقد في القواعد ما لم يتم إنشاء كيانات TypedXmlDocument وتأكيدها لها. إذا قمت بتأكيد هذه المثيلات TypedXmlDocument الجديدة ذات المستوى الأدنى، يقوم المحرك بتقييم المثيلات في القواعد، ولكن كيان TypedXmlDocument ذو المستوى الأعلى ليس لديه معرفة بها. عند التراجع عن TypedXmlDocument من المستوى الأعلى، لا يتم التراجع تلقائيا عن كيانات TypedXmlDocument الجديدة والمؤكدة بشكل مستقل. ونتيجة لذلك، إذا تم إنشاء عقد جديدة، فنفذ Retract و Reassert على XmlDocument الكامل، وهي الخطوة النموذجية والأكثر وضوحا التي يجب اتخاذها.

توفر فئة TypedXmlDocument أساليب مفيدة يمكنك استدعاءها داخل عضو .NET مخصص كجزء من إجراء. تتضمن هذه الأساليب القدرة على الحصول على XmlNode المقترنة ب TypedXmlDocument أو TypedXmlDocument الأصل.

التراجع عن كيان TypedXmlDocument ذو المستوى الأعلى

  1. في نافذة RuleSet Explorer ، ابحث عن القاعدة التي تريدها وحددها.

  2. في جزء THEN، ضمن Actions، أضف الدالة Retract المضمنة كإجراء.

  3. في نافذة مستكشف الحقائق، وحدد مخططات XML.

  4. من علامة التبويب مخططات XML، اسحب عقدة المستوى الأعلى للمخطط إلى الوسيطة للدالة Retract.

    تنتهي هذه العقدة العلوية في ملحق .xsd وتمثل عقدة جذر المستند، وليس عقدة عنصر المستند. تحتوي العقدة على محدد / يشير إلى TypedXmlDocument الأولي. عند سحب TypedXmlDocument الأصل، تتم إزالة كافة الكيانات التابعة TypedXmlDocument المقترنة ب TypedXmlDocument من ذاكرة العمل، بما في ذلك كافة كيانات TypedXmlDocument التي تم إنشاؤها عن طريق استدعاء الدالة Assert، استنادا إلى المحددات المستخدمة في مجموعة القواعد.

التراجع عن كيان TypedXmlDocument تابع

  1. في نافذة RuleSet Explorer ، ابحث عن القاعدة التي تريدها وحددها.

  2. في جزء THEN، ضمن Actions، أضف الدالة Retract المضمنة كإجراء.

  3. في نافذة مستكشف الحقائق، وحدد مخططات XML.

  4. من علامة التبويب مخططات XML، اسحب العقدة التابعة إلى الوسيطة للدالة Retract.

الدالة RetractByType

لإزالة كافة الكائنات ذات النوع المحدد من ذاكرة عمل محرك القواعد، استخدم الدالة RetractByType في Microsoft Rules Composer. تختلف هذه الدالة عن الدالة Retract ، التي تزيل عناصر معينة فقط بنوع معين.

اسحب جميع كائنات .NET بنوع معين

  1. في نافذة RuleSet Explorer ، ابحث عن القاعدة التي تريدها وحددها.

  2. في جزء THEN، ضمن Actions، أضف الدالة RetractByType المضمنة كإجراء.

  3. في نافذة مستكشف الحقائق، حدد فئات .NET.

  4. من علامة التبويب فئات .NET، اسحب الفئة إلى الوسيطة للدالة RetractByType.

التراجع عن كافة كيانات TypedXmlDocument بنوع معين

يزيل RetractByType كافة كيانات TypedXmlDocument بنفس DocumentType.Selector.

  1. في نافذة RuleSet Explorer ، ابحث عن القاعدة التي تريدها وحددها.

  2. في جزء THEN، ضمن Actions، أضف الدالة RetractByType المضمنة كإجراء.

  3. في نافذة مستكشف الحقائق، حدد مخططات XML.

  4. من علامة التبويب مخططات XML، اسحب العقدة المناسبة إلى الدالة RetractByType.

بما يتوافق مع دالة Retract، إذا كنت تستخدم الدالة RetractByType على عقدة جذر المستند، لا يسحب هذا الإجراء جميع كيانات TypedXmlDocument المؤكدة مع DocumentType هذا فحسب، ولكن أيضا جميع كيانات TypedXmlDocument التابعة، أو عقد XmlNode في التسلسل الهرمي الشجري، المقترنة بكيانات TypedXmlDocument الأصل هذه.

إعادة التأكيد على الدالة

لاستدعاء الدالة Assert على كائن موجود بالفعل في ذاكرة عمل المحرك، استخدم الدالة Reassert في Microsoft Rules Composer. السلوك يعادل إصدار أمر "Retract " للكائن، متبوعا بأمر "Assert ".

على سبيل المثال، إذا كنت تستخدم الدالة Reassert على كائن .NET، فإن محرك القواعد يتخذ الخطوات التالية:

  1. اسحب كائن .NET من ذاكرة العمل.

  2. قم بإزالة أي إجراءات على جدول الأعمال للقواعد التي تستخدم العنصر في دالة تقييم أو إجراء.

  3. قم بتأكيد كائن .NET مرة أخرى إلى ذاكرة العمل وتقييمه ككائن مؤكد حديثا.

  4. أعد تقييم أي قواعد تستخدم العنصر في دالة تقييم وأضف إجراءات هذه القواعد إلى جدول الأعمال حسب الاقتضاء.

  5. قراءة الإجراءات إلى جدول الأعمال لأي قواعد تم تقييمها مسبقا إلى true واستخدام العنصر فقط في إجراءاتها.

إعادة إدراج كائن .NET

  1. في نافذة RuleSet Explorer ، ابحث عن القاعدة التي تريدها وحددها.

  2. في جزء THEN، ضمن Actions، أضف الدالة Reassert المضمنة كإجراء.

  3. في نافذة مستكشف الحقائق، حدد فئات .NET.

  4. من علامة التبويب فئات .NET، اسحب الفئة إلى الوسيطة للدالة Reassert.

إعادة تأكيد كيان TypedXmlDocument

  1. في نافذة RuleSet Explorer ، ابحث عن القاعدة التي تريدها وحددها.

  2. في جزء THEN، ضمن Actions، أضف الدالة Reassert المضمنة كإجراء.

  3. في نافذة مستكشف الحقائق، حدد مخططات XML.

  4. من علامة التبويب مخططات XML، اسحب عقدة الكيان التي تريدها إلى الوسيطة في الدالة Reassert.

إذا قمت بإعادة تأكيد كيان TypedXmlDocument من المستوى الأعلى، يمكن أن تتصرف الكيانات التابعة TypedXmlDocument، التي تم إنشاؤها عند تأكيد كيان TypedXmlDocument من المستوى الأعلى لأول مرة، بشكل مختلف، اعتمادا على حالة كل كيان تابع TypedXmlDocument.

على سبيل المثال، إذا كان كيان تابع جديد أو موجود "قذرا"، ما يعني أنه تم تغيير حقل واحد على الأقل في مجموعة القواعد باستخدام إجراء، تنفيذ دالة تأكيد أو إعادة إدراج على هذا التابع. أي طفل موجود غير قذر يبقى في ذاكرة العمل.

إشعار

لا يتم وضع علامة على العقدة قذرة من العمليات الخارجية التي لا يعرفها المحرك، على سبيل المثال، يضيف تطبيق خارجي تلك العقدة أو يحذفها أو يحدثها برمجيا.

يوضح المثال التالي سيناريو مبسطا يصف سلوكيات الكيان التابع عند إعادة تأكيد الكيان الأصل. لنفترض أن لديك كيانات TypedXmlDocument التالية في ذاكرة العمل: Parent و Child1 و Child2 و Child3.

  • الأصل هو كيان TypedXmlDocument ذو المستوى الأعلى.
  • يحتوي كل طفل على حقل يسمى ExampleField حيث يتم تعيين القيمة إلى 1، على سبيل المثال، Child1.ExampleField = 1'.

لنفترض أن إجراء القاعدة ينفذ العمليات التالية على الكيانات التابعة:

  • يتم تحديث قيمة ExampleField ل Child2 من 1 إلى 0.
  • التعليمات البرمجية للمستخدم تحذف Child3.
  • تضيف التعليمة البرمجية للمستخدم كيانا فرعيا جديدا TypedXmlDocument يسمى NewChild إلى Parent.

يوضح المثال التالي التمثيل الجديد للكائنات في ذاكرة العمل:

Parent
Child1 // Where Child1.ExampleField = 1
Child2 // Where Child2.ExampleField = 0
NewChild

الآن، افترض أنك تعيد تأكيد الكيان الأصل ، مما يؤدي إلى سلوكيات الكيان التابع التالية:

  • يتم إعادة تأكيد Child2 لأنه أصبح الآن قذرا بعد تحديث حقله.
  • يتم التراجع عن Child3 من ذاكرة العمل.
  • تم تأكيد NewChild في ذاكرة العمل.
  • يظل Child1 دون تغيير في ذاكرة العمل لأنه لم يتم تحديثه قبل إعادة اعتماد الأصل .

وظيفة Update

لإعادة تعيين عنصر في محرك القواعد لإعادة التقييم، استنادا إلى البيانات والحالة الجديدة، استخدم الدالة Update في Microsoft Rules Composer. يمكن أن يكون للكائن نوع فئة .NET أو نوع TypedXmlDocument . يمكنك أيضا استخدام الدالة Update لتحسين أداء المحرك ومنع سيناريوهات التكرار الحلقي التي لا نهاية لها.

هام

الحد الأقصى الافتراضي لعدد التكرارات الحلقية لإعادة تقييم القواعد هو 2^32، لذلك بالنسبة لبعض القواعد، قد يستمر تنفيذ مجموعة القواعد لفترة طويلة. لتقليل عدد التكرارات الحلقية، قم بتغيير الخاصية Maximum Execution Loop Depth في إصدار مجموعة القواعد.

تحديث كائن .NET

  1. في نافذة RuleSet Explorer ، ابحث عن القاعدة التي تريدها وحددها.

  2. في جزء THEN، ضمن Actions، أضف الوظيفة المضمنة Update كإجراء.

  3. في نافذة مستكشف الحقائق، حدد فئات .NET.

  4. من علامة التبويب فئات .NET، اسحب الفئة إلى الوسيطة لدالة التحديث.

عادة ما تستخدم Assert لوضع كائن جديد في ذاكرة عمل محرك القواعد، واستخدام Update لتحديث كائن موجود بالفعل في ذاكرة العمل. عند تأكيد عنصر جديد كحقيقة، يعيد المحرك تقييم الشروط في جميع القواعد. ومع ذلك، عند تحديث كائن موجود، يعيد المحرك تقييم الشروط التي تستخدم الحقائق المحدثة فقط ويضيف إجراءات إلى جدول الأعمال، إذا تم تقييم هذه الشروط إلى true.

على سبيل المثال، افترض أن لديك القواعد التالية وأن الكائنات المسماة ItemA و ItemB موجودة بالفعل في ذاكرة العمل.

  • تقوم القاعدة 1 بتقييم خاصية المعرف في ItemA، وتعيين خاصية المعرف على ItemB، ثم إعادة تعيين ItemB بعد التغيير. عند إعادة تأكيد ItemB ، يعامل المحرك ItemB ككائن جديد، ويعيد المحرك تقييم جميع القواعد التي تستخدم ItemB في التقييمات أو الإجراءات. يتأكد هذا السلوك من أن المحرك يعيد تقييم القاعدة 2 مقابل القيمة الجديدة في ItemB.Id كما هو محدد في القاعدة 1.

    القاعدة 1

    IF ItemA.Id == 1
    THEN ItemB.Id = 2
    Assert(ItemB)
    
  • قد تفشل القاعدة 2 في التقييم الأول، ولكن يتم تقييمها إلى true أثناء التقييم الثاني.

    القاعدة 2

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

تمنحك القدرة على إعادة تعيين العناصر في ذاكرة العمل تحكما صريحا في السلوك في سيناريوهات التسلسل الأمامي. ومع ذلك، يكشف هذا المثال عن تأثير جانبي من إعادة التقييم حيث تتم إعادة تقييم القاعدة 1 أيضا. مع عدم تغيير ItemA.Id ، يتم تقييم القاعدة 1 مرة أخرى إلى true، ويتم تشغيل إجراء Assert(ItemB) مرة أخرى. ونتيجة لذلك، تنشئ القاعدة حالة تكرار حلقي لا نهاية لها.

منع التكرارات الحلقية التي لا نهاية لها

يجب أن تكون قادرا على إعادة تأكيد الكائنات دون إنشاء حلقات لا نهاية لها. لتجنب مثل هذه السيناريوهات، يمكنك استخدام الدالة Update . مثل الدالة Reassert، تقوم الدالة Update بتنفيذ الدالتين Retract و Assert على مثيلات الكائن المقترنة التي يتم تغييرها بواسطة إجراءات القاعدة، ولكن مع الاختلافات الرئيسية التالية:

  • في جدول الأعمال، تظل إجراءات القواعد على جدول الأعمال عندما يتم استخدام نوع المثيل فقط في الإجراءات، وليس المسند.

  • لا تتم إعادة تقييم القواعد التي تستخدم نوع المثيل فقط في الإجراءات.

ونتيجة لذلك، يعاد تقييم القواعد التي تستخدم أنواع المثيلات، إما في دالات التقييم فقط أو في كل من التقييمات والإجراءات، وتتم إضافة إجراءات القواعد إلى جدول الأعمال حسب الاقتضاء.

بتغيير المثال السابق لاستخدام الدالة Update، يمكنك التأكد من أن المحرك يعيد تقييم القاعدة 2 فقط لأن شرط القاعدة 2 يستخدم ItemB. لا يعيد المحرك تقييم القاعدة 1 لأن ItemB يستخدم فقط في إجراءات القاعدة 1*، مما يلغي سيناريو التكرار الحلقي.

القاعدة 1

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

القاعدة 2

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

على الرغم من استخدام الدالة Update بهذه الطريقة، لا تزال هناك إمكانية لإنشاء سيناريوهات التكرار الحلقي. على سبيل المثال، ضع في اعتبارك القاعدة التالية:

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

تستخدم دالة التقييم ItemA، لذا يقوم المحرك بإعادة تقييم القاعدة عند استدعاء التحديث على ItemA. إذا لم تتغير قيمة ItemA.Id في مكان آخر، تستمر القاعدة 1 في التقييم على أنها true، مما يؤدي إلى استدعاء Update مرة أخرى على ItemA.

كمصمم القاعدة، يجب عليك التأكد من تجنب إنشاء سيناريوهات التكرار الحلقي هذه. ويختلف النهج المناسب لإصلاح هذه المشكلة استنادا إلى طبيعة القواعد.

يوضح المثال التالي طريقة بسيطة لحل المشكلة في المثال السابق عن طريق إضافة فحص على ItemA.Value يمنع القاعدة من التقييم على أنها true مرة أخرى بعد تنفيذ إجراءات القاعدة في المرة الأولى.

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

تحديث كيان TypedXmlDocument

  1. في نافذة RuleSet Explorer ، ابحث عن القاعدة التي تريدها وحددها.

  2. في جزء THEN، ضمن Actions، أضف الوظيفة المضمنة Update كإجراء.

  3. في نافذة مستكشف الحقائق، حدد مخططات XML.

  4. من علامة التبويب مخططات XML، اسحب عقدة الكيان التي تريدها إلى الوسيطة في الدالة Update.

على سبيل المثال، افترض أن لديك القواعد التالية:

  • تقيم القاعدة 1 العدد الإجمالي للعناصر في رسالة أمر الشراء.

    IF 1 == 1
    THEN ProcessPO.Order:/Order/Items/TotalCount = (ProcessPO.Order:/Order/Items/TotalCount + ProcessPO:/Order/Items/Item/Count)  
    
  • تعين القاعدة 2 الحالة إلى "يحتاج إلى الموافقة" إذا كان العدد الإجمالي أكبر من أو يساوي 10.

    القاعدة 2

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

إذا قمت بتمرير رسالة أمر الشراء التالية كإدخل إلى مجموعة القواعد هذه، فستلاحظ أنه لم يتم تعيين الحالة إلى "يحتاج إلى الموافقة"، على الرغم من أن TotalCount هو 14. يحدث هذا السلوك لأنه يتم تقييم القاعدة 2 فقط في البداية عندما تكون قيمة TotalCount 0. لا يتم تقييم القاعدة في كل مرة يتم فيها تحديث TotalCount .

<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>

لكي يقوم المحرك بإعادة تقييم الشروط في كل مرة يتم فيها تحديث TotalCount ، يجب عليك استدعاء دالة Update على العقدة الأصل (العناصر) للعقدة المحدثة (TotalCount). إذا قمت بتغيير القاعدة 1 كما يلي، واختبرت القاعدة مرة أخرى، يتم تعيين حقل الحالة إلى "يحتاج إلى الموافقة":

القاعدة 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)