El programa ingra_xjs.exe que acompaña a la aplicación en el directorio \UTIL, permite automatizar la aplicación -desde el sistema operativo o desde otra aplicación-, ejecutando código JavaScript arrancando el programa, o bien utilizarlo si ya está en ejecución, y realizar operaciones con él incluso si no está en modo edición, por ejemplo, arrancar el programa, abrir ventanas, mostrar pestañas y datos, poner en edición y realizar operaciones contra una o varias B.D., aunque para ello, naturalmente el usuario con el que se abre la base de datos tiene que tener permiso para ejecutar código JavaScript y editar la base.
El programa se puede utilizar arrancándolo desde cualquier directorio. La ejecución desde un programa externo, o un acceso directo, o cualquier otra forma de ejecutar esta aplicación, es pasándole parámetros de la forma:
ingra_xjs.exe <nombre aplicación> [<camino\base datos.ext>:]<código de informe xjs> [<función a ejecutar> {<parámetros de la función>}]
Ejemplo:
Si en el archivo libreria.xjs de la aplicación Ingrid tenemos definida una función cad_abre con la definición:
function cad_abre (cad) { ... }
y dentro de la función se utiliza la cadena de caracteres cad para dar de alta un concepto y ponerle como resumen la cadena, esta operación se realizará ejecutando la utilidad con los parámetros:
ingra_xjs.exe Ingrid libreria cad_abre "Concepto 1"
Ejemplo de ejecución mediante WSH (Windows Scripting Host):
Se puede realizar una prueba con el archivo de distribución \util\ingra_xjs.js que arranca la aplicación con la base \ejemplos\edificio.ing y ejecuta una función de la misma.
Para hacer otra prueba de conexión, con la aplicación decodata, basta con ejecutar el siguiente código en un archivo con extensión .JS:
var a= "ingra_xjs.exe decodata decodata_lib
cad_abre 'c:\\datos\\pru dec.exp'";
var wss = new ActiveXObject ("WScript.Shell");
wss.Run (a, 0, false); // 1:muestra en ventana en el estado original,
true:detiene la ejecución del script hasta que termina el comando
CON ESTE MECANISMO, SE SOPORTA CUALQUIER PROCESO DE AUTOMATIZACIÓN DE LA APLICACIÓN INGRA.
Lo que se conoce como lanzamiento de eventos comprobando valores en la aplicación, está relacionado con el Histórico de campos y también con el módulo de mantenimiento. En el primer caso en campos que almacenan múltiples valores con el tiempo, pueden lanzar un evento cuando se llega a ciertos valores. En el caso del mantenimiento, los valores que recogen las acciones de las órdenes de trabajo (OTs), están controladas para lanzar otras acciones en el caso de llegar a un valor definido.
El control de eventos en interface no tiene que ver con ninguno de estos dos controles de valores. Consiste en definir en un procedimiento JavaScript con un nombre especial (eventos.xjs) unas funciones con nombres específicos, que permiten controlar la modificación de datos desde el interface y realizar operaciones en consecuencia.
Habitualmente en al distribución del programa se tienen comentadas las funciones -o cambiado el nombre- para que el programa no tenga la sobrecarga de estar controlando el número de funciones definidas cada vez que se modifica un campo, se abre la B.D., etc.). Sólo deben estar definidas si es necesario su uso.
Los nombres de función de los eventos disponibles son:
evento_<tabla>_<campo> (<ide>, <string>) ->
La función se ejecuta después de
introducir un dato en el <campo>, y antes de modificar el valor en la tabla de
B.D. La cadena <string> contiene el valos del campo sea del tipo que sea.
En <campo> no se pueden especificar campos virtuales de BD.
evento_<tabla>_crea (<registro>) ->
Se ejecuta antes de crear un <registro>. La especificación de formato de
registro nuevo, se tiene en Métodos de script, y
puede ser un solo identificador en una tabla de conceptos, dos en una tabla
de relaciones...
evento_<tabla>_elimina (ide) ->
Se ejecuta antes de eliminar un registro
evento_base_abre () ->
Se ejecuta después de abrir BD y coger permisos de usuario
evento_base_cierra () ->
Se ejecuta antes de cerrar el archivo actual de BD
Cuyos valores de retorno pueden ser:
return 0; -> Continúa la operación
return "[<Cadena de error>]" ó 1; > Detiene la operación
dando como mensaje el error especificado
Ejemplo:
Un ejemplo sencillo, partiendo de una clase dinámica car (carretera) con dos campos dinámicos kms y kms2, que son dos números enteros:
function evento_car_kms2 (ide, val)
{
var bas= Cbas;
bas.edicion= 1;
bas.car.kms(ide)= parseInt(val)*2;
return 0;
}
Pone en un campo el doble de lo que se introduzca en el otro.
El refresco de los datos en la ventana puede no realizarse en el momento de ejecutarse el evento.