Προσαρμογή του πλέγματος υποκείμενων εγγραφών σε προβλέψεις

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

Συμβάντα για το υποκείμενο πλέγμα εγγραφών

Τα ακόλουθα συμβάντα υποστηρίζονται στην πρόβλεψη:

Τα παρακάτω σενάρια δειγμάτων δημιουργούνται με βάση τα υποστηριζόμενα πρόγραμμα χειρισμού συμβάντων:

Συμβάν OnRowLoad

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

Ακολουθούν τα δείγματα σεναρίων που μπορείτε να εκτελέσετε με τον OnRowLoad χειρισμό:

Σημείωμα

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

Συμβάν OnChange

Το OnChange συμβάν ενεργοποιείται όταν η τιμή ενός κελιού στο υποκείμενο πλέγμα εγγραφών ενημερώνεται και το κελί είναι εκτός εστίασης.

Σημείωμα

  • Για το υποκείμενο πλέγμα εγγραφών, οποιαδήποτε αλλαγή πεδίου θα ενεργοποιείται OnChange και OnSave χειρισμούς συμβάντων, εάν υπάρχουν.
  • Η αποθήκευση δεν θα ενεργοποιηθεί εάν ένα πεδίο οριστεί με ειδοποιήσεις σφάλματος χρησιμοποιώντας το API προγράμματος-πελάτη στον OnChange χειρισμό. Για ειδοποιήσεις που σχετίζονται με την πρόβλεψη API προγράμματος-πελάτη, μεταβείτε setNotification στο API στο context.getFormContext().data.entity.attributes.getByName("Attribute Name").controls.get(0).
  • Δεν υπάρχει αντιστοίχιση μεταξύ χαρακτηριστικών στον OnChange χειρισμό και οποιαδήποτε αλλαγή πεδίου θα ενεργοποιήσει τον OnChange χειρισμό με την παράμετρο αντικειμένου περιβάλλοντος. Για να προσδιορίσετε το χαρακτηριστικό που ενεργοποίησε τον χειρισμό, χρησιμοποιήστε τη getIsDirty συνάρτηση στο αντικείμενο χαρακτηριστικού. Περισσότερες πληροφορίες: context.getFormContext().data.entity.attributes.getByName("Attribute Name")

Ακολουθεί ένα δείγμα σεναρίου που μπορείτε να εκτελέσετε χρησιμοποιώντας τον OnChange χειρισμό:

Συμβάν OnSave

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

Ο OnSave χειρισμός καλείται πριν από την πραγματική αποθήκευση του πεδίου.

Σημείωμα

  • Για το υποκείμενο πλέγμα εγγραφών, οποιαδήποτε αλλαγή πεδίου θα ενεργοποιείται OnChange και OnSave χειρισμούς συμβάντων, εάν υπάρχουν.
  • Η αποθήκευση δεν θα ενεργοποιηθεί εάν ένα πεδίο οριστεί με ειδοποιήσεις σφάλματος χρησιμοποιώντας το API προγράμματος-πελάτη στον OnSave χειρισμό. Για ειδοποιήσεις που σχετίζονται με την πρόβλεψη API προγράμματος-πελάτη, μεταβείτε setNotification στο API στο context.getFormContext().data.entity.attributes.getByName("Attribute Name").controls.get(0).
  • Δεν υπάρχει αντιστοίχιση μεταξύ χαρακτηριστικών στον OnSave χειρισμό και οποιαδήποτε αλλαγή πεδίου θα ενεργοποιήσει τον OnSave χειρισμό με την παράμετρο αντικειμένου περιβάλλοντος. Για να προσδιορίσετε το χαρακτηριστικό που ενεργοποίησε τον χειρισμό, χρησιμοποιήστε τη getIsDirty συνάρτηση στο αντικείμενο χαρακτηριστικού. Περισσότερες πληροφορίες: context.getFormContext().data.entity.attributes.getByName("Attribute Name")

Ακολουθεί ένα δείγμα σεναρίου που μπορείτε να εκτελέσετε χρησιμοποιώντας τον OnSave χειρισμό:

Αντικείμενο περιβάλλοντος για χειρισμούς συμβάντων στο υποκείμενο πλέγμα εγγραφών

Το αντικείμενο περιβάλλοντος περιέχει ένα σύνολο API για την εκτέλεση λειτουργιών ειδικά για μια υποκείμενη εγγραφή σε μια πρόβλεψη. Αυτό το αντικείμενο περιβάλλοντος διαβιβάζεται ως παράμετρος στους χειρισμούς συμβάντων στην προβολή πλέγματος των υποκείμενων εγγραφών.

Υποστηρίζονται τα παρακάτω API:

μέθοδος context.getFormContext

Επιστρέφει μια αναφορά σε μια εγγραφή στο υποκείμενο πλέγμα εγγραφών.

context.getFormContext().data.entity

Αυτό επιστρέφει ένα αντικείμενο οντότητας και έχει τις ακόλουθες μεθόδους:

Μέθοδος Τύπος επιστροφής Περιγραφή
getEntityName() Συμβλοσειρά Επιστρέφει μια συμβολοσειρά που αντιπροσωπεύει το λογικό όνομα της οντότητας για την εγγραφή.
getId() Συμβλοσειρά Επιστρέφει μια συμβολοσειρά που αντιπροσωπεύει την τιμή GUID για την εγγραφή.
attributes Λίστα Επιστρέφει μια λίστα χαρακτηριστικών που σχετίζονται με την προβολή και μια οντότητα που φορτώνεται ως μέρος του υποκείμενου πλέγματος εγγραφών. Μπορείτε να εκτελέσετε τις ακόλουθες λειτουργίες:
- context.getFormContext().data.entity.attributes.forEach
- context.getFormContext().data.entity.attributes.getByName(arg)
- context.getFormContext().data.entity.attributes.get(index)

context.getFormContext().data.entity.attributes.getByName("Attribute Name")

Αυτό επιστρέφει ένα αντικείμενο χαρακτηριστικού και έχει τις ακόλουθες μεθόδους:

Μέθοδος Τύπος επιστροφής Περιγραφή
getName() Συμβλοσειρά Επιστρέφει μια συμβολοσειρά που αντιπροσωπεύει το λογικό όνομα του χαρακτηριστικού.
getValue() -- Ανακτά την τιμή δεδομένων για ένα χαρακτηριστικό.
getIsDirty() Δυαδική τιμή Επιστρέφει μια δυαδική τιμή που υποδεικνύει εάν υπάρχουν μη αποθηκευμένες αλλαγές στην τιμή χαρακτηριστικού.
controls Λίστα Επιστρέφει μια λίστα στοιχείων ελέγχου για κάθε αντικείμενο χαρακτηριστικού.
Σημείωση: Το controls μήκος λίστας αντικειμένων είναι πάντα 1 και get(0) μπορεί να χρησιμοποιηθεί απευθείας.

context.getFormContext().data.entity.attributes.getByName("Attribute Name").controls.get(0)

Αυτό επιστρέφει μια αντιστοίχιση αντικειμένου στοιχείου ελέγχου στο χαρακτηριστικό και έχει τις ακόλουθες μεθόδους:

Μέθοδος Τύπος επιστροφής Περιγραφή
getDisabled() Δυαδική τιμή Επιστρέφει εάν το στοιχείο ελέγχου είναι απενεργοποιημένο.
setDisabled(bool) -- Ορίζει την απενεργοποιημένη τιμή (true ή false) στο στοιχείο ελέγχου.
setNotification(message: string, uniqueId?: string) Δυαδική τιμή Εμφανίζει ένα μήνυμα σφάλματος για το στοιχείο ελέγχου που υποδεικνύει ότι τα δεδομένα δεν είναι έγκυρα. Όταν χρησιμοποιείται αυτή η μέθοδος, εμφανίζεται ένα εικονίδιο κόκκινου διασταύρωσης δίπλα στο στοιχείο ελέγχου μέσα στο κελί. Η κατάδειξη του εικονιδίου σφάλματος θα εμφανίσει το μήνυμα που παρέχεται. Η επιλογή του εικονιδίου σφάλματος θα φορτώσει ξανά τη γραμμή και θα αναιρέσει τυχόν αλλαγές. Η uniqueId χρησιμοποιείται για την εκκαθάριση αυτού του μηνύματος κατά τη χρήση της clearNotification μεθόδου .
clearNotification(uniqueId?: string) Δυαδική τιμή Καταργεί ένα μήνυμα που εμφανίζεται ήδη για ένα στοιχείο ελέγχου. Εάν δεν παρέχεται μοναδικό αναγνωριστικό, καταργούνται όλες οι ειδοποιήσεις για αυτό το στοιχείο ελέγχου.

Σημείωμα

Συνιστάται τα ονόματα των συναρτήσεων στο αρχείο JavaScript να συμφωνούν με τα ονόματα του συμβάντος και πρέπει να αποδέχονται την παράμετρο αντικειμένου περιβάλλοντος.

Παράδειγμα 1:

Ας δημιουργήσουμε κώδικα JavaScript για να μετατρέψουμε όλα τα πεδία στο υποκείμενο πλέγμα εγγραφών ως ΜΟΝΟ ΓΙΑ ΑΝΆΓΝΩΣΗ. Επίσης, θα καλέσουμε τη OnRowLoad συνάρτηση για κάθε γραμμή όταν το πλέγμα φορτωθεί και αποθηκευτεί με επιτυχία.

function OnRowLoad(executionContext) {
    // Iterating through all attributes and disabling it.
    executionContext.getFormContext().data.entity.attributes.forEach(
        attribute => {
            attribute.controls.get(0).setDisabled(true);
        }
    )
}

Παράδειγμα 2:

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

function OnRowLoad(executionContext) {

    // Get the logical name of the loaded entity as part of underlying records grid.
    var entityName = executionContext.getFormContext().data.entity.getEntityName();

    if (entityName === "opportunity") {

        // Defining the attributes list from opportunity that has to be enabled if loaded as part of view.
        var OPTY_ENABLE_ATTRS_LIST = ["name", "msdyn_forecastcategory", "actualvalue", "actualclosedate", "estimatedvalue", "estimatedclosedate"];

        executionContext.getFormContext().data.entity.attributes.forEach(
            attribute => {
                // Disabling all attributes other than OPTY_ENABLE_ATTRS_LIST
                if (!OPTY_ENABLE_ATTRS_LIST.includes(attribute.getName())) {
                    attribute.controls.get(0).setDisabled(true);
                }
            }
        )        
    }
}

Παράδειγμα 3:

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

Για μια οντότητα Ευκαιρία, η δέσμη ενεργειών θα απενεργοποιήσει τα εξής:

  • Στήλη ονόματος
  • actualRevenue και actualCloseData εάν η τιμή είναι η forecastCategory καλύτερη περίπτωση, δεσμευμένη, παραλειφθεί ή διοχέτευση.
  • estimatedRevenue και estimatedCloseDate εάν η forecastCategory τιμή κερδείται ή χαθεί.

Παρομοίως, η δέσμη ενεργειών θα απενεργοποιήσει τη στήλη ονόματος για την οντότητα Λογαριασμός και θα απενεργοποιήσει όλες τις στήλες για άλλες οντότητες.

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


function OnRowLoad(executionContext) {
		 
    // Get the logical name of the loaded entity as part of underlying records grid.
    var entityName = executionContext.getFormContext().data.entity.getEntityName();
    
    // If loaded logical name of entity in underlying records grid is opportunity.
    if (entityName === "opportunity") {
        
       var allAttrs = executionContext.getFormContext().data.entity.attributes;

       // Disable column name for all records if exists in the view.
       var nameAttr = allAttrs.getByName("name");
       if (nameAttr) {
           nameAttr.controls.get(0).setDisabled(true);
       }

       var fcatAttr = allAttrs.getByName("msdyn_forecastcategory");
       if (fcatAttr) {
           // Disable actualRevenue, actualCloseDate for forecastcategory Bestcase, committed, omitted, or pipeline.
           if (fcatAttr.getValue() <= 100000004 && fcatAttr.getValue() >= 100000001) {
                   var actualRevenueAttr = allAttrs.getByName("actualvalue");
                   var actualCloseDateAttr = allAttrs.getByName("actualclosedate");
                   if (actualRevenueAttr) actualRevenueAttr.controls.get(0).setDisabled(true);
                   if (actualCloseDateAttr) actualCloseDateAttr.controls.get(0).setDisabled(true);
           }
           // Disable estimatedRevenue, estimatedCloseDate for forecastCategory won or lost.
           else if (fcatAttr.getValue() == 100000005 || fcatAttr.getValue() == 100000006) {
                   var estimatedRevenueAttr = allAttrs.getByName("estimatedvalue");
                   var estimatedCloseDateAttr = allAttrs.getByName("estimatedclosedate");
                   if (estimatedRevenueAttr) estimatedRevenueAttr.controls.get(0).setDisabled(true);
                   if (estimatedCloseDateAttr) estimatedCloseDateAttr.controls.get(0).setDisabled(true);
           }
       }
   } 
   
   // Else disable name column, if loaded logical name of entity is Account.
   else if (entityName === "account"){
       var attrNameObj = executionContext.getFormContext().data.entity.attributes.getByName("name");
       if (attrNameObj) {
               attrNameObj.controls.get(0).setDisabled(true);
       }
   } 
   
   // For all other entities
   else {
       executionContext.getFormContext().data.entity.attributes.forEach(
           attribute => {
               attribute.controls.get(0).setDisabled(true);
           }
       )
   }
}

Παράδειγμα 4:

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


// OnChange function is invoked when any field's value is updated on the underlying records grid of the forecast
function OnChange(executionContext) {

    let entity = executionContext.getFormContext().data.entity;

    // Verify the logical name of the entity and load as part of the underlying records grid.
    if (entity.getEntityName() === "opportunity") {

        // Verify estimated revenue value
        let estValAttr = entity.attributes.get("estimatedvalue");

        // Verify if this attribute exists within the grid view and changed
        if(estValAttr && estValAttr.getIsDirty()) 
        {
            if(estValAttr.getValue() < 10){

                // This will show an error icon next to the estimated revenue field. On hovering over the icon, the below provided message is displayed.
                // Any save attempts are blocked by the system until all notifications are cleared from the columns.
                estValAttr.controls.get(0).setNotification("Estimated revenue cannot be less than 10");
            }
            else{
                // Clearing notifications to save.
                estValAttr.controls.get(0).clearNotification();
            }
        }
    }
}

context.getWebApiContext()

Αυτό επιστρέφει ένα webApiContext αντικείμενο και έχει τις ακόλουθες μεθόδους:

Μέθοδος Περιγραφή
retrieveRecord(entityLogicalName, id, options)
then (successCallback, errorCallback);
Ανακτά μια καρτέλα οντότητας. Περισσότερες πληροφορίες: retrieveRecord (αναφορά API προγράμματος-πελάτη)
updateRecord(entityLogicalName, id, data)
then(successCallback, errorCallback);
Ενημερώνει μια καρτέλα οντότητας. Περισσότερες πληροφορίες: updateRecord (αναφορά API προγράμματος-πελάτη)
createRecord(entityLogicalName, data)
then(successCallback, errorCallback);
Δημιουργεί μια καρτέλα οντότητας. Περισσότερες πληροφορίες: createRecord (Αναφορά API προγράμματος-πελάτη)
deleteRecord(entityLogicalName, id)
then(successCallback, errorCallback);
Διαγράφει μια καρτέλα οντότητας. Περισσότερες πληροφορίες: deleteRecord (Αναφορά API προγράμματος-πελάτη)

context.getEventArgs().preventDefault()

Η preventDefault() μέθοδος είναι διαθέσιμη μόνο μέσα στο OnSave συμβάν. Η κλήση αυτής της μεθόδου εντός OnSave του δεν επιτρέπει τη συνέχιση του συμβάντος αποθήκευσης.

Παράδειγμα:

Ας δημιουργήσουμε ένα δείγμα JavaScript για να ανοίξουμε το πλέγμα ευκαιριών και να αποκλείσετε το συμβάν αυτόματης αποθήκευσης και να ανοίξουμε μια ειδοποίηση παραθύρου εάν η εκτιμώμενη τιμή εσόδων είναι μικρότερη από 10. Επίσης, θα επιτρέψουμε το συμβάν αυτόματης αποθήκευσης εάν η εκτιμώμενη τιμή εσόδων είναι μεγαλύτερη ή ίση με 10.

// OnSave function will be invoked whenever grid attempts to save changes made to any field. 
function OnSave(executionContext){

    let entity = executionContext.getFormContext().data.entity;

    // Verify the logical name of the entity and load as part of the underlying records grid.
    if (entity.getEntityName() === "opportunity") {

        // Verify estimated revenue value
        var estValAttr = entity.attributes.get("estimatedvalue");

        if(estValAttr && estValAttr.getIsDirty() && estValAttr.getValue() < 10){

            // This call will prevent the save event from proceeding
            executionContext.getEventArgs().preventDefault(); 
            alert("Estimated revenue cannot be less than 10");

        }
    }
}

Προσαρμογή υποκείμενου πλέγματος εγγραφών