Merk
Tilgang til denne siden krever autorisasjon. Du kan prøve å logge på eller endre kataloger.
Tilgang til denne siden krever autorisasjon. Du kan prøve å endre kataloger.
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:
- Gjør et rutenett skrivebeskyttet ved å deaktivere alle feltene.
- Aktiver alltid bare noen få felt basert på enhet.
- Deaktiver redigering av felt basert på logikk og enhet.
- Vis en feilvarsling basert på verdi.
- Blokker automatisk lagring basert på den estimerte verdien ved hjelp av preventDefault, og åpne en vindushendelse.
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:
- Gjør et rutenett skrivebeskyttet ved å deaktivere alle feltene.
- Aktiver alltid bare noen få felt basert på enhet.
- Deaktiver redigering av felt basert på logikk og enhet.
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
- For det underliggende postrutenettet utløses
OnChangeeventuelle feltendringer ogOnSavehendelsesbehandlinger hvis de finnes. - Lagringen utløses ikke hvis et felt er angitt med feilvarsler ved hjelp av klient-API-en i behandleren
OnChange. Hvis du vil ha varsler relatert til prognoseklient-API-ersetNotification, kan du gå til API-en i context.getFormContext().data.entity.attributes.getByName("Attribute Name").controls.get(0). - Det finnes ingen tilordning mellom attributter til behandleren
OnChange, og eventuelle feltendringer utløserOnChangebehandlingsprogrammet med kontekstobjektparameteren. Hvis du vil identifisere attributtet som utløste behandleren, bruker dugetIsDirtyfunksjonen på attributtobjektet. Mer informasjon: context.getFormContext().data.entity.attributes.getByName("Attribute Name")
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
- For det underliggende postrutenettet utløses
OnChangeeventuelle feltendringer ogOnSavehendelsesbehandlinger hvis de finnes. - Lagringen utløses ikke hvis et felt er angitt med feilvarsler ved hjelp av klient-API-en i behandleren
OnSave. Hvis du vil ha et varsel relatert til prognoseklient-API-ersetNotification, kan du gå til API-en i context.getFormContext().data.entity.attributes.getByName("Attribute Name").controls.get(0). - Det finnes ingen tilordning mellom attributter til behandleren
OnSave, og eventuelle feltendringer utløserOnSavebehandlingsprogrammet med kontekstobjektparameteren. Hvis du vil identifisere attributtet som utløste behandleren, bruker dugetIsDirtyfunksjonen på attributtobjektet. Mer informasjon: context.getFormContext().data.entity.attributes.getByName("Attribute Name")
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.
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);
}
)
}
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
-
actualRevenueogactualCloseDatahvisforecastCategoryverdien er best case, committed, omitted eller pipeline. -
estimatedRevenueogestimatedCloseDatehvisforecastCategoryverdien 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);
}
)
}
}
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.
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");
}
}
}