Przykład: Rozszerz Universal Resource Scheduling przy użyciu niestandardowego ograniczenia językowego
Ten przewodnik krok po kroku stanowi dodatek Informacje na temat i dostosowywanie zasobów w Universal Resource Scheduling
W tym przewodniku krok po kroku rozszerzymy zasoby Universal Resource Scheduling o ograniczenie Language
. Weźmy pod uwagę organizację, która chce filtrować zasoby według języków, w których odbywa się w niej komunikacja. Chcą także przechwytywać rekord Requirement
, którego język wymagał dla zadania. To ograniczenie jest podobne do wbudowanego ograniczenia Territory
. Nowa encja główna Language
będzie przechowywać różne języki, z których korzysta zasób. Rekord Resource
można skojarzyć z wieloma Languages
dzięki encji relacji wiele do wielu. Na encji Requirement
pokażemy to tworząc dwa nowe atrybuty wyszukiwania: Primary Language
i Secondary Language
. Podczas wyszukiwania dostępnych zasobów dla wymagania, tylko zasoby skojarzone z Primary Language
lub Secondary Language
będą wyświetlane.
Tworzenie nowych encji i relacji
W tej sekcji utworzymy nowy schemat encji głównej Language
i zaktualizujemy encje Resource
i Requirement
odpowiednimi relacjami z nową encją Language
.
Utwórz nowego Wydawcę
W Dynamics 365, w obszarze Dostosowania należy utworzyć nowego Wydawcę
Wypełnij formularz Nowy wydawca podając poniższe szczegóły:
Pole Value Wyświetlana nazwa Language Nazwisko język Prefiks lang Kliknij Zapisz i Zamknij
Utwórz nowe rozwiązanie
W Dynamics 365, w obszarze Dostosowania należy utworzyć nowe Rozwiązanie
Wypełnij formularz Nowe rozwiązanie podając poniższe szczegóły:
Pole Value Wyświetlana nazwa Language Nazwisko Language Wydawca Language Wersja 1.0.0.0 Kliknij Zapisz
Utwórz encję Język
W rozwiązaniu Język utwórz nową Encję
Wypełnij formularz Nowa encja podając poniższe szczegóły:
Pole Value Wyświetlana nazwa Language Nazwa w lm Języki Nazwa/nazwisko lang_language (Prefiks lang_
zostanie wypełniony automatycznie i będzie tylko do odczytu)Kliknij Zapisz
Utwórz relację wiele do wielu między encją Zasób i Język
W encji Język utwórz Relację wiele do wielu
Wypełnij formularz Nowa relacja podając poniższe szczegóły:
Pole Value Bieżący obiekt Opcja wyświetlania Użyj nazwy w liczbie mnogiej Inny obiekt Nazwa obiektu Zasób, który można zarezerwować Kliknij Zapisz i Zamknij
Zamknij formularz encji Język
Utwórz relacje między encją Wymaganie i encją Język
W rozwiązaniu Język dodaj istniejącą encję Wymaganie zasobu do rozwiązania (jeśli pojawi się okno dialogowe Brak wymaganych składników, wybierz Nie, nie umieszczaj wymaganych składników.)
W encji Wymaganie zasobu utwórz nowe Pole
Wypełnij formularz Nowe pole podając poniższe szczegóły:
Pole Value Wyświetlana nazwa Język podstawowy Typ danych Wyszukiwanie Docelowy typ rekordu Language Kliknij Zapisz i Zamknij
W encji Wymaganie zasobu utwórz nowe Pole
Wypełnij formularz Nowe pole podając poniższe szczegóły:
Pole Value Wyświetlana nazwa Język dodatkowy Typ danych Wyszukiwanie Docelowy typ rekordu Language Kliknij Zapisz i Zamknij
Zaktualizuj formularza główny Wymaganie
- W encji Wymaganie zasobu dodaj istniejący formularz Informacje do składników podrzędnych encji (jeśli pojawi się okno dialogowe Brak wymaganych składników, wybierz Nie, nie umieszczaj wymaganych składników.)
- W formularzu Informacje użyj Eksploratora pola, aby dodać dwa nowe atrybuty, Język główny i Język dodatkowy do formularza, aby użytkownicy mogli wprowadzać te informacje podczas tworzenia wymagań
- Kliknij Zapisz
- Kliknij Publikuj
- Możesz zamknąć Edytor formularzy
Podsumowanie
Powyższe kroki pozwoliły utworzyć nową encję Język. Następnie dodaliśmy nowe relacje z encjami Zasób i Wymaganie. Zasoby mogą być powiązane z wieloma językami, ponieważ dodaliśmy relację wiele do wielu między Język i Zasób. Wymagania mogą być powiązane z dwoma językami, ponieważ dodaliśmy dwa atrybuty wyszukiwania na encji Wymaganie wskazujące na nową encję Język.
Dodawanie danych
Użyj szukania zaawansowanego, aby dodać nowe rekordy do encji Język. Możesz skojarzyć rekordy Zasób z nowymi rekordami Język otwierając rekord Zasób i przechodząc do relacji Język na pasku nawigacyjnym. Dla rekordów Wymaganie możesz wypełnić nowe pola Język podstawowy i Język dodatkowy język w formularzu Wymaganie.
Dostosowywanie tablicy harmonogramu
Aby filtrować zasoby na Tablicy harmonogramu przy użyciu nowego ograniczenia Język, przeprowadzimy aktualizację rekordów Zapytanie dotyczące zasobów i Konfiguracja układu filtru.
Konfiguracja układu filtru
Napiwek
W przypadku poniższych kroków warto edytora tekstów, który obsługuje wyróżnianie składni języka XML, aby wprowadzić zmiany, a następnie wkleić zmiany w edytorze Universal Resource Scheduling.
Konfiguracja układ filtru to definicja układu XML pozwalająca dostosować układ panelu Filtr.
Uwaga
W tym ćwiczeniu usuniemy wszystkie filtry domyślne dostarczane z Universal Resource Scheduling z panelu Filtr i dodamy Języki jako jedyny dostępny filtr.
<control type="combo" source="entity" key="Languages" inactive-state="1" label-id="Languages" entity="lang_language" multi="true" />
Element control
dodaje nowe kontrolki do panelu Filtr. Oto opis każdego atrybutu:
Nazwisko | Opis |
---|---|
type |
Typ formantu filtru. Formant combo renderuje listę rozwijaną z wartościami do wyboru |
source |
Źródło wartości dla formantu listy rozwijanej. Źródło entity ukazuje rekordy encji na liście rozwijanej |
key |
Klucz, którego należy używać do przechowywania wybranych wartości w zbiorze właściwości ograniczenia |
inactive-state |
Nieaktywny kod statecode dla tej encji. Używany do wykluczania nieaktywnych rekordów z listy rozwijanej |
label-id |
Zlokalizowana etykieta, która ma być używana dla tego formantu |
entity |
Rekordy tej encji zostaną wyświetlone na liście rozwijanej |
multi |
Konfiguruje listę rozwijaną, aby umożliwić wybranie jednego lub wielu rekordów |
Układ 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>
Utwórz nową tablicę Języki
Aby odizolować te zmiany utworzymy zupełnie nową oddzielą Tablicę harmonogramu i zaimplementujemy zmiany, ale zawsze możesz wprowadzić te zmiany w domyślnej Tablicy harmonogramu, aby inne Tablice harmonogram mogły automatycznie odziedziczyć te zmiany.
- W Dynamics 365, na górnym pasku nawigacyjnym, przejdź do Planowanie zasobów > Tablica harmonogramu
- W prawym górnym kliknij znak +, aby utworzyć nową tablicę
- Nazwij nową tablicę Język
- U dołu okna dialogowego kliknij Dodaj. Nowa tablica zostanie utworzona.
Zaktualizuj Układ filtru tablicy harmonogramu
Następnie utworzymy nowy rekord konfiguracji, który przechowuje układy filtrów i zapytania używane przez Tablicę harmonogramu, a następnie połączymy nowoutworzoną Tablicę harmonogramu z nowoutworzonym rekordem konfiguracji. Istnieje wiele sposobów, aby to zrobić, ale ten jest najszybszy:
- W prawym górnym kliknij dwukrotnie kartę Język
- Przewiń w dół do Ustawienia ogólne > Inne ustawienia
- Znajdź pole Układ filtru, kliknij przycisk z prawej strony, aby otworzyć Edytor
- Zaktualizuj pole Wartość za pomocą kodu Układ filtru powyżej, a następnie kliknij Zapisz jako.
- Wprowadź w polu Nazwa "Układ filtru języka " i kliknij Zapisz. Spowoduje to utworzenie nowego rekordu konfiguracji i połączy tę Tablicę harmonogramu z rekordem.
- U dołu okna dialogowego kliknij Zastosuj
Tablica zostanie załadowana ponownie i zobaczysz panel Filtr po lewej z nowym układem; tylko filtr Języki będzie dostępny. Filtrowanie nie będzie jeszcze działać, ponieważ musimy zaktualizować Zapytanie dotyczące zasobów, aby móc skorzystać z nowego filtru.
Konfiguracja Zapytania dotyczącego zasobów
Napiwek
W przypadku poniższych kroków warto edytora tekstów, który obsługuje wyróżnianie składni języka XML, aby wprowadzić zmiany, a następnie wkleić zmiany w edytorze Universal Resource Scheduling.
Konfiguracja Zapytania dotyczącego zasobów to UFX Query używane przez interfejs API dopasowywania zasobów. Uznaje za dane wejściowe wartości wprowadzane w panelu Filtr i dynamicznie tworzy poprawne FetchXML, aby znajdować pasujące zasoby.
Poniżej znajdują się nowe urywki dodane do Zapytania dotyczącego zasobów, aby dopasować i zamówić przez Języki zasobów.
Dodawanie sprzężeń z bookableresource
do 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>
Wartości wybrane w panelu Filtr są przekazywane jako dane wejściowe do zapytania i są dostępne w zmiennej XPath
$input
Zapytanie dotyczące zasobów używa FetchXML dla zapytania encji Resource (bookableresource)
. Wykorzystujemy element FetchXML link-entity
, aby zwracać zasoby skojarzone z rekordami Język wybranymi w panelu Filtr. Do obsługi wyświetlania dopasowanych języków i zamawiania dla języka podstawowego lub pomocniczego, opisanych dalej w tej sekcji Szablon komórki zasobów, wykorzystujemy wiele sprzężeń link-entity
.
Oto opis każdego element
i attribute
:
Nazwisko | Opis |
---|---|
link-entity |
Utwórz sprzężenie do relacji wiele do wielu między encjami Zasób i Język |
ufx:if |
Emituj ten element FetchXML (link-entity ) tylko jeśli wyrażenie XPath w tym atrybucie zwraca wartość |
attribute |
Zwróć dopasowany język podstawowy lub język pomocniczy |
filter i condition |
Filtruj rekordy relacji wiele do wielu tylko do tych, które spełniają określone identyfikatory Język |
ufx:value i select |
Wyświetla wynik wyrażenia XPath w atrybucie select |
ufx:apply i select |
Emituj podrzędne elementy FetchXML dla każdego wyniku zwróconego z wyrażenia XPath w atrybucie select |
value |
Zawiera identyfikator rekordu Język |
Określanie porządku Sortowanie zasobów
Po pobraniu dopasowanych zasobów, w oparciu o języki przypisane do poszczególnych zasobów, przypisujemy nową właściwość lang_order
, aby określić kolejność sortowania.
<bag>
<lang_order ufx:select="iif(lang_primary and lang_secondary, 1, iif(lang_primary, 2, iif(lang_secondary, 3, 4)))" />
</bag>
Oto opis każdego element
i attribute
:
Nazwisko | Opis |
---|---|
lang_order |
Utwórz nową właściwości w każdym Zasobie zwróconym z zapytania FetchXML o nazwielang_order |
ufx:select |
Przypisz wynik wyrażenia XPath w tym atrybucie do właściwości lang_order . Właściwości lang_primary i lang_secondary , pobrane wcześniej w zapytaniu, są używane razem z funkcją XPath iif w celu określenia porządku dopasowywania zasobów. |
Porządkowanie wyników
<Resources ufx:select="order(Resources, 'lang_order')" />
UFX Queries są przetwarzane w kolejności sekwencyjnej. Po pobraniu zasobów za pomocą FetchXML, wyniki są przypisywane do właściwości Resources
. Sortujemy wyniki w oparciu o właściwość lang_order
dodaną wcześniej i ponowne przypisujemy posortowane wyniki do właściwości Resources
.
Oto opis każdego element
i attribute
:
Nazwa/nazwisko | Opis |
---|---|
Resources |
Ponownie przypisz właściwość Resources |
ufx:select |
Przypisz wynik wyrażenia XPath w tym atrybucie do właściwości Resources . Funkcja XPath order jest używana do porządkowania listy Resources dla właściwości lang_order . |
Uwaga
Domyślne Zapytanie dotyczące zasobów dostarczane z Universal Resource Scheduling to duże zapytanie, które obsługuje wszystkie ograniczenia zasobów z Universal Resource Scheduling. W tym ćwiczeniu użyjemy tylko podzbiór domyślnego zapytania i dodamy Języki jako jedyny filtr.
<?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>
Zaktualizuj Zapytanie dotyczące zasobów dla Tablicy harmonogramu
- W prawym górnym kliknij dwukrotnie kartę Język
- Przewiń w dół do Ustawienia ogólne > Inne ustawienia
- Znajdź pole Zapytanie dotyczące zasobów, kliknij przycisk z prawej strony, aby otworzyć Edytor
- Zaktualizuj pole Wartość za pomocą kodu Zapytanie dotyczące zasobów powyżej, a następnie kliknij Zapisz jako
- Wprowadź w polu Nazwa "Zapytanie dotyczące zasobów języka " i kliknij Zapisz. Spowoduje to utworzenie nowego rekordu konfiguracji i połączy tę Tablicę harmonogramu z rekordem.
- U dołu okna dialogowego kliknij Zastosuj
Tablica zostanie załadowana ponownie zaktualizowaną konfiguracją. Filtrowanie będzie teraz działać. Jeśli utworzyłeś rekordy Język i skojarzyłeś je z rekordami Zasoby, będziesz w stanie filtrować zasoby według skojarzonych z nimi języków.
Podsumowanie
W powyższych krokach zmodyfikowaliśmy panel Filtr, aby pokazać formant filtrowania dla encji Język. Zmodyfikowaliśmy również Zapytanie dotyczące zasobów, aby dopasować zasoby skojarzone z rekordami wybranego Języka. Gdy użytkownik wybiera wartości w formancie filtru i klika Wyszukaj, wartości są przekazywane do zapytania a zapytanie FetchXML zwraca tylko dopasowane zasoby.
Dostosowywanie Asystenta planowania
Musimy dostosować Układ filtru asystenta planowania i konfiguracje Zapytanie dotyczące ograniczeń, aby używać nowych ograniczeń Język w Asystencie planowania.
W przeciwieństwie do dostosowań Tablicy harmonogramu, gdzie każdą tablicę można osobno dostosować, dostosowania Asystenta planowania mają wpływ na wszystkie tablice, w których Asystent planowania jest używany. Dostosowania Asystenta planowania mogą być specyficzne dla planowanego typu lub dla wszystkich typów. W tym przykładzie dostosujemy Asystenta planowania dla wszystkich typów.
Konfiguracja układu filtru asystenta planowania
Napiwek
W przypadku poniższych kroków warto edytora tekstów, który obsługuje wyróżnianie składni języka XML, aby wprowadzić zmiany, a następnie wkleić zmiany w edytorze Universal Resource Scheduling.
Konfiguracja układu filtru asystenta planowania., podobnie jak Układ filtru tablicy harmonogramu, określa układ formantów w panelu Filtr. Ponieważ w Asystencie planowania używa większej ilości filtrów niż Tablica harmonogramu, takich jak Godzina rozpoczęcia, Godzina zakończenia, Czas trwania, itp., używany jest inny układ.
Uwaga
W tym ćwiczeniu użyjemy ponownie tylko podzbioru domyślnych filtrów dostarczanego w Universal Resource Scheduling z konfiguracji Układ filtru asystenta planowania i dodamy listę rozwijaną Języki jako jedyny dostępny filtr.
Filtr dodawany do układu jest taki sam jak ten opisany powyżej w Konfiguracja układu filtru. Inne formanty są niezbędne do modyfikowania parametrów wyszukiwania Asystenta planowania.
Kompletny Układ filtru asystenta planowania
<?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>
Zaktualizuj Układ filtru asystenta planowania
- W prawym górnym kliknij dwukrotnie kartę Język
- W prawym górnym rogu kliknij Otwórz ustawienia domyślne
- Przejdź do sekcji Typy harmonogramów i wybierz Brak z listy po lewej stronie
- Znajdź pole Układ filtru asystenta planowania, kliknij przycisk z prawej strony, aby otworzyć Edytor
- Zaktualizuj pole Wartość za pomocą kodu Układ filtru asystenta planowania powyżej, a następnie kliknij Zapisz jako
- Wprowadź w polu Nazwa "Układ filtru asystenta planowania języka " i kliknij Zapisz. Spowoduje to utworzenie nowego rekordu konfiguracji i połączy tę Tablicę harmonogramu z rekordem.
- U dołu okna dialogowego kliknij Zastosuj
Tablica zostanie załadowana ponownie. Następnie musimy zmienić Zapytanie dotyczące ograniczeń zanim będzie można używać do Asystenta planowania z naszymi nowymi ograniczeniami języka, aby Języki ustawione w Wymaganiach były częścią wyszukiwania Asystenta planowania.
Konfiguracja zapytanie dotyczącego ograniczeń
Napiwek
W przypadku poniższych kroków warto edytora tekstów, który obsługuje wyróżnianie składni języka XML, aby wprowadzić zmiany, a następnie wkleić zmiany w edytorze Universal Resource Scheduling.
Konfiguracja Zapytania dotyczącego ograniczeń to UFX Query używane przez interfejs API Ograniczenia odzyskiwania wymagań. Wprowadza jako dane wejściowe identyfikator rekordu Wymagania (wybrany w interfejsie użytkownika) i zwraca rekord Wymagania i wszystkie jego rekordy podrzędne.
Uwaga
Domyślne Zapytanie dotyczące ograniczeń dostarczane z Universal Resource Scheduling to duże zapytanie, które obsługuje wszystkie ograniczenia wymagań z Universal Resource Scheduling. W tym ćwiczeniu użyjemy tylko podzbiór domyślnego zapytania i dodamy Języki jako jedyny filtr.
<Languages ufx:select="lookup-to-list(Requirement/lang_primarylanguage, Requirement/lang_secondarylanguage)" />
UFX Queries są przetwarzane w kolejności sekwencyjnej. Zapytanie dotyczące ograniczeń używa FetchXML, aby wysłać zapytanie do encji Requirement (msdyn_resourcerequirement)
i do przypisać wynik, rekord Wymaganie, do właściwości Requirement
. Dodajemy do zestawu właściwości ograniczeń nową właściwość Languages
, która łączy oba atrybuty, Język podstawowy i Język dodatkowy, w jedną listę encji (EntityCollection). Jest to wymagane, ponieważ ukazujemy formant Języki w panelu Filtr jako listę rekordów. Alternatywą jest tworzenie dwóch oddzielnych formantów w panelu Filtr dla dwóch atrybutów.
Oto opis każdego element
i attribute
:
Nazwisko | Opis |
---|---|
Languages |
Utwórz nową właściwość w zestawie właściwości ograniczeń wyników, o nazwie Languages |
ufx:select |
Przypisz wynik wyrażenia XPath w tym atrybucie do właściwości Languages . Właściwości lang_primarylanguage i lang_secondarylanguage , pobrane wcześniej w zapytaniu i dostępne we właściwości Requirement , są przekazywane do funkcji lookup-to-list XPath, która konwertuje wiele właściwości lookup do jednejlist (EntityCollection) |
Zapytanie dotyczące ograniczeń:
<?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>
Zaktualizuj Zapytanie dotyczące ograniczeń
- W prawym górnym kliknij dwukrotnie kartę Język
- W prawym górnym rogu kliknij Otwórz ustawienia domyślne
- Przejdź do sekcji Typy harmonogramów i wybierz Brak z listy po lewej stronie
- Znajdź pole Zapytanie dotyczące ograniczeń asystenta planowania, kliknij przycisk z prawej strony, aby otworzyć Edytor
- Zaktualizuj pole Wartość za pomocą kodu Zapytanie dotyczące zasobów powyżej, a następnie kliknij Zapisz jako
- Wprowadź w polu Nazwa "Zapytanie dotyczące ograniczeń języka " i kliknij Zapisz. Spowoduje to utworzenie nowego rekordu konfiguracji i połączy tę Tablicę harmonogramu z rekordem.
- Znajdź pole Zapytanie dotyczące zasobów asystenta planowania i wybierz Zapytanie dotyczące zasobów języków, które utworzyliśmy wcześniej dla dostosowań Tablicy harmonogramu
- U dołu okna dialogowego kliknij Zastosuj
Tablica zostanie załadowana ponownie zaktualizowaną konfiguracją. Filtrowanie Asystenta planowania będzie teraz działać. Jeśli utworzyłeś rekordy Język i skojarzyłeś je z rekordami Wymagania, będziesz mógł wybrać rekord Wymaganie w dolnej części Tablicy harmonogramu, kliknąć Znajdź dostępność, aby uruchomić Asystenta planowania, i wyświetlić tylko zasoby pasujące do języków zapisanych w wymaganiu.
Konfiguracja szablonu komórki zasobu
Napiwek
W przypadku poniższych kroków warto edytora tekstów, który obsługuje wyróżnianie składni języka HTML, aby wprowadzić zmiany, a następnie wkleić zmiany w edytorze Universal Resource Scheduling.
Konfiguracja szablonu komórki zasobu to szablon Odległość używany do renderowania zawartości w komórce zasobu. Wynik z Zapytanie dotyczące zasobów jest dostępny dla szablonu.
Modyfikujemy domyślny szablon zasobów do pokazywania zielonego wskaźnika ✔✱, jeśli zasób pasuje do języka głównego i pomocniczego, zielony wskaźnik ✔, jeśli zasób pasuje tylko do języka podstawowego i żółty wskaźnik ✔, jeśli zasób pasuje tylko do języka pomocniczego.
{{#if lang_primary}}
<span style='color:green;'>✔{{#if lang_secondary}} ✱{{/if}}</span>
{{else if lang_secondary}}
<span style='color:#ffe700;'>✔</span>
{{/if}}
Właściwości lang_primary
i lang_secondary
są zwracane z naszego niestandardowego Zapytania dotyczącego zasobów utworzonego powyżej. Zapoznaj się z witryną Odległości, aby uzyskać dokumentację dotyczącą składni używanej w szablonach.
Szablon komórki zasobu:
<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>
Zaktualizuj Szablon komórki zasobu
- W prawym górnym kliknij dwukrotnie kartę Język
- W prawym górnym rogu kliknij Otwórz ustawienia domyślne
- Przejdź do sekcji Typy harmonogramów i wybierz Brak z listy po lewej stronie
- Znajdź pole Szablon komórki zasobu asystenta planowania, kliknij przycisk z prawej strony, aby otworzyć Edytor
- Zaktualizuj pole Wartość za pomocą kodu Szablon komórki zasobu powyżej, a następnie kliknij Zapisz jako
- Wprowadź w polu Nazwa "Szablon komórki zasobu Język " i kliknij Zapisz. Spowoduje to utworzenie nowego rekordu konfiguracji i połączy tę Tablicę harmonogramu z rekordem.
- U dołu okna dialogowego kliknij Zastosuj
Tablica zostanie załadowana ponownie zaktualizowaną konfiguracją. Komórka zasobu wskaże, jak zasób dopasował się do ograniczenie języka w panelu Filtr.
Podsumowanie
W powyższych krokach zmodyfikowaliśmy panel Filtr w Asystencie planowania, aby pokazać formant filtrowania dla encji Język. Zmodyfikowaliśmy również Zapytanie dotyczące ograniczeń, aby zadać zapytanie do nowych atrybutów Język powiązanych z encją Wymaganie, i utworzyliśmy z nich listę. Po wybraniu przez użytkownika znajdowania dostępności dla rekordu Wymaganie, panel Filtr wyświetla przechwycone ograniczenia Język. Wartości z panelu Filtr są przekazywane do Zapytanie dotyczące zasobów a zapytanie FetchXML zwraca tylko pasujące zasoby.
Zobacz także
Możliwości rozszerzania Universal Resource Scheduling — Informacje o wersji