Faire faire quelque chose à un bouton
Objectif
Donner à un bouton de la barre de commandes d’un formulaire ou d’une vue quelque chose à faire lorsqu’on appuie dessus.
Prérequis
- Un formulaire ou une vue que vous modifiez dans son concepteur, avec au moins une action sur sa bande Actions.
Étapes
-
Ouvrez le formulaire dans le concepteur de formulaires, ou la vue dans le concepteur de vues.
-
Sélectionnez votre bouton dans la bande Actions.
-
Dans Lors de l’appui, choisissez ce qu’il fait :
Choix Ce dont il a besoin Ce qui se passe Ouvrir une vue une table (vide signifie cette table) et l’une de ses vues la liste s’ouvre sur cette vue Nouvel enregistrement une table (vide signifie cette table) un formulaire d’enregistrement vierge s’ouvre Ouvrir un tableau de bord un tableau de bord le tableau de bord s’ouvre Ouvrir un écran un écran dessiné l’écran s’ouvre Exécuter un rapport un rapport le rapport s’ouvre dans son propre écran — restreint à l’enregistrement ouvert, s’il y en a un Ouvrir une adresse web une adresse http://ouhttps://, qui peut nommer des champs de l’enregistrementelle s’ouvre dans un nouvel onglet Exécuter un script rien ici — voir ci-dessous votre script BS Lang s’exécute -
Choisissez la cible dans la liste. Chacune de ces zones ouvre une liste avec recherche de ce que votre environnement contient réellement, avec le nom d’affichage de chaque élément sur la première ligne et son nom logique en dessous. Tapez pour filtrer — l’une ou l’autre ligne correspond :
par_invtrouve « Invoices », tout comme la saisie de inv. -
Enregistrez le formulaire ou la vue.
Laissez la table vide chaque fois que vous voulez dire « celle-ci ». Une commande qui ne nomme aucune table fonctionne sur la table sur laquelle elle est placée : le même bouton peut donc être copié sur un autre formulaire sans être redirigé. C’est le sens de la mention Cette table dans la zone vide, et le ✕ à côté d’une table choisie la rétablit.
La liste des vues appartient à la table au-dessus. Choisissez d’abord la table ; les vues proposées sont les vues de liste de cette table, celles qu’une page de liste peut ouvrir. Changez de table et une vue déjà choisie est effacée, car une vue d’une table ne peut pas s’ouvrir sur une autre — mieux vaut choisir de nouveau qu’enregistrer un bouton qui échouera quand quelqu’un appuiera dessus.
Un rapport connaît sa propre table : il n’y a donc pas de table à choisir à côté.
Une adresse web peut porter l’enregistrement
Placez le nom logique d’un champ entre accolades, et l’adresse utilise la valeur de ce champ dans l’enregistrement ouvert :
https://teams.microsoft.com/l/call/0/0?users=4:{pw_phone_number}
https://www.openstreetmap.org/search?query={address1_city}
La valeur est encodée pour l’URL à votre place : un numéro de téléphone comme
+44 20 7946 0000 arrive donc d’un seul tenant. L’adresse doit tout de même commencer par
http:// ou https://, écrit en toutes lettres : un champ peut remplir une partie d’une
adresse, jamais son schéma.
Si le champ est vide, rien ne s’ouvre, et la personne qui a appuyé sur le bouton est informée du champ concerné. Dans une liste, il n’y a pas d’enregistrement ouvert : une adresse contenant un champ ne fonctionne donc que sur un formulaire.
Les cinq premiers emmènent l’utilisateur ailleurs — et laissent un chemin de retour
Ouvrir une vue, Nouvel enregistrement, Ouvrir un tableau de bord, Ouvrir un écran et Exécuter un rapport sont des navigations : chacune remplace l’écran sur lequel le bouton a été pressé, et la barre d’adresse l’indique, si bien que le résultat peut être actualisé, ajouté aux favoris ou envoyé à quelqu’un.
C’est pourquoi l’écran qu’ouvre une commande porte un bouton ← qui ramène d’où l’on vient. Survolez-le et il nomme l’endroit — « Retour à Accounts », ou « Retour à Invoices · Contoso Ltd » lorsque le bouton a été pressé sur un enregistrement.
Il se place là où se trouve déjà la navigation de cet écran, donc toujours dans le même coin :
- une liste et un formulaire d’enregistrement le placent au début de la barre de commandes, là où a toujours été la flèche d’un formulaire — sur un formulaire, c’est cette flèche, si bien qu’il n’y a qu’une seule sortie, et non deux ;
- un rapport le place au début de sa propre barre d’outils, avant le nom du rapport ;
- un tableau de bord et un écran dessiné n’ont pas de barre d’outils : il va donc dans le coin supérieur gauche.
La flèche vous suit tant que vous continuez à vous déplacer dans l’application : ouvrir un enregistrement depuis une liste vers laquelle un bouton vous a envoyé ne fait donc pas perdre le chemin du retour ; elle disparaît lorsque vous choisissez quelque chose dans la navigation propre de l’application, ce qui est un changement de programme plutôt qu’une étape du trajet. Un écran que vous avez atteint vous-même par la navigation n’a pas de flèche de retour, puisqu’il n’y a rien à annuler.
Si le formulaire que vous quittez contient des modifications non enregistrées, une confirmation vous est demandée avant de partir — la même question que pose toute autre sortie d’un formulaire.
Un rapport exécuté depuis un enregistrement imprime cet enregistrement ; exécuté depuis une liste, il porte sur toute la table. La recherche et le filtre d’une liste ne le suivent pas, car un rapport est désigné par son propre nom et un filtre n’est pas quelque chose qu’une adresse peut transporter. Pour faire un rapport sur un ensemble d’enregistrements plus restreint, donnez le filtre au rapport lui-même.
Quand écrire plutôt un script
Choisissez Exécuter un script et le bouton Modifier le code apparaît. Utilisez-le lorsque ce que fait le bouton dépend de quelque chose que seul le navigateur connaît — ce que l’utilisateur a saisi, ou les lignes qu’il a cochées.
Un script peut appeler :
| Appel | Ce qu’il fait |
|---|---|
getValue(field) | la valeur actuelle d’un champ sur le formulaire ouvert |
setValue(field, value) | définit un champ sur le formulaire ouvert (sans l’enregistrer) |
recordId() | l’identifiant de l’enregistrement ouvert, ou "" |
selectedCount() / selectedId(index) | le nombre de lignes cochées, et l’une d’elles |
openRecord(table, id) | ouvre un enregistrement ; un identifiant vide en ouvre un vierge |
newRecord(table, { field: value }) | ouvre un enregistrement vierge avec ces champs déjà remplis. Rien n’est enregistré tant que la personne n’appuie pas sur Enregistrer |
openView(table, view) / openDashboard(name) / openScreen(name) / runReport(name) | les mêmes déplacements que le sélecteur |
openUrl(url) | ouvre une adresse http/https dans un nouvel onglet ; un {field} qu’elle contient est rempli, comme ci-dessus |
notify(message) | affiche un message à l’utilisateur |
refresh() | recharge ce qui est à l’écran |
save() | appuie sur Enregistrer du formulaire, après ce que le script a défini. Sur un formulaire uniquement |
if (selectedCount() == 0) {
notify("Tick a ticket first.");
} else {
openRecord("par_ticket", selectedId(0));
}
Voici comment le bouton Appeler de Sales ouvre Teams et un appel téléphonique concernant le client d’une seule pression :
openUrl("https://teams.microsoft.com/l/call/0/0?users=4:{telephone1}");
newRecord("pw_activity", {
pw_type: 110000002,
pw_regarding: "contact:" + recordId(),
pw_phone_number: getValue("telephone1")
});
Un champ de recherche pouvant pointer vers plusieurs tables se remplit sous la forme
table:id, comme pw_regarding ici.
L’éditeur souligne les erreurs pendant la saisie et complète ces fonctions — c’est le même éditeur que celui dans lequel on écrit une règle métier.
Ce qu’une commande ne peut pas faire
Elle ne peut pas écrire un enregistrement, ni imposer quoi que ce soit. setValue
modifie le formulaire affiché devant l’utilisateur, et ce qui peut être stocké relève de la
décision du serveur. Une règle qui doit s’appliquer quel que soit le bouton pressé a sa
place dans une étape de plug-in serveur.
save() ne permet pas de contourner cela. Il appuie sur le bouton Enregistrer du
formulaire à la place de l’utilisateur, avec les mêmes vérifications : champs obligatoires,
règles exécutées à l’enregistrement, et tout ce que le serveur refuse. C’est ce qui permet à
un même bouton de définir un champ et de l’enregistrer, comme le bouton Envoyer d’un
e-mail :
setValue("pw_delivery", 110000001);
save();
Chaque surface a aussi ses propres limites, et une commande qui en demande davantage en est informée plutôt que de sembler fonctionner :
- une liste n’a pas d’enregistrement ouvert :
setValuen’y fait donc rien ; - un onglet associé dans un formulaire n’a pas d’adresse propre : il ne peut donc pas naviguer ;
- un formulaire ne se recharge pas sur
refresh(), car il contient des modifications que personne n’a demandé à perdre.
Chaque entrée d’un bouton partagé fait sa propre chose
Ajoutez un bouton partagé et les entrées de son menu peuvent avoir leur propre comportement — une entrée ouvrant une adresse web tandis qu’une autre crée un enregistrement. Une entrée que vous laissez telle quelle reprend le comportement du bouton parent.
Dans le menu Plus (…), un bouton partagé est un groupe : son nom, avec ses entrées en dessous. Le nom n’est lui-même une entrée que si le bouton fait quelque chose par lui-même ; sinon, ce n’est qu’un titre.
Dans la barre, c’est pareil : quand un bouton partagé n’a pas de comportement propre, appuyer sur son nom ouvre son menu, comme sa flèche.
Dépannage
- « … does nothing yet: it has neither an action nor a script. » — le bouton n’a jamais reçu de comportement. Choisissez-en un dans Lors de l’appui.
- « … is missing what it should open. » — le comportement est défini mais sa zone est
vide, ou l’adresse web n’est pas en
http/https. Une adressejavascript:est refusée à tous les niveaux, y compris à l’importation. - « … needs …, which is empty on this record. » — l’adresse web nomme un champ qui ne contient rien. Remplissez le champ, ou appuyez sur le bouton depuis un enregistrement où il est rempli.
- « … could not run: … » — le script a échoué. Le message est celui de l’interpréteur, et l’écran continue de fonctionner.
- « … asked for something this screen cannot do. » — voir les limites ci-dessus.
- Le rapport s’est ouvert mais affiche tous les enregistrements. Il a été exécuté depuis une liste, ou depuis un enregistrement jamais enregistré — il n’y a aucun enregistrement auquel le restreindre. Ouvrez d’abord l’enregistrement.
- Le bouton Modifier le code est absent. — le bouton nomme déjà un comportement. Choisissez Exécuter un script pour retrouver l’éditeur ; deux comportements sur un même bouton signifieraient que l’un d’eux perdrait en silence.
Scénarios associés
- Regrouper les boutons d’une barre de commandes.
- Renommer, masquer ou réordonner une commande — le texte, le symbole, l’ordre, et le fait qu’elle démarre masquée ou non.
- Écrire une règle métier — l’autre moitié de la logique des formulaires : ce qui se passe sans que personne n’appuie sur rien.