عينة: توسيع Universal Resource Scheduling باستخدام قيد لغة مخصص

مثل هذا الدليل خطوة بخطوة رفيقًا يساعدك على فهم مطابقة الموارد وتخصيصها في Universal Resource Scheduling

في هذا الدليل خطوة بخطوة، سنعمل على توسيع موارد Universal Resource Scheduling باستخدام قيد Language. تريد إحدى المؤسسات تصفية الموارد حسب اللغات التي تتحدث بها. وتريد أيضًا تسجيل اللغة المطلوبة لتنفيذ المهمة على سجل Requirement. يتبع هذا القيد نمطًا مماثلًا لقيد Territory المضمن. سيقوم كيان رئيسي جديد Language بتخزين مختلف اللغات التي يستطيع المورد التحدث بها. ويمكن عندئذٍ إقران سجل Resource بعدد كبير من Languages من خلال كيان علاقة متعدد إلى متعدد‬. على كيان Requirement، سنشكل هذا عن طريق إنشاء سمتي بحث جديدتين: Primary Language وSecondary Language. عند البحث عن الموارد المتوفرة لأحد المتطلبات، لن تظهر سوى الموارد المقترنة بسمة البحث Primary Language أو Secondary Language.

إنشاء الكيانات والعلاقات الجديدة

في هذا القسم، سننشئ مخططًا جديدًا للكيان الرئيسي Language وسنحدّث كيانات Resource وRequirement بالعلاقات المناظرة لكيان Language الجديد.

إنشاء ناشر جديد

  1. في Dynamics 365، ضمن "تخصيصات"، أنشئ ناشرًا جديدًا.

  2. املأ النموذج "ناشر جديد" باستخدام التفاصيل أدناه:

    الحقل Value
    اسم العرض Language
    الاسم اللغة
    البادئة لغة
  3. انقر فوق "حفظ وإغلاق".

إنشاء حل جديد

  1. في Dynamics 365، ضمن "تخصيصات"، أنشئ حلًا جديدًا.

  2. املأ النموذج "حل جديد" باستخدام التفاصيل أدناه:

    الحقل Value
    اسم العرض Language
    الاسم Language
    الناشر Language
    الإصدار 1.0.0.0
  3. انقر فوق "حفظ"

إنشاء كيان اللغة

  1. في قسم اللغة، أنشئ كيانًا جديدًا.

  2. املأ النموذج "كيان جديد" باستخدام التفاصيل أدناه:

    الحقل Value
    اسم العرض Language
    اسم الجمع لغات
    الاسم lang_language (سيتم ملء البادئة lang_ بشكل تلقائي وستكون للقراءة فقط)
  3. انقر فوق "حفظ"

إنشاء علاقة متعدد بمتعدد من كيان المورد إلى كيان اللغة

  1. في كيان اللغة، أنشئ علاقة متعدد بمتعدد

  2. املأ النموذج "علاقة جديدة" باستخدام التفاصيل أدناه:

    الحقل Value
    الكيان الحالي
    خيار العرض استخدام اسم جمع
    كيان آخر
    اسم الكيان مورد قابل للحجز
  3. انقر فوق "حفظ وإغلاق".

  4. أغلق نموذج كيان اللغة

إنشاء العلاقات من كيان المتطلبات إلى كيان اللغة

  1. في حل اللغة، أضف كيان "متطلبات الموارد‬" الموجود إلى الحل (إذا ظهر مربع حوار "المكونات المطلوبة مفقودة‬"، حدد "لا"، لا تقم بتضمين المكونات المطلوبة.)

  2. في كيان "متطلبات الموارد‬"، أنشئ حقلًا جديدًا

  3. املأ النموذج "حقل جديد" باستخدام التفاصيل أدناه:

    الحقل Value
    اسم العرض اللغة الأساسية
    نوع البيانات بحث
    نوع السجل الهدف Language
  4. انقر فوق "حفظ وإغلاق".

  5. في كيان "متطلبات الموارد‬"، أنشئ حقلًا جديدًا

  6. املأ النموذج "حقل جديد" باستخدام التفاصيل أدناه:

    الحقل Value
    اسم العرض اللغة الثانوية
    نوع البيانات بحث
    نوع السجل الهدف Language
  7. انقر فوق "حفظ وإغلاق".

تحديث نموذج المتطلبات الرئيسي

  1. في كيان "متطلبات الموارد‬"، أضف نموذج المعلومات الموجود إلى المكونات الفرعية للكيان (إذا ظهر مربع حوار "المكونات المطلوبة مفقودة‬"، حدد "لا"، لا تقم بتضمين المكونات المطلوبة.)
  2. في نموذج المعلومات، استخدم "مستكشف الحقول" لإضافة سمتين جديدتين، اللغة الأساسية واللغة الثانوية إلى النموذج لتمكين المستخدمين إدخال هذه المعلومات أثناء إنشاء المتطلبات
  3. انقر فوق "حفظ"
  4. انقر فوق "نشر"
  5. يمكنك إغلاق محرر النماذج

تلخيص

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

إضافة بيانات

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

تخصيص لوحة الجدولة

لتصفية الموارد في لوحة الجدولة باستخدام القيد اللغة الجديدة، سنقوم بتحديث سجلات تكوين استعلام استرداد الموارد وتخطيط عامل التصفية.

تكوين تخطيط عامل التصفية

تلميح

لتنفيذ الخطوات أدناه، من المفيد استخدام محرر نصوص يدعم تمييز بناء جملة XML لإجراء التغييرات التي تريدها، ثم لصق هذه التغييرات مرة أخرى في محرر Universal Resource Scheduling.

تكوين تخطيط عامل التصفية عبارة عن تعريف تخطيط XML لتخصيص تخطيط لوحة عامل التصفية.

‏‫ملاحظة‬

في هذا التمرين، سنقوم بإزالة كافة عوامل التصفية الافتراضية المضمنة مع Universal Resource Scheduling من لوحة عامل التصفية وإضافة اللغات كعامل التصفية الوحيد المتوفر.

<control type="combo" source="entity" key="Languages" inactive-state="1" label-id="Languages" entity="lang_language" multi="true" />

يضيف العنصر control عنصر تحكم جديدًا إلى لوحة عامل التصفية. وإليك وصف لكل سمة:

الاسم الوصف
type نوع عنصر تحكم عامل تصفية. يعرض عنصر التحكم combo قائمة منسدلة تتضمن قيمًا للاختيار من بينها
source مصدر القيم لعنصر تحكم القائمة المنسدلة. يعرض المصدر entity سجلات الكيان في القائمة المنسدلة
key المفتاح الذي سيتم استخدامه لتخزين القيم المحددة في مجموعة خصائص القيود
inactive-state statecode غير النشط لهذا الكيان. يُستخدم لاستبعاد السجلات غير النشطة من القائمة المنسدلة
label-id التسمية المترجمة لاستخدامها لعنصر التحكم هذا
entity سيتم عرض سجلات هذا الكيان في القائمة المنسدلة
multi تكوين القائمة المنسدلة للسماح بتحديد سجل واحد أو عدة سجلات

تخطيط عامل التصفية:

<?xml version="1.0" encoding="utf-8" ?>
<filter>
  <controls>
    <control type="combo" source="entity" key="Languages" inactive-state="1" label-id="Languages" entity="lang_language" multi="true" />
  </controls>
</filter>

إنشاء لوحة لغات جديدة

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

  1. في Dynamics 365، في شريط التنقل العلوي، انتقل إلى جدولة الموارد > لوحة الجدولة
  2. في أعلى الجانب الأيسر، انقر فوق + تسجيل الدخول لإنشاء لوحة جديدة
  3. قم بتسمية لوحة اللغة الجديدة
  4. في أسفل مربع الحوار، انقر فوق "إضافة". سيتم إنشاء اللوحة الجديدة.

تحديث تخطيط عامل التصفية في لوحة الجدولة

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

  1. في أعلى الجانب الأيسر، انقر نقرًا مزدوجًا فوق علامة التبويب "اللغة".
  2. قم بالتمرير لأسفل وصولًا إلى الإعدادات العامة > إعدادات أخرى
  3. حدد موقع حقل "تخطيط عامل التصفية"، وانقر فوق الزر إلى اليسار لفتح المحرر
  4. حدّث حقل "القيمة" بكود "تخطيط عامل التصفية" أعلاه ثم انقر فوق "حفظ باسم".
  5. أدخل "تخطيط عامل تصفية اللغة" في حقل "الاسم" ثم انقر فوق "حفظ". يؤدي هذا إلى إنشاء سجل تكوين جديد ويربط لوحة الجدولة هذه بالسجل.
  6. في أسفل مربع الحوار، انقر فوق "تطبيق".

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

تكوين استعلام استرداد الموارد

تلميح

لتنفيذ الخطوات أدناه، من المفيد استخدام محرر نصوص يدعم تمييز بناء جملة XML لإجراء التغييرات التي تريدها، ثم لصق هذه التغييرات مرة أخرى في محرر Universal Resource Scheduling.

إن استعلام استرداد الموارد عبارة عن استعلام UFX تستخدمه واجهة API مطابقة الموارد. وهو يأخذ كإدخال القيم المدخلة في لوحة عامل التصفية ويبني بطريقة ديناميكية FetchXML الصحيح للبحث عن الموارد المطابقة.

فيما يلي أجزاء التعليمات البرمجية المتكررة الجديدة المضافة إلى استعلام استرداد الموارد للمطابقة والترتيب حسب لغات الموارد.

إضافة الصلات من bookableresource إلى lang_language

<link-entity name="lang_lang_language_bookableresource" from="bookableresourceid" to="bookableresourceid" alias="lang_primary" link-type="outer" ufx:if="$input/Languages/bag[1]">
  <attribute name="lang_languageid" alias="lang_primary" groupby="true" />

  <filter>
    <condition attribute="lang_languageid" operator="eq">
      <ufx:value select="$input/Languages/bag[1]/@ufx-id" attribute="value" />
    </condition>          
  </filter>
</link-entity>

<link-entity name="lang_lang_language_bookableresource" from="bookableresourceid" to="bookableresourceid" alias="lang_secondary" link-type="outer" ufx:if="$input/Languages/bag[2]">
  <attribute name="lang_languageid" alias="lang_secondary" groupby="true" />

  <filter>
    <condition attribute="lang_languageid" operator="eq">
      <ufx:value select="$input/Languages/bag[2]/@ufx-id" attribute="value" />
    </condition>          
  </filter>
</link-entity>

<link-entity name="lang_lang_language_bookableresource" from="bookableresourceid" to="bookableresourceid" alias="lang_others" link-type="outer" ufx:if="$input/Languages/bag[position() > 2]">

  <filter>
    <condition attribute="lang_languageid" operator="in">
      <ufx:apply select="$input/Languages/bag[position() > 2]">
        <value>
          <ufx:value select="@ufx-id" />
        </value>
      </ufx:apply>
    </condition>            
  </filter>
</link-entity>        

<filter type="or">
  <condition entityname="lang_primary" attribute="lang_languageid" operator="not-null" ufx:if="$input/Languages/bag[1]" />
  <condition entityname="lang_secondary" attribute="lang_languageid" operator="not-null" ufx:if="$input/Languages/bag[2]" />
  <condition entityname="lang_others" attribute="lang_languageid" operator="not-null" ufx:if="$input/Languages/bag[position() > 2]" />          
</filter>

يتم تمرير القيم المحددة في لوحة عامل التصفية كإدخال إلى الاستعلام وتصبح متوفرة في المتغير XPath $input

يستخدم استعلام استرداد الموارد FetchXML للاستعلام عن الكيان Resource (bookableresource). نحن نستخدم عنصر FetchXML link-entity لإرجاع فقط الموارد المقترنة بسجلات اللغة المحددة في لوحة عامل التصفية. لدعم إظهار اللغات المطابقة وترتيبها حسب اللغة الأساسية أو الثانوية، والتي سيرد وصفها لاحقًا في القسم قالب خلية المورد‬، نستخدم صلات link-entity متعددة.

فيما يلي وصف لكل element وattribute:

الاسم الوصف
link-entity إنشاء صلة بعلاقة متعدد بمتعدد بين كيانات المورد واللغة
ufx:if إصدار عنصر FetchXML هذا فقط (link-entity) عندما يرجع تعبير XPath في هذه السمة قيمة
attribute إرجاع اللغة الأساسية أو الثانوية المطابقة
filter وcondition تصفية سجلات علاقة متعدد بمتعدد فقط للحصول على تلك التي تتطابق مع معرفات اللغات المحددة
ufx:value وselect إخراج نتيجة تعبير XPath في السمة select
ufx:apply وselect إصدار عناصر FetchXML التابعة لكل نتيجة تم إرجاعها من تعبير XPath في السمة select
value يحتوي على معرف سجل اللغة

تحديد ترتيب فرز المورد

بعد استرداد الموارد المطابقة، واستنادًا إلى اللغات المعينة لكل مورد، سنعين خاصية lang_order جديدة لتحديد ترتيب فرزها.

<bag>
  <lang_order ufx:select="iif(lang_primary and lang_secondary, 1, iif(lang_primary, 2, iif(lang_secondary, 3, 4)))" />
</bag>

فيما يلي وصف لكل element وattribute:

الاسم الوصف
lang_order إنشاء خاصية جديدة في كل مورد مرتجع من استعلام FetchXML مسمى lang_order
ufx:select تعيين نتيجة تعبير XPath في هذه السمة إلى الخاصية lang_order. يتم استخدام خصائص lang_primary وlang_secondary التي تم استردادها في وقت سابق في هذا الاستعلام، مع وظيفة XPath iif لتحديد ترتيب مطابقة الموارد.

ترتيب النتائج

<Resources ufx:select="order(Resources, 'lang_order')" />

تتم معالجة استعلامات UFX بترتيب تسلسلي. بعد استرداد الموارد عبر FetchXML، يتم تعيين النتائج إلى الخاصية Resources. نحن نعمل على فرز النتائج استنادًا إلى الخاصية lang_order التي تمت إضافتها في وقت سابق وعلى إعادة تعيين النتائج تم فرزها إلى الخاصية Resources.

فيما يلي وصف لكل element وattribute:

الاسم الوصف
Resources إعادة تعيين الخاصية Resources
ufx:select تعيين نتيجة تعبير XPath في هذه السمة إلى الخاصية Resources. يتم استخدام الوظيفة XPath order لترتيب قائمة Resources على خاصيتها lang_order.

‏‫ملاحظة‬

إن استعلام استرداد الموارد الافتراضي المضمن مع Universal Resource Scheduling عبارة عن استعلام كبير يدعم جميع قيود الموارد المضمنة مع Universal Resource Scheduling. في هذا التمرين، سنستخدم مجموعة فرعية فقط من الاستعلام الافتراضي ونضيف اللغات كعامل التصفية الوحيد.

<?xml version="1.0" encoding="utf-8" ?>
<bag xmlns:ufx="https://schemas.microsoft.com/dynamics/2017/universalfetchxml">
  <Resources ufx:source="fetch">
    <fetch mapping="logical" aggregate="true">
      <entity name="bookableresource">
        <attribute name="bookableresourceid" alias="bookableresourceid" groupby="true"/>
        <attribute name="name" alias="name" groupby="true"/>
        <attribute name="calendarid" alias="calendarid" groupby="true"/>
        <attribute name="resourcetype" alias="resourcetype" groupby="true"/>
        <attribute name="msdyn_startlocation" alias="startlocation" groupby="true"/>

        <!-- Language join -->
        <link-entity name="lang_lang_language_bookableresource" from="bookableresourceid" to="bookableresourceid" alias="lang_primary" link-type="outer" ufx:if="$input/Languages/bag[1]">
          <attribute name="lang_languageid" alias="lang_primary" groupby="true" />
          
          <filter>
            <condition attribute="lang_languageid" operator="eq">
              <ufx:value select="$input/Languages/bag[1]/@ufx-id" attribute="value" />
            </condition>          
          </filter>
        </link-entity>

        <link-entity name="lang_lang_language_bookableresource" from="bookableresourceid" to="bookableresourceid" alias="lang_secondary" link-type="outer" ufx:if="$input/Languages/bag[2]">
          <attribute name="lang_languageid" alias="lang_secondary" groupby="true" />
          
          <filter>
            <condition attribute="lang_languageid" operator="eq">
              <ufx:value select="$input/Languages/bag[2]/@ufx-id" attribute="value" />
            </condition>          
          </filter>
        </link-entity>
        
        <link-entity name="lang_lang_language_bookableresource" from="bookableresourceid" to="bookableresourceid" alias="lang_others" link-type="outer" ufx:if="$input/Languages/bag[position() > 2]">
          
          <filter>
            <condition attribute="lang_languageid" operator="in">
              <ufx:apply select="$input/Languages/bag[position() > 2]">
                <value>
                  <ufx:value select="@ufx-id" />
                </value>
              </ufx:apply>
            </condition>            
          </filter>
        </link-entity>        
        
        <filter type="or">
          <condition entityname="lang_primary" attribute="lang_languageid" operator="not-null" ufx:if="$input/Languages/bag[1]" />
          <condition entityname="lang_secondary" attribute="lang_languageid" operator="not-null" ufx:if="$input/Languages/bag[2]" />
          <condition entityname="lang_others" attribute="lang_languageid" operator="not-null" ufx:if="$input/Languages/bag[position() > 2]" />          
        </filter>
        
        <link-entity name="systemuser" from="systemuserid" to="userid" link-type="outer">
          <attribute name="systemuserid" alias="systemuserid" groupby="true" />
          <attribute name="entityimage_url" alias="userimagepath" groupby="true"/>
        </link-entity>

        <link-entity name="contact" from="contactid" to="contactid" link-type="outer">
          <attribute name="contactid" alias="contactid" groupby="true"/>
          <attribute name="entityimage_url" alias="contactimagepath" groupby="true"/>
        </link-entity>
        
        <link-entity name="account" from="accountid" to="accountid" link-type="outer">
          <attribute name="accountid" alias="accountid" groupby="true"/>
          <attribute name="entityimage_url" alias="accountimagepath" groupby="true"/>
        </link-entity>
      </entity>
    </fetch>

    <bag>
      <imagepath ufx:select="accountimagepath | contactimagepath | userimagepath" />

      <accountimagepath ufx:select="$null" />
      <contactimagepath ufx:select="$null" />
      <userimagepath ufx:select="$null" />
      
      <lang_order ufx:select="iif(lang_primary and lang_secondary, 1, iif(lang_primary, 2, iif(lang_secondary, 3, 4)))" />
    </bag>
  </Resources>

  <Resources ufx:select="order(Resources, 'lang_order')" />
</bag>

تحديث استعلام استرداد الموارد في لوحة الجدولة

  1. في أعلى الجانب الأيسر، انقر نقرًا مزدوجًا فوق علامة التبويب "اللغة".
  2. قم بالتمرير لأسفل وصولًا إلى الإعدادات العامة > إعدادات أخرى
  3. حدد موقع حقل "استعلام استرداد الموارد"، وانقر فوق الزر إلى اليسار لفتح المحرر
  4. حدّث حقل "القيمة" بكود "استعلام استرداد الموارد" أعلاه ثم انقر فوق "حفظ باسم".
  5. أدخل "استعلام استرداد الموارد" في حقل "الاسم" ثم انقر فوق "حفظ". يؤدي هذا إلى إنشاء سجل تكوين جديد ويربط لوحة الجدولة هذه بالسجل.
  6. في أسفل مربع الحوار، انقر فوق "تطبيق".

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

الملخص

في الخطوات السابقة، قمنا بتعديل لوحة عامل التصفية لعرض عنصر تحكم عامل التصفية لكيان اللغة. وقمنا أيضًا بتعديل استعلام استرداد الموارد لمطابقة الموارد المقترنة بسجلات اللغات المحددة. عندما يحدد أحد المستخدمين القيم في عنصر تحكم عامل التصفية وينقر فوق بحث، يتم تمرير القيم إلى الاستعلام ويُرجع الاستعلام FetchXML الموارد المطابقة فقط.

تخصيص مساعد الجدولة

نحتاج إلى تخصيص تكوينات تخطيط عامل التصفية لمساعد الجدولة واستعلام استرداد القيود لاستخدام قيود اللغة الجديدة في "مساعد الجدولة".

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

تكوين تخطيط عامل التصفية لمساعد الجدولة

تلميح

لتنفيذ الخطوات أدناه، من المفيد استخدام محرر نصوص يدعم تمييز بناء جملة XML لإجراء التغييرات التي تريدها، ثم لصق هذه التغييرات مرة أخرى في محرر Universal Resource Scheduling.

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

‏‫ملاحظة‬

في هذا التمرين، سنعيد استخدام مجموعة فرعية من عوامل التصفية الافتراضية المضمنة في Universal Resource Scheduling من تكوين تخطيط عامل التصفية لمساعد الجدولة وسنضيف القائمة المنسدلة "اللغات" كعامل التصفية الوحيد.

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

تخطيط عامل التصفية الكامل لمساعد الجدولة

<?xml version="1.0" encoding="utf-8" ?>
<filter>
  <controls>
    <control type="twocolumn">
      <control type="combo" source="optionset" key="Requirement/msdyn_worklocation" label-id="ScheduleAssistant.West.settingsform.WorkLocation" entity="msdyn_resourcerequirement" attribute="msdyn_worklocation">
        <bind property="disabled" to="Requirement/InitialWorkLocation" operator="eq" value="690970002" />
        <data>
          <value id="690970000" />
          <value id="690970001" />
          <value id="690970002" />
        </data>
      </control>
      <control type="duration" key="Requirement/msdyn_remainingduration" label-id="ScheduleAssistant.West.settingsform.AvailableDuration" />
    </control>
    <control type="distance" key="Requirement/Radius" label-id="ScheduleAssistant.West.settingsform.Radius" min="1">
      <bind property="disabled" to="Requirement/msdyn_worklocation" operator="eq" value="690970002" />
    </control>
    <control type="datetime" key="Requirement/msdyn_fromdate" label-id="ScheduleAssistant.West.settingsform.StartDay">
      <bind property="disabled" to="Requirement/RealTimeMode" operator="eq" value="true" />
      <bind property="max" to="Requirement/msdyn_todate" operator="eq" />
    </control>
    <control type="datetime" key="Requirement/msdyn_todate" label-id="ScheduleAssistant.West.settingsform.EndDay">
      <bind property="min" to="Requirement/msdyn_fromdate" operator="eq" />
    </control>
    <control type="combo" source="entity" key="Languages" inactive-state="1" label-id="Languages" entity="lang_language" multi="true" />
  </controls>
</filter>

تحديث تخطيط عامل التصفية لمساعد الجدولة

  1. في أعلى الجانب الأيسر، انقر نقرًا مزدوجًا فوق علامة التبويب "اللغة".
  2. في أعلى الجانب الأيسر، انقر فوق "فتح الإعدادات الافتراضية"
  3. قم بالتمرير إلى القسم "أنواع الجداول" وحدد "بلا" في القائمة اليمنى
  4. حدد موقع حقل "تخطيط عامل التصفية لمساعد الجدولة"، وانقر فوق الزر إلى اليسار لفتح المحرر
  5. حدّث حقل "القيمة" بكود "تخطيط عامل التصفية لمساعد الجدولة" أعلاه ثم انقر فوق "حفظ باسم".
  6. أدخل "تخطيط عامل التصفية لمساعد جدولة اللغة" في حقل "الاسم" ثم انقر فوق "حفظ". يؤدي هذا إلى إنشاء سجل تكوين جديد ويربط لوحة الجدولة هذه بالسجل.
  7. في أسفل مربع الحوار، انقر فوق "تطبيق".

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

تكوين استعلام استرداد القيود

تلميح

لتنفيذ الخطوات أدناه، من المفيد استخدام محرر نصوص يدعم تمييز بناء جملة XML لإجراء التغييرات التي تريدها، ثم لصق هذه التغييرات مرة أخرى في محرر Universal Resource Scheduling.

إن استعلام استرداد القيود عبارة عن استعلام UFX تستخدمه واجهة API استرداد قيود المتطلبات. وهو يأخذ كإدخال معرف سجل المتطلبات (محدد في واجهة المستخدم) ويُرجع سجل المتطلبات وجميع سجلاته التابعة.

‏‫ملاحظة‬

إن استعلام استرداد القيود الافتراضي المضمن مع Universal Resource Scheduling عبارة عن استعلام كبير يدعم جميع قيود المتطلبات المضمنة مع Universal Resource Scheduling. في هذا التمرين، سنستخدم مجموعة فرعية فقط من الاستعلام الافتراضي ونضيف اللغات كعامل التصفية الوحيد.

<Languages ufx:select="lookup-to-list(Requirement/lang_primarylanguage, Requirement/lang_secondarylanguage)" />

تتم معالجة استعلامات UFX بترتيب تسلسلي. يستخدم استعلام استرداد القيود FetchXML للاستعلام عن كيان Requirement (msdyn_resourcerequirement)، ويعين النتيجة، سجل متطلبات، إلى الخاصية Requirement. نحن نعمل على إضافة خاصية جديدة Languages إلى مجموعة خصائص القيود تجمع السمتين، اللغة الأساسية واللغة الثانوية، في قائمة كيانات واحدة (EntityCollection). يعد هذا ضروريًا لأننا نُظهر عنصر تحكم اللغات في لوحة عامل التصفية كقائمة سجلات. هناك طريقة بديلة، وهي إنشاء عنصري تحكم منفصلين في لوحة عامل التصفية للسمتين.

فيما يلي وصف لكل element وattribute:

الاسم الوصف
Languages إنشاء خاصية جديدة في مجموعة خصائص القيود باسمLanguages
ufx:select تعيين نتيجة تعبير XPath في هذه السمة إلى الخاصية Languages. يتم تمرير الخصائص lang_primarylanguage وlang_secondarylanguage التي تم استردادها في وقت سابق في الاستعلام والمتوفرة في الخاصية Requirement إلى الوظيفة lookup-to-list XPath التي تحوّل خصائص lookup متعددة إلى list (EntityCollection) واحدة.

استعلام استرداد القيود:

<?xml version="1.0" encoding="utf-8" ?>
<bag xmlns:ufx="https://schemas.microsoft.com/dynamics/2017/universalfetchxml">
  <Requirement ufx:source="fetch" ufx:select="bag[1]">
    <fetch top="1">
      <entity name="msdyn_resourcerequirement">
        <all-attributes />
        
        <filter>
          <condition attribute="statecode" operator="eq" value="0" />
          <condition attribute="msdyn_resourcerequirementid" operator="eq">
            <ufx:value select="$input/@ufx-id" attribute="value" />
          </condition>
        </filter>
      </entity>
    </fetch>

    <bag>
      <InitialWorkLocation ufx:select="msdyn_worklocation" />
    </bag>
  </Requirement>
  
  <Languages ufx:select="lookup-to-list(Requirement/lang_primarylanguage, Requirement/lang_secondarylanguage)" />
</bag>

تحديث استعلام استرداد القيود

  1. في أعلى الجانب الأيسر، انقر نقرًا مزدوجًا فوق علامة التبويب "اللغة".
  2. في أعلى الجانب الأيسر، انقر فوق "فتح الإعدادات الافتراضية"
  3. قم بالتمرير إلى القسم "أنواع الجداول" وحدد "بلا" في القائمة اليمنى
  4. حدد موقع حقل "استعلام استرداد القيود لمساعد الجدولة"، وانقر فوق الزر إلى اليسار لفتح المحرر
  5. حدّث حقل "القيمة" بكود "استعلام استرداد الموارد" أعلاه ثم انقر فوق "حفظ باسم".
  6. أدخل "استعلام قيود اللغة" في حقل "الاسم" ثم انقر فوق "حفظ". يؤدي هذا إلى إنشاء سجل تكوين جديد ويربط لوحة الجدولة هذه بالسجل.
  7. حدد موقع الحقل "استعلام استرداد الموارد لمساعد الجدولة" وحدد "استعلام موارد اللغات" الذي مساعد بإنشائه في وقت سابق لتخصيصات لوحة الجدولة.
  8. في أسفل مربع الحوار، انقر فوق "تطبيق".

سيُعاد تحميل اللوحة مع التكوين المحدث. سوف تعمل التصفية مساعد الجدولة الآن. إذا أنشأت سجلات اللغات ثم قمت بربطها بسجلات المتطلبات، ستتمكن الآن من تحديد سجل متطلبات في أسفل لوحة الجدولة، والنقر فوق "بحث عن التوافر‬" لبدء تشغيل مساعد الجدولة، ورؤية فقط الموارد المطابقة للغات المحفوظة على المتطلبات.

تكوين قالب خلية المورد

تلميح

لتنفيذ الخطوات أدناه، من المفيد استخدام محرر نصوص يدعم تمييز بناء جملة HTML لإجراء التغييرات التي تريدها، ثم لصق هذه التغييرات مرة أخرى في محرر Universal Resource Scheduling.

تكوين قالب خلية المورد عبارة عن قالب Handlebars يُستخدم لعرض المحتوى في خلية الجدول. يتوفر الإخراج من استعلام استرداد الموارد للقالب.

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

{{#if lang_primary}}
<span style='color:green;'>&#10004;{{#if lang_secondary}} &#10033;{{/if}}</span>
{{else if lang_secondary}}
<span style='color:#ffe700;'>&#10004;</span>
{{/if}} 

يتم إرجاع خصائص lang_primary وlang_secondary من استعلام استرداد الموارد المخصص الذي أعددناه أعلاه. راجع موقع ويب Handlebars للحصول على وثائق حول بناء جملة القوالب.

قالب خلية المورد:

<div class='resource-card-wrapper {{iif ResourceCellSelected "resource-cell-selected" ""}} {{iif ResourceUnavailable "resource-unavailable" ""}} {{iif IsMatchingAvailability "availability-match" ""}}'>
  {{#if imagepath}}
  <img class='resource-image' src='{{client-url}}{{imagepath}}' />
  {{else}}
  <div class='resource-image unknown-resource'></div>
  {{/if}}
  <div class='resource-info'>
    <div class='resource-name primary-text ellipsis' title='{{name}}'>{{name}}</div>
    <div class='secondary-text ellipsis'>
      {{#if (eq (is-sa-grid-view) false) }}
      <div class='booked-duration'>{{BookedDuration}}</div>
      <div class='booked-percentage'>
        {{BookedPercentage}}%
        
        {{#if lang_primary}}
        <span style='color:green;'>&#10004;{{#if lang_secondary}} &#10033;{{/if}}</span>
        {{else if lang_secondary}}
        <span style='color:#ffe700;'>&#10004;</span>
        {{/if}}            
      </div>
      {{/if}}
    </div>
    {{#if (eq (is-sa-grid-view) false) }}
    <div class='matching-indicator'></div>
    {{/if}}
  </div>
  {{#if (eq (is-sa-grid-view) false) }}
  {{> resource-map-pin-template this }}
  {{/if}}
</div>

تحديث قالب خلية المورد

  1. في أعلى الجانب الأيسر، انقر نقرًا مزدوجًا فوق علامة التبويب "اللغة".
  2. في أعلى الجانب الأيسر، انقر فوق "فتح الإعدادات الافتراضية"
  3. قم بالتمرير إلى القسم "أنواع الجداول" وحدد "بلا" في القائمة اليمنى
  4. حدد موقع حقل "قالب خلية المورد لمساعد الجدولة‬"، وانقر فوق الزر إلى اليسار لفتح المحرر
  5. حدّث حقل "القيمة" بكود "قالب خلية المورد" أعلاه ثم انقر فوق "حفظ باسم".
  6. أدخل "قالب خلية المورد‬ للغة" في حقل "الاسم" ثم انقر فوق "حفظ". يؤدي هذا إلى إنشاء سجل تكوين جديد ويربط لوحة الجدولة هذه بالسجل.
  7. في أسفل مربع الحوار، انقر فوق "تطبيق".

سيُعاد تحميل اللوحة مع التكوين المحدث. ستشير خلية المورد الآن إلى كيفية مطابقة مورد مع قيد اللغة في لوحة عامل التصفية.

الملخص

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

راجع أيضًا

Universal Fetch XML

ملاحظات حول الإصدار لإمكانية توسيع Universal Resource Scheduling