Partajați prin


Exemplu: Extindeți Universal Resource Scheduling cu o constrângere de limbă particularizată

Acest ghid pas cu pas este un companion pentru Înțelegerea și personalizarea potrivirii resurselor în Universal Resource Scheduling

În acest ghid pas cu pas, vom extinde resursele Universal Resource Scheduling cu o constrângere Language. Considerați o organizație care vrea să filtreze resursele în funcție de limbile pe care le vorbesc. Dorește, de asemenea, să captureze pe înregistrarea Requirement limba necesară pentru operațiune. Această constrângere urmează un model similar cu constrângerea Territory integrată. O nouă entitate primară Language va stoca diferitele limbi vorbite de o resursă. O înregistrare Resource poate fi apoi asociată la mai multe Languages prin o entitate relație mulți-la-mulți. Pe entitatea Requirement, vom modela asta prin crearea a două noi atribute de căutare: Primary Language și Secondary Language. Când găsim resurse disponibile pentru o cerință, doar resursele asociate cu Primary Language sau Secondary Language vor fi indicate.

Crearea noilor entități și relații

În această secțiune vom crea noua schemă pentru entitatea master Language și actualiza entitățile Resource și Requirement cu relațiile corespunzătoare noii entități Language.

Crearea unui Editor nou

  1. În Dynamics 365, sub Particularizări, creați un nou Editor

  2. Completați formularul Editor nou cu detaliile de mai jos:

    Câmp Value
    Nume afișat Language
    Nume limbă
    Prefix lang
  3. Faceți clic pe Salvare și închidere

Creați o nouă Soluție

  1. În Dynamics 365, sub Particularizări, creați o nouă Soluție

  2. Completați formularul Soluție nouă cu detaliile de mai jos:

    Câmp Value
    Nume afișat Language
    Nume Language
    Editor Language
    Versiune 1.0.0.0
  3. Faceți clic pe Salvare

Creați entitatea limbă

  1. În Soluția de limbă, creați o nouă Entitate

  2. Completați formularul Entitate nouă cu detaliile de mai jos:

    Câmp Value
    Nume afișat Language
    Nume plural Limbi
    Nume lang_language (Prefixul lang_ va fi auto-completat și doar în citire)
  3. Faceți clic pe Salvare

Creați relația mulți-la-mulți din entitatea Resursă pentru entitatea Limbă

  1. În entitatea limbă, creați o nouă relație mulți-la-mulți

  2. Completați formularul Relație nouă cu detaliile de mai jos:

    Câmp Value
    Entitate curentă
    Opțiune afișare Utilizare nume plural
    Altă entitate
    Nume entitate Resursă ce se poate rezerva
  3. Faceți clic pe Salvare și închidere

  4. Închideți formularul entitate Limbă

Creați relațiile mulți-la-mulți din entitatea Cerință pentru entitatea Limbă

  1. În soluția de limbă, adăugați entitatea cerință de resurse existentă la soluție (dacă este prezentat un dialog Componente obligatorii lipsă, selectați Nu, nu includeți componentele obligatorii).

  2. În entitatea Cerință de resurse, creați un nou câmp

  3. Completați formularul Câmp nou cu detaliile de mai jos:

    Câmp Value
    Nume afișat Limbă primară
    Tip de date Căutare
    Tip înregistrare țintă Language
  4. Faceți clic pe Salvare și închidere

  5. În entitatea Cerință de resurse, creați un nou câmp

  6. Completați formularul Câmp nou cu detaliile de mai jos:

    Câmp Value
    Nume afișat Limbă secundară
    Tip de date Căutare
    Tip înregistrare țintă Language
  7. Faceți clic pe Salvare și închidere

Actualizați formularul principal Cerință

  1. În entitatea cerință de resurse, adăugați formularul Informații existent la sub-componentele entității (dacă este prezentat un dialog Componente obligatorii lipsă, selectați Nu, nu includeți componentele obligatorii).
  2. În formularul Informații, utilizați Exploratorul de câmpuri pentru a adăuga două noi atribute, Limbă primară și limbă secundară, la formular astfel încât utilizatorii să poată introduce aceste informații, pe măsură ce creează cerințele
  3. Faceți clic pe Salvare
  4. Faceți clic pe Publicare
  5. Puteți închide editorul de formulare

Rezumat

În pașii de mai sus, am creat noua entitate limbă. Apoi am adăugat noi relații cu entitățile Resursă și Cerință. Resursele pot fi asociate cu mai multe limbi, deoarece am adăugat o relație mulți-la-mulți între limbă și resurse. Cerințele pot fi asociate cu două limbi deoarece am adăugat două atribute de căutare în entitatea cerință ce indică noua entitate Limbă.

Adăugarea datelor

Utiliza Găsirea complexă pentru a adăuga înregistrări noi entității limbă. Apoi puteți asocia înregistrările de resurse la noile înregistrări de limbă prin deschiderea unei înregistrări de resursă și navigarea la relația de limbă din bara de navigare. Pentru înregistrările Cerință, puteți completa noile câmpurile limbă primară și limbă secundară în formularul de cerință.

Personalizarea tabloului de planificare

Pentru a filtra resursele în tabloul de planificare cu noua constrângere de limbă, vom actualiza interogarea regăsire resurse și Înregistrările de configurare aspect filtru.

Configurare aspect filtru

Bacșiș

Pentru pașii de mai jos, este util să utilizați un editor de text care acceptă evidențierea sintaxei XML pentru a face modificările, și apoi lipiți modificările înapoi în editorul Universal Resource Scheduling.

Configurarea aspectului filtru este o definiție de aspect XML pentru a particulariza aspectul panoului filtru.

Notă

Pentru acest exercițiu, vom elimina toate filtrele implicite furnizate cu Universal Resource Scheduling din panoul filtru iar unicul filtru disponibil va fi Adăugare limbi.

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

Elementul control adaugă un nou control la panoul filtrului. Iată descrierea fiecărui atribut:

Nume Descriere
type Tipul de control filtru. Un control combo redă un filtru vertical cu valori de selectare
source Sursa de valori pentru controlul vertical. O sursă entity afișează înregistrările de entitate pe verticală
key Cheia pentru a utiliza și stoca valorile selectate în sacul de proprietăți constrângeri
inactive-state statecode inactiv pentru această entitate. Acest lucru este folosit pentru a exclude înregistrările inactive din lista verticală
label-id Eticheta localizată pentru acest control
entity Înregistrările acestei entități vor fi afișate în meniul vertical
multi Configurează meniul vertical pentru a permite selectarea unei singure înregistrare sau mai multor înregistrări

Aspect filtru:

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

Creați un nou tablou de limbi

Pentru a păstra aceste modificări izolate, vom crea un tablou de planificare complet nou și separat pentru a implementa modificările, dar puteți oricând face aceste modificări pe tabloul de planificare implicit, astfel încât alte tablouri de planificare să poată moșteni automat aceste modificări.

  1. În Dynamics 365 în bara de navigare superioară, accesați Planificare resurse > Tablou de planificare
  2. În dreapta sus, faceți clic pe semnul + pentru a crea un nou tablou
  3. Numiți noul tablou Limbă
  4. În partea de jos a dialogului, faceți clic pe Adăugare. Va fi creat noul tablou.

Actualizați aspectul filtrului pentru tabloul de planificare

Apoi, vom crea o nouă înregistrare de configurare care stochează aspectele filtru și interogările utilizate de Tabloul de planificare, și apoi conectăm tabloul de planificare nou creat la noua înregistrare de configurare. Există mai multe moduri de a face acest lucru, dar iată care este cel mai rapid:

  1. În partea dreaptă sus, faceți dublu clic pe fila Limbă
  2. Defilați în jos la Setări generale > Alte setări
  3. Localizați câmpul Aspect filtru, faceți clic pe butonul din dreapta pentru a deschide editorul
  4. Actualizați câmpul Valoare cu codul Aspectului filtru de mai sus și faceți clic pe Salvare ca.
  5. Introduceți „Aspect filtru Limbă” în câmpul nume și faceți clic pe Salvare. Acest lucru creează o nouă înregistrare de configurare și racordează acest tablou de planificare la înregistrare.
  6. În partea de jos a dialogului, faceți clic pe Aplicare.

Tabloul se va reîncărca și veți vedea panoul filtrului în partea stângă cu noul aspect; doar filtrul Limbi va fi disponibil. Filtrarea nu va funcționa încă, deoarece e nevoie să actualizăm interogarea regăsire resurse pentru a profita de noul filtru.

Configurare interogare de regăsire resurse

Bacșiș

Pentru pașii de mai jos, este util să utilizați un editor de text care acceptă evidențierea sintaxei XML pentru a face modificările, și apoi lipiți modificările înapoi în editorul Universal Resource Scheduling.

Configurarea interogării de regăsire resurse este o Interogare UFX folosită de API potrivire resurse. Aceasta preia valorile introduse în panoul filtrului și construiește dinamic FetchXML corectă pentru a găsi resursele potrivite.

Mai jos sunt noile fragmente adăugate la interogarea regăsirii de resurse pentru a potrivi și ordona în funcție de limbile resurselor.

Adăugarea se alătură de la bookableresource la 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>

Valorile selectate în panoul filtrului sunt trecute ca date de intrare pentru interogare și sunt disponibile în variabila XPath $input

Interogarea regăsire resurse utilizează FetchXML pentru a interoga entitatea Resource (bookableresource). Folosim elementul FetchXML link-entity pentru a returna doar resursele asociate cu înregistrările de Limbă selectate în panoul filtrului. Pentru a sprijini afișarea limbilor potrivite și a ordona în funcție de limba primară sau secundară, descrisă mai târziu în secțiunea Șablon celulă de resurse, vom folosi mai multe asocieri link-entity.

Iată descrierea pentru fiecare element și attribute:

Nume Descriere
link-entity Creați o asociere la relația mulți-la-mulți între entitățile Resursă și Limbă
ufx:if Emiteți doar acest element FetchXML (link-entity) când expresia XPath din acest atribut returnează o valoare
attribute Returnați limba primară sau secundară potrivită
filter și condition Filtrarea înregistrărilor relației mulți-la-mulți pentru numai cele care se potrivesc ID-urilor de limbă specificate
ufx:value și select Generează rezultatul unei expresii XPath în atributul select
ufx:apply și select Emite elemente FetchXML fiu pentru fiecare rezultat returnat din expresia XPath în atributul select
value Conține ID-ul unei înregistrări de limbă

Determinarea ordinii de sortare a unei resurse

După ce regăsim resursele potrivite, bazate pe limbile atribuite fiecărei resurse, putem atribui o nouă proprietate lang_order pentru a determina ordinea sa de sortare.

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

Iată descrierea pentru fiecare element și attribute:

Nume Descriere
lang_order Creați o nouă proprietate în fiecare resursă returnată de interogarea FetchXML numită lang_order
ufx:select Atribuie rezultatul unei expresii XPath în acest atribut către proprietatea lang_order. Proprietățile lang_primary și lang_secondary, regăsite anterior în interogare, sunt utilizate împreună cu funcția XPath iif pentru a determina ordinea de potrivire a resurselor.

Ordonarea rezultatelor

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

Interogările UFX sunt procesate în ordine secvențială. După ce resursele sunt regăsite prin FetchXML, rezultatele sunt atribuite proprietății Resources. Noi sortăm rezultatele pe baza proprietății lang_order adăugate mai devreme și reatribuind rezultatele sortate la proprietatea Resources.

Iată descrierea pentru fiecare element și attribute:

Nume Descriere
Resources Reatribuirea proprietății Resources
ufx:select Atribuie rezultatul unei expresii XPath în acest atribut către proprietatea Resources. Funcția XPath order este utilizată pentru a ordona lista Resources în funcție de proprietatea lang_order.

Notă

Interogarea regăsire resurse implicită furnizată cu Universal Resource Scheduling este o interogare mare care acceptă toate constrângerile legate de resurse incluse cu Universal Resource Scheduling. Pentru acest exercițiu, vom folosi doar un subset din interogarea implicită și adăugăm Limbile ca singurul filtru.

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

Actualizați Tabloul de planificare interogare de regăsire resurse

  1. În partea dreaptă sus, faceți dublu clic pe fila Limbă
  2. Defilați în jos la Setări generale > Alte setări
  3. Localizați câmpul interogare regăsire resurse, faceți clic pe butonul din dreapta pentru a deschide editorul
  4. Actualizați câmpul Valoare cu codul interogare regăsire resurse de mai sus și faceți clic pe Salvare ca
  5. Introduceți „Interogare resurse limbă” în câmpul nume și faceți clic pe Salvare. Acest lucru creează o nouă înregistrare de configurare și racordează acest tablou de planificare la înregistrare.
  6. În partea de jos a dialogului, faceți clic pe Aplicare.

Tabloul se va reîncărca cu configurația actualizată. Filtrarea va funcționa acum. În cazul în care ați creat înregistrări de limbă și le-ați asociat cu înregistrările de resurse, veți putea acum să filtrați resursele de limbă asociate.

Rezumat

În pașii de mai sus am modificat panoul Filtru pentru a afișa un control filtru pentru entitatea limbă. Am modificat, de asemenea, interogarea de regăsire resurse pentru a potrivi resursele asociate cu înregistrările de limbă selectate. Când un utilizator selectează valorile din controlul filtrului și face clic pe Căutare, valorile sunt trecute în interogare iar interogarea FetchXML returnează numai resursele potrivite.

Personalizarea Asistentului de planificare

Trebuie să personalizăm Aspectul filtrului pentru asistentul de planificare și să regăsim configurațiile interogări constrângeri pentru a utiliza noile constrângeri de limbă din Asistentul de planificare.

Spre deosebire de particularizările tabloului de planificare, unde fiecare tablou poate fi personalizat individual, personalizările pentru Asistentul de planificare afectează toate tablourile în care este folosit asistentul de planificare. Particularizările asistentului de planificare pot fi specifice pentru un tip de planificare sau pentru toate tipurile. În acest exemplu vom personaliza Asistentul de planificare pentru toate tipurile.

Configurare aspect filtru pentru asistent de planificare

Bacșiș

Pentru pașii de mai jos, este util să utilizați un editor de text care acceptă evidențierea sintaxei XML pentru a face modificările, și apoi lipiți modificările înapoi în editorul Universal Resource Scheduling.

Configurarea aspectului filtru pentru asistentul de planificare, la fel ca pentru Aspectul filtru pentru tabloul de planificare, definește dispunerea controalelor în panoul filtrului. Deoarece Asistentul de planificare folosește mai multe filtre decât tabloul de planificare, ca Oră de începere, Oră de terminare, durată, etc, este folosit un aspect diferit.

Notă

Pentru acest exercițiu, vom reutiliza doar un subset din filtrele implicite expediate cu Universal Resource Scheduling din configurația aspectului filtrului pentru asistentul de planificare și adăugăm meniul vertical pentru limbi ca unicul filtru disponibil.

Filtrul pe care îl adăugăm la aspect este același de mai sus din Configurare aspect filtru. Celelalte controale sunt necesare pentru a modifica parametrii de căutare pentru asistentul de planificare.

Aspectul filtrului asistent de planificare complet

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

Actualizați aspectul filtrului asistent de planificare

  1. În partea dreaptă sus, faceți dublu clic pe fila Limbă
  2. În dreapta sus, faceți clic pe Deschideți setările implicite
  3. Derulați la secțiunea Tipuri de planificare și selectați niciunul în lista din stânga
  4. Localizați câmpul Aspect filtru asistent de planificare, faceți clic pe butonul din dreapta pentru a deschide editorul
  5. Actualizați câmpul Valoare cu codul Aspectului filtru asistent de planificare de mai sus și faceți clic pe Salvare ca
  6. Introduceți „Aspect filtru Limbă asistent de planificare” în câmpul nume și faceți clic pe Salvare. Acest lucru creează o nouă înregistrare de configurare și racordează acest tablou de planificare la înregistrare.
  7. În partea de jos a dialogului, faceți clic pe Aplicare.

Tabloul se va reîncărca. Apoi, trebuie să modificăm interogarea de regăsire constrângeri înainte să putem folosi asistentul de planificare cu noile noastre constrângeri de limbă, astfel încât limbile setate în Cerință să fie parte din căutarea din asistentul de planificare.

Configurare interogare de regăsire constrângeri

Bacșiș

Pentru pașii de mai jos, este util să utilizați un editor de text care acceptă evidențierea sintaxei XML pentru a face modificările, și apoi lipiți modificările înapoi în editorul Universal Resource Scheduling.

Configurarea interogării de regăsire constrângeri este o Interogare UFX folosită de API regăsire cerință constrângeri. Folosește ca intrare ID-ul unei înregistrări cerință (selectat din interfața utilizator) și returnează înregistrarea cerință și toate înregistrările sale fiu.

Notă

Interogarea implicită de regăsire constrângeri expediată cu Universal Resource Scheduling este o interogare mare care acceptă toate cerințele de constrângeri incluse cu Universal Resource Scheduling. Pentru acest exercițiu, vom folosi doar un subset din interogarea implicită și adăugăm Limbile ca singurul filtru.

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

Interogările UFX sunt procesate în ordine secvențială. Interogarea Retrieve Constraints folosește FetchXML pentru a interogaRequirement (msdyn_resourcerequirement) entității și atribuie rezultatul, o înregistrare de cerințe, cătreRequirement proprietate. Adăugăm la sacul de proprietăți constrângeri o nouă proprietate Languages care combină ambele atribute, limbă primară și limbă secundară, într-o singură listă a entităților (EntityCollection). Acest lucru este necesar deoarece afișăm controlul limbilor în panoul filtrului ca o listă de înregistrări. O alternativă ar fi să se creeze două controale separate în panoul filtrului pentru cele două atribute.

Iată descrierea pentru fiecare element și attribute:

Nume Descriere
Languages Creați o nouă proprietate în rezultatele din sacul de proprietăți constrângeri numit Languages
ufx:select Atribuie rezultatul unei expresii XPath în acest atribut către proprietatea Languages. Proprietățile lang_primarylanguage și lang_secondarylanguage, regăsite mai devreme în interogare și disponibile în proprietatea Requirement, sunt trecute la funcția XPath lookup-to-list care convertește multiple proprietăți lookup la o singură list (EntityCollection)

Interogare de regăsire constrângeri:

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

Actualizare interogare de regăsire constrângeri

  1. În partea dreaptă sus, faceți dublu clic pe fila Limbă
  2. În dreapta sus, faceți clic pe Deschideți setările implicite
  3. Derulați la secțiunea Tipuri de planificare și selectați niciunul în lista din stânga
  4. Localizați câmpul Interogare regăsire constrângeri pentru asistentul de planificare, faceți clic pe butonul din dreapta pentru a deschide editorul
  5. Actualizați câmpul Valoare cu codul interogare regăsire resurse de mai sus și faceți clic pe Salvare ca
  6. Introduceți „Interogare constrângeri limbă” în câmpul nume și faceți clic pe Salvare. Acest lucru creează o nouă înregistrare de configurare și racordează acest tablou de planificare la înregistrare.
  7. Localizați câmpul Interogare regăsire resurse pentru asistentul de planificare și selectați interogarea de resurse limbi pe care am creat-o mai devreme pentru particularizările tabloului de planificare
  8. În partea de jos a dialogului, faceți clic pe Aplicare.

Tabloul se va reîncărca cu configurația actualizată. Filtrarea va funcționa acum pentru Asistentul de planificare. În cazul în care ați creat înregistrări de limbă și le-ați asociat cu cerința de înregistrări, acum veți putea să selectați o înregistrare de cerință în partea de jos a tabloului de planificare, faceți clic pe Găsiți disponibilitatea pentru a lansa asistentul de planificare, și a vedea numai resursele potrivite limbii stocate pe cerință.

Configurarea șablonului celulă de resurse

Bacșiș

Pentru pașii de mai jos, este util să utilizați un editor de text care acceptă evidențierea sintaxei HTML pentru a face modificările, și apoi lipiți modificările înapoi în editorul Universal Resource Scheduling.

Configurarea șablonului celulă mobilă este un șablon Handlebars utilizat pentru a reda conținut în celula de resurse. Ieșirea din interogarea de regăsire resurse este disponibilă în șablon.

Modificăm șablonul implicit de resurse pentru a afișa un indicator verde ✔✱ dacă resursa a corespuns limbilor primare și secundare, un indicator verde ✔ dacă resursa a corespuns doar pentru limba primară, și un indicator galben ✔ dacă resursa a corespuns doar pentru limba secundară.

{{#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}} 

Proprietățile lang_primary și lang_secondary sunt returnate din Interogarea de regăsire resurse configurată mai sus. Consultați site-ul web Handlebars pentru documentația privind șablonul sintaxei.

Șablon celulă de resurse:

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

Actualizați șablonul celulă de resurse

  1. În partea dreaptă sus, faceți dublu clic pe fila Limbă
  2. În dreapta sus, faceți clic pe Deschideți setările implicite
  3. Derulați la secțiunea Tipuri de planificare și selectați niciunul în lista din stânga
  4. Localizați câmpul Șablon celulă de resurse pentru asistentul de planificare, faceți clic pe butonul din dreapta pentru a deschide editorul
  5. Actualizați câmpul Valoare cu codul șablon celulă de resurse de mai sus și faceți clic pe Salvare ca
  6. Introduceți „Șablon celulă de resurse” în câmpul nume și faceți clic pe Salvare. Acest lucru creează o nouă înregistrare de configurare și racordează acest tablou de planificare la înregistrare.
  7. În partea de jos a dialogului, faceți clic pe Aplicare.

Tabloul se va reîncărca cu configurația actualizată. Celula de resurse va indica acum cum o resursă a corespuns constrângerii de limbă din panoul filtru.

Rezumat

În pașii de mai sus, am modificat panoul Filtru din asistentul de planificare pentru a afișa un control filtru pentru entitatea limbă. Am modificat, de asemenea, Interogarea regăsire constrângeri pentru a interoga atributele pentru noua limbă, și le formam într-o listă. Atunci când un utilizator selectează disponibilitatea pentru o înregistrare de cerință, panoul Filtru va arăta constrângerile Limbă capturate. Valorile din panoul de filtrare sunt trecute în interogarea de regăsit resursele și FetchXML interogarea returnează numai resursele potrivite.

Consultați și

FetchXML universal

Universal Resource Scheduling note de lansare privind extensibilitatea