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
În Dynamics 365, sub Particularizări, creați un nou Editor
Completați formularul Editor nou cu detaliile de mai jos:
Câmp Value Nume afișat Language Nume limbă Prefix lang Faceți clic pe Salvare și închidere
Creați o nouă Soluție
În Dynamics 365, sub Particularizări, creați o nouă Soluție
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 Faceți clic pe Salvare
Creați entitatea limbă
În Soluția de limbă, creați o nouă Entitate
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)Faceți clic pe Salvare
Creați relația mulți-la-mulți din entitatea Resursă pentru entitatea Limbă
În entitatea limbă, creați o nouă relație mulți-la-mulți
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 Faceți clic pe Salvare și închidere
Închideți formularul entitate Limbă
Creați relațiile mulți-la-mulți din entitatea Cerință pentru entitatea Limbă
Î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).
În entitatea Cerință de resurse, creați un nou câmp
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 Faceți clic pe Salvare și închidere
În entitatea Cerință de resurse, creați un nou câmp
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 Faceți clic pe Salvare și închidere
Actualizați formularul principal Cerință
- Î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).
- Î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
- Faceți clic pe Salvare
- Faceți clic pe Publicare
- 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.
- În Dynamics 365 în bara de navigare superioară, accesați Planificare resurse > Tablou de planificare
- În dreapta sus, faceți clic pe semnul + pentru a crea un nou tablou
- Numiți noul tablou Limbă
- Î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:
- În partea dreaptă sus, faceți dublu clic pe fila Limbă
- Defilați în jos la Setări generale > Alte setări
- Localizați câmpul Aspect filtru, faceți clic pe butonul din dreapta pentru a deschide editorul
- Actualizați câmpul Valoare cu codul Aspectului filtru de mai sus și faceți clic pe Salvare ca.
- 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.
- Î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
- În partea dreaptă sus, faceți dublu clic pe fila Limbă
- Defilați în jos la Setări generale > Alte setări
- Localizați câmpul interogare regăsire resurse, faceți clic pe butonul din dreapta pentru a deschide editorul
- Actualizați câmpul Valoare cu codul interogare regăsire resurse de mai sus și faceți clic pe Salvare ca
- 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.
- Î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
- În partea dreaptă sus, faceți dublu clic pe fila Limbă
- În dreapta sus, faceți clic pe Deschideți setările implicite
- Derulați la secțiunea Tipuri de planificare și selectați niciunul în lista din stânga
- Localizați câmpul Aspect filtru asistent de planificare, faceți clic pe butonul din dreapta pentru a deschide editorul
- Actualizați câmpul Valoare cu codul Aspectului filtru asistent de planificare de mai sus și faceți clic pe Salvare ca
- 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.
- Î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
- În partea dreaptă sus, faceți dublu clic pe fila Limbă
- În dreapta sus, faceți clic pe Deschideți setările implicite
- Derulați la secțiunea Tipuri de planificare și selectați niciunul în lista din stânga
- Localizați câmpul Interogare regăsire constrângeri pentru asistentul de planificare, faceți clic pe butonul din dreapta pentru a deschide editorul
- Actualizați câmpul Valoare cu codul interogare regăsire resurse de mai sus și faceți clic pe Salvare ca
- 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.
- 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
- Î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;'>✔{{#if lang_secondary}} ✱{{/if}}</span>
{{else if lang_secondary}}
<span style='color:#ffe700;'>✔</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;'>✔{{#if lang_secondary}} ✱{{/if}}</span>
{{else if lang_secondary}}
<span style='color:#ffe700;'>✔</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
- În partea dreaptă sus, faceți dublu clic pe fila Limbă
- În dreapta sus, faceți clic pe Deschideți setările implicite
- Derulați la secțiunea Tipuri de planificare și selectați niciunul în lista din stânga
- Localizați câmpul Șablon celulă de resurse pentru asistentul de planificare, faceți clic pe butonul din dreapta pentru a deschide editorul
- Actualizați câmpul Valoare cu codul șablon celulă de resurse de mai sus și faceți clic pe Salvare ca
- 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.
- Î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
Universal Resource Scheduling note de lansare privind extensibilitatea