Udostępnij przez


Przykład: Rozszerzanie uniwersalnego planowania zasobów za pomocą niestandardowego ograniczenia języka

Ten artykuł jest uzupełnieniem tematu Rozumienie i dostosowywanie dopasowywania zasobów w rozwiązaniu Universal Resource Scheduling.

W tym przewodniku krok po kroku rozszerzymy zasoby Universal Resource Scheduling o Languageograniczenie . Weźmy pod uwagę organizację, która chce filtrować zasoby według języków, którymi się posługują. Chcą również uchwycić w rejestrze Requirement język wymagany do wykonania zadania. To ograniczenie podąża podobnym wzorcem do wbudowanego ograniczenia Territory. Nowa encja Language główna przechowuje różne języki, którymi może posługiwać się zasób. Rekord Resource można skojarzyć z wieloma Languages dzięki encji relacji wiele do wielu. Na Requirement jednostce modelujemy to, tworząc dwa nowe atrybuty wyszukiwania: Primary Language i Secondary Language. Gdy system szuka dostępnych zasobów dla wymagania, pokazują się tylko zasoby skojarzone z Primary Language lub Secondary Language.

Wskazówka

Jednostka jest również nazywana tabelą.

Tworzenie nowych tabel i relacji

Utwórz nowy schemat dla tabeli głównej Language i zaktualizuj tabele Resource i Requirement poprzez odpowiednie relacje z nową tabelą Language.

Tworzenie nowego wydawcy

  1. Przejdź do Aplikacja ustawień środowiska Power Platform. Wybierz pozycję Dostosowania>Wydawcy i utwórz nowego wydawcę. Dowiedz się więcej w temacie Tworzenie wydawcy.

  2. Wprowadź następujące informacje:

    Pole Wartość
    nazwa wyświetlana Język
    Nazwa Język
    Prefiks lang
  3. Wybierz Zapisz.

Utwórz nowe rozwiązanie

  1. Wybierz pozycję Rozwiązania dostosowań> i utwórz nowe rozwiązanie. Dowiedz się więcej w temacie Tworzenie rozwiązania.

  2. Wprowadź następujące informacje:

    Pole Wartość
    Wyświetlana nazwa Język
    Nazwa Język
    Wydawca Język
    Wersja 1.0.0.0
  3. Wybierz Utwórz.

Tworzenie tabeli językowej

  1. Otwórz rozwiązanie językowe i wybierz Nowa>Tabela>(właściwości zaawansowane). Dowiedz się więcej o tworzeniu nowych tabel.

  2. Wprowadź następujące informacje:

    Pole Wartość
    Wyświetlana nazwa Język
    Nazwa w liczbie mnogiej Języki

    Nazwa schematu w obszarze Opcje zaawansowane jest wypełniana automatycznie| lang_Language. Prefiks lang_ jest tylko do odczytu.

  3. Wybierz Zapisz.

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

  1. Otwórz tabelę Język i Nowe>Relacja>Wiele do wielu. Dowiedz się więcej o tworzeniu relacji wiele-do-wielu między tabelami.
  2. W polu Powiązana tabela (wiele) wybierz pozycję Zasób rezerwowalny.
  3. Wybierz pozycję Gotowe.
  4. Zamknij tabelę Język.

Utwórz relacje z istniejącej tabeli Wymaganie do tabeli Język

  1. Otwórz rozwiązanie językowe i wybierz pozycję Dodaj istniejący>Tabela>Zapotrzebowanie na zasoby.

  2. Jeśli zostanie wyświetlone okno dialogowe Brak wymaganych składników, wybierz pozycję Nie i nie uwzględnij wymaganych składników.

  3. Wybierz Dodaj.

  4. W tabeli Wymagania dotyczące zasobów utwórz nową kolumnę.

  5. Wprowadź następujące informacje:

    Pole Wartość
    nazwa wyświetlana Język podstawowy
    Typ danych Lookup
    Powiązana tabela Język
  6. Wybierz Zapisz.

  7. W tabeli Wymagania dotyczące zasobów utwórz nową kolumnę.

  8. Wprowadź następujące informacje:

    Pole Wartość
    nazwa wyświetlana Język dodatkowy
    Typ danych Lookup
    Powiązana tabela Język
  9. Wybierz Zapisz.

Zaktualizuj formularza główny Wymaganie

  1. W tabeli Wymagania dotyczące zasobów wybierz pozycję Formularze.
  2. Wybierz Dodaj istniejący formularz>Informacje i Dodaj. Jeśli zostanie wyświetlone okno dialogowe Brak wymaganych składników, wybierz pozycję Nie i nie uwzględnij wymaganych składników.
  3. Otwórz formularz Informacje i dodaj dwa nowe atrybuty, język podstawowy i język pomocniczy do formularza, aby użytkownicy mogli wprowadzać te informacje podczas tworzenia wymagań.
  4. Wybierz Zapisz i opublikuj.

Dodawanie danych językowych do zasobów i wymagań

Dodaj nowe rekordy do tabeli Language. Następnie można skojarzyć rekordy zasobów z nowymi rekordami języka, otwierając rekord zasobu i przechodząc do relacji języka na pasku nawigacyjnym. Dla rekordów wymagań 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ęzykowego, zaktualizuj rekordy konfiguracji "Retrieve Resources Query" oraz "Filter Layout".

Uwaga / Notatka

Te dostosowania tablicy harmonogramu mają zastosowanie do wszystkich kart jednolicie i nie można ich ustawić indywidualnie na kartę. To dostosowanie dotyczy Układu filtra asystenta harmonogramu, Zapytania dotyczącego pobierania zasobów asystenta harmonogramu, Szablonu komórki zasobu asystenta harmonogramui Zapytani dotyczącego ograniczeń pobierania agenta harmonogramu.

Konfigurowanie układu filtru

W poniższych krokach użyj edytora tekstów obsługującego wyróżnianie składni XML, aby wprowadzić zmiany, a następnie wklej zmiany z powrotem do edytora uniwersalnego planowania zasobów.

Konfiguracja układu filtru to definicja układu XML służąca do dostosowywania układu panelu Filtr.

Uwaga / Notatka

Usuń wszystkie filtry domyślne dostarczane z uniwersalnym planowaniem zasobów z panelu Filtr i dodaj 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 nową kontrolkę do panelu Filtr. Oto opis każdego atrybutu:

Nazwa Opis
type Typ kontroli filtra. Kontrolka 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 Nieaktywne statecode dla tego obiektu, który służy 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 pojedynczego rekordu lub wielu rekordów

Układ filtra:

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

Tworzenie nowej tablicy języków

Aby zachować izolację tych zmian, utwórz oddzielną tablicę harmonogramu i zaimplementuj zmiany. Te zmiany można zawsze wprowadzać w domyślnej tablicy harmonogramu, aby inne tablice harmonogramu mogły automatycznie dziedziczyć te zmiany.

  1. Przejdź do aplikacji Planowanie zasobów i wybierz pozycję Tablica harmonogramu.
  2. Wybierz znak, + aby utworzyć nową tablicę.
  3. Nazwij nowy język tablicy.
  4. W dolnej części okna dialogowego wybierz pozycję Dodaj. Zostanie utworzona nowa tablica.

Konfigurowanie układu filtru tablicy harmonogramu

Następnie utwórz nowy rekord konfiguracji, który przechowuje układy filtrów i zapytania używane przez tablicę harmonogramu. Następnie połącz nowo utworzoną tablicę harmonogramu z nowym rekordem konfiguracji. Istnieje wiele sposobów, aby to zrobić, ale oto najszybsza metoda:

  1. Na tablicy harmonogramu wybierz wielokropek (...) w prawym górnym rogu i ustawienia harmonogramu.
  2. Wybierz pozycję Wszystkie ustawienia tablicy w dolnej części okienka. Następnie wybierz pozycję Inne.
  3. Znajdź pole Układ filtru i wybierz ikonę ołówka, aby otworzyć edytor.
  4. Wprowadź ciąg "Układ filtru języka" w polu Nazwa i dodaj kod układu filtru, a następnie wybierz pozycję Zapisz jako nowy.
  5. Wybierz Zapisz. Zostanie utworzony nowy rekord konfiguracji, który łączy tę tablicę harmonogramu z rekordem.
  6. Wybierz Filtry. Zostanie wyświetlony panel Filtr z nowym układem. Dostępny jest tylko filtr Języki. Filtrowanie nie działa, dopóki nie zaktualizujesz zapytania Pobieranie zasobów.

Zaktualizuj zapytanie o pobieranie zasobów

W poniższych krokach użyj edytora tekstów obsługującego wyróżnianie składni XML, aby wprowadzić zmiany, a następnie wklej zmiany z powrotem do edytora uniwersalnego planowania zasobów.

Konfiguracja Zapytania dotyczącego zasobów to Zapytanie Universal FetchXML (UFX) Query używane przez interfejs API dopasowywania zasobów. Przyjmuje jako dane wejściowe wartości wprowadzone w panelu Filtr i dynamicznie konstruuje poprawny kod FetchXML w celu znalezienia pasujących zasobów.

Dodaj te fragmenty kodu do zapytania Pobieranie zasobów, aby dopasować je i uporządkować według języków zasobów.

Dodawanie łączeń 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 Retrieve Resources używa FetchXML do wykonywania zapytań dotyczących Resource (bookableresource) jednostki. Wybraliśmy element FetchXML link-entity , aby zwracał tylko zasoby skojarzone z rekordami języka wybranymi w panelu Filtr. Użyj wielu link-entity łączeń, aby wyświetlić dopasowane języki i sortuj według podstawowego lub drugorzędnego języka, jak opisano w sekcji Szablon komórki zasobu.

Oto opis każdego z element i attribute.

Nazwa Opis
link-entity Utwórz sprzężenie do relacji wiele do wielu między encjami Zasób i Język
ufx:if Ten element FetchXML (link-entity) należy emitować tylko wtedy, gdy 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 Wyprowadza 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 kolejności sortowania zasobu

Po pobraniu pasujących zasobów na podstawie przypisanych języków każdego zasobu przypisz nową lang_order właściwość, 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>

Opis każdego element i attribute.

Nazwa Opis
lang_order Utwórz nową właściwość w każdym zasobie zwróconym z zapytania FetchXML o nazwie lang_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 kolejności dopasowywania zasobów.

Kolejność wyników

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

Zapytania UFX są przetwarzane w kolejności sekwencyjnej. Po pobraniu zasobów za pomocą FetchXML wyniki są przypisywane do właściwości.Resources Posortuj wyniki na podstawie właściwości dodanej lang_order wcześniej i ponownie przypisz posortowane wyniki do Resources właściwości .

Opis każdego element i attribute:

Nazwa Opis
Resources Przypisz na nowo Resources właściwość
ufx:select Przypisz wynik wyrażenia XPath w tym atrybucie do właściwości Resources. Funkcja XPath order jest używana do uporządkowania Resources listy według jej lang_order atrybutu.

Uwaga / Notatka

Domyślne zapytanie o pobieranie zasobów dostarczane z planowaniem uniwersalnych zasobów to duże zapytanie, które obsługuje wszystkie ograniczenia zasobów zawarte w planowaniu zasobów uniwersalnych. W tym ćwiczeniu użyjemy tylko podzestawu 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. Na tablicy harmonogramu wybierz wielokropek (...) w prawym górnym rogu i ustawienia harmonogramu.
  2. Wybierz pozycję Wszystkie ustawienia tablicy w dolnej części okienka. Następnie wybierz pozycję Inne.
  3. Znajdź pole Pobieranie zasobów Zapytanie i wybierz ikonę ołówka, aby otworzyć edytor.
  4. Wprowadź frazę "Zapytanie dotyczące zasobów językowych" w polu Nazwa , dodaj kod zapytania Pobieranie zasobów i wybierz pozycję Zapisz jako nowy.
  5. Wybierz Zapisz. Zostanie utworzony nowy rekord konfiguracji, który łączy tę tablicę harmonogramu z rekordem.

Tablica ponownie załaduje zaktualizowaną konfigurację. Filtrowanie działa. Jeśli tworzysz rekordy języka i kojarzysz je z rekordami zasobów, możesz filtrować zasoby według skojarzonych języków.

Dostosowywanie Asystenta harmonogramu

Dostosuj widok filtra Asystenta Harmonogramu i uzyskaj konfiguracje zapytań dotyczących ograniczeń, aby korzystać z nowych ograniczeń językowych w Asystencie Harmonogramu.

W przeciwieństwie do dostosowań Tablicy harmonogramu, gdzie każda tablica może być indywidualnie dostosowywana, dostosowania Asystenta planowania mają wpływ na wszystkie tablice, na których jest używany Asystent planowania. Dostosowania Asystenta planowania mogą być specyficzne dla typu możliwego do zaplanowania lub dla wszystkich typów. W tym przykładzie dostosujemy Asystenta planowania dla wszystkich typów.

Konfigurowanie układu filtru Asystenta harmonogramu

W poniższych krokach użyj edytora tekstów obsługującego wyróżnianie składni XML, aby wprowadzić zmiany, a następnie wklej zmiany z powrotem do edytora uniwersalnego planowania zasobów.

Konfiguracja układu filtru asystenta planowania., podobnie jak Układ filtru tablicy harmonogramu, określa układ formantów w panelu Filtr. Ponieważ Asystent harmonogramu używa większej liczby filtrów niż tablica harmonogramu, takich jak godzina rozpoczęcia, godzina zakończenia i czas trwania, używany jest inny układ.

Uwaga / Notatka

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, który dodajemy do układu, jest taki sam w temacie Konfigurowanie układu filtru tablicy harmonogramu. Inne kontrolki są potrzebne do modyfikowania parametrów wyszukiwania Asystenta harmonogramu.

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>

Aktualizowanie układu filtru Asystenta planowania

  1. Na tablicy harmonogramu wybierz wielokropek (...) w prawym górnym rogu i ustawienia harmonogramu.
  2. Wybierz pozycję Wszystkie ustawienia tablicy w dolnej części okienka.
  3. Przewiń do pozycji Typy harmonogramu i wybierz pozycję Brak.
  4. Wybierz pozycję Edytuj wartości domyślne znajdujące się u dołu.
  5. Znajdź pole Układ filtru Asystenta harmonogramu , wybierz ikonę ołówka, aby otworzyć edytor.
  6. Wprowadź układ filtru Asystenta harmonogramu językowego w polu Nazwa .
  7. Zaktualizuj pole układu filtru Asystenta harmonogramu za pomocą kodu i wybierz pozycję Zapisz jako nowe. Zostanie utworzony nowy rekord konfiguracji, który łączy tę tablicę harmonogramu z rekordem.
  8. W dolnej części okna dialogowego Ustawienia tablicy wybierz pozycję Zapisz.

Tablica się przeładowuje. Zmień zapytanie dotyczące pobierania ograniczeń, aby uwzględnić języki ustawione w wymaganiach w wyszukiwarce Asystenta harmonogramu.

Konfigurowanie zapytania pobierania ograniczeń

W poniższych krokach użyj edytora tekstów obsługującego wyróżnianie składni XML, aby wprowadzić zmiany, a następnie wklej zmiany z powrotem do edytora uniwersalnego planowania zasobów.

Konfiguracja Zapytania dotyczącego ograniczeń to UFX Query używane przez interfejs API Ograniczenia odzyskiwania wymagań. Jako dane wejściowe przyjmuje identyfikator rekordu wymagań (wybranego w interfejsie użytkownika) i zwraca rekord wymagań oraz wszystkie jego rekordy podrzędne.

Uwaga / Notatka

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 podzestawu domyślnego zapytania i dodamy języki jako jedyny filtr.

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

Zapytania UFX 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 torby właściwości ograniczeń nową właściwość Languages , która łączy oba atrybuty, język podstawowy i język pomocniczy, w jedną listę jednostek (EntityCollection). Ta właściwość jest wymagana, ponieważ w panelu Filtr jest wyświetlana kontrolka Języki jako lista rekordów. Alternatywą jest utworzenie dwóch oddzielnych elementów sterujących w panelu Filtr dla dwóch atrybutów.

Opis każdego element i attribute:

Nazwa Opis
Languages Utwórz nową właściwość w torbie właściwości ograniczeń wynikowych 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, które zostały wcześniej pobrane w zapytaniu i są dostępne we właściwości Requirement, są przekazywane do funkcji XPath lookup-to-list, która konwertuje wiele właściwości lookup na pojedynczą list (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. Na tablicy harmonogramu wybierz wielokropek (...) w prawym górnym rogu i ustawienia harmonogramu.
  2. Wybierz pozycję Wszystkie ustawienia tablicy w dolnej części okienka.
  3. Przewiń do pozycji Typy harmonogramu i wybierz pozycję Brak.
  4. Wybierz pozycję Edytuj wartości domyślne.
  5. Znajdź pole Zapytanie dotyczące ograniczeń asystenta planowania, wybierz ikonę ołówka, aby otworzyć edytor.
  6. Wprowadź ciąg "Zapytanie dotyczące ograniczeń językowych" w polu Nazwa .
  7. Zaktualizuj pole Zapytanie dotyczące ograniczeń asystenta planowania, używając kodu zapytania dotyczącego pobierania ograniczeń, a następnie wybierz Zapisz jako nowe.
  8. Wybierz Zapisz. Zostanie utworzony nowy rekord konfiguracji, który łączy tę tablicę harmonogramu z rekordem.
  9. Znajdź pole Zapytanie dotyczące zasobów asystenta planowania i wybierz zapytanie dotyczące zasobów języków, które utworzyliśmy dla dostosowań tablicy harmonogramu.
  10. W dolnej części okna dialogowego wybierz pozycję Zapisz.

Tablica ponownie załaduje zaktualizowaną konfigurację. Filtrowanie Asystenta harmonogramu działa. Jeśli tworzysz rekordy języka i kojarzysz je z rekordami wymagań, możesz wybrać rekord Wymagania w dolnej części tablicy harmonogramu, wybierz pozycję Znajdź dostępność , aby wyświetlić tylko zasoby zgodne z językami zapisanymi w wymaganiach.

Konfiguracja szablonu komórki zasobu

W poniższych krokach użyj edytora tekstów, który obsługuje wyróżnianie składni HTML, aby wprowadzić zmiany, a następnie wklej zmiany z powrotem do edytora uniwersalnego planowania zasobów.

Konfiguracja szablonu komórki zasobu to szablon Odległość używany do renderowania zawartości w komórce zasobu. Dane wyjściowe z zapytania Retrieve Resources są dostępne dla szablonu.

Modyfikujemy domyślny szablon zasobu tak, aby pokazywał zielony ✔ wskaźnik ✱, jeśli zasób jest zgodny z językiem podstawowym i dodatkowym, 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 dodatkowego.

{{#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_primary i lang_secondary są zwracane z naszego niestandardowego Zapytania dotyczącego zasobów utworzonego powyżej. Zapoznaj się ze stroną Handlebars, aby uzyskać dokumentację na temat składni szablonów.

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>

Aktualizowanie szablonu komórki zasobu

  1. Na tablicy harmonogramu wybierz wielokropek (...) w prawym górnym rogu i ustawienia harmonogramu.
  2. Wybierz pozycję Wszystkie ustawienia tablicy w dolnej części okienka.
  3. Przewiń do pozycji Typy harmonogramu i wybierz pozycję Brak.
  4. Wybierz pozycję Edytuj wartości domyślne.
  5. Znajdź pole Szablon komórki zasobu Asystenta harmonogramu i wybierz ikonę ołówka, aby otworzyć edytor.
  6. Wprowadź "Szablon komórki zasobów językowych" w polu Nazwa.
  7. Zaktualizuj pole Szablon komórki zasobu, wpisując kod szablonu, i wybierz Zapisz jako nowe.
  8. Wybierz Zapisz. Zostanie utworzony nowy rekord konfiguracji, który łączy tę tablicę harmonogramu z rekordem.
  9. Znajdź pole Zapytanie dotyczące zasobów asystenta planowania i wybierz zapytanie dotyczące zasobów języków, które utworzyliśmy dla dostosowań tablicy harmonogramu.
  10. W dolnej części okna dialogowego wybierz pozycję Zapisz.

Tablica ponownie załaduje zaktualizowaną konfigurację. Komórka zasobów pokazuje, jak zasób jest zgodny z ograniczeniem językowym w panelu filtrów.

Dodatkowe zasoby

Uniwersalny Fetch XML