Share via


Exemple : Étendre Universal Resource Scheduling avec une contrainte de langue personnalisée

Ce guide par à pas est accompagne le document Présentation et personnalisation de la mise en correspondance des ressources dans Universal Resource Scheduling

Dans ce guide pas à pas, nous allons étendre les ressources Universal Resource Scheduling avec une contrainte Language. Prenons l’exemple d’une organisation qui souhaite filtrer des ressources en fonction des langues qu’elles parlent. Elle veut également capturer sur l’enregistrement Requirement la langue requise pour la tâche. Cette contrainte suit un schéma similaire à celui de la contrainte Territory intégrée. Une nouvelle entité principale Language va stocker les différentes langues qu’une ressource peut parler. Un enregistrement Resource peut ensuite être associé à plusieurs Languages via une entité de relations plusieurs à plusieurs. Sous l’entité Requirement, nous allons créer un modèle à l’aide de deux nouveaux attributs de recherche : Primary Language et Secondary Language. Lors de la recherche de ressources disponibles pour un besoin, seules les ressources associées à Primary Language ou à Secondary Language seront affichées.

Création d’entités et de relations

Dans cette section, nous allons créer le schéma pour l’entité Language principale et mettre à jour les entités Resource et Requirement avec les relations correspondantes à la nouvelle entité Language.

Créer un éditeur

  1. Dans Dynamics 365, sous Personnalisations, créez un éditeur

  2. Complétez le formulaire Nouvel éditeur avec les informations ci-dessous :

    Champ Valeur
    Nom complet Langue
    Nom langue
    Préfixe lang
  3. Cliquez sur Enregistrer et fermer

Créer une solution

  1. Dans Dynamics 365, sous Personnalisations, créez une solution

  2. Complétez le formulaire Nouvelle solution avec les informations ci-dessous :

    Champ Valeur
    Nom complet Langue
    Nom Langue
    Éditeur Langue
    Version 1.0.0.0
  3. Cliquez sur Enregistrer.

Créer l’entité Langue

  1. Dans la solution Langue, créez une entité

  2. Complétez le formulaire Nouvelle entité avec les informations ci-dessous :

    Champ Valeur
    Nom complet Langue
    Nom au pluriel Langues
    Nom lang_language (le préfixe lang_ sera rempli automatiquement et en lecture seule)
  3. Cliquez sur Enregistrer.

Créer la relation plusieurs-à-plusieurs entre l’entité Ressource et l’entité Langue

  1. Dans l’entité Langue, créez une relation plusieurs-à-plusieurs

  2. Complétez le formulaire Nouvelle relation avec les informations ci-dessous :

    Champ Valeur
    Entité active
    Option d’affichage Utiliser un nom au pluriel
    Autre entité
    Nom de l’entité Ressource pouvant être réservée
  3. Cliquez sur Enregistrer et fermer

  4. Fermez le formulaire de l’entité Langue

Créer les relations entre l’entité Besoin et l’entité Langue

  1. Dans la solution Langue, ajoutez l’entité Besoin en ressources existante à la solution (si elle est présentée avec une bote de dialogue Composants nécessaires manquants, sélectionnez Non, n’incluez pas les composants nécessaires.)

  2. Dans l’entité Besoin en ressources, créez un champ

  3. Complétez le formulaire Nouveau champ avec les informations ci-dessous :

    Champ Valeur
    Nom complet Langue principale
    Type de données Recherche
    Type d’enregistrement cible Langue
  4. Cliquez sur Enregistrer et fermer

  5. Dans l’entité Besoin en ressources, créez un champ

  6. Complétez le formulaire Nouveau champ avec les informations ci-dessous :

    Champ Valeur
    Nom complet Langue secondaire
    Type de données Recherche
    Type d’enregistrement cible Langue
  7. Cliquez sur Enregistrer et fermer

Mettre à jour le formulaire principal du besoin

  1. Dans l’entité Besoin en ressources, ajoutez le formulaire Informations existant aux sous-composants de l’entité (s’il est présenté avec une bote de dialogue Composants nécessaires manquants, sélectionnez Non, n’incluez pas les composants nécessaires.)
  2. Dans le formulaire Informations, utilisez l’Explorateur de champs pour ajouter les deux nouveaux attributs, Langue principale et Langue secondaire, au formulaire afin que les utilisateurs puissent entrer ces informations quand ils créent les besoins
  3. Cliquez sur Enregistrer.
  4. Cliquez sur Publier
  5. Vous pouvez fermer l’éditeur de formulaires

Résumé

Dans les étapes ci-dessus, nous avons créé l’entité de langue. Nous avons ensuite ajouté de nouvelles relations avec les entités Ressource et Besoin. Les ressources peuvent être associées à plusieurs langues, car nous avons ajouté des relations plusieurs à plusieurs entre Langue et Ressource. Les Besoins peuvent être associés à deux langues puisque nous avons ajouté deux attributs de recherche à l’entité Besoin pointant vers la nouvelle entité Langue.

Ajout de données

Utilisez la recherche avancée pour ajouter de nouveaux enregistrements à l’entité Langue. Vous pouvez ensuite associer les enregistrements de ressources aux nouveaux enregistrements de langues en ouvrant un enregistrement Ressource et en accédant à la relation de langue dans la barre de navigation. Pour les enregistrements des besoins, vous pouvez renseigner les champs Langue principale et Langue secondaire sur le formulaire Besoin.

Personnalisation du tableau de planification

Pour filtrer des ressources dans le tableau de planification avec la nouvelle contrainte de langue, nous allons mettre à jour la requête Récupérer des ressources et les enregistrements de configuration de la mise en page du filtre.

Configuration de la mise en page du filtre

Pourboire

Pour les étapes ci-dessous, il convient d’utiliser un éditeur de texte qui prend en charge la syntaxe XML mettant en surbrillance vos modifications, puis de coller vos modifications dans l’éditeur Universal Resource Scheduling.

La configuration de la mise en page du filtre est une définition de mise en page XML pour personnaliser la mise en page du volet Filtre.

Note

Dans cet exercice, nous allons supprimer tous les filtres par défaut fournis avec Universal Resource Scheduling du volet Filtre et ajouter des langues comme seul filtre disponible.

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

L’élément control ajoute un nouveau au contrôle au volet Filtre. Voici la description de chaque attribut :

Nom Description
type Type de contrôle de filtre. Un contrôle combo affiche une liste déroulante avec des valeurs à sélectionner à l’écran
source Source des valeurs du contrôle déroulant. Une source entity affiche les enregistrements d’entités dans le contrôle déroulant
key Clé à utiliser pour stocker les valeurs sélectionnées dans le conteneurs de contraintes de propriétés
inactive-state statecode inactif pour cette entité. Il est utilisé pour exclure les enregistrements inactifs de la liste déroulante
label-id Étiquette localisée à utiliser pour ce contrôle
entity Les enregistrements de cette entité s’affichent dans la liste déroulante
multi Configure la liste déroulante pour permettre de sélectionner un seul enregistrement ou plusieurs enregistrement

Mise en page du filtre :

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

Créer un tableau Langues

Afin de conserver ces modifications isolées, nous allons créer un tout nouveau tableau de planification distinct et implémenter les modifications, mais vous pourrez toujours effectuer ces modifications sur le tableau de planification par défaut afin que d’autres tableaux de planification puissent automatiquement hériter de ces modifications.

  1. Dans Dynamics 365, dans la barre de navigation supérieure, accédez à Planification des ressources > Tableau de planification
  2. En haut à droite, cliquez sur le signe + pour créer un tableau
  3. Nommez le nouveau tableau Langue
  4. En bas de la boîte de dialogue, cliquez sur Ajouter. Le nouveau tableau est créé.

Mettez à jour la mise en page du filtre du tableau de planification

Ensuite, nous allons créer un enregistrement de configuration, qui stockera les mises en page et les requêtes de filtre utilisées par le tableau de planification, puis nous allons associer le tableau de planification nouvellement créé au nouvel enregistrement de configuration. Vous trouverez diverses manières de le faire, mais voici la plus rapide :

  1. Dans le coin supérieur droit, double-cliquez sur l’onglet Langue
  2. Faites défiler vers le bas jusqu’à Paramètres généraux > Autres paramètres
  3. Recherchez le champ Mise en page du filtre, cliquez sur le bouton à droite pour ouvrir l’éditeur
  4. Mettez à jour le champ Valeur avec le code de mise en page du filtre ci-dessus puis cliquez sur Enregistrer sous.
  5. Entrez « Mise en page du filtre Langue » dans le champ Nom et cliquez sur Enregistrer. Cela crée un enregistrement de configuration et associe ce tableau de planification à l’enregistrement.
  6. En bas de la boîte de dialogue, cliquez sur Appliquer.

Le tableau va se recharger et vous verrez le volet Filtre à gauche avec la nouvelle mise en page ; seul le filtre Langue sera disponible. Le filtrage ne fonctionne pas encore, car nous devons mettre à jour la requête Récupérer les ressources pour utiliser le filtre.

Configuration de la requête Récupérer les ressources

Pourboire

Pour les étapes ci-dessous, il convient d’utiliser un éditeur de texte qui prend en charge la syntaxe XML mettant en surbrillance vos modifications, puis de coller vos modifications dans l’éditeur Universal Resource Scheduling.

La configuration de la requête Récupérer les ressources est un requête UFX utilisée par l’API de mise en correspondance des ressources. Elle utilise comme entrées les valeurs entrées dans le volet Filtre et crée dynamiquement le FetchXML approprié pour rechercher des ressources correspondantes.

Ci-dessous sont les nouveaux extraits ajoutés à la requête Récupérer des ressources pour mettre en correspondance et classer les langues des ressources.

Ajout de jointures entre bookableresource et 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>

Les valeurs sélectionnées dans le volet Filtre sont transmises comme des entrées à la requête et sont disponibles dans la variable $input de XPath

La requête Récupérer des ressources utilise FetchXML pour interroger l’entité Resource (bookableresource). Nous utilisons l’élément link-entity FetchXML pour retourner uniquement des ressources associées aux enregistrement Langue sélectionnés dans le volet Filtre. Pour prendre en charge l’affichage des langues mises en correspondance et les classer selon la langue principale ou secondaire, comme décrit plus loin dans la section Modèle de cellule de ressource, nous utilisons plusieurs jointures link-entity.

Voici la description de chaque element et attribute :

Nom Description
link-entity Créez un jointure avec la relation plusieurs-à-plusieurs entre les entités Ressource et Langue
ufx:if Émettez uniquement cet élément FetchXML (link-entity) si l’expression XPath dans cet attribut renvoie une valeur
attribute Renvoyez la langue principale ou secondaire mise en correspondance
filter et condition Filtrez les enregistrements de relations plusieurs-à-plusieurs uniquement avec celles qui correspondent aux ID de langue spécifiés
ufx:value et select Indique le résultat de l’expression XPath dans l’attribut select
ufx:apply et select Émettez les éléments FetchXML enfants pour résultat chaque renvoyé par l’expression XPath dans l’attribut select
value Contient l’ID d’un enregistrement Langue

Définition de l’ordre de tri d’une ressource

Après avoir récupéré les ressources correspondantes, selon les langues affectées à chaque ressource, nous attribuons une nouvelle propriété lang_order pour déterminer son ordre de tri.

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

Voici la description de chaque element et attribute :

Nom Description
lang_order Créez une propriété dans chaque ressource renvoyée par la requête FetchXML nommée lang_order
ufx:select Attribuez le résultat de l’expression XPath dans cet attribut à la propriété lang_order. Les propriétés lang_primary et lang_secondary, récupérées précédemment dans la requête, sont utilisées avec la fonction iif XPath pour déterminer l’ordre de correspondance de la ressource.

Classement des résultats

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

Les requêtes UFX sont traitées dans un ordre séquentiel. Une fois les ressources sont récupérées via le FetchXML, les résultats sont Resources affectés à la propriété. Nous trions les résultats en fonction de la propriété lang_order ajoutée précédemment et réattribuons les résultats triés à la propriété Resources.

Voici la description de chaque element et attribute :

Nom Description
Resources Réattribuer la propriété Resources
ufx:select Attribuez le résultat de l’expression XPath dans cet attribut à la propriété Resources. La fonction order XPath est utilisée pour classer la liste Resources sur sa propriété lang_order.

Note

La requête Récupérer des ressources par défaut fournie avec Universal Resource Scheduling est une vaste requête qui prend en charge toutes les contraintes de ressource incluses dans Universal Resource Scheduling. Dans cet exercice, nous allons utiliser uniquement un sous-ensemble de la requête par défaut et ajouter Langues comme unique filtre.

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

Mettez à jour la requête Récupérer les ressources du tableau de bord de planification

  1. Dans le coin supérieur droit, double-cliquez sur l’onglet Langue
  2. Faites défiler vers le bas jusqu’à Paramètres généraux > Autres paramètres
  3. Recherchez le champ Requête Récupérer les ressources, cliquez sur le bouton à droite pour ouvrir l’éditeur
  4. Mettez à jour le champ Valeur avec le code de la requête Récupérer les ressources ci-dessus puis cliquez sur Enregistrer sous
  5. Entrez « Requête Ressources de langue » dans le champ Nom et cliquez sur Enregistrer. Cela crée un enregistrement de configuration et associe ce tableau de planification à l’enregistrement.
  6. En bas de la boîte de dialogue, cliquez sur Appliquer.

Le tableau va se recharger avec la configuration mise à jour. Le filtrage fonctionnera maintenant. Si vous avez créé des enregistrements Langue et que vous leur avez associé des enregistrements de ressources, vous pouvez désormais filtrer les ressources selon leurs langues associées.

Synthèse

Dans les étapes ci-dessus, nous avons modifié le volet Filtre pour afficher un contrôle de filtre pour l’entité Langue. Nous avons également modifié la requête Récupérer les ressources pour faire correspondre les ressources associées avec les enregistrements Langue. Lorsqu’un utilisateur sélectionne des valeurs dans le contrôle de filtre et clique sur Rechercher, les valeurs sont transférées dans la requête et la requête FetchXML retourne uniquement les ressources correspondantes.

Personnalisation l’Assistant Planifier

Nous devons personnaliser la mise en page du filtre de l’Assistant Planifier et les configurations de la requête Récupérer les ressources pour utiliser de nouvelles contraintes de langue dans l’Assistant Planifier.

Contrairement aux personnalisations du tableau de planification, où chaque tableau peut être personnalisé individuellement, les personnalisations de l’Assistant Planifier affectent tous les tableaux où l’Assistant Planifier est utilisé. Les personnalisations de l’Assistant Planifier peuvent être spécifiques à un type planifiable ou à tous les types. Dans cet exemple, nous allons personnaliser l’Assistant Planifier pour tous les types.

Configuration de la mise en page du filtre de l’Assistant Planifier

Pourboire

Pour les étapes ci-dessous, il convient d’utiliser un éditeur de texte qui prend en charge la syntaxe XML mettant en surbrillance vos modifications, puis de coller vos modifications dans l’éditeur Universal Resource Scheduling.

La configuration de la mise en page du filtre de l’Assistant Planifier, comme la mise ne page du filtre du tableau de planification, définit la mise en page des contrôles du volet Filtre. Comme l’Assistant Planifier utilise plus de filtres que le tableau de planification, comme l’heure de début, l’heure de fin, la durée, etc., une mise en page différente est utilisée.

Note

Dans cet exercice, nous allons réutiliser uniquement un sous-ensemble de filtres par défaut fournis dans Universal Resource Scheduling à partir de la configuration de mise en page du filtre de l’Assistant Planifier et ajouterons la liste déroulante Langues comme seul filtre disponible.

Le filtre que nous ajoutons à la mise en page est identique à celui ci-dessus dans Configuration de la mise en page du filtre. Les autre contrôles sont requis pour modifier les paramètres de recherche de l’Assistant Planifier.

Mise en page complète du filtre de l’Assistant Planifier

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

Mettre à jour la mise en page du filtre de l’Assistant Planifier

  1. Dans le coin supérieur droit, double-cliquez sur l’onglet Langue
  2. En haut à droite, cliquez sur Ouvrir les paramètres par défaut
  3. Faites défiler jusqu’à la section Types de planification et sélectionnez Aucun dans la liste de gauche
  4. Recherchez le champ Filtre de l’Assistant Planifier, cliquez sur le bouton à droite pour ouvrir l’éditeur
  5. Mettez à jour le champ Valeur avec le code de mise en page du filtre de l’Assistant Planifier ci-dessus puis cliquez sur Enregistrer sous
  6. Entrez « Mise en page du filtre de l’Assistant Planifier Langue » dans le champ Nom et cliquez sur Enregistrer. Cela crée un enregistrement de configuration et associe ce tableau de planification à l’enregistrement.
  7. En bas de la boîte de dialogue, cliquez sur Appliquer.

Le tableau va se recharger. Ensuite, nous devons modifier la requête Récupérer les contraintes avant de pouvoir utiliser l’Assistant Planifier avec nos nouvelles contraintes de langue, de sorte que les langues définies sur le Besoin fassent partie de la recherche de l’Assistant Planifier.

Configuration de la requête Récupérer les contraintes

Pourboire

Pour les étapes ci-dessous, il convient d’utiliser un éditeur de texte qui prend en charge la syntaxe XML mettant en surbrillance vos modifications, puis de coller vos modifications dans l’éditeur Universal Resource Scheduling.

La configuration de la requête Récupérer les contraintes est une requête UFX utilisée par l’API Récupérer les contraintes du besoin. Elle utilise comme entrée l’ID d’un enregistrement de besoin (sélectionné dans l’interface utilisateur) et renvoie l’enregistrement du besoin et tous ses enregistrements enfants.

Note

La requête Récupérer les contraintes par défaut fournie avec Universal Resource Scheduling est une vaste requête qui prend en charge toutes les contraintes de besoin incluses dans Universal Resource Scheduling. Dans cet exercice, nous allons utiliser uniquement un sous-ensemble de la requête par défaut et ajouter Langues comme unique filtre.

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

Les requêtes UFX sont traitées dans un ordre séquentiel. La requête Récupérer les contraintes utilise FetchXML pour interroger l’entité Requirement (msdyn_resourcerequirement) et attribuer le résultat, un enregistrement Besoin, à la propriété Requirement. Nous ajoutons au conteneur de propriétés des contraintes une nouvelle propriété Languages qui combine les deux attributs, la Langue principale et la Langue secondaire, en une liste unique d’entités (EntityCollection). Ceci est obligatoire car nous affichons le contrôle Langues dans le volet Filtre en tant que liste d’enregistrements. Nous pouvons aussi créer deux contrôles distincts dans le volet Filtre pour les deux attributs.

Voici la description de chaque element et attribute :

Nom Description
Languages Créez une propriété dans le conteneur de propriétés des contraintes du résultat nommée Languages
ufx:select Attribuez le résultat de l’expression XPath dans cet attribut à la propriété Languages. Les propriétés lang_primarylanguage et lang_secondarylanguage, récupérées précédemment dans la requête et disponibles dans la propriété Requirement, sont transmises à la fonction XPath lookup-to-list qui convertit plusieurs propriétés lookup en une seule list (EntityCollection)

Requête Récupérer les contraintes :

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

Mettez à jour la requête Récupérer les contraintes

  1. Dans le coin supérieur droit, double-cliquez sur l’onglet Langue
  2. En haut à droite, cliquez sur Ouvrir les paramètres par défaut
  3. Faites défiler jusqu’à la section Types de planification et sélectionnez Aucun dans la liste de gauche
  4. Recherchez le champ Requête Récupérer les contraintes de l’Assistant Planifier, cliquez sur le bouton à droite pour ouvrir l’éditeur
  5. Mettez à jour le champ Valeur avec le code de la requête Récupérer les ressources ci-dessus puis cliquez sur Enregistrer sous
  6. Entrez « Requête Contraintes de langue » dans le champ Nom et cliquez sur Enregistrer. Cela crée un enregistrement de configuration et associe ce tableau de planification à l’enregistrement.
  7. Recherchez le champ Requête Récupérer des ressources de l’Assistant Planifier et sélectionnez la Requête Ressources de langues créée précédemment pour les personnalisations de tableau de planification
  8. En bas de la boîte de dialogue, cliquez sur Appliquer.

Le tableau va se recharger avec la configuration mise à jour. Le filtrage de l’Assistant Planifier va fonctionner maintenant. Si vous avez créé des enregistrements Langue et que vous leur avez associé des enregistrements Besoin, vous pourrez désormais sélectionner un enregistrement Besoin au bas du tableau de planification, cliquer sur Rechercher une disponibilité pour lancer l’Assistant Planifier, et afficher uniquement les ressources correspondant aux langues enregistrées sur le besoin.

Configuration du modèle de cellule de ressource

Pourboire

Pour les étapes ci-dessous, il convient d’utiliser un éditeur de texte qui prend en charge la syntaxe HTML mettant en surbrillance vos modifications, puis de coller vos modifications dans l’éditeur Universal Resource Scheduling.

La configuration de modèle de cellule de ressource est un modèle Handlebars utilisé pour afficher le contenu dans la cellule de ressource. Le résultat de la Requête Récupérer des ressources est disponible sur le modèle.

Nous modifions le modèle de ressource par défaut pour afficher un indicateur ✔✱ vert si la ressource correspondait aux langues principales et secondaires, un indicateur ✔ vert si la ressource correspondait uniquement à la langue principale et un indicateur ✔ jaune si la ressource correspondait uniquement à la langue secondaire.

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

Les propriétés lang_primary et lang_secondary sont renvoyées par notre Requête Récupérer des ressources personnalisée configurée ci-dessus. Consultez le site Web Handlebars pour obtenir de la documentation sur la syntaxe des modèles.

Modèle de cellule de ressource :

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

Mettez à jour le modèle de cellule de ressource

  1. Dans le coin supérieur droit, double-cliquez sur l’onglet Langue
  2. En haut à droite, cliquez sur Ouvrir les paramètres par défaut
  3. Faites défiler jusqu’à la section Types de planification et sélectionnez Aucun dans la liste de gauche
  4. Recherchez le champ Modèle de cellule de ressource de l’Assistant Planifier, cliquez sur le bouton à droite pour ouvrir l’éditeur
  5. Mettez à jour le champ Valeur avec le code du Modèle de cellule de ressource ci-dessus puis cliquez sur Enregistrer sous
  6. Entrez « Modèle de cellule de ressource de langue » dans le champ Nom et cliquez sur Enregistrer. Cela crée un enregistrement de configuration et associe ce tableau de planification à l’enregistrement.
  7. En bas de la boîte de dialogue, cliquez sur Appliquer.

Le tableau va se recharger avec la configuration mise à jour. La cellule de ressource va indiquer maintenant comment une ressource est mise en correspondance avec la contrainte de langue dans le volet Filtre.

Synthèse

Dans les étapes ci-dessus, nous avons modifié le volet Filtre dans l’Assistant Planifier pour afficher un contrôle de filtre pour l’entité Langue. Nous avons également modifié la Requête Récupérer les contraintes pour interroger les nouveaux attributs de langue associés à l’entité Besoin, et les classer sous forme de liste. Lorsqu’un utilisateur sélectionne pour rechercher la disponibilité d’un enregistrement Besoin, le volet Filtre affiche les contraintes de langue capturées. Les valeurs du volet Filtre sont transférées à la Requête Récupérer les ressources et la requête FetchXML retourne uniquement les ressources correspondantes.

Voir aussi

Universal Fetch XML

Notes de publication sur l’extensibilité de Universal Resource Scheduling