Formular OnSave Ereignis (Client-API-Referenz) in modellgesteuerten Apps

Mit dem Formularereignis OnSave in modellgesteuerten Apps können Sie Logik ausführen, Daten überprüfen oder abbrechen, bevor ein Datensatz gespeichert wird. Das OnSave-Ereignis tritt auf, wenn Folgendes zutrifft:

  • Der Benutzer wählt die Schaltfläche " Speichern " oder "Aktualisieren " in der Befehlsleiste aus, auch wenn keine geänderten Daten zum Speichern vorhanden sind.
  • Code führt die formContext.data.entity.save-Methode aus, auch wenn keine geänderten Daten gespeichert werden sollen.
  • Der Benutzer verlässt das Formular und es befinden sich ungespeicherte Daten im Formular.
  • Die Option „AutoSave“ ist aktiviert, 30 Sekunden nachdem sich Daten geändert haben und sich ungespeicherte Daten im Formular befinden.
  • Der Code führt die Methode formContext.data.save aus und es befinden sich ungespeicherte Daten im Formular.
  • Code führt die Methode formContext.data.refresh aus und übergibt einen wahren Wert als ersten Parameter, wenn sich ungespeicherte Daten im Formular befinden.

Anmerkung

Das OnSave Ereignis für Termin-, Terminserien- oder Dienstaktivitätsdatensätze bricht den Speichervorgang ab und verwendet die Book Nachricht, um die Änderung anstelle oder CreateUpdatezu speichern. Aufgrund dieses Verhaltens OnSave funktionieren ereignishandler PostSave für diese Tabellen nicht.

Um festzustellen auf welche Schaltfläche geklickt wurde, um das Speichern auszuführen, verwenden Sie die getSaveMode-Methode.

Sie können die Speicheraktion mithilfe der preventDefault-Methode innerhalb des Ereignisargumentobjekts abbrechen. Auf die preventDefault Methode kann mithilfe der getEventArgs-Methode zugegriffen werden, die Teil des Ausführungskontexts ist. Der Ausführungskontext wird automatisch an den Formularereignishandler weitergegeben.

Unterstützung für asynchrone Event-Handler

Das OnSave-Ereignis hat die Fähigkeit, vor dem Speichern auf die von den Ereignishandlern zurückgegebenen Versprechen zu warten, wodurch das Ereignis OnSave asynchron (“async“) sein kann.

Das Ereignis OnSave wird asynchron, wenn der Handler für das Ereignis OnSave ein Versprechen zurückgibt. Das Speichern des Datensatzes erfolgt, wenn jedes von einem Handler zurückgegebenes Versprechen aufgelöst wird. Für alle Versprechen, die zurückgegeben werden, gibt es ein 10-Sekunden-Limit für jedes Versprechen, danach betrachtet die Plattform die Versprechen als abgelaufen. Dieses Zeitlimit wird für jedes Versprechen angewendet. Wenn zum Beispiel fünf Versprechen zurückgegeben werden, beträgt die Gesamtwartezeit 50 Sekunden.

Wenn das Versprechen abgelehnt wird oder eine Zeitüberschreitung auftritt, verhält sich der Speichervorgang weiterhin ähnlich wie bei den aktuellen Skriptfehlern. Verwenden Sie die Methode preventDefault innerhalb des Objekts mit den Ereignisargumenten in diesem bestimmten Handler, wenn Sie verhindern wollen, dass das Ereignis „Speichern“ eintritt, wenn ein Skriptfehler/abgelehntes Versprechen vorliegt oder der Handler ein Timeout hat.

Sie können auch den Speichervorgang unabhängig vom Fehler im Handler abbrechen oder nicht, indem Sie die Methode preventDefault innerhalb des Objekts mit den Ereignisargumenten verwenden. Wenn diese Methode aufgerufen wird, wartet das Ereignis Async OnSave darauf, dass alle Versprechen eingelöst werden, aber die Speicherung wird nicht durchgeführt. Wenn Sie diese Methode aufrufen, wird die Logik in .then() & .catch() ausgeführt.

Das Ereignis OnSave wartet auf ein Versprechen, das pro Handler zurückgegeben wird. Wenn mehrere Versprechen erforderlich sind, empfiehlt es sich, alle Versprechen in die Methode Promise.all() zu verpacken und das einzelne resultierende Versprechen zurückzugeben. Für mehrere Handler, die alle ein Versprechen zurückgeben, empfehlen wir Ihnen, einen Handler zu erstellen, der alle Ereignisse aufruft und ein einzelnes Versprechen zurückgibt, das alle erforderlichen Versprechen verpackt. Diese Praxis dient dazu, die durch die Zeitüberschreitung verursachten Wartezeiten zu minimieren.

Beispiel: Verwendung asynchroner OnSave-Handler

Erwägen Sie das Erstellen einer Arbeitsauftragsaufgabe, bei der Sie überprüfen müssen, ob die ausgewählte Kundenressource dasselbe Konto aufweist, das in der Arbeitsbestellung aufgeführt ist. Das Abrufen des Kontos in der Arbeitsauftrags- und Kundenressource sind asynchrone Prozesse, und Sie müssen beide abschließen, bevor Sie überprüfen können.

Da in diesem Szenario mehrere asynchrone Prozesse vorhanden sind und beide Aufrufe eine einzelne Zusage zurückgeben, schließen Sie beide in der Promise.all() Methode um.

Anmerkung

Sie können die preventDefault Methode nur synchron verwenden.

Zum Beispiel:

 function myHandler() {
    return Promise.all([getWorkOrderPromise, getCustomerAssetPromise]).then((values) => {
        var workOrder = values[0];
        var customerAsset = values[1];
        // Perform validation
        if (isValid(workOrder, customerAsset)) {
            return Promise.resolve();
        }
        return Promise.reject(new Error("Validation failed for the work order and customer asset"));
   });
 }

Aktivieren asynchroner OnSave-Handler mithilfe einer App-Einstellung

Um asynchrone OnSave-Handler zu verwenden, aktivieren Sie das Feature über eine App-Einstellung:

  1. Wechseln Sie zu https://make.powerapps.com.

  2. Stellen Sie sicher, dass Sie die richtige Umgebung auswählen.

  3. Wählen Sie im linken Navigationsbereich die Option Apps aus.

  4. Wählen Sie die App aus, wählen Sie ... (Auslassungspunkte) und dann "Bearbeiten" aus.

  5. Wählen Sie in der Befehlsleiste Einstellungen aus.

  6. Wenn sich der Dialog öffnet, wählen Sie Funktionen.

  7. Schalten Sie Asynchroner onSave-Handler ein.

  8. Wählen Sie Speichern.

    Screenshot der Einstellung der Async onSave-Handlerfunktion, die im Dialogfeld

Deaktivieren von asynchronen OnSave-Handlertimeouts

Wenn Sie einen asynchronen OnSave-Handler verwenden, wartet das Formular darauf, dass das vom Handler zurückgegebene Versprechen erfüllt wird. Um sicherzustellen, dass das Formular rechtzeitig gespeichert wird, löst der Handler nach 10 Sekunden eine Timeoutausnahme aus, um Sie zu informieren, um den asynchronen OnSave Handler für eine bessere Leistung zu optimieren.

Es gibt Szenarien, in denen es erforderlich ist, den OnSave-Handler länger als 10 Sekunden anzuhalten. Dies ist zum Beispiel beim Öffnen eines Dialogs und beim Warten auf die Eingabe des Benutzers zum Fortfahren des Speicherns der Fall. Um sicherzustellen, dass der asynchrone Vorgang auf die Auflösung der Zusage wartet, verwenden Sie die disableAsyncTimeout-Methode .

Anmerkung

Sie müssen disableAsyncTimeout vor allen Await-Anweisungen oder asynchronen Aufrufen aufrufen.

Zum Beispiel:

async function myHandler(context) {  
     context.getEventArgs().disableAsyncTimeout();
     // The 10000ms time out will not be disabled if the above line does not come before all async awaits
     await Xrm.Navigation.openConfirmDialog({ text: "Are you sure you want to save?" });
 }

Wenn Sie disableAsyncTimeout aufrufen, wird das Timeout für diesen Handler nicht angewendet. Es wartet weiterhin darauf, dass das Versprechen des Handlers erfüllt wird.

Dieses Muster kann sich auf die Leistung des Formularspeichers auswirken.

Raster OnSave-Ereignis
Ereignissse (Client-API-Referenz)
Ereignisse in Formularen und in Rastern in modellgesteuerten Apps