Esempio: estendere Universal Resource Scheduling con un vincolo di lingua personalizzato

Questa guida dettagliata consente di comprendere e personalizzare la corrispondenza delle risorse in Universal Resource Scheduling

In questa guida dettagliata, estenderemo le risorse Universal Resource Scheduling con un vincolo Language. Prendiamo in considerazione un'organizzazione che intende filtrare le risorse per lingua parlata dalle stesse. L'organizzazione intende inoltre acquisire nel record Requirement la lingua necessaria per la mansione. Questo vincolo segue un modello simile al vincolo Territory incorporato. Una nuova entità master Language memorizzerà le varie lingue che una risorsa può parlare. Un record Resource può quindi essere associato a numerose entità Languages mediante un'entità di relazione molti-a-molti. Nell'entità Requirement, modelleremo questa entità creando due nuovi attributi di tipo lookup: Primary Language e Secondary Language. Durante la ricerca di risorse disponibili per un requisito, solo le risorse associate a Primary Language o Secondary Language verranno visualizzate.

Creazione di nuove entità e relazioni

In questa sezione creeremo il nuovo schema per l'entità Language master e aggiorneremo le entità Resource e Requirement con le relazioni corrispondenti alla nuova entità Language.

Creare un nuovo autore

  1. In Dynamics 365 crea un nuovo autore in Personalizzazioni

  2. Compila il modulo Nuovo autore con i dettagli seguenti:

    Campo Value
    Nome visualizzato Language
    Nome language
    Prefisso lang
  3. Fai clic su Salva e chiudi.

Creare una nuova soluzione

  1. In Dynamics 365 crea una nuova soluzione in Personalizzazioni

  2. Compila il modulo Nuova soluzione con i dettagli seguenti:

    Campo Value
    Nome visualizzato Language
    Nome Language
    Autore Language
    Versione 1.0.0.0
  3. Fai clic su Salva.

Creare l'entità Lingua

  1. Nella soluzione Lingua, crea una nuova entità.

  2. Compila il modulo Nuova entità con i dettagli seguenti:

    Campo Value
    Nome visualizzato Language
    Nome plurale Lingue
    Nome lang_language (il prefisso lang_ verrà immesso automaticamente e sarà di sola lettura)
  3. Fai clic su Salva.

Creare la relazione molti-a-molti dall'entità Risorsa all'entità Lingua

  1. Nell'entità Lingua, crea una nuova relazione molti-a-molti

  2. Compila il modulo Nuova relazione con i dettagli seguenti:

    Campo Value
    Entità corrente
    Opzione di visualizzazione Usa nome plurale
    Altra entità
    Nome entità Risorsa prenotabile
  3. Fai clic su Salva e chiudi.

  4. Chiudi il modulo dell'entità Lingua

Creare la relazione dall'entità Requisito all'entità Lingua

  1. Nella soluzione Lingua, aggiungi l'entità Requisito di risorsa esistente alla soluzione (se viene visualizzata una finestra di dialogo Componenti necessari mancanti, seleziona No, non includere i componenti necessari).

  2. Nell'entità Requisito di risorsa, crea un nuovo campo

  3. Compila il modulo Nuovo campo con i dettagli seguenti:

    Campo Value
    Nome visualizzato Lingua primaria
    Tipo di dati Ricerca
    Tipo di record di destinazione Language
  4. Fai clic su Salva e chiudi.

  5. Nell'entità Requisito di risorsa, crea un nuovo campo

  6. Compila il modulo Nuovo campo con i dettagli seguenti:

    Campo Value
    Nome visualizzato Lingua secondaria
    Tipo di dati Ricerca
    Tipo di record di destinazione Language
  7. Fai clic su Salva e chiudi.

Aggiornare il modulo principale Requisito

  1. Nell'entità Requisito di risorsa, aggiungi il modulo Informazioni esistente ai sottocomponenti dell'entità (se viene visualizzata una finestra di dialogo Componenti necessari mancanti, seleziona No, non includere i componenti necessari).
  2. Nel modulo Informazioni, utilizza Esplora campi per aggiungere i due nuovi attributi, Lingua primaria e Lingua secondaria al modulo di modo che gli utenti possano immettere queste informazioni quando creano requisiti
  3. Fai clic su Salva.
  4. Fai clic su Pubblica
  5. Puoi chiudere l'editor di moduli.

Riepilogo

Nei passaggi precedenti, abbiamo creato la nuova entità Lingua. Abbiamo quindi aggiunto nuove relazioni con le entità Risorsa e Requisito. Le risorse possono essere correlate a più lingue, poiché abbiamo aggiunto una relazione molti a molti tra la lingua e la risorsa. I requisiti possono essere correlati a due lingue poiché abbiamo aggiunto due attributi di tipo lookup all'entità Requisito che punta alla nuova entità Lingua.

Aggiunta di dati

Utilizza Ricerca avanzata per aggiungere nuovi record all'entità Lingua. Puoi quindi associare i record Risorsa ai nuovi record Lingua aprendo un record Risorsa e passando alla relazione Lingua nella barra di spostamento. Per i record Requisito, puoi riempire i campi Lingua primaria e Lingua secondaria nel modulo Requisito.

Personalizzazione della scheda di pianificazione

Per filtrare le risorse nella scheda di pianificazione con il nuovo vincolo Lingua, aggiorneremo i record di configurazione Query Recupera risorse e Layout filtro.

Configurazione Layout filtro

Mancia

Per i passaggi seguenti, è utile utilizzare un editor di testo che supporta l'evidenziazione della sintassi XML per apportare modifiche e quindi incollare le modifiche nuovamente nell'editor Universal Resource Scheduling.

La configurazione Layout filtro è una definizione di layout XML per personalizzare il layout del pannello Filtro.

Nota

Per questo esercizio, rimuoveremo tutti i filtri predefiniti forniti con Universal Resource Scheduling dal pannello Filtro e aggiungeremo Lingue come unico filtro disponibile.

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

L'elemento control aggiunge un nuovo controllo al pannello Filtro. Di seguito viene descritto ogni attributo:

Nome Descrizione
type Il tipo di controllo filtro. Un controllo combo esegue il rendering di un elenco a discesa con valori da scegliere
source L'origine dei valori per il controllo dell'elenco a discesa. Un origine entity mostra i record dell'entità nell'elenco a discesa
key La chiave da utilizzare per archiviare i valori selezionati nel contenitore della proprietà Vincoli
inactive-state Lo statecode inattivo per questa entità. Viene utilizzato per escludere i record inattivi dall'elenco a discesa
label-id L'etichetta localizzata da utilizzare per questo controllo
entity I record di questa entità saranno visualizzati nell'elenco a discesa
multi Configura l'elenco a discesa per consentire la seleziona di un solo record o di più record

Layout filtro:

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

Creare una nuova scheda Lingue

Per mantenere queste modifiche isolate, creeremo una nuova scheda di pianificazione distinta e implementeremo le modifiche. Tuttavia, puoi sempre apportare queste modifiche nella scheda di pianificazione predefinita di modo che altre schede di pianificazione possano ereditare automaticamente tali modifiche.

  1. In Dynamics 365 nella barra di spostamento superiore vai a Pianificazione risorsa > Scheda di pianificazione
  2. In alto a destra, fai clic sul simbolo + per creare una nuova scheda
  3. Assegna un nome alla nuova scheda Lingua
  4. Nella parte inferiore della finestra di dialogo, fai clic su Aggiungi. Verrà creata la nuova scheda.

Aggiornare il layout filtro della scheda di pianificazione

Successivamente, creeremo un nuovo record di configurazione in cui sono memorizzati i layout filtro e query utilizzati dalla scheda di pianificazione e quindi collegheremo la scheda di pianificazione appena creata al nuovo record di configurazione. È possibile fare ciò in vari modi. Di seguito viene descritto quello più rapido:

  1. In alto a destra, fai doppio clic sulla scheda Lingua
  2. Scorri verso il basso fino a impostazioni generali > Altre impostazioni
  3. Individua il campo Layout filtro, fai clic sul pulsante a destra per aprire l'editor
  4. Aggiorna il campo Valore con il codice Layout filtro precedente e fai clic su Salva con nome.
  5. Immetti "Layout filtro lingua" nel campo Nome e fai clic su Salva. In questo modo si crea un nuovo record di configurazione e si collega la scheda di pianificazione al record.
  6. Nella parte inferiore della finestra di dialogo, fai clic su Applica.

La scheda verrà ricaricata e a sinistra verrà visualizzato il pannello Filtro con il nuovo layout; solo il filtro Lingue sarà disponibile. Il filtro non funzionerà ancora, in quanto è necessario aggiornare Query Recupera risorse per utilizzare il nuovo filtro.

Configurazione Query Recupera risorse

Mancia

Per i passaggi seguenti, è utile utilizzare un editor di testo che supporta l'evidenziazione della sintassi XML per apportare modifiche e quindi incollare le modifiche nuovamente nell'editor Universal Resource Scheduling.

La configurazione Query Recupera risorse è una query UFX utilizzata dall'API di corrispondenza delle risorse. Questa configurazione utilizza come input i valori immessi nel pannello Filtro e crea il corretto FetchXML in modo dinamico per trovare risorse corrispondenti.

Di seguito sono riportati i nuovi frammenti aggiunti a Query Recupera risorse per la corrispondenza e da ordinare in base alle lingue delle risorse.

Aggiunta di join da bookableresource a 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>

I valori selezionati nel pannello Filtro sono passati come input alla query e sono disponibili nella variabile $input di XPath

La query Recupera risorse utilizza FetchXML per eseguire query sull'entità Resource (bookableresource). Utilizziamo l'elemento link-entity di FetchXML per restituire solo le risorse associate ai record Lingua selezionati nel pannello Filtro. Per supportare la visualizzazione delle lingue corrispondenti e l'ordinamento per lingua primaria o secondaria, descritto successivamente nella sezione Modello di cella della risorsa, utilizziamo più join link-entity.

Di seguito viene descritto ogni element e attribute:

Nome Descrizione
link-entity Crea un join alla relazione molti-a-molti tra le entità Risorsa e Lingua
ufx:if Crea questo elemento FetchXML (link-entity) solo se l'espressione XPath in questo attributo restituisce un valore
attribute Restituisce la lingua primaria o secondaria corrispondente
filter e condition Filtra i record della relazione molti a molti per visualizzare solo quelli che corrispondono agli ID lingua specificati
ufx:value e select Produce il risultato dell'espressione XPath nell'attributo select
ufx:apply e select Emette gli elementi FetchXML figlio per ogni risultato restituito dall'espressione XPath nell'attributo select
value Contiene l'ID di un record Lingua

Determinazione dell'ordinamento di una risorsa

Dopo il recupero delle risorse corrispondenti, in base alle lingue assegnate di ogni risorsa, assegniamo una nuova proprietà lang_order per determinare il relativo ordinamento.

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

Di seguito viene descritto ogni element e attribute:

Nome Descrizione
lang_order Crea una nuova proprietà in ogni risorsa restituita dalla query FetchXML denominata lang_order
ufx:select Assegna il risultato dell'espressione XPath in questo attributo alla proprietà lang_order. Le proprietà lang_primary e lang_secondary, recuperate in precedenza nella query, sono utilizzate insieme alla funzione iif di XPath per determinare l'ordine di corrispondenza delle risorse.

Ordinamento dei risultati

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

Le query UFX sono elaborate in ordine sequenziale. Dopo il recupero delle risorse mediante FetchXML, i risultati sono assegnati alla proprietà Resources. Stiamo ordinando i risultati in base alla proprietà lang_order aggiunta in precedenza e riassegnando i risultati ordinati alla proprietà Resources.

Di seguito viene descritto ogni element e attribute:

Nome Descrizione
Resources Riassegnare la proprietà Resources
ufx:select Assegna il risultato dell'espressione XPath in questo attributo alla proprietà Resources. La funzione order di XPath viene utilizzata per ordinare l'elenco Resources nella relativa proprietà lang_order.

Nota

La query Recupera risorse predefinita fornita con Universal Resource Scheduling è una query di grandi dimensioni che supporta tutti i vincoli di risorsa inclusi in Universal Resource Scheduling. Per questo esercizio, utilizzeremo solo un sottoinsieme della query predefinita e aggiungeremo Lingue come unico filtro.

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

Aggiornare la query Recupera risorse della scheda di pianificazione

  1. In alto a destra, fai doppio clic sulla scheda Lingua
  2. Scorri verso il basso fino a impostazioni generali > Altre impostazioni
  3. Individua il campo Query Recupera risorse, fai clic sul pulsante a destra per aprire l'editor
  4. Aggiorna il campo Valore con il codice Query Recupera risorse precedente e fai clic su Salva con nome.
  5. Immetti "Query risorse lingua" nel campo Nome e fai clic su Salva. In questo modo si crea un nuovo record di configurazione e si collega la scheda di pianificazione al record.
  6. Nella parte inferiore della finestra di dialogo, fai clic su Applica.

La scheda verrà ricaricata con la configurazione aggiornata. Il filtro ora funzionerà. Se hai creato record Lingua e li hai associasti ai record Risorsa, potrai filtrare le risorse per lingue associate.

Riepilogo

Nei passaggi precedenti abbiamo modificato il pannello Filtro per visualizzare un controllo di filtro per l'entità Lingua. Abbiamo inoltre modificato la query Recupera risorse per la corrispondenza delle risorse associate ai record Lingua selezionati. Quando un utente seleziona i valori nel controllo filtro e fa clic su Cerca, i valori vengono passati alla query e la query FetchXML restituisce solo le risorse corrispondenti.

Personalizzazione dell'assistente di pianificazione

Dobbiamo personalizzare le configurazioni Layout filtro Assistente di pianificazione e Query Recupera vincoli per utilizzare i nuovi vincoli Lingua nell'assistente di pianificazione.

A differenza delle personalizzazioni della scheda di pianificazione, dove ogni scheda può essere personalizzata singolarmente, le personalizzazioni dell'assistente di pianificazione influiscono su tutte le schede in cui l'assistente di pianificazione è utilizzato. Le personalizzazioni dell'assistente di pianificazione possono essere specifiche a un tipo pianificabile o per tutti i tipi. In questo esempio personalizzeremo l'assistente di pianificazione per tutti i tipi.

Configurazione Layout filtro Assistente di pianificazione

Mancia

Per i passaggi seguenti, è utile utilizzare un editor di testo che supporta l'evidenziazione della sintassi XML per apportare modifiche e quindi incollare le modifiche nuovamente nell'editor Universal Resource Scheduling.

La configurazione Layout filtro Assistente di pianificazione, come il layout Filtro scheda di pianificazione, definisce il layout dei comandi nel pannello Filtro. Poiché l'assistente di pianificazione utilizza più filtri nella scheda di pianificazione, come Ora di inizio, Ora di fine, Durata e così via, viene utilizzato un layout differente.

Nota

Per questo esercizio, riutilizzeremo solo un sottoinsieme dei filtri predefiniti presenti in Universal Resource Scheduling nella configurazione Layout filtro Assistente di pianificazione e aggiungeremo l'elenco a discesa Lingue come unico filtro disponibile.

Il filtro che stiamo aggiungendo al layout è uguale al precedente in Configurazione Layout filtro. Gli altri comandi sono necessari per modificare i parametri di ricerca dell'assistente di ricerca.

Layout filtro Assistente di pianificazione completo

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

Aggiornare il layout filtro Assistente di pianificazione

  1. In alto a destra, fai doppio clic sulla scheda Lingua
  2. In alto a destra, fai clic su Apri impostazioni predefinite
  3. Scorri fino alla sezione Tipi di pianificazione e seleziona Nessuno nell'elenco a sinistra
  4. Individua il campo Layout filtro Assistente di pianificazione, fai clic sul pulsante a destra per aprire l'editor
  5. Aggiorna il campo Valore con il codice Layout filtro Assistente di pianificazione e fai clic su Salva con nome
  6. Immetti "Lingua Layout filtro Assistente di pianificazione" nel campo Nome e fai clic su Salva. In questo modo si crea un nuovo record di configurazione e si collega la scheda di pianificazione al record.
  7. Nella parte inferiore della finestra di dialogo, fai clic su Applica.

La scheda verrà ricaricata. Successivamente, dovremo modificare la query Recupera vincoli prima di poter utilizzare l'assistente di pianificazione con i nuovi vincoli Lingua, di modo che le lingue impostate per il requisito siano parte della ricerca dell'assistente di pianificazione.

Configurazione Query Recupera vincoli

Mancia

Per i passaggi seguenti, è utile utilizzare un editor di testo che supporta l'evidenziazione della sintassi XML per apportare modifiche e quindi incollare le modifiche nuovamente nell'editor Universal Resource Scheduling.

La configurazione Query Recupera vincoli è una query UFX utilizzata dall'API di recupero dei vincoli di requisito. Questa configurazione utilizza come input l'ID di un record Requisito (selezionato nell'interfaccia utente) e restituisce il record Requisito e i relativi record figlio.

Nota

La query Recupera vincoli fornita con Universal Resource Scheduling è una query di grandi dimensioni che supporta tutti i vincoli di requisito inclusi in Universal Resource Scheduling. Per questo esercizio, utilizzeremo solo un sottoinsieme della query predefinita e aggiungeremo Lingue come unico filtro.

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

Le query UFX sono elaborate in ordine sequenziale. La query Recupera vincoli utilizza FetchXML per eseguire query sull'entità Requirement (msdyn_resourcerequirement) e assegna il risultato, un record Requisito, alla proprietà Requirement. Stiamo aggiungendo al contenitore della proprietà Vincoli una nuova proprietà Languages che combina entrambi gli attributi, la lingua primaria e la lingua secondaria, in un unico elenco di entità (EntityCollection). Ciò è necessario poiché stiamo visualizzando il controllo Lingue nel pannello Filtro come elenco di record. Un'alternativa sarebbe di creare due controlli distinti nel pannello Filtro per i due attributi.

Di seguito viene descritto ogni element e attribute:

Nome Descrizione
Languages Crea una nuova proprietà nel contenitore delle proprietà Vincoli dei risultati denominata Languages
ufx:select Assegna il risultato dell'espressione XPath in questo attributo alla proprietà Languages. Le proprietà lang_primarylanguage e lang_secondarylanguage, recuperate in precedenza nella query e disponibili nella proprietà Requirement, sono passate alla funzione lookup-to-list di XPath che convertire molteplici proprietà lookup in un unico list (EntityCollection)

Query Recupera vincoli:

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

Aggiornare la query Recupera vincoli

  1. In alto a destra, fai doppio clic sulla scheda Lingua
  2. In alto a destra, fai clic su Apri impostazioni predefinite
  3. Scorri fino alla sezione Tipi di pianificazione e seleziona Nessuno nell'elenco a sinistra
  4. Individua il campo Query Recupera vincoli di Assistente di pianificazione e fai clic sul pulsante a destra per aprire l'editor
  5. Aggiorna il campo Valore con il codice Query Recupera risorse precedente e fai clic su Salva con nome.
  6. Immetti "Query vincoli lingua" nel campo Nome e fai clic su Salva. In questo modo si crea un nuovo record di configurazione e si collega la scheda di pianificazione al record.
  7. Individua il campo Query Recupera risorse di Assistente di pianificazione e seleziona la query Risorse lingue creata in precedenza per le personalizzazioni della scheda di pianificazione
  8. Nella parte inferiore della finestra di dialogo, fai clic su Applica.

La scheda verrà ricaricata con la configurazione aggiornata. Ora il filtro dell'assistente di pianificazione funzionerà. Se hai creato i record Lingua e li hai associati ai record Requisito, sarai ora in grado di selezionare un record Requisito nella parte inferiore della scheda di pianificazione, fai clic su Trova disponibilità per avviare l'assistente di pianificazione e visualizzare solo le risorse corrispondenti alle lingue salvate nel requisito.

Configurazione Modello cella risorsa

Mancia

Per i passaggi seguenti, è utile utilizzare un editor di testo che supporta l'evidenziazione della sintassi HTML per apportare modifiche e quindi incollare le modifiche nuovamente nell'editor Universal Resource Scheduling.

La configurazione Modello cella risorsa è un modello Handlebars utilizzato per eseguire il rendering del contenuto nella cella della risorsa. L'output della query Recupera risorse è disponibile per il modello.

Stiamo modificando il modello di risorsa predefinito per visualizzare un indicatore ✔✱ verde se la risorsa è corrispondente alle lingue primaria e secondaria, un indicatore ✔ verde se la risorsa è corrispondente solo alla lingua primaria e un indicatore ✔ giallo se la risorsa è corrispondente solo alla lingua secondaria.

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

Le proprietà lang_primary e lang_secondary sono restituiti dalla query Recupera risorse personalizzata configurata in precedenza. Consulta il sito Web Handlebars per la documentazione sulla sintassi per la creazione di modelli.

Modello di cella della risorsa:

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

Aggiornare il modello di cella della risorsa

  1. In alto a destra, fai doppio clic sulla scheda Lingua
  2. In alto a destra, fai clic su Apri impostazioni predefinite
  3. Scorri fino alla sezione Tipi di pianificazione e seleziona Nessuno nell'elenco a sinistra
  4. Individua il campo Modello cella risorsa Assistente di pianificazione e fai clic sul pulsante a destra per aprire l'editor
  5. Aggiorna il campo Valore con il codice Modello cella risorsa precedente e fai clic su Salva con nome.
  6. Immetti "Lingua modello cella risorsa" nel campo Nome e fai clic su Salva. In questo modo si crea un nuovo record di configurazione e si collega la scheda di pianificazione al record.
  7. Nella parte inferiore della finestra di dialogo, fai clic su Applica.

La scheda verrà ricaricata con la configurazione aggiornata. La cella della risorsa ora indicherà come una risorsa corrisponde al vincolo Lingua nel pannello Filtro.

Riepilogo

Nei passaggi precedenti abbiamo modificato il pannello Filtro nell'assistente di pianificazione per visualizzare un controllo per l'entità Lingua. Abbiamo anche modificato la query Recupero vincoli per eseguire query sui nuovi attributi Lingua correlati all'entità Requisito e inserirli in un elenco. Quando un utente cerca la disponibilità per un record Requisito, il pannello Filtro visualizzerà i vincoli Lingua acquisiti. I valori del pannello Filtro vengono passati alla query Recupera risorse e la query FetchXML restituisce solo le risorse corrispondenti.

Vedi anche

FetchXML universale

Note sulla versione dell'estendibilità di Universal Resource Scheduling