Freigeben über


Beispiel: Erweitern von Universal Resource Scheduling mit einer benutzerdefinierten Spracheinschränkung

Diese Schritt-für-Schritt-Anleitung ist eine Ergänzung zum Verstehen und Anpassen des Ressourcenabgleichs in Universal Resource Scheduling

In dieser Schritt-für-Schritt-Anleitung erweitern wir Universal Resource Scheduling-Ressourcen um eine Language Einschränkung. Stellen Sie sich eine Organisation vor, die Ressourcen nach den Sprachen filtern möchte, die sie sprechen. Sie möchten auch die für den Job geforderte Sprache im Requirement Datensatz erfassen. Diese Beschränkung folgt einem ähnlichen Muster wie die integrierte Territory Einschränkung. Eine neue Hauptentität Language speichert die verschiedenen Sprachen, die eine Ressource sprechen kann. Ein Resource Datensatz kann vielen Languages n: n-Beziehungs-Entität zugeordnet werden. Für die Requirement Entität modellieren wir dies, indem wir zwei neue Nachschlageattribute erstellen: Primary Language und Secondary Language. Wenn das System nach verfügbaren Ressourcen für eine Anforderung sucht, werden nur Ressourcen angezeigt, die entweder mit der Primary Language oder der Secondary Language Anzeige verknüpft sind.

Erstellen der neuen Entitäten und Beziehungen

In diesem Abschnitt erstellen wir das neue Schema für die Hauptentität Language und aktualisieren die ResourceRequirement und-Entitäten mit den entsprechenden Beziehungen zur neuen Language Entität.

Erstellen eines neuen Publishers

  1. Erstellen Sie in Dynamics 365 unter Anpassungen einen neuen Verleger.

  2. Füllen Sie das Formular "Neuer Publisher" mit den folgenden Details aus:

    Feld Wert
    Anzeigename Sprache
    Name Sprache
    Präfix Dauer
  3. Wählen Sie "Speichern" und "Schließen" aus.

Erstellen einer neuen Lösung

  1. Erstellen Sie in Dynamics 365 unter Anpassungen eine neue Lösung.

  2. Füllen Sie das Formular Neue Lösung mit den folgenden Details aus:

    Feld Wert
    Anzeigename Sprache
    Name Sprache
    Herausgeber Sprache
    Version 1.0.0.0
  3. Wählen Sie Speichern aus.

Erstellen der Entität "Sprache"

  1. Erstellen Sie in der Sprachlösung eine neue Entität.

  2. Füllen Sie das Formular Neue Entität mit den folgenden Details aus:

    Feld Wert
    Anzeigename Sprache
    Pluralname Sprachen
    Name lang_language (das lang_ Präfix wird automatisch ausgefüllt und ist schreibgeschützt)
  3. Wählen Sie "Speichern" aus.

Erstellen der n: n-Beziehung der Ressourcen-Entität zur Sprachen-Entität

  1. Erstellen Sie in der Sprachenentität Sie eine neue n: n-Beziehung.

  2. Füllen Sie das Formular Neue Beziehung mit den folgenden Details aus:

    Feld Wert
    Derzeitige Entität
    Anzeige-Option Pluralnamen verwenden
    Sonstiges Unternehmen
    Entitätsname Buchbare Ressource
  3. Wählen Sie "Speichern" und "Schließen" aus.

  4. Schließen Sie das Sprachenentitätsformular.

Erstellen Sie die Beziehungen von der Entität "Anforderung" zur Entität "Sprache"

  1. Fügen Sie der Lösung „Sprache“ die vorhandene Entität „Ressourcenanforderung“ hinzu. Wenn das Dialogfeld "Fehlende erforderliche Komponenten" angezeigt wird, wählen Sie "Nein, erforderliche Komponenten nicht einschließen" aus.

  2. Erstellen Sie in der Entität Ressourcenanforderung ein neues Feld.

  3. Füllen Sie das Formular Neues Feld mit den folgenden Details aus:

    Feld Wert
    Anzeigename Primäre Sprache
    Datentyp Suche
    Typ des Zieldatensatzes Sprache
  4. Wählen Sie "Speichern" und "Schließen" aus.

  5. Erstellen Sie in der Entität Ressourcenanforderung ein neues Feld.

  6. Füllen Sie das Formular Neues Feld mit den folgenden Details aus:

    Feld Wert
    Anzeigename Sekundärsprache
    Datentyp Suche
    Typ des Zieldatensatzes Sprache
  7. Wählen Sie "Speichern" und "Schließen" aus.

Aktualisieren des Hauptformulars "Anforderung"

  1. Fügen Sie in der Entität Ressourcenanforderung das vorhandene Informationsformular zu den Unterkomponenten der Entität hinzu. Wenn das Dialogfeld "Fehlende erforderliche Komponenten" angezeigt wird, wählen Sie "Nein, erforderliche Komponenten nicht einschließen" aus.
  2. Verwenden Sie im Formular Informationen den Feld-Explorer, um dem Formular die beiden neuen Attribute "Primärsprache" und "Sekundärsprache" hinzuzufügen, damit Benutzer diese Informationen eingeben können, wenn sie Anforderungen erstellen.
  3. Wählen Sie Speichern aus.
  4. Wählen Sie Veröffentlichen aus.

Zusammenfassung

In den obigen Schritten haben wir die neue Entität Language erstellt. Anschließend haben wir neue Beziehungen mit den Entitäten "Ressource" und "Anforderung" hinzugefügt. Ressourcen können mit mehreren Sprachen verknüpft werden, da wir n:n-Beziehungen zwischen Sprache und Ressource hinzugefügt haben. Anforderungen können mit zwei Sprachen verknüpft werden, da wir zwei Nachschlageattribute für die Anforderungsentität hinzugefügt haben, die auf die neue Sprachentität verweisen.

Hinzufügen von Daten

Verwenden Sie die erweiterte Suche, um der Entität Sprache neue Datensätze hinzuzufügen. Sie können dann Ressourceneinträge mit den neuen Spracheinträgen verknüpfen, indem Sie einen Ressourcendatensatz öffnen und in der Navigationsleiste zur Sprachbeziehung navigieren. Für Anforderungsdatensätze können Sie die neuen Felder "Primärsprache" und "Sekundärsprache" im Anforderungsformular ausfüllen.

Anpassung der Zeitplantafel

Um weitere Ressourcen im Zeitplan mit der neuen Spracheneinschränkung zu filtern, aktualisieren wir die Abrufen-Ressourcen und die Filter-Layout-Konfigurationssätze.

Hinweis

Diese Anpassungen der Zeitplanübersicht gelten einheitlich für alle Registerkarten und können nicht einzeln pro Registerkarte festgelegt werden. Dies gilt für Filterlayout des Zeitplan-Assistenten, Abfrage „Ressourcen abrufen” des Zeitplan-Assistenten, Ressourcenzellenvorlage des Zeitplan-Assistenten und Abfrage „Einschränkungen abrufen” des Zeitplan-Assistenten.

Konfiguration des Filterlayouts

Tipp

Für die folgenden Schritte ist es hilfreich, einen Text-Editor zu verwenden, der die XML-Syntaxhervorhebung unterstützt, um Ihre Änderungen vorzunehmen, und dann Ihre Änderungen wieder in den Universal Resource Scheduling-Editor einzufügen.

Bei der Konfiguration "Filterlayout" handelt es sich um eine XML-Layoutdefinition, mit der das Layout des Bedienfelds "Filter" angepasst werden kann.

Hinweis

In dieser Übung entfernen wir alle Standardfilter, die mit Universal Resource Scheduling ausgeliefert werden, aus dem Bereich "Filter" und fügen Sprachen als einzigen verfügbaren Filter hinzu.

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

Das control Element fügt dem Bereich Filter ein neues Steuerelement hinzu. Hier ist die Beschreibung der einzelnen Attribute:

Name BESCHREIBUNG
type Der Typ des Filtersteuerelements. Ein combo Steuerelement rendert eine Dropdownliste mit Werten zur Auswahl
source Die Quelle der Werte für das Dropdown-Steuerelement. Die entity Quelle zeigt Entitätsdatensätze im Dropdown-Listenfeldern an
key Der Schlüsse,, um die ausgewählten Werte in der Einschränkungseigenschaft zu speichern
inactive-state Der inaktive Status statecode für diese Entität. Dies wird verwendet, um inaktive Datensätze aus der Dropdown-Liste auszuschließen
label-id Die lokalisierte Bezeichnung, die für dieses Steuerelement verwendet werden soll
entity Die Datensätze dieser Entität werden im Dropdown angezeigt
multi Konfiguriert die Dropdown-Liste so, dass ein einzelner Datensatz oder mehrere Datensätze ausgewählt werden können

Filterlayout:

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

Erstellen eines neuen Sprachenboards

Um diese Änderungen isoliert zu halten, erstellen wir eine brandneue separate Zeitplanübersicht und implementieren die Änderungen, aber Sie können diese Änderungen immer in der Standardzeitplanübersicht vornehmen, damit andere Zeitplanübersichten diese Änderungen automatisch übernehmen können.

  1. Wechseln Sie in Dynamics 365 in der oberen Navigationsleiste zu Resource Scheduling>Schedule Board.
  2. Wählen Sie oben rechts das + Zeichen aus, um eine neue Pinnwand zu erstellen.
  3. Name der neuen Kartensprache.
  4. Wählen Sie am unteren Rand des Dialogfelds Hinzufügen aus. Die neuen Karte wird erstellt.

Aktualisieren des Filterlayouts der Zeitplantafel

Als Nächstes erstellen wir einen neuen Konfigurationsdatensatz, in dem Filterlayouts und Abfragen gespeichert sind, die von der Zeitplanübersicht verwendet werden, und verknüpfen dann die neu erstellte Zeitplanübersicht mit dem neuen Konfigurationsdatensatz. Es gibt mehrere Möglichkeiten, dies zu tun, aber hier ist die schnellste:

  1. Wählen Sie die Registerkarte Sprache aus.
  2. Scrollen Sie nach unten zu Allgemeine Einstellungen>Andere Einstellungen.
  3. Suchen Sie das Feld Filterlayout , wählen Sie die Schaltfläche rechts aus, um den Editor zu öffnen
  4. Aktualisieren Sie das Feld Wert mit dem Filterlayout-Code oben, und wählen Sie Speichern als aus.
  5. Geben Sie "Language Filter Layout" in das Feld Name ein und wählen Sie Speichern aus. Dadurch wird ein neuer Konfigurationsdatensatz erstellt und diese Zeitplanübersicht mit dem Datensatz verknüpft.
  6. Wählen Sie am unteren Rand des Dialogfelds Anwenden aus.

Das Board wird neu geladen und Sie sehen das Filter-Panel auf der linken Seite mit dem neuen Layout. Nur der Filter Sprachen ist verfügbar. Das Filtern funktioniert noch nicht, da wir die Abfrage zum Abrufen von Ressourcen aktualisieren müssen, um den neuen Filter nutzen zu können.

Konfiguration der Abfrage "Ressourcen abrufen"

Tipp

Für die folgenden Schritte ist es hilfreich, einen Text-Editor zu verwenden, der die XML-Syntaxhervorhebung unterstützt, um Ihre Änderungen vorzunehmen, und dann Ihre Änderungen wieder in den Universal Resource Scheduling-Editor einzufügen.

Die Konfiguration "Retrieve Resources Query" ist eine UFX-Abfrage , die von der Resource Matching API verwendet wird. Es verwendet die im Filterbereich eingegebenen Werte als Eingabe und erstellt dynamisch das richtige FetchXML, um übereinstimmende Ressourcen zu finden.

Im Folgenden finden Sie die neuen Codeausschnitte, die der Abfrage zum Abrufen von Ressourcen hinzugefügt wurden, um sie nach den Sprachen der Ressourcen abgleichen und sortieren zu können.

Hinzufügen der Verknüpfungen von bookableresource bis 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>

Die im Bedienfeld "Filter" ausgewählten Werte werden als Eingabe an die Abfrage übergeben und sind in der Variablen "XPath $input " verfügbar

Die Abfrage zum Abrufen von Ressourcen verwendet FetchXML, um die Resource (bookableresource) Entität abzufragen. Wir verwenden das FetchXML-Element link-entity , um nur Ressourcen zurückzugeben, die den im Filterpanel ausgewählten Sprachdatensätzen zugeordnet sind. Um die Anzeige der übereinstimmenden Sprachen und die Sortierung nach Primär- oder Sekundärsprache zu unterstützen, wie weiter unten im Abschnitt Ressourcenzellenvorlage beschrieben, verwenden wir mehrere link-entity Verknüpfungen.

Hier ist die Beschreibung der einzelnen element und attribute:

Name BESCHREIBUNG
link-entity Erstellen der n: n-Beziehung der Ressourcen-Entität zur Sprachen-Entität
ufx:if Geben Sie dieses FetchXML-Element (link-entity) nur aus, wenn der XPath-Ausdruck in diesem Attribut einen Wert zurückgibt
attribute Geben Sie die übereinstimmende Primär- oder Sekundärsprache zurück
filter und condition Filtern Sie die n: n-Beziehungs-Datensätze nur nach denen, die mit den angegebenen Sprachen-IDs übereinstimmen
ufx:value und select Gibt das Ergebnis des XPath-Ausdrucks im select Attribut aus
ufx:apply und select Geben Sie die untergeordneten FetchXML-Elemente für jedes Ergebnis aus, die vom XPath-Ausdruck im Attribut select zurückgegeben werden
value Enthält die ID eines Sprachdatensatzes

Bestimmen der Sortierreihenfolge einer Ressource

Nachdem wir die übereinstimmenden Ressourcen basierend auf den den einzelnen Ressourcen zugewiesenen Sprachen abgerufen haben, weisen wir eine neue lang_order Eigenschaft zu, um die Sortierreihenfolge zu bestimmen.

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

Hier ist die Beschreibung der einzelnen element und attribute:

Name BESCHREIBUNG
lang_order Erstellen Sie eine neue Eigenschaft in jeder Ressource, die aus der FetchXML-Abfrage mit dem Namen lang_order zurückgegeben wird.
ufx:select Weisen Sie der lang_order-Eigenschaft das Ergebnis des XPath-Ausdrucks in diesem Attribut zu. Die Eigenschaften lang_primary und lang_secondary, die bereits früher in der Abfrage abgerufen wurden, werden zusammen mit der XPath-Funktion iif verwendet, um die Reihenfolge des Ressourcenabgleichs zu bestimmen.

Sortieren der Ergebnisse

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

UFX-Abfragen werden in sequenzieller Reihenfolge verarbeitet. Nachdem die Ressourcen über FetchXML abgerufen wurden, werden die Ergebnisse der Resources Eigenschaft zugewiesen. Wir sortieren die Ergebnisse basierend auf der lang_order zuvor hinzugefügten Eigenschaft und weisen die sortierten Ergebnisse der Resources Eigenschaft neu zu.

Hier ist die Beschreibung der einzelnen element und attribute:

Name BESCHREIBUNG
Resources Weisen Sie die Resources Eigenschaft neu zu
ufx:select Weisen Sie der Resources Eigenschaft das Ergebnis des XPath-Ausdrucks in diesem Attribut zu. Die XPath-Funktion order wird verwendet, um die Resources Liste nach ihrer lang_order Eigenschaft zu sortieren.

Hinweis

Die standardmäßige Abfrage zum Abrufen von Ressourcen, die mit Universal Resource Scheduling ausgeliefert wird, ist eine große Abfrage, die alle Ressourceneinschränkungen unterstützt, die in Universal Resource Scheduling enthalten sind. In dieser Übung verwenden wir nur eine Teilmenge der Standardabfrage und fügen Sprachen als einzigen Filter hinzu.

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

Die Abfrage „Ressourcen abrufen” des Zeitplan-Assistenten bearbeiten

  1. Doppelklicken Sie rechts oben auf den Tab Sprache
  2. Scrollen Sie nach unten zu Allgemeine Einstellungen > Andere Einstellungen
  3. Suchen Sie das Feld "Ressourcenabfrage", und wählen Sie die Schaltfläche rechts daneben aus, um den Editor zu öffnen.
  4. Aktualisieren Sie das Wertfeld mit dem Code für Ressourcenabfrage abrufen oben, und klicken Sie auf „Speichern unter“.
  5. Geben Sie "Language Resources Query" in das Feld Name ein, und wählen Sie Speichern aus. Dadurch wird ein neuer Konfigurationsdatensatz erstellt und diese Zeitplanübersicht mit dem Datensatz verknüpft.
  6. Wählen Sie am unteren Rand des Dialogfelds Anwenden aus.

Das Board wird mit der aktualisierten Konfiguration neu geladen. Das Filtern funktioniert jetzt. Wenn Sie Spracheinträge erstellt und mit Ressourceneinträgen verknüpft haben, können Sie jetzt Ressourcen nach den zugehörigen Sprachen filtern.

Zusammenfassung

In den obigen Schritten haben wir den Bereich "Filter" so geändert, dass ein Filtersteuerelement für die Entität "Sprache" angezeigt wird. Wir haben auch die Abfrage zum Abrufen von Ressourcen so geändert, dass sie mit Ressourcen übereinstimmt, die den ausgewählten Sprachdatensätzen zugeordnet sind. Wenn ein Benutzer Werte im Filtersteuerelement auswählt und Suchen auswählt, werden die Werte an die Abfrage übergeben, und die FetchXML-Abfrage gibt nur übereinstimmende Ressourcen zurück.

Anpassen des Zeitplan-Assistenten

Wir müssen das Zeitplanassistent-Filterlayout anpassen und Abfragekonfigurationseinschränkungen abrufen, um die neuen Spracheneinschränkungen im Zeitplan-Assistenten zu verwenden.

Im Gegensatz zu den Anpassungen der Zeitplanübersicht, bei denen jedes Board individuell angepasst werden kann, wirken sich die Anpassungen des Zeitplan-Assistenten auf alle Boards aus, auf denen der Zeitplan-Assistent verwendet wird. Die Anpassungen des Zeitplan-Assistenten können spezifisch für einen planbaren Typ oder für alle Typen sein. In diesem Beispiel passen wir den Zeitplan-Assistenten für alle Typen an.

Konfiguration des Filterlayouts des Zeitplan-Assistenten

Tipp

Für die folgenden Schritte ist es hilfreich, einen Text-Editor zu verwenden, der die XML-Syntaxhervorhebung unterstützt, um Ihre Änderungen vorzunehmen, und dann Ihre Änderungen wieder in den Universal Resource Scheduling-Editor einzufügen.

Die Konfiguration des Filterlayouts des Zeitplan-Assistenten definiert, ähnlich wie die des Filterlayouts der Zeitplanübersicht, das Layout der Steuerelemente im Filterbereich. Da der Zeitplan-Assistent mehr Filter als die Zeitplanübersicht verwendet, wie z. B. Startzeit, Endzeit, Dauer usw., wird ein anderes Layout verwendet.

Hinweis

In dieser Übung verwenden wir nur eine Teilmenge der Standardfilter, die in Universal Resource Scheduling aus der Filterlayoutkonfiguration des Zeitplan-Assistenten ausgeliefert werden, und fügen die Dropdownliste Sprachen als einzigen verfügbaren Filter hinzu.

Der Filter, den wir dem Layout hinzufügen, ist derselbe wie oben in der Filterlayoutkonfiguration. Die anderen Steuerelemente werden benötigt, um die Suchparameter des Zeitplan-Assistenten zu ändern.

Das vollständige Filterlayout des Zeitplanassistenten

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

Aktualisieren des Filterlayouts des Zeitplan-Assistenten

  1. Doppelklicken Sie rechts oben auf den Tab Sprache
  2. Wählen Sie rechts oben "Standardeinstellungen öffnen" aus.
  3. Scrollen Sie zum Abschnitt "Zeitplantypen" und wählen Sie in der linken Liste "Keine" aus.
  4. Suchen Sie das Feld Filterlayout des Zeitplanassistenten, und wählen Sie die Schaltfläche rechts aus, um den Editor zu öffnen
  5. Aktualisieren Sie das Wertfeld mit dem Code für Filterlayout des Zeitplan-Assistenten oben, und klicken Sie auf „Speichern unter“.
  6. Geben Sie "Language Schedule Assistant Filter Layout" in das Feld Name ein und wählen Sie Speichern aus. Dadurch wird ein neuer Konfigurationsdatensatz erstellt und diese Zeitplanübersicht mit dem Datensatz verknüpft.
  7. Wählen Sie am unteren Rand des Dialogfelds Anwenden aus.

Das Board wird neu geladen. Als Nächstes müssen wir die Abfrage zum Abrufen von Einschränkungen ändern, bevor wir den Zeitplan-Assistenten mit unseren neuen Spracheinschränkungen verwenden können, sodass die Sprachen, die für die Anforderung festgelegt sind, Teil der Suche des Zeitplan-Assistenten sind.

Konfiguration der Einschränkungsabfrage abrufen

Tipp

Für die folgenden Schritte ist es hilfreich, einen Text-Editor zu verwenden, der die XML-Syntaxhervorhebung unterstützt, um Ihre Änderungen vorzunehmen, und dann Ihre Änderungen wieder in den Universal Resource Scheduling-Editor einzufügen.

Die Retrieve Constraints Query-Konfiguration ist eine UFX-Abfrage , die von der Retrieve Requirement Constraints API verwendet wird. Sie wird als ID eines Anforderungsdatensatzes (in der Benutzeroberfläche ausgewählt) und gibt den Anforderungsdatensatz und alle zugehörigen untergeordneten Datensätze zurück.

Hinweis

Die standardmäßige Abfrage zum Abrufen von Einschränkungen, die mit Universal Resource Scheduling ausgeliefert wird, ist eine umfangreiche Abfrage, die alle Anforderungseinschränkungen unterstützt, die in Universal Resource Scheduling enthalten sind. In dieser Übung verwenden wir nur eine Teilmenge der Standardabfrage und fügen Sprachen als einzigen Filter hinzu.

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

UFX-Abfragen werden in sequenzieller Reihenfolge verarbeitet. Die Abrufen-Einschränkungen nutzen FetchXML, um die Requirement (msdyn_resourcerequirement) Entität abzufragen und weisen das Ergebnis zu, einen Anforderungsdatensatz der Eigenschaft Requirement. Wir fügen dem Eigenschaftenbehälter für Einschränkungen eine neue Eigenschaft Languages hinzu, die beide Attribute, die primäre Sprache und die sekundäre Sprache, in einer einzigen Liste von Entitäten (EntityCollection) kombiniert. Dies ist erforderlich, da das Steuerelement "Sprachen" im Bereich "Filter" als Liste von Datensätzen angezeigt wird. Eine Alternative wäre, im Filterbereich zwei separate Steuerelemente für die beiden Attribute zu erstellen.

Hier ist die Beschreibung der einzelnen element und attribute:

Name BESCHREIBUNG
Languages Erstellen Sie eine neue Eigenschaft im Eigenschaftencontainer für Ergebniseinschränkungen mit dem Namen Languages
ufx:select Weisen Sie der Languages-Eigenschaft das Ergebnis des XPath-Ausdrucks in diesem Attribut zu. Die lang_primarylanguage- und lang_secondarylanguage-Eigenschaften, die zuvor in der Abfrage abgerufen wurden und in der Requirement-Eigenschaft verfügbar sind, werden an die lookup-to-list-XPath-Funktion übergeben, die mehrere lookup-Eigenschaften in eine einzelne list (EntityCollection) konvertiert.

Abfrage zum Abrufen von Einschränkungen:

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

Standardabfrage zum Abrufen von Einschränkungen aktualisieren

  1. Doppelklicken Sie rechts oben auf den Tab Sprache
  2. Wählen Sie rechts oben "Standardeinstellungen öffnen" aus.
  3. Scrollen Sie zum Abschnitt "Zeitplantypen" und wählen Sie in der linken Liste "Keine" aus.
  4. Suchen Sie das Feld Schedule Assistant Retrieve Constraints Query, und wählen Sie die Schaltfläche rechts aus, um den Editor zu öffnen
  5. Aktualisieren Sie das Wertfeld mit dem Code für Ressourcenabfrage abrufen oben, und klicken Sie auf „Speichern unter“.
  6. Geben Sie "Language Constraints Query" in das Feld Name ein und wählen Sie Speichern aus. Dadurch wird ein neuer Konfigurationsdatensatz erstellt und diese Zeitplanübersicht mit dem Datensatz verknüpft.
  7. Suchen Sie den Zeitplanassistenten zur Abfrageneinschränkungsressource und wählen Sie die Sprachenressourcenabfrage, die zuvor für die Zeitplan-Karten-Anpassung erstellt wurde.
  8. Wählen Sie am unteren Rand des Dialogfelds Anwenden aus.

Das Board wird mit der aktualisierten Konfiguration neu geladen. Die Filterung des Zeitplan-Assistenten funktioniert jetzt. Wenn Sie Sprachdatensätze erstellt und diese mit Anforderungsdatensätzen verknüpft haben, können Sie jetzt unten in der Zeitplanübersicht einen Anforderungsdatensatz auswählen, Verfügbarkeit suchen auswählen, um den Zeitplanassistenten zu starten, und nur Ressourcen anzeigen, die den in der Anforderung gespeicherten Sprachen entsprechen.

Die Ressourcenzellenvorlagekonfiguration bearbeiten

Tipp

Für die folgenden Schritte ist es hilfreich, einen Text-Editor zu verwenden, der die HTML-Syntaxhervorhebung unterstützt, um Ihre Änderungen vorzunehmen, und dann Ihre Änderungen wieder in den Universal Resource Scheduling-Editor einzufügen.

Bei der Ressourcenzellenvorlagenkonfiguration handelt es sich um eine Handlebars-Vorlage, die zum Rendern von Inhalten in der Ressourcenzelle verwendet wird. Die Ausgabe in der Ressourcenabfrage ist in der Vorlage verfügbar.

Wir ändern die Standardressourcenvorlage so, dass ein grüner ✔ ✱-Indikator angezeigt wird, wenn die Ressource mit der primären und sekundären Sprache übereinstimmt, ein grüner ✔ Indikator, wenn die Ressource nur mit der primären Sprache übereinstimmt, und ein gelber ✔ Indikator, wenn die Ressource nur mit der sekundären Sprache übereinstimmt.

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

Die lang_primary- und lang_secondary-Eigenschaften werden von unserer benutzerdefinierten Abfrage zum Abrufen von Ressourcen zurückgegeben, die oben eingerichtet wurde. Auf der Handlebars-Website finden Sie eine Dokumentation zur Vorlagensyntax.

Vorlage für Ressourcenzellen:

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

Aktualisieren der Vorlage für Ressourcenzellen

  1. Doppelklicken Sie rechts oben auf den Tab Sprache
  2. Wählen Sie rechts oben "Standardeinstellungen öffnen" aus.
  3. Scrollen Sie zum Abschnitt "Zeitplantypen" und wählen Sie in der linken Liste "Keine" aus.
  4. Suchen Sie das Feld „Ressourcenzellenvorlage des Zeitplan-Assistenten“, und klicken Sie auf die Schaltfläche rechts, um den Editor zu öffnen
  5. Aktualisieren Sie das Wertfeld mit dem Code für Ressourcenzellenvorlage oben, und klicken Sie auf „Speichern unter“.
  6. Geben Sie "Language Resource Cell Template" in das Feld Name ein, und wählen Sie Speichern aus. Dadurch wird ein neuer Konfigurationsdatensatz erstellt und diese Zeitplanübersicht mit dem Datensatz verknüpft.
  7. Wählen Sie am unteren Rand des Dialogfelds Anwenden aus.

Das Board wird mit der aktualisierten Konfiguration neu geladen. In der Ressourcenzelle wird nun angezeigt, wie eine Ressource mit der Sprachbeschränkung im Bereich "Filter" übereinstimmt.

Zusammenfassung

In den obigen Schritten haben wir den Bereich Filter im Zeitplan-Assistenten so geändert, dass ein Filtersteuerelement für die Entität Sprache angezeigt wird. Wir haben auch die Abfrage zum Abrufen von Einschränkungen geändert, um die neuen Sprachattribute abzufragen, die sich auf die Anforderungsentität beziehen, und sie in einer Liste zu formen. Wenn ein Benutzer auswählt, die Verfügbarkeit für einen Anforderungsdatensatz zu suchen, werden im Bereich "Filter" die erfassten Spracheinschränkungen angezeigt. Die Werte aus dem Bereich "Filter" werden an die Abfrage "Ressourcen abrufen" übergeben, und die FetchXML-Abfrage gibt nur übereinstimmende Ressourcen zurück.

Siehe auch

Universelles Abrufen von XML

Versionshinweise zur Erweiterbarkeit von Universal Resource Scheduling