Passen Sie die zugrunde liegenden Datensätze Raster in Prognosen an
Verwenden Sie als Entwickler diese Referenzdokumentation, um mehr über die Ereignisse und Kontextobjekte zu erfahren und die zugrunde liegenden Datensätze Raster in Ihrer Prognose anzupassen. Mit dem Kontextobjekt können Sie Anpassungen vornehmen, z. B. das gesamte Raster oder bestimmte Felder schreibgeschützt machen, Felder deaktivieren, Fehlerbenachrichtigungen anzeigen usw.
Lizenz- und Rollenanforderungen
Anforderungstyp | Sie benötigen |
---|---|
Lizenz | Dynamics 365 Sales Premium oder Dynamics 365 Sales Enterprise Weitere Informationen: Dynamics 365 Sales-Preise. |
Sicherheitsrollen | Systemanpasser Weitere Informationen: Vordefinierte Sicherheitsrollen für Vertrieb |
Notiz
Das Prognose-Kontextobjekt, auf das in diesem Thema Bezug genommen wird, unterscheidet sich vom Ausführungskontext Microsoft Dataverse. Das Prognosekontextobjekt ist spezifisch für Prognosen und unterstützt die erweiterten Konfigurationen für die zugrunde liegenden Datensätze Raster.
Ereignisse für das zugrunde liegende Raster der Datensätze
Die folgenden Ereignisse werden in der Planung unterstützt:
Die folgenden Beispielszenarien werden auf der Grundlage der unterstützten Handler für Ereignisse erstellt:
- Ein Raster schreibgeschützt machen durch Deaktivieren aller Felder.
- Stets nur wenige Felder auf Basis der Entität aktivieren.
- Bearbeitung von Feldern basierend auf Logik und Entität deaktivieren.
- Anzeigen einer Fehlermeldung basierend auf dem Wert.
- Blockieren Sie die automatische Speicherung auf der Basis des geschätzten Wertes mit preventDefault und öffnen Sie ein Ereignis im Fenster.
OnRowLoad Ereignis
Das Ereignis OnRowLoad
wird für jeden zugrunde liegenden Datensatz ausgelöst, der in das Raster geladen wird. Das Kontextobjekt, das an den Handler für das Ereignis OnRowLoad
übergeben wird, enthält APIs, die für den zugrunde liegenden Datensatz spezifisch sind.
Im Folgenden finden Sie Beispiele für Szenarien, die Sie mit dem Handler OnRowLoad
durchführen können:
- Ein Raster schreibgeschützt machen durch Deaktivieren aller Felder.
- Stets nur wenige Felder auf Basis der Entität aktivieren.
- Bearbeitung von Feldern basierend auf Logik und Entität deaktivieren.
Notiz
Für die Prognosekonfiguration werden zugrunde liegende Datensätze verschiedener Entitäten angezeigt, indem das Attribut Groupby in den zugrunde liegenden Datensätzen Raster ausgewählt wird. Um die Logik auf der Grundlage dieser Entitäten zu handhaben, sehen Sie sich die Beispiele Immer nur einige Felder auf der Grundlage der Entität aktivieren und Die Bearbeitung von Feldern auf der Grundlage von Logik und Entität deaktivieren an.
OnChange-Ereignis
Das OnChange
Ereignis wird ausgelöst, wenn der Wert einer Zelle in den zugrunde liegenden Datensätzen Raster aktualisiert wird und die Zelle nicht im Fokus ist.
Anmerkung
- Für die zugrunde liegenden Datensätze Raster wird jede Feldänderung Trigger
OnChange
undOnSave
Ereignishandler, falls vorhanden, betreffen. - Das Speichern wird nicht ausgelöst, wenn ein Feld mit einer Fehlermeldung über die Client API im
OnChange
-Handler festgelegt wird. Für Benachrichtigungen im Zusammenhang mit Client-APIs für die Planung gehen Sie zur APIsetNotification
in context.getFormContext().data.entity.attributes.getByName("Attribut Name").controls.get(0). - Es gibt keine Zuordnung zwischen Attributen und dem Handler
OnChange
, und jede Feldänderung löst den HandlerOnChange
mit dem Kontextobjektparameter aus. Um das Attribut zu identifizieren, das den Handler ausgelöst hat, verwenden Sie die FunktiongetIsDirty
für das Attributobjekt. Weitere Informationen: context.getFormContext().data.entity.attributes.getByName("Attribut Name")
Im Folgenden sehen Sie ein Beispielszenario, das Sie mit dem Handler OnChange
ausführen können:
OnSave Ereignis
Das OnSave
Ereignis wird ausgelöst, wenn ein Wert in einer Zelle der zugrunde liegenden Datensätze Raster geändert wird und die Zelle nicht im Fokus ist. Existiert jedoch der Handler OnChange
für dieselbe Planung, wird der Handler OnSave
nach dem Handler OnChange
aufgerufen.
Der OnSave
Handler wird vor dem eigentlichen Speichern des Feldes aufgerufen.
Anmerkung
- Für die zugrunde liegenden Datensätze Raster wird jede Feldänderung Trigger
OnChange
undOnSave
Ereignishandler, falls vorhanden, betreffen. - Das Speichern wird nicht ausgelöst, wenn ein Feld mit einer Fehlermeldung über die Client API im
OnSave
-Handler festgelegt wird. Für Benachrichtigungen in Bezug auf die Planung von Client APIs gehen Sie zursetNotification
API in context.getFormContext().data.entity.attributes.getByName("Attribut Name").controls.get(0). - Es gibt keine Zuordnung zwischen Attributen und dem
OnSave
-Handler, und jede Feldänderung löst denOnSave
-Handler mit dem Kontextobjektparameter aus. Um das Attribut zu identifizieren, das den Handler ausgelöst hat, verwenden Sie die FunktiongetIsDirty
für das Attributobjekt. Weitere Informationen: context.getFormContext().data.entity.attributes.getByName("Attribut Name")
Im Folgenden sehen Sie ein Beispielszenario, das Sie mit dem Handler OnSave
ausführen können:
Kontextobjekt für Ereignishandler in den zugrunde liegenden Datensätzen Raster
Das Kontextobjekt enthält eine Reihe von APIs zur Durchführung von Vorgängen, die für einen zugrunde liegenden Datensatz in einer Planung spezifisch sind. Dieses Kontextobjekt wird als Parameter an die Ereignishandler in der zugrunde liegenden Datensatzansicht Raster übergeben.
Die folgenden APIs werden unterstützt:
Methode context.getFormContext
Gibt eine Referenz auf einen Datensatz in den zugrunde liegenden Datensätzen Raster zurück.
context.getFormContext().data.entity
Dies gibt ein Entitätsobjekt zurück und hat die folgenden Methoden:
Methode | Rückgabetyp | Beschreibung des Dataflows |
---|---|---|
getEntityName() |
String | Gibt eine Zeichenfolge zurück, die den logische Namen des Entitätsdatensatz darstellt. |
getId() |
String | Gibt eine Zeichenfolge zurück, die den GUID-Wert für den Datensatz darstellt. |
attributes |
List | Gibt eine Liste von Attributen zurück, die mit der Ansicht und einer Entität verknüpft sind, die als Teil der zugrunde liegenden Datensätze Raster geladen wird. Sie können die folgenden Vorgänge durchführen: - 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("Attribut Name")
Dies gibt ein Attributobjekt zurück und hat die folgenden Methoden:
Methode | Rückgabetyp | Beschreibung des Dataflows |
---|---|---|
getName() |
String | Gibt eine Zeichenkette zurück, die den logischen Namen des Attributs darstellt. |
getValue() |
-- | Ruft den Datenwert für ein Attribut ab. |
getIsDirty() |
Boolesch | Gibt einen booleschen Wert zurück, der angibt, ob es ungespeicherte Änderungen an dem Attributwert gibt. |
controls |
List | Gibt eine Liste von Steuerelementen für jedes Attributobjekt zurück. Anmerkung: Die Länge der Objektliste controls ist immer 1, und get(0) kann direkt verwendet werden. |
context.getFormContext().data.entity.attributes.getByName("Attribut Name").controls.get(0)
Dies gibt ein Steuerelement zurück, das dem Attribut zugeordnet ist, und hat die folgenden Methoden:
Methode | Rückgabetyp | Beschreibung des Dataflows |
---|---|---|
getDisabled() |
Boolesch | Gibt zurück, ob das Steuerelement deaktiviert ist. |
setDisabled(bool) |
-- | Legt den deaktivierten Wert (wahr oder falsch) für das Steuerelement fest. |
setNotification(message: string, uniqueId?: string) |
Boolesch | Zeigt eine Fehlermeldung für das Steuerelement an, um anzugeben, dass Daten ungültig sind. Bei dieser Methode wird neben dem Steuerelement in der Zelle ein rotes Symbol mit einem Kreuz angezeigt. Wenn Sie den Mauszeiger über das Symbol für Fehler bewegen, wird die entsprechende Nachricht angezeigt. Wenn Sie das Symbol für Fehler wählen, wird die Zeile neu geladen und alle Änderungen werden rückgängig gemacht. Die uniqueId wird verwendet, um diese Nachricht zu löschen, wenn Sie die clearNotification -Methode verwenden. |
clearNotification(uniqueId?: string) |
Boolesch | Entfernt eine Nachricht, die bereits für ein Steuerelement angezeigt wird. Wenn keine eindeutige ID angegeben wird, werden alle Benachrichtigungen für dieses Steuerelement entfernt. |
Notiz
Wir empfehlen, dass die Funktionsnamen in der JavaScript-Datei mit den Namen der Ereignisse übereinstimmen und den Parameter des Kontextobjekts akzeptieren müssen.
Erstellen wir einen JavaScript-Code, um alle Felder in den zugrunde liegenden Datensätzen Raster als NUR-LESEBAR festzulegen. Außerdem rufen wir die Funktion OnRowLoad
für jede Zeile auf, wenn das Raster erfolgreich geladen und gespeichert wurde.
function OnRowLoad(executionContext) {
// Iterating through all attributes and disabling it.
executionContext.getFormContext().data.entity.attributes.forEach(
attribute => {
attribute.controls.get(0).setDisabled(true);
}
)
}
Wir erstellen JavaScript-Code, um alle Felder bis auf einige wenige nur für die Entität Verkaufschancen zu deaktivieren. Außerdem rufen wir die Funktion OnRowLoad
für jede Zeile auf, wenn das Raster erfolgreich geladen und gespeichert wurde.
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);
}
}
)
}
}
Beispiel 3:
Wir erstellen JavaScript-Code, um verschiedene Entitäten für die geladene Konfiguration der Planung zu behandeln.
Für eine Verkaufschance-Entität wird das Skript Folgendes deaktivieren:
- Spalte Name
-
actualRevenue
undactualCloseData
, wenn derforecastCategory
-Wert best case, committed, omitted oder Pipeline ist. -
estimatedRevenue
undestimatedCloseDate
, wenn derforecastCategory
-Wert gewonnen oder verloren ist.
In ähnlicher Weise deaktiviert das Script die Namensspalte für die Entität Konto und alle Spalten für andere Entitäten.
Außerdem rufen wir die Funktion OnRowLoad
für jede Zeile auf, wenn das Raster erfolgreich geladen und gespeichert wurde.
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);
}
)
}
}
Erstellen wir eine JavaScript-Validierungsdatei, die das Speichern blockiert und eine Fehlermeldung in der Spalte für den geschätzten Umsatz anzeigt, wenn der Wert unter 10 liegt. Außerdem entfernen wir die Fehlermeldung und lassen das Sichern zu, wenn der Wert der Spalte mit dem geschätzten Umsatz auf einen Wert größer oder gleich 10 korrigiert wird. Hier wird die OnChange
Funktion aufgerufen, wenn der Wert eines beliebigen Felds in den zugrunde liegenden Datensätzen Raster einer Prognose aktualisiert wird.
// 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()
Dieser gibt ein webApiContext
-Objekt zurück und hat die folgenden Methoden:
Methode | Beschreibung des Dataflows |
---|---|
retrieveRecord(entityLogicalName, id, options) then (successCallback, errorCallback); |
Ruft einen Entitätsdatensatz ab. Weitere Informationen: Datensatz abrufen (Client API-Referenz) |
updateRecord(entityLogicalName, id, data) then(successCallback, errorCallback); |
Aktualisiert einen Entitätsdatensatz. Weitere Informationen: updateRecord (Client API Referenz) |
createRecord(entityLogicalName, data) then(successCallback, errorCallback); |
Erstellt einen Entitätsdatensatz. Weitere Informationen: createRecord (Client API Referenz) |
deleteRecord(entityLogicalName, id) then(successCallback, errorCallback); |
Löscht einen Entitätsdatensatz. Weitere Informationen: Datensatz löschen (Client API-Referenz) |
context.getEventArgs().preventDefault()
Die Methode preventDefault()
ist nur innerhalb des Ereignisses OnSave
verfügbar. Der Aufruf dieser Methode innerhalb von OnSave
verhindert, dass das Ereignis „Speichern“ fortgesetzt wird.
Erstellen wir ein JavaScript-Beispiel, um das Raster der Verkaufschancen zu öffnen, das Ereignis für das automatische Speichern zu blockieren und eine Warnung zu öffnen, wenn der geschätzte Umsatz unter 10 liegt. Außerdem lassen wir das Ereignis „Automatisches Speichern“ zu, wenn der geschätzte Umsatz größer als oder gleich 10 ist.
// 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");
}
}
}