Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
L’événement de formulaire OnSave dans les applications basées sur des modèles vous permet d’exécuter une logique, de valider des données ou d’annuler une enregistrement avant l’enregistrement d’un enregistrement. L’événement OnSave se produit lorsque :
- L’utilisateur sélectionne le bouton Enregistrer ou Actualiser dans la barre de commandes, même s’il n’y a pas de données modifiées à enregistrer.
- Le code exécute la méthode formContext.data.entity.save , même s’il n’y a pas de données modifiées à enregistrer.
- L’utilisateur quitte le formulaire et qu’il existe des données non enregistrées dans le formulaire.
- L’option d’enregistrement automatique est activée, 30 secondes après la modification de données et il existe des données non enregistrées dans le formulaire.
- Le code exécute la méthode formContext.data.save et il existe des données non enregistrées dans le formulaire.
- Le code exécute la méthode formContext.data.refresh qui passe une valeur true en tant que premier paramètre et il existe des données non enregistrées dans le formulaire.
Note
L’événement OnSave pour les enregistrements de rendez-vous, de rendez-vous périodique ou d’activité de service annule l’opération d’enregistrement et utilise le Book message pour enregistrer la modification au lieu de Create ou .Update En raison de ce comportement, OnSave et PostSave les gestionnaires d’événements pour ces tables ne fonctionnent pas.
Pour déterminer quel bouton a été activé pour exécuter l’enregistrement, utilisez la méthode getSaveMode.
Vous pouvez annuler l’action d’enregistrement à l’aide de la méthode preventDefault dans l’objet arguments d’événement. La preventDefault méthode est accessible à l’aide de la méthode getEventArgs qui fait partie du contexte d’exécution. Le contexte d’exécution est automatiquement passé au gestionnaire d’événements de formulaire.
Prise en charge du gestionnaire d’événements asynchrones
L’événement OnSave a la capacité d’attendre que les promesses renvoyées par les gestionnaires d’événements se règlent avant d’enregistrer, ce qui permet à l’événement OnSave d’être asynchrone (« async »).
L’événement OnSave devient asynchrone lorsque le gestionnaire d’événements OnSave renvoie une promesse. Sauvegarder l’enregistrement se produit lorsque chaque promesse renvoyée par un gestionnaire est résolue. Pour toutes les promesses renvoyées, il y a une limite de 10 secondes pour chaque promesse, après quoi la plateforme considère que les promesses ont expiré. Ce délai d’attente est appliqué par promesse. Par exemple, si nous avons cinq promesses renvoyées, le temps d’attente total est de 50 secondes.
Si la promesse est rejetée ou parvient à expiration, l’opération d’enregistrement continue de se comporter de la même manière par rapport aux erreurs de script en cours. Utilisez la méthode preventDefault dans l’objet arguments d’événement dans ce gestionnaire particulier si vous souhaitez empêcher l’événement d’enregistrement de se produire s’il y a une erreur de script/une promesse rejetée ou que le gestionnaire parvient à expiration.
Vous pouvez également annuler l’opération d’enregistrement indépendamment de l’erreur dans le gestionnaire en utilisant la métode preventDefault dans l’objet arguments d’événement. Si cette méthode est appelée, l’événement OnSave asynchrone attend toujours que toutes les promesses soient réglées, mais l’enregistrement ne se produit pas. Appeler cette méthode signifie que la logique à l’intérieur de .then() et .catch() s’exécutera.
L’événement OnSave n’attend qu’une seule promesse renvoyée par gestionnaire. Si plusieurs promesses sont requises, il est recommandé d’envelopper toutes les promesses dans la méthode Promise.all() et de renvoyer la seule promesse résultante. Pour plusieurs gestionnaires qui renvoient tous une promesse, nous vous recommandons de créer un gestionnaire qui appelle tous les événements et renvoie une seule promesse qui inclut dans un wrapper toutes les promesses requises. Cette pratique consiste à minimiser les délais causés par le temps d’attente.
Exemple : Quand utiliser des gestionnaires OnSave asynchrones
Envisagez de créer une tâche de service de commande de travail dans laquelle vous devez vérifier que la ressource client sélectionnée a le même compte répertorié dans l’ordre de travail. L’extraction du compte sur l’ordre de travail et la ressource client sont des processus asynchrones et vous devez effectuer les deux avant de pouvoir valider.
Dans ce scénario, étant donné qu’il existe plusieurs processus asynchrones et que les deux appels retournent une promesse unique, encapsulez les deux dans la Promise.all() méthode.
Note
Vous ne pouvez utiliser la preventDefault méthode que de manière synchrone.
Par exemple :
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"));
});
}
Activer des gestionnaires onSave asynchrones à l’aide d’un paramètre d’application
Pour utiliser des gestionnaires asynchrones surSave, activez la fonctionnalité via un paramètre d’application :
Accéder à https://make.powerapps.com.
Veillez à sélectionner l’environnement approprié.
Cliquez sur Applications dans le volet de navigation de gauche.
Sélectionnez l’application, sélectionnez ... (points de suspension), puis sélectionnez Modifier.
Sélectionnez Paramètres dans la barre de commandes.
Quand la boîte de dialogue s’ouvre, sélectionnez Fonctionnalités.
Activez le Gestionnaire onSave asynchrone.
Sélectionnez Enregistrer.
Désactiver les délais d’expiration du gestionnaire onSave asynchrones
Lors de l’utilisation d’un gestionnaire OnSave asynchrone, le formulaire attend que la promesse renvoyée par le gestionnaire soit exécutée. Pour vous assurer que l’enregistrement du formulaire se termine en temps opportun, le gestionnaire lève une exception de délai d’expiration après 10 secondes pour vous permettre de régler le gestionnaire asynchrone OnSave pour obtenir de meilleures performances.
Il existe des scénarios dans lesquels il est nécessaire de suspendre le gestionnaire OnSave pendant plus de 10 secondes. Un exemple consiste à ouvrir une boîte de dialogue et à attendre la saisie de l’utilisateur avant de poursuivre l’enregistrement. Pour vous assurer que l’opération asynchrone attend la résolution de la promesse, utilisez la méthode disableAsyncTimeout .
Note
Vous devez appeler disableAsyncTimeout avant toute instruction await ou appel asynchrone.
Par exemple :
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?" });
}
Lorsque vous appelez disableAsyncTimeout, le délai d’expiration de ce gestionnaire n’est pas appliqué. Il continue d’attendre que la promesse de ce gestionnaire soit exécutée.
Ce modèle peut affecter les performances de l’enregistrement de formulaire.
Articles associés
Événement OnSave de grille
Événements (référence de l′API client)
Événements dans les formulaires et les grilles des applications basées sur un modèle