Conexión ingra.xjs y otras formas de automatizar la aplicación

Automatización desde un programa externo

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>}]

  • Con el nombre del ejecutable arrancamos el programa de conexión, con su camino completo.
  • <nombre aplicación> es el nombre del ejecutable de la aplicación (sin extensión exe) que vamos a utilizar con la automatización (ingrid, decodata, etc...). Si está arrancada, ejecuta el código script con esa instancia, y sino, busca en el registro de Windows, y arranca la aplicación.
  • <base datos>, opcionalmente se puede especificar una, separada del código de informe por dos puntos (:). El nombre debe llevar la extensión del archivo y el camino relativo desde la aplicación registrada.
  • <código de informe xjs> es el nombre de uno de los programas JavaScript distribuidos con la aplicación (en la bases de datos 'comun') o bien particular de la base con la que se abre el programa.
  • <función a ejecutar> opcionalmente, es el nombre de la función que está en el concepto de tipo script. Si no se especifica función, simplemente se está ejecutando todo el código del script.
  • {<parámetros de la función>} opcionalmente, puede ser una serie de parámetros separados por espacios en blanco. Los parámetros deben estar en el formato en que JavaScript va a entender los datos, es decir, que si tienen espacios en blanco, deben ir entre dobles comillas "nombre 1"; si tiene caracteres de control como un camino en disco, deben llevan la barra inclinada doble "C:\\programas\\datos", etc. Si la función no tiene parámetros, no es necesario poner nada.

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.

 

Eventos (también conocidos como triggers o disparadores)

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.