Κοινή χρήση μέσω


Δείγμα: Επέκταση Universal Resource Scheduling με περιορισμό προσαρμοσμένης γλώσσας

Αυτός ο οδηγός βήμα προς βήμα συνοδεύει την ενότητα Κατανόηση και προσαρμογή πόρων που αντιστοιχούν στο Universal Resource Scheduling

Σε αυτόν τον οδηγό βήμα προς βήμα, θα επεκτείνουμε τους πόρους Universal Resource Scheduling με περιορισμό Language. Λάβετε υπόψη έναν οργανισμό που θέλει να φιλτράρει πόρους σύμφωνα με τις γλώσσες που ομιλούνται. Επίσης, θέλει να καταγράψει στην καρτέλα Requirement τη γλώσσα που απαιτείται για την εργασία. Αυτός ο περιορισμός ακολουθεί ένα παρόμοιο μοτίβο για τον ενσωματωμένο περιορισμό Territory. Μια νέα κύρια οντότητα Language θα αποθηκεύσει τις διαφορετικές γλώσσες που μπορεί να μιλήσει ένας πόρος. Μια καρτέλα Resource στη συνέχεια μπορεί να συσχετιστεί με πολλές Languages μέσω μιας οντότητας σχέσης πολλά προς πολλά. Στην οντότητα Requirement, αυτό θα μοντελοποιηθεί δημιουργώντας δύο νέα χαρακτηριστικά αναζήτησης: Primary Language και Secondary Language. Όταν βρείτε τους διαθέσιμους πόρους για μια απαίτηση, μόνο οι πόροι που σχετίζονται με το Primary Language ή Secondary Language θα εμφανίζονται.

Δημιουργία νέων οντοτήτων και σχέσεων

Σε αυτήν την ενότητα θα δημιουργήσουμε το νέο σχήμα για την κύρια οντότητα Language και θα ενημερώσουμε τις οντότητες Resource και Requirement με τις αντίστοιχες σχέσεις με τη νέα οντότητα Language.

Δημιουργία νέου εκδότη

  1. Στο Dynamics 365, στην περιοχή προσαρμογών, δημιουργήστε έναν νέο εκδότη

  2. Συμπληρώστε τη φόρμα νέου εκδότη με τις παρακάτω λεπτομέρειες:

    Πεδίο Value
    Εμφανιζόμενο όνομα Language
    Όνομα γλώσσα
    Πρόθεμα lang
  3. Κάντε κλικ στην επιλογή Αποθήκευση και κλείσιμο

Δημιουργία νέας λύσης

  1. Στο Dynamics 365, στην περιοχή προσαρμογών, δημιουργήστε μια νέα λύση

  2. Συμπληρώστε τη φόρμα νέας λύσης με τις παρακάτω λεπτομέρειες:

    Πεδίο Value
    Εμφανιζόμενο όνομα Language
    Όνομα Language
    Εκδότης Language
    Έκδοση 1.0.0.0
  3. Κάντε κλικ στην επιλογή Αποθήκευση

Δημιουργήστε μια οντότητα γλώσσας

  1. Στη λύση γλώσσας, δημιουργήστε μια νέα οντότητα

  2. Συμπληρώστε τη φόρμα νέας οντότητας με τις παρακάτω λεπτομέρειες:

    Πεδίο Value
    Εμφανιζόμενο όνομα Language
    Όνομα σε πληθυντικό Γλώσσες
    Ονομασία lang_language (Το πρόθεμα lang_ θα συμπληρωθεί αυτόματα και θα είναι μόνο για ανάγνωση)
  3. Κάντε κλικ στην επιλογή Αποθήκευση

Δημιουργήστε τη σχέση πολλά προς πολλά από την οντότητα πόρων στην οντότητα Γλώσσα

  1. Στην οντότητα γλώσσας, δημιουργήστε μια νέα σχέση πολλά-προς-πολλά

  2. Συμπληρώστε τη φόρμα νέας σχέσης με τις παρακάτω λεπτομέρειες:

    Πεδίο Value
    Τρέχουσα οντότητα
    Επιλογή εμφάνισης Χρήση ονόματος σε πληθυντικό
    Άλλη οντότητα
    Όνομα οντότητας Πόρος με δυνατότητα κράτησης
  3. Κάντε κλικ στην επιλογή Αποθήκευση και κλείσιμο

  4. Κλείστε τη φόρμα οντότητας γλώσσας

Δημιουργήστε τις σχέσεις από την οντότητα Απαίτηση στην οντότητα Γλώσσα

  1. Στη λύση γλώσσας, προσθέστε την υπάρχουσα οντότητα απαίτησης πόρου στη λύση (Εάν εμφανιστεί με ένα παράθυρο διαλόγου Λείπουν ορισμένα απαιτούμενα στοιχεία, επιλέξτε Όχι, να μην συμπεριληφθούν απαιτούμενα στοιχεία.)

  2. Στην οντότητα απαίτησης πόρου, δημιουργήστε ένα νέο πεδίο

  3. Συμπληρώστε τη φόρμα νέου πεδίου με τις παρακάτω λεπτομέρειες:

    Πεδίο Value
    Εμφανιζόμενο όνομα Κύρια γλώσσα
    Τύπος δεδομένων Αναζήτηση
    Τύπος καρτέλας προορισμού Language
  4. Κάντε κλικ στην επιλογή Αποθήκευση και κλείσιμο

  5. Στην οντότητα απαίτησης πόρου, δημιουργήστε ένα νέο πεδίο

  6. Συμπληρώστε τη φόρμα νέου πεδίου με τις παρακάτω λεπτομέρειες:

    Πεδίο Value
    Εμφανιζόμενο όνομα Δευτερεύουσα γλώσσα
    Τύπος δεδομένων Αναζήτηση
    Τύπος καρτέλας προορισμού Language
  7. Κάντε κλικ στην επιλογή Αποθήκευση και κλείσιμο

Ενημέρωση της κύριας φόρμας απαίτησης

  1. Στην οντότητα απαίτησης πόρου, προσθέστε την υπάρχουσα φόρμα πληροφοριών στα δευτερεύοντα στοιχεία οντότητας (Εάν εμφανιστεί με ένα παράθυρο διαλόγου Λείπουν ορισμένα απαιτούμενα στοιχεία, επιλέξτε Όχι, να μην συμπεριληφθούν απαιτούμενα στοιχεία.)
  2. Στη φόρμα πληροφοριών, χρησιμοποιήστε την Εξερεύνηση πεδίων για να προσθέσετε τα δύο νέα χαρακτηριστικά, την κύρια γλώσσα και τη δευτερεύουσα γλώσσα στη φόρμα, ώστε οι χρήστες να εισαγάγουν αυτές τις πληροφορίες καθώς δημιουργούν απαιτήσεις
  3. Κάντε κλικ στην επιλογή Αποθήκευση
  4. Κάντε κλικ στην επιλογή Δημοσίευση
  5. Μπορείτε να κλείσετε το πρόγραμμα επεξεργασίας φορμών

Σύνοψη

Στα παραπάνω βήματα, έχουμε δημιουργήσει τη νέα οντότητα γλώσσας. Στη συνέχεια, προσθέτουμε νέες σχέσεις στις οντότητες πόρων και απαίτησης. Οι πόροι μπορούν να συσχετιστούν με πολλές γλώσσες, εφόσον προσθέτουμε μια σχέση πολλά προς πολλά σχέση μεταξύ της γλώσσας και του πόρου. Οι απαιτήσεις μπορούν να συσχετιστούν με δύο γλώσσες, εφόσον προσθέσουμε δύο χαρακτηριστικά αναζήτησης στην οντότητα απαίτησης που υποδεικνύει τη νέα οντότητα γλώσσας.

Προσθήκη δεδομένων

Χρησιμοποιήστε τα πρόσθετα κριτήρια εύρεσης για να προσθέσετε νέες καρτέλες στην οντότητα γλώσσας. Στη συνέχεια, μπορείτε να συσχετίσετε καρτέλες πόρων με τις νέες καρτέλες γλώσσας ανοίγοντας μια καρτέλα πόρου και μεταβαίνοντας στη σχέση γλώσσας στη γραμμή πλοήγησης. Για τις καρτέλες απαίτησης, μπορείτε να συμπληρώσετε τα νέα πεδία κύριας γλώσσας και δευτερεύουσας γλώσσας στη φόρμα απαίτησης.

Προσαρμογή πίνακα χρονοδιαγράμματος

Για να φιλτράρετε πόρους στον πίνακα χρονοδιαγράμματος με τον νέο περιορισμό γλώσσας, θα ενημερώσουμε τις καρτέλες διαμόρφωσης Ερώτημα ανάκτησης πόρων και Διάταξη φίλτρου.

Διαμόρφωση διάταξης φίλτρου

Φιλοδώρημα

Για τα παρακάτω βήματα, είναι χρήσιμο να χρησιμοποιήσετε ένα πρόγραμμα επεξεργασίας κειμένου που υποστηρίζει την επισήμανση της σύνταξης XML γι ανα κάνετε τις αλλαγές σας και μετά επικολλήστε τις αλλαγές σας στο πρόγραμμα επεξεργασίας Universal Resource Scheduling.

Η διαμόρφωση διάταξης φίλτρου είναι ένας ορισμός διάταξης XML για να προσαρμόσετε τη διάταξη του πίνακα φίλτρου.

Σημείωμα

Για αυτήν την άσκηση, θα καταργήσουμε όλα τα προεπιλεγμένα φίλτρα που αποστέλλονται με Universal Resource Scheduling από τον πίνακα φίλτρου και θα προσθέσουμε γλώσσες ως το μόνο διαθέσιμο φίλτρο.

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

Το στοιχείο control προσθέτει ένα νέο στοιχείο ελέγχου στον πίνακα φίλτρου. Ακολουθεί η περιγραφή του κάθε χαρακτηριστικού:

Όνομα Περιγραφή
type Ο τύπος στοιχείου ελέγχου φίλτρου. Ένα στοιχείο ελέγχου combo εμφανίζει μια αναπτυσσόμενη λίστα με τις τιμές για να επιλέξετε
source Η προέλευση των τιμών για το στοιχείο ελέγχου της αναπτυσσόμενης λίστας. Μια προέλευση entity εμφανίζει καρτέλες οντότητας στην αναπτυσσόμενη λίστα
key Το κλειδί που θα χρησιμοποιηθεί για την αποθήκευση των επιλεγμένων τιμών στο σετ ιδιοτήτων περιορισμών
inactive-state Το ανενεργό statecode για αυτήν την οντότητα. Χρησιμοποιείται για την εξαίρεση ανενεργών καρτελών από την αναπτυσσόμενη λίστα
label-id Η τοπικοποιημένη ετικέτα που θα χρησιμοποιηθεί για αυτό το στοιχείο ελέγχου
entity Θα εμφανιστούν οι καρτέλες της οντότητας στην αναπτυσσόμενη λίστα
multi Ρυθμίζει την αναπτυσσόμενη λίστα ώστε να επιλέξετε μια μεμονωμένη καρτέλα ή πολλές καρτέλες

Διάταξη φίλτρου:

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

Δημιουργία ενός νέου πίνακα γλωσσών

Για να διατηρήσετε αυτές τις αλλαγές απομονωμένες, θα δημιουργήσουμε έναν νέο ξεχωριστό πίνακα χρονοδιαγράμματος και θα εφαρμόσουμε τις αλλαγές αλλά μπορείτε να κάνετε αυτές τις αλλαγές στον προεπιλεγμένο πίνακα χρονοδιαγράμματος, έτσι ώστε οι άλλοι πίνακες χρονοδιαγράμματος να μεταβιβάζουν αυτόματα αυτές τις αλλαγές.

  1. Στο Dynamics 365, στην επάνω γραμμή περιήγησης, μεταβείτε στον Προγραμματισμό πόρων > Πίνακας χρονοδιαγράμματος
  2. Επάνω δεξιά κάντε κλικ στο σύμβολο + για να δημιουργήσετε έναν νέο πίνακα
  3. Ονομάστε τον νέο πίνακα γλωσσών
  4. Στο κάτω μέρος του παραθύρου διαλόγου, επιλέξτε Προσθήκη. Θα δημιουργηθεί ο νέος πίνακας.

Ενημέρωση διάταξης φίλτρου πίνακα χρονοδιαγράμματος

Στη συνέχεια, θα δημιουργήσουμε μια νέα καρτέλα ρύθμισης παραμέτρων που αποθηκεύει διατάξεις φίλτρων και ερωτήματα που χρησιμοποιούνται από τον πίνακα χρονοδιαγράμματος και, στη συνέχεια, θα συνδέσουμε τον πίνακα χρονοδιαγράμματος που μόλις δημιουργήθηκε με τη νέα καρτέλα ρύθμισης παραμέτρων. Υπάρχουν πολλοί τρόποι για να το κάνετε αυτό, αλλά αυτός είναι ο πιο γρήγορος:

  1. Επάνω δεξιά κάντε διπλό κλικ στην καρτέλα γλώσσας
  2. Κάντε κύλιση προς τα κάτω στις Γενικές ρυθμίσεις > Άλλες ρυθμίσεις
  3. Εντοπίστε το πεδίο διάταξης φίλτρου, κάντε κλικ στο κουμπί στα δεξιά για να ανοίξετε το πρόγραμμα επεξεργασίας
  4. Ενημερώσετε το πεδίο τιμής με τον κωδικό διάταξης φίλτρου παραπάνω και κάντε κλικ στο κουμπί Αποθήκευση ως.
  5. Πληκτρολογήστε "Διάταξη φίλτρου γλώσσας" στο πεδίο "Όνομα" και επιλέξτε "Αποθήκευση". Έτσι δημιουργείται μια νέα καρτέλα ρύθμισης παραμέτρων και συνδέεται αυτός ο πίνακας χρονοδιαγράμματος με την καρτέλα.
  6. Στο κάτω μέρος του παραθύρου διαλόγου, επιλέξτε Εφαρμογή

Ο πίνακας θα φορτωθεί ξανά και θα εμφανιστεί ο πίνακας φίλτρου στην αριστερή γωνία με τη νέα διάταξη. Μόνο το φίλτρο γλωσσών θα είναι διαθέσιμο. Το φιλτράρισμα δεν θα λειτουργεί ακόμα διότι πρέπει να γίνει ενημέρωση του ερωτήματος πόρων ανάκτηση για να επωφεληθείτε από το νέο φίλτρο.

Ρύθμιση παραμέτρων ερωτήματος ανάκτησης πόρων

Φιλοδώρημα

Για τα παρακάτω βήματα, είναι χρήσιμο να χρησιμοποιήσετε ένα πρόγραμμα επεξεργασίας κειμένου που υποστηρίζει την επισήμανση της σύνταξης XML γι ανα κάνετε τις αλλαγές σας και μετά επικολλήστε τις αλλαγές σας στο πρόγραμμα επεξεργασίας Universal Resource Scheduling.

Η ρύθμιση παραμέτρων ερωτήματος ανάκτησης πόρων είναι ένα Ερώτημα UFX που χρησιμοποιείται από το API αντιστοίχισης πόρων. Χρησιμοποιούνται οι τιμές που καταχωρίστηκαν στον πίνακα φίλτρου και δυναμικά δημιουργείται το σωστό FetchXML για εύρεση πόρων που ταιριάζουν.

Παρακάτω ακολουθούν τα νέα τμήματα που προστίθενται στο ερώτημα ανάκτησης πόρων για αντιστοίχιση και παραγγελία σύμφωνα με τις γλώσσες πόρων.

Γίνεται προσθήκη των συνδέσμων από το bookableresource στο 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>

Οι τιμές που επιλέξατε στον πίνακα φίλτρου μεταβιβάζονται ως καταχώριση στο ερώτημα και είναι διαθέσιμες στη μεταβλητή XPath $input

Το ερώτημα ανάκτησης πόρων χρησιμοποιεί FetchXML για να θέσει ερώτημα στην οντότητα Resource (bookableresource). Χρησιμοποιούμε το στοιχείο FetchXML link-entity για να επιστρέφονται μόνο οι πόροι που σχετίζονται με τις καρτέλες γλωσσών που επιλέξατε στον πίνακα φίλτρου. Για να υποστηρίξουμε την εμφάνιση γλωσσών που ταιριάζουν και την παραγγελία κατά κύρια ή δευτερεύουσα γλώσσα που περιγράφονται παρακάτω στην ενότητα Πρότυπο κελιού πόρων, χρησιμοποιούμε πολλές συνδέσεις link-entity.

Ακολουθεί η περιγραφή του κάθε χαρακτηριστικού element και attribute:

Όνομα Περιγραφή
link-entity Δημιουργήστε έναν σύνδεσμο με τη σχέση πολλά προς πολλά μεταξύ των οντοτήτων πόρων και γλωσσών
ufx:if Να γίνει αποστολή αυτού του στοιχείου FetchXML (link-entity) μόνο αν η έκφραση XPath σε αυτό το χαρακτηριστικό επιστρέφει μια τιμή
attribute Επιστρέφεται η κύρια ή δευτερεύουσα γλώσσα που ταιριάζει
filter και condition. Φιλτράρετε τις καρτέλες σχέσης πολλά-προς-πολλά σε μόνο εκείνες που συμφωνούν με τα καθορισμένα αναγνωριστικά γλώσσας
ufx:value και select. Εμφανίζει το αποτέλεσμα της έκφρασης XPath στο χαρακτηριστικό select
ufx:apply και select. Αποστολή των θυγατρικών στοιχείων FetchXML για κάθε αποτέλεσμα που επιστρέφεται από την έκφραση XPath στο χαρακτηριστικό select
value Περιέχει το αναγνωριστικό μιας καρτέλας γλώσσας

Καθορισμός της σειράς ταξινόμησης ενός πόρου

Αφού ανακτήσουμε τους αντίστοιχους πόρους, με βάση τις γλώσσες που έχουν ανατεθεί σε κάθε πόρο, αναθέτουμε μια νέα ιδιότητα lang_order για να καθορίσετε τη σειρά ταξινόμησης.

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

Ακολουθεί η περιγραφή του κάθε χαρακτηριστικού element και attribute:

Όνομα Περιγραφή
lang_order Δημιουργία μιας νέας ιδιότητας σε κάθε πόρο που επιστρέφεται από το ερώτημα FetchXML με το όνομα lang_order
ufx:select Αναθέστε το αποτέλεσμα της έκφρασης XPath σε αυτό το χαρακτηριστικό στην ιδιότητα lang_order. Οι ιδιότητες lang_primary και lang_secondary που έχουν ανακτηθεί προηγουμένως στο ερώτημα χρησιμοποιούνται μαζί με τη συνάρτηση XPath iif για να καθορίσετε τον πόρο που ταιριάζει σε μια παραγγελία.

Παραγγελία αποτελεσμάτων

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

Τα ερωτήματα UFX τίθενται υπό επεξεργασία με διαδοχική σειρά. Μετά την ανάκτηση των πόρων μέσω FetchXML, τα αποτελέσματα εκχωρούνται την ιδιότητα Resources. Ταξινομούμε τα αποτελέσματα με βάση την ιδιότητα lang_order που προστέθηκε προηγουμένως και θα αναθέσουμε εκ νέου τα ταξινομημένα αποτελέσματα στην ιδιότητα Resources.

Ακολουθεί η περιγραφή του κάθε χαρακτηριστικού element και attribute:

Ονομασία Περιγραφή
Resources Εκ νέου ανάθεση της ιδιότητας Resources
ufx:select Αναθέστε το αποτέλεσμα της έκφρασης XPath σε αυτό το χαρακτηριστικό στην ιδιότητα Resources. Η συνάρτηση XPath order χρησιμοποιείται για παραγγελία της λίστας Resources στην ιδιότητα lang_order.

Σημείωμα

Το προεπιλεγμένο ερώτημα ανάκτησης πόρων που αποστέλλεται με Universal Resource Scheduling είναι ένα μεγάλο ερώτημα που υποστηρίζει όλους τους περιορισμούς πόρων που συνοδεύουν το Universal Resource Scheduling. Για αυτήν την άσκηση, θα χρησιμοποιήσουμε μόνο ένα υποσύνολο του προεπιλεγμένου ερωτήματος και θα προσθέσουμε γλώσσες ως το μόνο φίλτρο.

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

Ενημέρωση του ερωτήματος ανάκτησης πόρων πίνακα χρονοδιαγράμματος

  1. Επάνω δεξιά κάντε διπλό κλικ στην καρτέλα γλώσσας
  2. Κάντε κύλιση προς τα κάτω στις Γενικές ρυθμίσεις > Άλλες ρυθμίσεις
  3. Εντοπίστε το πεδίο ερωτήματος ανάκτησης πόρων, κάντε κλικ στο κουμπί στα δεξιά για να ανοίξετε το πρόγραμμα επεξεργασίας
  4. Ενημερώσετε το πεδίο τιμής με τον κωδικό ερωτήματος ανάκτησης πόρων παραπάνω και κάντε κλικ στο κουμπί Αποθήκευση ως.
  5. Πληκτρολογήστε "Ερώτημα πόρων γλώσσας" στο πεδίο "Όνομα" και επιλέξτε "Αποθήκευση". Έτσι δημιουργείται μια νέα καρτέλα ρύθμισης παραμέτρων και συνδέεται αυτός ο πίνακας χρονοδιαγράμματος με την καρτέλα.
  6. Στο κάτω μέρος του παραθύρου διαλόγου, επιλέξτε Εφαρμογή

Ο πίνακας θα φορτώσει ξανά με τις ενημερωμένες παραμέτρους. Το φιλτράρισμα δεν θα έχει αποτέλεσμα. Εάν δημιουργήσατε καρτέλες γλωσσών και τις συσχετίσατε με καρτέλες πόρων, θα μπορείτε να φιλτράρετε πόρους με βάση τις συσχετισμένες γλώσσες.

Σύνοψη

Στα παραπάνω βήματα θα τροποποιήσουμε τον πίνακα φίλτρου για να εμφανιστεί ένα στοιχείο ελέγχου φίλτρου για την οντότητα γλώσσας. Θα τροποποιήσουμε επίσης το ερώτημα ανάκτησης πόρων για την αντιστοίχιση πόρων που σχετίζονται με τις επιλεγμένες καρτέλες γλώσσας. Όταν ένας χρήστης επιλέγει τιμές στο στοιχείο ελέγχου φίλτρου και κάνει κλικ στο κουμπί αναζήτησης, αυτές οι τιμές περνούν στο ερώτημα και το ερώτημα FetchXML επιστρέφει μόνο πόρους που ταιριάζουν.

Προσαρμογή βοηθού χρονοδιαγράμματος

Θα χρειαστεί να διαμορφώσετε τη διάταξη φίλτρου βοηθού χρονοδιαγράμματος και ερωτήματος περιορισμών ανάκτησης για να χρησιμοποιήσετε τους νέους περιορισμούς γλώσσας στον βοηθό χρονοδιαγράμματος.

Σε αντίθεση με τις προσαρμογές του πίνακα χρονοδιαγράμματος, όπου κάθε πίνακας μπορεί να προσαρμοστεί ξεχωριστά, οι προσαρμογές βοηθού χρονοδιαγράμματος επηρεάζει όλους τους πίνακες όπου χρησιμοποιείται ο βοηθός χρονοδιαγράμματος. Οι προσαρμογές του βοηθού χρονοδιαγράμματος μπορούν να αφορούν έναν συγκεκριμένο τύπο με δυνατότητα προγραμματισμού ή για όλους τους τύπους. Σε αυτό το παράδειγμα θα προσαρμόσουμε τον Βοηθό χρονοδιαγράμματος για όλους τους τύπους.

Διαμόρφωση διάταξης φίλτρου βοηθού χρονοδιαγράμματος

Φιλοδώρημα

Για τα παρακάτω βήματα, είναι χρήσιμο να χρησιμοποιήσετε ένα πρόγραμμα επεξεργασίας κειμένου που υποστηρίζει την επισήμανση της σύνταξης XML γι ανα κάνετε τις αλλαγές σας και μετά επικολλήστε τις αλλαγές σας στο πρόγραμμα επεξεργασίας Universal Resource Scheduling.

Η διαμόρφωση διάταξης φίλτρου του βοηθού χρονοδιαγράμματος, όπως η διάταξη φίλτρου πίνακα χρονοδιαγράμματος, καθορίζει τη διάταξη των στοιχείων ελέγχου στον πίνακα φίλτρου. Αφού ο Βοηθός χρονοδιαγράμματος χρησιμοποιεί περισσότερα φίλτρα από τον πίνακα χρονοδιαγράμματος, όπως η ώρα έναρξης, η ώρα λήξης, η διάρκεια, κ.λπ., χρησιμοποιείται μια διαφορετική διάταξη.

Σημείωμα

Για αυτήν την άσκηση, θα χρησιμοποιήσουμε ξανά μόνο ένα υποσύνολο προεπιλεγμένων φίλτρων που αποστέλλονται στο Universal Resource Scheduling από τη ρύθμιση παραμέτρων διάταξης φίλτρου βοηθού χρονοδιαγράμματος και να προσθέσετε την αναπτυσσόμενη λίστα γλωσσών ως το μόνο διαθέσιμο φίλτρο.

Το φίλτρο που προσθέτουμε στη διάταξη είναι το ίδιο με παραπάνω στη Ρύθμιση παραμέτρων διάταξης φίλτρου. Τα άλλα στοιχεία ελέγχου είναι απαραίτητα για να τροποποιήσετε τις παραμέτρους αναζήτησης του βοηθού χρονοδιαγράμματος.

Η ολοκληρωμένη διάταξη φίλτρου Βοηθού χρονοδιαγράμματος

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

Ενημερώστε τη διάταξη φίλτρου Βοηθού χρονοδιαγράμματος

  1. Επάνω δεξιά κάντε διπλό κλικ στην καρτέλα γλώσσας
  2. Επάνω δεξιά, κάντε κλικ στην επιλογή Άνοιγμα προεπιλεγμένων ρυθμίσεων
  3. Μεταβείτε στην ενότητα Τύποι χρονοδιαγράμματος και επιλέξτε Κανένας στη λίστα αριστερά
  4. Εντοπίστε το πεδίο διάταξης βοηθού χρονοδιαγράμματος, κάντε κλικ στο κουμπί στα δεξιά για να ανοίξετε το πρόγραμμα επεξεργασίας
  5. Ενημερώσετε το πεδίο τιμής με τον κωδικό διάταξης φίλτρου βοηθού χρονοδιαγράμματος παραπάνω και κάντε κλικ στο κουμπί Αποθήκευση ως.
  6. Πληκτρολογήστε "Διάταξη φίλτρου βοηθού χρονοδιαγράμματος" στο πεδίο "Όνομα" και επιλέξτε "Αποθήκευση". Έτσι δημιουργείται μια νέα καρτέλα ρύθμισης παραμέτρων και συνδέεται αυτός ο πίνακας χρονοδιαγράμματος με την καρτέλα.
  7. Στο κάτω μέρος του παραθύρου διαλόγου, επιλέξτε Εφαρμογή

Ο πίνακας θα φορτώσει ξανά. Στη συνέχεια, πρέπει να αλλάξουμε το ερώτημα περιορισμών ανάκτησης για να μπορέσετε να χρησιμοποιήσετε τον Βοηθό χρονοδιαγράμματος με τους νέους περιορισμούς γλώσσας, έτσι ώστε οι γλώσσες που ορίζονται στην απαίτηση είναι μέρος της αναζήτησης του βοηθού χρονοδιαγράμματος.

Διαμόρφωση ερωτήματος περιορισμών ανάκτησης

Φιλοδώρημα

Για τα παρακάτω βήματα, είναι χρήσιμο να χρησιμοποιήσετε ένα πρόγραμμα επεξεργασίας κειμένου που υποστηρίζει την επισήμανση της σύνταξης XML γι ανα κάνετε τις αλλαγές σας και μετά επικολλήστε τις αλλαγές σας στο πρόγραμμα επεξεργασίας Universal Resource Scheduling.

Η ρύθμιση παραμέτρων ερωτήματος ανάκτησης περιορισμών είναι ένα Ερώτημα UFX που χρησιμοποιείται από το API περιορισμών απαίτησης ανάκτησης. Λαμβάνει υπόψη ως καταχώριση το αναγνωριστικό μιας καρτέλας απαίτησης (επιλέγεται στο περιβάλλον εργασίας χρήστη) και επιστρέφει την καρτέλα απαίτησης και όλες τις θυγατρικές καρτέλες.

Σημείωμα

Το προεπιλεγμένο ερώτημα περιορισμών ανάκτησης πόρων που αποστέλλεται με Universal Resource Scheduling είναι ένα μεγάλο ερώτημα που υποστηρίζει όλους τους περιορισμούς απαίτησης που συνοδεύουν το Universal Resource Scheduling. Για αυτήν την άσκηση, θα χρησιμοποιήσουμε μόνο ένα υποσύνολο του προεπιλεγμένου ερωτήματος και θα προσθέσουμε γλώσσες ως το μόνο φίλτρο.

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

Τα ερωτήματα UFX τίθενται υπό επεξεργασία με διαδοχική σειρά. Το ερώτημα περιορισμών ανάκτησης χρησιμοποιεί FetchXML για να θέσει ερώτημα στην οντότητα Requirement (msdyn_resourcerequirement) και αντιστοιχίζει το αποτέλεσμα, μια καρτέλα απαίτησης, στην ιδιότητα Requirement. Προσθέτουμε στο σύνολο ιδιοτήτων περιορισμών μια νέα ιδιότητα Languages που συνδυάζει και τα δύο χαρακτηριστικά, την κύρια γλώσσα και τη δευτερεύουσα γλώσσα, σε μία μόνο λίστα οντοτήτων (EntityCollection). Αυτό απαιτείται επειδή εμφανίζονται στο στοιχείο ελέγχου Γλώσσες στον πίνακα φίλτρου ως μια λίστα καρτελών. Μια εναλλακτική είναι να δημιουργήσετε δύο ξεχωριστά στοιχεία ελέγχου στον πίνακα φίλτρου για τα δύο χαρακτηριστικά.

Ακολουθεί η περιγραφή του κάθε χαρακτηριστικού element και attribute:

Όνομα Περιγραφή
Languages Δημιουργήστε μια νέα ιδιότητα στο σύνολο ιδιοτήτων περιορισμών αποτελέσματος με το όνομα Languages
ufx:select Αναθέστε το αποτέλεσμα της έκφρασης XPath σε αυτό το χαρακτηριστικό στην ιδιότητα Languages. Οι ιδιότητες lang_primarylanguage και lang_secondarylanguage, που ανακτώνται νωρίτερα στο ερώτημα και είναι διαθέσιμες στην ιδιότητα Requirement, μταβιβάζονται στη λειτουργία lookup-to-list XPath που μετατρέπει πολλές ιδιότητες lookup σε μία list (EntityCollection)

Ερώτημα περιορισμών ανάκτησης:

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

Ενημέρωση του ερωτήματος περιορισμών ανάκτησης

  1. Επάνω δεξιά κάντε διπλό κλικ στην καρτέλα γλώσσας
  2. Επάνω δεξιά, κάντε κλικ στην επιλογή Άνοιγμα προεπιλεγμένων ρυθμίσεων
  3. Μεταβείτε στην ενότητα Τύποι χρονοδιαγράμματος και επιλέξτε Κανένας στη λίστα αριστερά
  4. Εντοπίστε το πεδίο ερωτήματος περιορισμών ανάκτησης του βοηθού χρονοδιαγράμματος, κάντε κλικ στο κουμπί στα δεξιά για να ανοίξετε το πρόγραμμα επεξεργασίας
  5. Ενημερώσετε το πεδίο τιμής με τον κωδικό ερωτήματος ανάκτησης πόρων παραπάνω και κάντε κλικ στο κουμπί Αποθήκευση ως.
  6. Πληκτρολογήστε "Ερώτημα περιορισμών γλώσσας" στο πεδίο "Όνομα" και επιλέξτε "Αποθήκευση". Έτσι δημιουργείται μια νέα καρτέλα ρύθμισης παραμέτρων και συνδέεται αυτός ο πίνακας χρονοδιαγράμματος με την καρτέλα.
  7. Εντοπίστε το πεδίο ερωτήματος ανάκτησης πόρων βοηθού χρονοδιαγράμματος και επιλέξτε το ερώτημα πόρων γλώσσας που δημιουργήσαμε προηγουμένως για τις προσαρμογές του πίνακα χρονοδιαγράμματος
  8. Στο κάτω μέρος του παραθύρου διαλόγου, επιλέξτε Εφαρμογή

Ο πίνακας θα φορτώσει ξανά με τις ενημερωμένες παραμέτρους. Τώρα θα λειτουργήσει το φιλτράρισμα του βοηθού χρονοδιαγράμματος. Εάν δημιουργήσατε καρτέλες γλωσσών και τις συσχετίσατε με καρτέλες απαίτησης, τώρα θα μπορείτε να επιλέξετε μια καρτέλα απαίτησης στο κάτω μέρος του πίνακα χρονοδιαγράμματος, κάντε κλικ στο κουμπί Εύρεση διαθεσιμότητας για να εκκινήσετε τον Βοηθό χρονοδιαγράμματος και δείτε μόνο τους πόρους που ταιριάζουν στις γλώσσες που αποθηκεύονται στην απαίτηση.

Διαμόρφωση προτύπου κελιού πόρου

Φιλοδώρημα

Για τα παρακάτω βήματα, είναι χρήσιμο να χρησιμοποιήσετε ένα πρόγραμμα επεξεργασίας κειμένου που υποστηρίζει την επισήμανση της σύνταξης HTML γι ανα κάνετε τις αλλαγές σας και μετά επικολλήστε τις αλλαγές σας στο πρόγραμμα επεξεργασίας Universal Resource Scheduling.

Η ρύθμιση παραμέτρων προτύπου κελιού πόρων είναι ένα πρότυπο Handlebars που χρησιμοποιείται για την απόδοση περιεχομένου στο κελί πόρων. Η έξοδος από το ερώτημα ανάκτησης πόρων είναι διαθέσιμο για το πρότυπο.

Τροποποιούμε το προεπιλεγμένο πρότυπο πόρων για να εμφανιστεί μια πράσινη ένδειξη ✔✱ εάν ο πόρος αντιστοιχίζεται με τις κύριες και δευτερεύουσες γλώσσες, μια πράσινη ένδειξη ✔ εάν ο πόρος ταιριάζει μόνο με την κύρια γλώσσα και μια κίτρινη ένδειξη ✔ εάν ο πόρος ταιριάζει μόνο με τη δευτερεύουσα γλώσσα.

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

Οι ιδιότητες lang_primary και lang_secondary επιστρέφονται από το προσαρμοσμένο ερώτημα ανάκτησης πόρων που ρυθμίσαμε παραπάνω. Επικοινωνήστε με τον ιστότοπο Handlebars για τεκμηρίωση σχετικά με τη σύνταξη προτύπων.

Πρότυπο κελιού πόρου:

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

Ενημέρωση προτύπου κελιού πόρου

  1. Επάνω δεξιά κάντε διπλό κλικ στην καρτέλα γλώσσας
  2. Επάνω δεξιά, κάντε κλικ στην επιλογή Άνοιγμα προεπιλεγμένων ρυθμίσεων
  3. Μεταβείτε στην ενότητα Τύποι χρονοδιαγράμματος και επιλέξτε Κανένας στη λίστα αριστερά
  4. Εντοπίστε το πεδίο προτύπου κελιού πόρων του βοηθού χρονοδιαγράμματος, κάντε κλικ στο κουμπί στα δεξιά για να ανοίξετε το πρόγραμμα επεξεργασίας
  5. Ενημερώσετε το πεδίο τιμής με τον κωδικό προτύπου κελιού πόρων παραπάνω και κάντε κλικ στο κουμπί Αποθήκευση ως.
  6. Πληκτρολογήστε "Πρότυπο κελιού πόρων" στο πεδίο "Όνομα" και επιλέξτε "Αποθήκευση". Έτσι δημιουργείται μια νέα καρτέλα ρύθμισης παραμέτρων και συνδέεται αυτός ο πίνακας χρονοδιαγράμματος με την καρτέλα.
  7. Στο κάτω μέρος του παραθύρου διαλόγου, επιλέξτε Εφαρμογή

Ο πίνακας θα φορτώσει ξανά με τις ενημερωμένες παραμέτρους. Το κελί πόρου υποδεικνύει τώρα τον τρόπο με τον οποίο ένα πόρος αντιστοιχίζεται με τον περιορισμό γλώσσας στον πίνακα φίλτρου.

Σύνοψη

Στα παραπάνω βήματα θα τροποποιήσουμε τον πίνακα φίλτρου στον βοηθό χρονοδιαγράμματος για να εμφανιστεί ένα στοιχείο ελέγχου φίλτρου για την οντότητα γλώσσας. Τροποποιήσαμε επίσης το ερώτημα περιορισμών ανάκτησης για να θέσουμε ερώτημα στα νέα χαρακτηριστικά γλώσσας που σχετίζονται με την οντότητα απαίτησης και για να διαμορφώσουμε σε μια λίστα. Όταν ένας χρήστης επιλέγει να βρει διαθεσιμότητα για μια καρτέλα απαίτησης, ο πίνακας φίλτρου θα εμφανίσει τους περιορισμούς γλώσσας που έχουν καταγραφεί. Οι τιμές από τον πίνακα φίλτρου μεταβιβάζονται στο ερώτημα ανάκτησης πόρων και το ερώτημα FetchXML επιστρέφει μόνο πόρους που ταιριάζουν.

Δείτε επίσης

Fetch XML γενικής χρήσης

Σημειώσεις έκδοσης επεκτασιμότητας Universal Resource Scheduling