Escribir un script de solución
Objetivo
Escribir una lógica una sola vez («¿supera este gasto el límite de aprobación?», «dar formato a una referencia como la escribe este cliente») y llamarla desde todas las reglas de negocio y comandos que la necesiten, en lugar de pegar las mismas líneas en cada uno.
Requisitos previos
- Ha iniciado sesión como creador, con una solución y un entorno seleccionados.
Pasos
-
Abra su solución y elija Scripts.
-
Seleccione Nuevo. El diseñador se abre con un pequeño ejemplo ya incluido.
-
Asígnele un nombre para mostrar. La ruta del módulo se rellena sola mientras escribe: es el nombre que importarán otros scripts, y no se puede cambiar después de guardar.
-
Escriba su función auxiliar y expórtela:
func isOverLimit(amount: int, limit: int): bool {return amount > limit;}export isOverLimit; -
Seleccione Guardar.
Bajo el cuadro del nombre, el diseñador muestra la línea exacta que hay que copiar:
import 'par_expense_helpers';
Llamarla desde una regla de negocio
No tiene que recordar la ruta del módulo. En el diseñador de reglas de negocio, abra el panel Scripts de la solución de la derecha: enumera todos los scripts del entorno, e Importar escribe la línea al principio de su regla por usted. Un script que la regla ya importa aparece marcado como Importado en lugar de ofrecerse dos veces.
Si el entorno todavía no tiene scripts, el panel lo indica y ofrece Nuevo script, que abre el diseñador de scripts en una pestaña nueva; su regla sin guardar se queda donde está.
La línea que escribe es la misma que escribiría usted. Todo lo que exporta el script queda entonces disponible como si lo hubiera escrito ahí:
import 'par_expense_helpers';
setVisible('par_approval', isOverLimit(getValue('par_amount'), 100));
Si prefiere ser explícito sobre lo que usa, puede importar un único nombre:
import isOverLimit from 'par_expense_helpers';
La misma importación funciona en el script de un comando. Un script pertenece a la solución, no a una tabla, así que una regla de Invoice puede llamar a una función auxiliar escrita para Expense.
export no es opcional
Un script solo vincula lo que exporta. Una función auxiliar que olvide exportar es invisible para todo lo que importa el script, así que el diseñador se niega a guardar uno que no exporta nada, y lo indica. Ese rechazo es deliberado: sin él, el script se guardaría sin problemas y el fallo aparecería en un lugar completamente distinto, como «función no encontrada» dentro de una regla que no estaba mirando.
Puede exportar varios nombres desde un mismo script:
export isOverLimit, formatReference;
Qué viaja, y qué ocurre cuando no viaja
Un script es un componente de solución. Se exporta con su solución y se instala antes que las reglas que lo importan, de modo que un paquete siempre llega en un orden que funciona.
Si una regla importa un script que el entorno no tiene (porque se eliminó o porque no se importó la solución que lo proporcionaba), la regla falla por nombre, tanto en el editor mientras la escribe como en tiempo de ejecución. Nada falla en silencio.
Solución de problemas
«Script … exports nothing.» Agregue una línea export que nombre las funciones que quiere
compartir.
«BS Lang script is invalid: line …» El código fuente no se puede analizar. El editor subraya el problema y la lista de problemas que hay debajo nombra cada uno; seleccione una fila para saltar a la línea.
Una regla indica que no se encuentra mi función. Hay tres cosas que comprobar, por orden: que la
regla tenga la línea import; que la ruta del módulo que contiene coincida exactamente con la del
script; y que el script exporte esa función por su nombre. El panel Scripts de la solución
escribe las dos primeras por usted.
El panel está vacío, pero sé que hay scripts. La lista es la del entorno, así que un script guardado en otra pestaña del navegador aparece después de volver a abrir la regla.
No puedo cambiar el nombre de un script. Correcto: la ruta del módulo es lo que nombra cada regla que lo importa, así que cambiarla las rompería todas a la vez y sin avisar. Cree el nuevo y retire el anterior.