Freigeben über


Buchungsregeln festlegen

Buchungsregeln in Field Service erstellen Warn- oder Fehlermeldungen, die Benutzer beim Erstellen oder Bearbeiten eines Ressourcenbuchungsdatensatzes sehen, basierend auf benutzerdefinierten Bedingungen. Zum Beispiel kann eine Buchungsregel erstellt werden, um einen Benutzer zu warnen, wenn dieser versucht, einen Arbeitsauftrag für eine Ressource auf der Zeitplanungsübersicht zu erstellen, die nicht die erforderlichen Fähigkeiten für den Auftrag hat.

Buchungsregeln sind benutzerdefinierte JavaScript-Methoden, die vor dem Erstellen oder Bearbeiten des Buchungsdatensatzes Buchbare Ressource ausgeführt werden. Die JavaScript-Methode kann einen Parameter akzeptieren, der Informationen für den zu erstellenden Datensatz Bookable Resource Booking enthält und ein JavaScript-Objekt mit den erforderlichen Eigenschaften zurückgeben muss.

Installieren Sie eine Buchungsregel, um eine Buchung zu prüfen, wenn diese erstellt oder geändert wird.

Notiz

  • Buchungsregeln sind nur für die stündliche Ansicht verfügbar, nicht aber für die tägliche, wöchentliche oder monatliche Ansicht der Plantafel und des Planungsassistenten. Sie sind auch verfügbar, wenn eine Buchung über das Formular für buchbare Ressourcen erstellt oder aktualisiert wird.
  • Buchungsregeln sind auf dem Buchungsformular für buchbare Ressourcen nicht verfügbar, wenn der Geschäftsprozess-Flows auf dem Formular aktiviert ist.
  • Buchungsregeln sind für die Neuzuweisungsfunktion in der Zeitplanübersicht nicht verfügbar.
  • Jede benutzerdefinierte Buchungsregel kann nur einen Fehler/eine Warnung zurückgeben. Um mehrere Nachrichten zurückzusenden, richten Sie für jede Prüfung individuelle Buchungsregeln ein.

Lösung erstellen

Der erste Schritt zum Einrichten Ihrer Buchungsregel besteht darin, eine benutzerdefinierte JavaScript-Webressource zu erstellen. Wir empfehlen, dass Sie eine Lösung in CRM erstellen, um Ihre benutzerdefinierte JavaScript-Webressource hinzuzufügen, oder für Anpassungen eine vorhandene Lösung verwenden, die Sie möglicherweise haben.

CRM-Lösung erstellen

  1. Von Einstellungen>Lösungen erstellen Sie eine neue Lösung für Ihre Buchungsregel-JavaScript-Webressourcen.

Der folgende Screenshot zeigt eine neu erstellte Lösung. Wir empfehlen, dass Ihre Lösung einen eindeutigen Herausgeber anstelle des Standardverlegers verwendet.

Screenshot der Field Service-Buchungsregeln.

  1. Wählen Sie nach dem Erstellen der Lösung die Komponente Webressourcen aus und erstellen Sie eine neue Webressource.
  2. Geben Sie auf dem neuen Formular Webressource die folgenden Informationen ein: a. Name b. Anzeigename c. Wählen Sie als Typ Script (Jscript)
  3. Wählen Sie die Texteditoroption aus, um Ihren JavaScript-Code für die Buchungsregel einzugeben.
  4. Klicken Sie auf Speichern, um die Webressource zu speichern.
  5. Wählen Sie Veröffentlichen aus, um sicherzustellen, dass die Webressource für die Buchungsregel veröffentlicht wurde.

Screenshot einer neuen Webressource.

Einrichten einer Buchungsregel

  1. Gehen Sie im Hauptmenü zu Field Service>Ressourcen und wählen Sie dann Buchungsregeln unter Buchungseinstellungen aus.

    Screenshot der aktiven Buchungsregelnliste in Field Service.

  2. Klicken Sie auf +Neu, um eine neue Buchungsregel zu erstellen.

  3. Geben Sie im Formular Buchungsregel die folgenden Informationen ein: a. Name b. Webressource (Wählen Sie die kürzlich erstellte Webressource aus). c. Geben Sie den Methodennamen ein, den Sie in Ihrem JavaScript definiert haben.

    Screenshot der Buchungsregeln.

  4. Sichern Sie Ihre Buchungsregel. Sobald Sie die Buchungsregel gespeichert haben, wird sie von der Stundenansicht der Plantafel und des Planungsassistenten oder dem Formular für die Entitäten verwendet. Sie können den Datensatz Ihrer Buchungsregel deaktivieren, um zu verhindern, dass die Plantafel, der Planungsassistent oder das Formular für die Entität die Regel ausführt.

Notiz

Die Buchungsregeln werden derzeit nur in der stündlichen Ansicht der Plantafel und des Terminplanassistenten unterstützt. Die Buchungsregeln werden auch unterstützt, wenn die Buchungen über das Buchungsformular für buchbare Ressourcen erstellt oder aktualisiert werden. Buchungsregeln werden beim Löschen eines Buchungsdatensatzes nicht ausgeführt. Buchungsregeln funktionieren nicht auf Formularen, wenn die Mehrfachbearbeitung verwendet wird.

Erstellen einer CRM-Aktion

In diesem Abschnitt sehen wir uns ein Beispiel an, das zeigt, wie Sie mithilfe einer benutzerdefinierten CRM-Aktion die Prüfung als Teil einer Buchungsregel durchführen können.

Wenn Sie eine CRM-Aktion für die Prüfung der Buchungsregel verwenden, müssen Sie weiterhin eine benutzerdefinierte Webressource erstellen, wie dies oben definiert wurde. Das JavaScript, das Sie in Ihrer benutzerdefinierten Webressource definieren, ruft die benutzerdefinierte CRM-Aktion auf und wertet die Ergebnisse der benutzerdefinierten CRM-Aktion aus. Siehe Anhang A am Ende dieses Dokuments für Beispielcode, mit dem Sie eine benutzerdefinierte CRM-Aktion aufrufen können.

Eine benutzerdefinierte CRM-Aktion muss in CRM erstellt werden. Wir empfehlen Ihnen, dass Sie die CRM-Lösung verwenden, die Sie für Ihre benutzerdefinierte Webressource definiert haben, um Ihre benutzerdefinierte CRM-Aktion hinzuzufügen.

Die benutzerdefinierte CRM-Aktion sollte die folgenden Ein- und Ausgabeparameter aufweisen. Sie können weitere Ein- und Ausgabeparameter hinzufügen, wie es Ihr Szenario erfordert. Sie werden sicherstellen müssen, dass das JavaScript, das Sie zum Aufrufen Ihrer benutzerdefinierten CRM-Aktion definieren, aktualisiert wird, um Ihre zusätzlichen Eingabe- und Ausgabeparameter zu unterstützen.

Eingabeparameter:

  • originalScheduleStart - DateTime
  • originalScheduleEnd - DateTime
  • originalBookableResource - EntityReference
  • originalScheduleSource - Picklist
  • newScheduleStart - Datum/Uhrzeit
  • newScheduleEnd - Datum/Uhrzeit
  • isCreate - Boolesch
  • isUpdate - Boolesch

Ausgabeparameter:

  • isError - Boolesch
  • isWarning - Boolesch
  • errorMessage - Zeichenfolge
  • warningMessage - Zeichenkette

Der folgende Screenshot zeigt ein Beispiel für eine benutzerdefinierte CRM-Aktion. 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 dann davon ausgegangen, dass die Daten des versprochenen 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 im Buchungskontext übergebene Parameter ist nicht ein typischer CRM-Kontext, der in clientseitigen Skripten 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.

Notiz

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

Die möglichen Werte für ResourceScheduleSource stammen aus dem globalen Optionssatz Ressourcenzeitplanquelle. 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
    };

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

Notiz

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

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

Beispiel für die Definition einer JavaScript-Funktion. Der folgende JavaScript-Code ist der einzige JavaScript-Code, den Sie in Ihre benutzerdefinierte Webressource aufnehmen 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 das vorherige Beispiel aufweist.

Im Buchungsregeldatensatz muss der Methodenname sein: MSFSAENG.ScheduleBoard.Validate. Eine Referenz finden Sie im Screenshot im Abschnitt Einrichten einer Buchungsregel dieses Artikels.


    /// <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 = {}));

Weitere Hinweise

Die buchbare Ressourcenbuchung kann unter Verwendung von Buchungsregeln Warnungen oder Fehlermeldungen erstellen, die Benutzenden beim Erstellen oder Bearbeiten eines Ressourcenbuchungsdatensatzes je nach den benutzerdefinierten Bedingungen angezeigt werden. Das System verwendet preventDefault in Buchungsregeln. Daher können Geschäftsprozessflüsse und andere benutzerdefinierte Skripte für das onSave-Ereignis nicht für die Buchungsentität buchbarer Ressourcen verwendet werden, wenn Buchungsregeln aktiviert sind.

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

Aktuellen Wert der Einstellung msdyn_DisableProcessBookingRulesOnSaveBookingForm ablesen.

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