Udostępnij za pośrednictwem


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ę

  1. W Dynamics 365, w obszarze Dostosowania należy utworzyć nowego Wydawcę

  2. Wypełnij formularz Nowy wydawca podając poniższe szczegóły:

    Pole Value
    Wyświetlana nazwa Language
    Nazwisko język
    Prefiks lang
  3. Kliknij Zapisz i Zamknij

Utwórz nowe rozwiązanie

  1. W Dynamics 365, w obszarze Dostosowania należy utworzyć nowe Rozwiązanie

  2. 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
  3. Kliknij Zapisz

Utwórz encję Język

  1. W rozwiązaniu Język utwórz nową Encję

  2. 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)
  3. Kliknij Zapisz

Utwórz relację wiele do wielu między encją Zasób i Język

  1. W encji Język utwórz Relację wiele do wielu

  2. 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ć
  3. Kliknij Zapisz i Zamknij

  4. Zamknij formularz encji Język

Utwórz relacje między encją Wymaganie i encją Język

  1. 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.)

  2. W encji Wymaganie zasobu utwórz nowe Pole

  3. 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
  4. Kliknij Zapisz i Zamknij

  5. W encji Wymaganie zasobu utwórz nowe Pole

  6. 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
  7. Kliknij Zapisz i Zamknij

Zaktualizuj formularza główny Wymaganie

  1. 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.)
  2. 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ń
  3. Kliknij Zapisz
  4. Kliknij Publikuj
  5. 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.

  1. W Dynamics 365, na górnym pasku nawigacyjnym, przejdź do Planowanie zasobów > Tablica harmonogramu
  2. W prawym górnym kliknij znak +, aby utworzyć nową tablicę
  3. Nazwij nową tablicę Język
  4. 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:

  1. W prawym górnym kliknij dwukrotnie kartę Język
  2. Przewiń w dół do Ustawienia ogólne > Inne ustawienia
  3. Znajdź pole Układ filtru, kliknij przycisk z prawej strony, aby otworzyć Edytor
  4. Zaktualizuj pole Wartość za pomocą kodu Układ filtru powyżej, a następnie kliknij Zapisz jako.
  5. 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.
  6. 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_primaryi 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

  1. W prawym górnym kliknij dwukrotnie kartę Język
  2. Przewiń w dół do Ustawienia ogólne > Inne ustawienia
  3. Znajdź pole Zapytanie dotyczące zasobów, kliknij przycisk z prawej strony, aby otworzyć Edytor
  4. Zaktualizuj pole Wartość za pomocą kodu Zapytanie dotyczące zasobów powyżej, a następnie kliknij Zapisz jako
  5. 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.
  6. 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

  1. W prawym górnym kliknij dwukrotnie kartę Język
  2. W prawym górnym rogu kliknij Otwórz ustawienia domyślne
  3. Przejdź do sekcji Typy harmonogramów i wybierz Brak z listy po lewej stronie
  4. Znajdź pole Układ filtru asystenta planowania, kliknij przycisk z prawej strony, aby otworzyć Edytor
  5. Zaktualizuj pole Wartość za pomocą kodu Układ filtru asystenta planowania powyżej, a następnie kliknij Zapisz jako
  6. 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.
  7. 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ń

  1. W prawym górnym kliknij dwukrotnie kartę Język
  2. W prawym górnym rogu kliknij Otwórz ustawienia domyślne
  3. Przejdź do sekcji Typy harmonogramów i wybierz Brak z listy po lewej stronie
  4. Znajdź pole Zapytanie dotyczące ograniczeń asystenta planowania, kliknij przycisk z prawej strony, aby otworzyć Edytor
  5. Zaktualizuj pole Wartość za pomocą kodu Zapytanie dotyczące zasobów powyżej, a następnie kliknij Zapisz jako
  6. 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.
  7. 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
  8. 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;'>&#10004;{{#if lang_secondary}} &#10033;{{/if}}</span>
{{else if lang_secondary}}
<span style='color:#ffe700;'>&#10004;</span>
{{/if}} 

Właściwości lang_primaryi 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;'>&#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>

Zaktualizuj Szablon komórki zasobu

  1. W prawym górnym kliknij dwukrotnie kartę Język
  2. W prawym górnym rogu kliknij Otwórz ustawienia domyślne
  3. Przejdź do sekcji Typy harmonogramów i wybierz Brak z listy po lewej stronie
  4. Znajdź pole Szablon komórki zasobu asystenta planowania, kliknij przycisk z prawej strony, aby otworzyć Edytor
  5. Zaktualizuj pole Wartość za pomocą kodu Szablon komórki zasobu powyżej, a następnie kliknij Zapisz jako
  6. 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.
  7. 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

Uniwersalny Fetch XML

Możliwości rozszerzania Universal Resource Scheduling — Informacje o wersji