Freigeben über


Einrichten von Buchungsregeln

Buchungsregeln im Felddienst erstellen Warnungs- oder Fehlermeldungen, die Benutzern beim Erstellen oder Bearbeiten eines Ressourcenbuchungsdatensatzes basierend auf benutzerdefinierten Bedingungen angezeigt werden. So könnte beispielsweise eine Buchungsregel erstellt werden, um einen Benutzer zu warnen, wenn er versucht, eine Arbeitsbestellung in eine Ressource auf der Plantafel zu buchen, die nicht über die für den Auftrag erforderlichen Merkmale verfügt.

Buchungsregeln sind benutzerdefinierte JavaScript-Methoden, die ausgeführt werden, bevor der Datensatz "Bookable Resource Booking" erstellt oder bearbeitet wird. Die JavaScript-Methode kann einen Parameter akzeptieren, der Informationen für den zu erstellenden Bookable Resource Booking-Eintrag enthält und ein JavaScript-Objekt mit den erforderlichen Eigenschaften zurückgeben muss.

Richten Sie Buchungsregeln ein, um eine Buchung zu überprüfen, wenn sie erstellt oder geändert wird.

Hinweis

  • Buchungsregeln sind nur für die stundenweise Ansicht und nicht für die tägliche, wöchentliche oder monatliche Ansicht der Zeitplantafel und des Planungsassistenten verfügbar. Sie sind verfügbar, wenn eine Buchung im buchbaren Ressourcenbuchungsformular erstellt oder aktualisiert wird.
  • Buchungsregeln sind im buchbaren Ressourcenbuchungsformular nicht verfügbar, wenn der Geschäftsprozessfluss auf dem Formular aktiviert ist.
  • Buchungsregeln sind für die Neuzuweisungsfunktion auf der Plantafel nicht verfügbar.
  • Jede benutzerdefinierte Buchungsregel kann nur einen Fehler oder eine Warnung zurückgeben. Um mehrere Nachrichten zurückzugeben, richten Sie einzelne Buchungsregeln für jede Überprüfung ein.

Erstellen einer Lösung

Erstellen Sie eine benutzerdefinierte JavaScript-Webressource. Es wird empfohlen, eine Lösung in Microsoft Power Apps zu erstellen, um Ihre benutzerdefinierte JavaScript-Webressource hinzuzufügen oder eine vorhandene Lösung zu verwenden, die Sie für Anpassungen verwenden.

  1. Erstellen Sie eine neue Lösung für Ihre JavaScript-Webressourcen für die Buchungsregel. Es wird empfohlen, dass Ihre Lösung anstelle des Standardherausgebers einen eindeutigen Herausgeber verwendet.

  2. Erstellen Sie nach dem Erstellen der Lösung eine neue Webressource.

  3. Wählen Sie JavaScript (JS) als Typ aus.

  4. Geben Sie Ihren JavaScript-Code für die Buchungsregel ein.

  5. Wählen Sie Speichern und Veröffentlichen aus.

Einrichten einer Buchungsregel

  1. Wechseln Sie zum Felddienst , und wählen Sie den Bereich "Ressourcen " aus.

  2. Wählen Sie unter "Buchungseinstellungen" die Option "Buchungsregeln" und dann " Neu" aus.

    Screenshot einer neuen Buchungsregel.

  3. Geben Sie die folgenden Informationen ein:

    • Der Name der Buchungsregel.
    • Die Webressource, die Sie kürzlich erstellt haben.
    • Der Methodenname, den Sie in Ihrem JavaScript definiert haben.
  4. Wählen Sie Speichern & Schließen. Die Buchungsregel wird von der Stundenansicht der Plantafel und des Planungsassistenten oder dem Formular für die Entitäten verwendet.

Hinweis

Die Buchungsregeln werden derzeit nur in der stündlichen Ansicht der Zeitplanübersicht und des Terminplanassistenten unterstützt. Die Buchungsregeln werden auch unterstützt, wenn die Buchungen mithilfe des buchbaren Ressourcenbuchungsformulars erstellt oder aktualisiert werden. Buchungsregeln werden nicht beim Löschen eines Buchungsdatensatzes ausgeführt. Buchungsregeln funktionieren nicht auf Formularen, wenn die Mehrfachbearbeitung verwendet wird. Um die Ausführung der Regel zu beenden, deaktivieren Sie die Buchungsregel.

Eine benutzerdefinierte Prozessaktion erstellen

Erstellen Sie eine benutzerdefinierte Prozessaktion , um die Validierung als Teil einer Buchungsregel auszuführen. Rufen Sie im JavaScript Ihrer benutzerdefinierten Webressource die benutzerdefinierte Prozessaktion auf, und bewerten Sie die Ergebnisse aus der Aktion. Wechseln Sie zum Beispielcode , um zu sehen, wie eine benutzerdefinierte Prozessaktion aufgerufen wird.

Es wird empfohlen, die Lösung zu verwenden, die Sie für Ihre benutzerdefinierte Webressource definiert haben, um Ihre benutzerdefinierte Prozessaktion hinzuzufügen.

Verwenden Sie die folgenden Eingabe- und Ausgabeparameter. Sie können bei Bedarf weitere Eingabe- und Ausgabeparameter hinzufügen. Sie müssen sicherstellen, dass das JavaScript, das Sie zum Aufrufen ihrer benutzerdefinierten Prozessaktion definieren, aktualisiert wird, um Ihre anderen Eingabe- und Ausgabeparameter zu unterstützen.

Eingabeparameter:

  • originalerZeitplanStart – DateTime
  • originalScheduleEnd - DateTime
  • originalBookableResource – Entitätsreferenz
  • originalScheduleSource - Picklist
  • newScheduleStart - Datum/Uhrzeit
  • newScheduleEnd - Datum/Uhrzeit
  • isCreate - Boolesch
  • isUpdate – Boolescher Wert

Ausgabeparameter:

  • isError – Boolean
  • isWarning – Boolean
  • errorMessage – Zeichenfolge
  • warningMessage - Zeichenfolge

Der folgende Screenshot zeigt ein Beispiel für eine benutzerdefinierte Prozessaktion. Dieses Beispiel prüft, ob newBookableResource mit der bevorzugten Ressource im Arbeitsauftrag übereinstimmt und ob newScheduleStart innerhalb der Zeit von versprochen und Zeit bis versprochen liegt. Es wird angenommen, dass die Datumsangaben des zugesagten Fensters für ein einzelnes Datum gelten. Beispiel: Zeit von Versprochen: 01.01.2016 8:00 Uhr / Zeit von Versprochen: 01.01.2016 12:00 Uhr.

Screenshot einer benutzerdefinierten CRM-Aktion.

Beispielcode

Die von Ihnen erstellte JavaScript-Funktion kann einen einzelnen Parameter akzeptieren, der als Buchungskontext betrachtet wird. Der übergebene Buchungskontextparameter ist kein typischer CRM-Kontext, der in clientseitigen Skripts verwendet wird.

Buchungskontextschema:

export type BookingRuleContext = {
    oldValues: BookingRuleBookingRecord;
    newValues: BookingRuleBookingRecord;
    isCreate: boolean;
    isUpdate: boolean;
};
 
export type BookingRuleBookingRecord = {
    ResourceRequirementId?: string;
    ResourceId?: string;
    StartTime?: Date;
    EndTime?: Date;
    ResourceScheduleSource?: string;
};

Der Buchungskontextparameter hat die folgende JavaScript-Definition.

Hinweis

Es ist nicht erforderlich, diesen JavaScript-Code in die benutzerdefinierte Webressource für die Buchungsregel einzuschließen.

Die möglichen Werte für ResourceScheduleSource stammen aus dem globalen Ressourcenplan-Quelloptionssatz. Sie können diese Eigenschaft nutzen, um zu erfahren, ob die Buchungsregel aus der Zeitplanübersicht oder dem Zeitplanungsassistenten ausgelöst wird.

    var sbContext = {
    oldValues: {
        StartTime: "01/01/2016 08:00AM",
        EndTime: "01/01/2016 05:00PM",
        ResourceId: "00000000-0000-0000-0000-00000000",
        ResourceScheduleSource: 690970001
    },
    newValues: {
        StartTime: "01/01/2016 08:00AM",
        EndTime: "01/01/2016 05:00PM",
        ResourceId: "00000000-0000-0000-0000-00000000",
        ResourceScheduleSource: 690970001
    },
    isCreate: true,
    isUpdate: false
    };

Die Validierungsmethode muss ein JavaScript-Objekt mit der folgenden Definition zurückgeben.

Hinweis

Es ist nicht erforderlich, diesen JavaScript-Code in die benutzerdefinierte Webressource für die Buchungsregel einzuschließen.

    var ruleResult = {
    IsValid: false,
    Message: "Some Message Here",
    Type: "error" // this can be either "error" or "warning"
};

Beispieldefinition der JavaScript-Funktion. Der folgende JavaScript-Code ist der einzige JavaScript-Code, den Sie in Ihre benutzerdefinierte Webressource einbeziehen müssen.


    function Validate(ctx) {
      var url = Xrm.Page.context.getClientUrl();
      var ruleResult = {
  	IsValid: false,
       Message: '',
       Type: 'error'
      };

      //
      // perform some lookups or other validation logic here.
      //
  
      ruleResult.IsValid = false;
      ruleResult.Message = 'Some Error Message Here.';
      ruleResult.Type = 'error';

      return ruleResult;
    }

Mit dem folgenden JavaScript können Sie eine benutzerdefinierte CRM-Aktion aufrufen, die dieselben Eingabe- und Ausgabeparameter wie im vorherigen Beispiel enthält.

Im Buchungsregeldatensatz muss der Methodenname sein: MSFSAENG.ScheduleBoard.Validate. Weitere Informationen finden Sie im Screenshot im Abschnitt "Einrichten einer Buchungsregel" in diesem Artikel.


    /// <reference path="xrm.d.ts" />
    function brErrorCallback(sb) {
    // Add custom error handeling here if desired.
     return;
    }
    function brWarningCallback(sb) {
    // Add custom warning handeling here if desired.
    return;
    }
    function brSuccessCallback(sb) {
    // add custom sucess handeling here if desired.
    return;
    }
    var MSFSAENG;
    (function (MSFSAENG) {
    MSFSAENG.ScheduleBoard = {
        url: Xrm.Page.context.getClientUrl() + "/api/data/v8.1/",
        actionName: "msfsaeng_MSFSAScheduleBoardRuleActionSample",
        actionInputParameters: function (ctx) {
            var inputParameters = {};
            if (ctx.isUpdate) {
                inputParameters = {
                    "originalScheduleStart": ctx.oldValues.StartTime,
                    "originalScheduleEnd": ctx.oldValues.EndTime,
                    "originalBookableResource": {
                        "@odata.type": "Microsoft.Dynamics.CRM.bookableresource",
                        "bookableresourceid": ctx.oldValues.ResourceId,
                        "name": ""
                    },
                    "originalScheduleSource": ctx.oldValues.ResourceScheduleSource,
                    "newScheduleStart": ctx.newValues.StartTime,
                    "newScheduleEnd": ctx.newValues.EndTime,
                    "newBookableResource": {
                        "@odata.type": "Microsoft.Dynamics.CRM.bookableresource",
                        "bookableresourceid": ctx.newValues.ResourceId,
                        "name": ""
                    },
                    "newScheduleSource": ctx.newValues.ResourceScheduleSource,
                    "isCreate": ctx.isCreate,
                    "isUpdate": ctx.isUpdate
                };
            }
            else {
                inputParameters = {
                    "newScheduleStart": ctx.newValues.StartTime,
                    "newScheduleEnd": ctx.newValues.EndTime,
                    "newBookableResource": {
                        "@odata.type": "Microsoft.Dynamics.CRM.bookableresource",
                        "bookableresourceid": ctx.newValues.ResourceId,
                        "name": ""
                    },
                    "newScheduleSource": ctx.newValues.ResourceScheduleSource,
                    "isCreate": ctx.isCreate,
                    "isUpdate": ctx.isUpdate
                };
            }
            return JSON.stringify(inputParameters);
        },
        ctx: null,
        ruleResult: {
            IsValid: true,
            Message: "",
            Type: ""
        },
        outputParameters: {
            isError: false,
            isWarning: false,
            errorMessage: "",
            warningMessage: ""
        },
        Validate: function (context) {
            this.ctx = context;
            ScheduleBoardHelper.callActionWebApi(this);
            return this.ruleResult;
        },
        errorCallback: brErrorCallback,
        warningCallback: brWarningCallback,
        successCallback: brSuccessCallback
    };
    var ScheduleBoardHelper = (function () {
        function ScheduleBoardHelper() {
        }
        ScheduleBoardHelper.callActionWebApi = function (sb) {
            var oDataEndpoint = sb.url + sb.actionName;
            var req = new XMLHttpRequest();
            req.open("POST", oDataEndpoint, false);
            req.setRequestHeader("Accept", "application/json");
            req.setRequestHeader("Content-Type", "application/json; charset=utf-8");
            req.setRequestHeader("OData-MaxVersion", "4.0");
            req.setRequestHeader("OData-Version", "4.0");
            req.onreadystatechange = function () {
                if (req.readyState == 4) {
                    req.onreadystatechange = null;
                    if (req.status == 200) {
                        sb.outputParameters = JSON.parse(req.response);
                        if (sb.outputParameters.isError) {
                            sb.ruleResult.IsValid = false;
                            sb.ruleResult.Message = sb.outputParameters.errorMessage;
                            sb.ruleResult.Type = 'error';
                            if (sb.errorCallback)
                                sb.errorCallback(sb);
                            return;
                        }
                        else if (sb.outputParameters.isWarning) {
                            sb.ruleResult.IsValid = false;
                            sb.ruleResult.Message = sb.outputParameters.warningMessage;
                            sb.ruleResult.Type = 'warning';
                            if (sb.warningCallback)
                                sb.warningCallback(sb);
                            return;
                        }
                        else {
                            sb.ruleResult.IsValid = true;
                            sb.ruleResult.Message = '';
                            sb.ruleResult.Type = '';
                            if (sb.successCallback)
                                sb.successCallback(sb);
                            return;
                        }
                    }
                    else {
                        alert('Error calling Rule Action. Response = ' + req.response + ', Status = ' + req.statusText);
                    }
                }
            };
            req.send(sb.actionInputParameters(sb.ctx));
        };
        return ScheduleBoardHelper;
    }());
    })(MSFSAENG || (MSFSAENG = {}));

Zusätzliche Hinweise

Die buchbare Ressourcenbuchung ist für die Verwendung von Buchungsregeln aktiviert, um Warnungen oder Fehlermeldungen zu erstellen, die Benutzern beim Erstellen oder Bearbeiten eines Ressourcenbuchungsdatensatzes basierend auf benutzerdefinierten Bedingungen angezeigt werden. Das System verwendet preventDefault in Buchungsregeln. Daher können Geschäftsprozessflüsse und andere benutzerdefinierte Skripts, die an das onSaveEreignis gebunden sind, nicht für die buchbare Ressourcenbuchungsentität verwendet werden, wobei Buchungsregeln aktiviert sind.

Die Verarbeitung von Buchungsregeln kann jedoch beim Speichern des Buchungsformulars deaktiviert werden, indem die nachstehende Einstellung aktiviert wird, wodurch die Benutzer die Geschäftsprozessabläufe verwenden können. Die clientseitigen APIs können verwendet werden, um diese Einstellung auf Umgebungsebene zu aktivieren.

Lesen Sie den aktuellen Wert der Einstellung msdyn_DisableProcessBookingRulesOnSaveBookingForm.

Xrm.Utility.getGlobalContext().getCurrentAppSettings()["msdyn_DisableProcessBookingRulesOnSaveBookingForm"]

Aktivieren Sie die Einstellung msdyn_DisableProcessBookingRulesOnSaveBookingForm.

Xrm.Utility.getGlobalContext().saveSettingValue("msdyn_DisableProcessBookingRulesOnSaveBookingForm",true,).then(() => {a = "success"}, (error) => {a = error})

Deaktivieren Sie die Einstellung **msdyn_DisableProcessBookingRulesOnSaveBookingForm**.

Xrm.Utility.getGlobalContext().saveSettingValue("msdyn_DisableProcessBookingRulesOnSaveBookingForm",false,).then(() => {a = "success"}, (error) => {a = error})