Del via


Tilpasse det underliggende postrutenettet i prognoser

Som utvikler kan du bruke denne referansedokumentasjonen til å lære om hendelser og kontekstobjekt for å tilpasse det underliggende postrutenettet i prognosen. Du kan bruke kontekstobjektet til å utføre tilpasninger som å gjøre hele rutenettet eller bestemte felt skrivebeskyttet, deaktivere felt, vise feilvarsler og så videre.

Hendelser for det underliggende postrutenettet

Følgende hendelser støttes i prognoser:

Følgende eksemplescenarioer opprettes basert på de støttede hendelsesbehandlingene:

OnRowLoad-hendelse

Hendelsen OnRowLoad utløses for hver underliggende post som lastes inn i rutenettet. Kontekstobjektet som sendes til hendelsesbehandlingen OnRowLoad , inneholder API-er som er spesifikke for den underliggende posten.

Følgende er eksempelscenarioene du kan utføre ved hjelp av OnRowLoad behandlingsprogram:

Note

For prognosekonfigurasjon vises underliggende poster for forskjellige enheter ved å velge Groupby-attributtet i det underliggende postrutenettet. Hvis du vil håndtere logikk basert på disse enhetene, kan du se eksemplene Aktiver alltid bare noen få felt basert på enhet og Deaktiver redigering av felt basert på logikk og enhet.

OnChange-hendelse

Hendelsen OnChange utløses når verdien for en celle i det underliggende postrutenettet oppdateres og cellen er ute av fokus.

Note

Følgende er et eksempelscenario som du kan utføre ved hjelp av behandleren OnChange :

OnSave-hendelse

Hendelsen OnSave utløses når en verdi endres i en celle i det underliggende postrutenettet, og cellen er ute av fokus. Hvis behandleren OnChange finnes for samme prognosekonfigurasjon, aktiveres imidlertid behandleren OnSave etter behandleren OnChange .

Behandleren OnSave aktiveres før den faktiske lagringen av feltet.

Note

Følgende er et eksempelscenario som du kan utføre ved hjelp av behandleren OnSave :

Kontekstobjekt for hendelsesbehandlinger i det underliggende postrutenettet

Kontekstobjektet inneholder et sett med API-er som skal utføre operasjoner som er spesifikke for en underliggende post i en prognose. Dette kontekstobjektet sendes som en parameter til hendelsesbehandlingene i den underliggende rutenettvisningen for poster.

Følgende API-er støttes:

context.getFormContext-metode

Returnerer en referanse til en post i det underliggende postrutenettet.

context.getFormContext().data.entity

Dette returnerer et enhetsobjekt og har følgende metoder:

Metode Returtype Beskrivelse
getEntityName() String Returnerer en streng som representerer det logiske navnet på enheten for posten.
getId() String Returnerer en streng som representerer GUID-verdien for posten.
attributes List Returnerer en liste over attributter som er relatert til visningen og en enhet som er lastet inn som en del av det underliggende postrutenettet. Du kan utføre følgende operasjoner:
- 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("Attributtnavn")

Dette returnerer et attributtobjekt og har følgende metoder:

Metode Returtype Beskrivelse
getName() String Returnerer en streng som representerer det logiske navnet på attributtet.
getValue() -- Henter dataverdien for et attributt.
getIsDirty() boolsk Returnerer en boolsk verdi som angir om det finnes endringer som ikke er lagret i attributtverdien.
controls List Returnerer en liste over kontroller for hvert attributtobjekt.
Obs! Lengden controls på objektlisten er alltid 1, og get(0) kan brukes direkte.

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

Dette returnerer en kontrollobjekttilordning til attributtet og har følgende metoder:

Metode Returtype Beskrivelse
getDisabled() boolsk Returnerer om kontrollen er deaktivert.
setDisabled(bool) -- Angir den deaktiverte verdien (sann eller usann) til kontrollen.
setNotification(message: string, uniqueId?: string) boolsk Viser en feilmelding for kontrollen for å angi at dataene ikke er gyldige. Når denne metoden brukes, vises et rødt kors-ikon ved siden av kontrollen i cellen. Hvis du holder pekeren over feilikonet, vises den angitte meldingen. Hvis du velger feilikonet, laster du inn raden på nytt og angrer eventuelle endringer. Brukes uniqueId til å fjerne denne meldingen når du clearNotification bruker metoden.
clearNotification(uniqueId?: string) boolsk Fjerner en melding som allerede vises for en kontroll. Hvis ingen unik ID er angitt, fjernes alle varsler for kontrollen.

Note

Vi anbefaler at funksjonsnavnene i JavaScript-filen må samsvare med hendelsesnavnene og må godta kontekstobjektparameteren.

Eksempel 1:

La oss opprette JavaScript-kode for å gjøre alle feltene i det underliggende postrutenettet skrivebeskyttet. Vi kaller OnRowLoad også funksjonen for hver rad når rutenettet lastes inn og lagres.

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

Eksempel 2:

La oss opprette JavaScript-kode for å deaktivere alle felt, bortsett fra noen få for opportunity-enheten. Vi kaller OnRowLoad også funksjonen for hver rad når rutenettet lastes inn og lagres.

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);
                }
            }
        )        
    }
}

Eksempel 3:

La oss opprette JavaScript-kode for å håndtere ulike enheter for den innlastede prognosekonfigurasjonen.

Skriptet deaktiverer følgende for en salgsmulighetsenhet:

  • Navnekolonne
  • actualRevenue og actualCloseData hvis forecastCategory verdien er best case, committed, omitted eller pipeline.
  • estimatedRevenue og estimatedCloseDate hvis forecastCategory verdien er vunnet eller tapt.

På samme måte deaktiverer skriptet navnekolonnen for kontoenheten og deaktiverer alle kolonner for andre enheter.

Vi kaller OnRowLoad også funksjonen for hver rad når rutenettet lastes inn og lagres.


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);
           }
       )
   }
}

Eksempel 4:

La oss opprette en JavaScript-valideringsfil som vil blokkere lagring og vise en feilvarsling på den estimerte inntektskolonnen når verdien er mindre enn 10. Vi fjerner også feilvarslingen og tillater lagring når verdien for den estimerte inntektskolonnen korrigeres til å være større enn eller lik 10. OnChange Her aktiveres funksjonen når feltverdien oppdateres i det underliggende postrutenettet i en prognose.


// 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()

Dette returnerer et webApiContext objekt og har følgende metoder:

Metode Beskrivelse
retrieveRecord(entityLogicalName, id, options)
then (successCallback, errorCallback);
Henter en enhetsoppføring. Mer informasjon: retrieveRecord (Klient-API-referanse)
updateRecord(entityLogicalName, id, data)
then(successCallback, errorCallback);
Oppdaterer en enhetsoppføring. Mer informasjon: updateRecord (Klient-API-referanse)
createRecord(entityLogicalName, data)
then(successCallback, errorCallback);
Oppretter en enhetsoppføring. Mer informasjon: createRecord (Klient-API-referanse)
deleteRecord(entityLogicalName, id)
then(successCallback, errorCallback);
Sletter en enhetsoppføring. Mer informasjon: deleteRecord (Klient-API-referanse)

context.getEventArgs().preventDefault()

Metoden preventDefault() er bare tilgjengelig i OnSave hendelsen. Hvis du kaller denne metoden innenfor OnSave , hindres lagringshendelsen i å fortsette.

Eksempel:

La oss opprette et eksempel på JavaScript for å åpne salgsrutenettet, og blokkere hendelsen for automatisk lagring og åpne et vindusvarsel hvis den estimerte omsetningsverdien er mindre enn 10. Vi tillater også automatisk lagring hvis den estimerte omsetningsverdien er større enn eller lik 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");

        }
    }
}

Tilpass underliggende postrutenett