Écrire un script de solution
Objectif
Écrire un morceau de logique une seule fois — « cette dépense dépasse-t-elle le plafond d’approbation », « mettre en forme une référence comme ce client l’écrit » — et l’appeler depuis chaque règle métier et chaque commande qui en a besoin, au lieu de coller les mêmes lignes dans chacune.
Prérequis
- Vous êtes connecté en tant que créateur, avec une solution et un environnement sélectionnés.
Étapes
-
Ouvrez votre solution et choisissez Scripts.
-
Sélectionnez Nouveau. Le concepteur s’ouvre avec un petit exemple déjà en place.
-
Donnez-lui un nom d’affichage. Le chemin du module se remplit au fur et à mesure de la saisie — c’est le nom que les autres scripts importeront, et il ne peut plus être modifié après l’enregistrement.
-
Écrivez votre fonction utilitaire, puis exportez-la :
func isOverLimit(amount: int, limit: int): bool {return amount > limit;}export isOverLimit; -
Sélectionnez Enregistrer.
Sous la zone du nom, le concepteur affiche la ligne exacte à copier :
import 'par_expense_helpers';
L’appeler depuis une règle métier
Vous n’avez pas à retenir le chemin du module. Dans le concepteur de règles métier, ouvrez le panneau Scripts de solution à droite : il liste tous les scripts de l’environnement, et Importer écrit la ligne en haut de votre règle à votre place. Un script que la règle importe déjà est marqué Importé au lieu d’être proposé une seconde fois.
Si l’environnement n’a encore aucun script, le panneau l’indique et propose Nouveau script, qui ouvre le concepteur de scripts dans un nouvel onglet — votre règle non enregistrée reste là où elle est.
La ligne écrite est celle que vous auriez tapée. Tout ce que le script exporte devient alors disponible comme si vous l’aviez écrit à cet endroit :
import 'par_expense_helpers';
setVisible('par_approval', isOverLimit(getValue('par_amount'), 100));
Vous pouvez aussi n’importer qu’un seul nom, si vous préférez indiquer explicitement ce que vous utilisez :
import isOverLimit from 'par_expense_helpers';
La même importation fonctionne dans le script d’une commande. Un script appartient à la solution, pas à une table : une règle sur Invoice peut donc appeler une fonction écrite pour Expense.
export n’est pas facultatif
Un script ne met à disposition que ce qu’il exporte. Une fonction que vous oubliez d’exporter est invisible pour tout ce qui importe le script — c’est pourquoi le concepteur refuse d’enregistrer un script qui n’exporte rien, et le dit. Ce refus est délibéré : sans lui, le script s’enregistrerait sans broncher et l’échec surviendrait tout à fait ailleurs, sous la forme d’un « function not found » dans une règle que vous ne regardiez pas.
Vous pouvez exporter plusieurs noms depuis un même script :
export isOverLimit, formatReference;
Ce qui voyage, et ce qui se passe quand ce n’est pas le cas
Un script est un composant de solution. Il est exporté avec sa solution et installé avant les règles qui l’importent : un package arrive donc toujours dans un ordre qui fonctionne.
Si une règle importe un script absent de l’environnement — parce qu’il a été supprimé, ou parce que la solution qui le fournissait n’a pas été importée —, la règle échoue en le nommant, aussi bien dans l’éditeur pendant que vous l’écrivez qu’à l’exécution. Rien n’échoue en silence.
Dépannage
« Script … exports nothing. » Ajoutez une ligne export nommant les fonctions que vous
voulez partager.
« BS Lang script is invalid: line … » Le code source ne peut pas être analysé. L’éditeur souligne le problème, et la liste des problèmes en dessous nomme chacun d’eux ; sélectionnez une ligne pour aller à l’endroit concerné.
Une règle indique que ma fonction est introuvable. Trois choses à vérifier, dans
l’ordre : la règle contient la ligne import ; le chemin du module qu’elle indique
correspond exactement à celui du script ; et le script exporte cette fonction par son nom.
Le panneau Scripts de solution écrit les deux premières pour vous.
Le panneau est vide, mais je sais qu’il existe des scripts. La liste est celle de l’environnement : un script enregistré dans un autre onglet du navigateur apparaît après que vous avez rouvert la règle.
Je ne peux pas renommer un script. En effet — le chemin du module est ce que nomme chaque règle qui l’importe ; le renommer les casserait toutes d’un coup, en silence. Créez le nouveau script et retirez l’ancien.