Programas de ejecución automática en las actualizaciones

El ingreso, la actualización, la visualización o la eliminación de registros se realiza a través de los programas rec.htm y rec.php. El primero presenta el formato para que la información sea ingresada o modificada, y el segundo realiza el "INSERT" o el "UPDATE" en la base de datos.

Anteriormente, hasta la versión 4.3, existían otros programas:

Ahora todos esos programas han sido sustituídos por rec.htm y rec.php, pero permanecerán para asegurar la compatibilidad hacia atrás.

En rec.htm y rec.php hay varias operaciones estádares que se realizan en forma automática. Entre esas están las validaciones y la posibilidad de enviar un mensaje, en caso de ingreso y actualizaciones, la confirmación en el caso de la eliminación, y en todos los casos la grabación del log. Es posible tomar control antes y después de realizar una operación de ingreso, actualización o eliminación de registros de una tabla. A continuación explicamos como hacerlo.

Para especificar que se desea tomar control antes o después de una operación de estas, se debe utilizar, en la tabla de parámetros, los parámetros FormulaXXX, PreXXX y PostXXX (Explicación), especificando las fórmulas que deben ser ejecutadas al actualizar (Formula), el programa que debe ser ejecutado antes (Pre) y después de la operación (Post), respectivamente.

En el caso "Formula", el programa especificado es utilizado después de cualquier actualización de inclusión o modificación (no de eliminación), a través de un comando de UPDATE y lo que hace es que vuelva a escribir en el registro recién creado o actualizado, los cambios que se le han especificado.

En el caso "Pre", el programa especificado es insertado en el programa rec.php, con un "require" justo después de leer el cookie, abrir las bases de datos y de escribir el título, antes de la validación.

En el caso "Post", el programa especificado es insertado en el mismo programa act.php, después de realizar la actualización, de grabar el log, de ejecutar el programa "Formula" y antes de escribir las especificaciones que permiten enviar una notificación por mensajería interna.

Ver más abajo el diagrama de secuencia de ejecución de estos programas

¿Para que sirven y para que se usa esta facilidad? Típicamente puede ser usadas para una de las acciones siguientes:

Nota Importante:

Los programas Pre y Post se utilizan solo cuando la actualización es hecha a través de los programas rec.htm, es decir cuando se utiliza el icono . No se utilizan cuando la actualización es hecha a través del programa listarsup o listarsuppub. En cambio, el programa "Formula" es utilizado siempre, en todos los casos. La otra gran diferencia que existe entre estos programas es que "Formula" debe ser utilizado únicamente para calcular un campo de un mismo registro, en cambio "Pre" y "Post" pueden ser usados para navegar en otras tablas.

Programa tipo "Formula"

Cuando se invoca este programa, todos los campos del registro están disponibles en $row. Si se quiere tener acceso a un campo se invoca escribiendo: $row[Nbe campo] (Ej: $row[PERLinea1] o $row[EVENombre]). El campo que se quiere llenar se escribe con una variable del mismo nombre (Ej: $PERNombre, $AR1Linea5).

Se debe llenar una variable llamada "$Update" con todos los campos que se han modificado, separados por comas.

Ejemplo 1: Calcular las horas a partir de los minutos

$INTMonto2=$row[INTMonto1]/60;
$Update="INTMonto2";

Estas instrucciones calculan la cantidad de horas (INTMonto2) dividiendo los minutos (INTMonto1) entre 60. Nótese que en la variable "Update" se debe especificar que el campo INTMonto2 debe ser actualizado

Ejemplo 2: Componer el nombre completo a partir del nombre y el apellido

$PERNombre=$row[PERLinea2].", ".$row[PERLinea1];
$Update="PERNombre";
La primera instrucción forma el campo PERNombre poniendo el apellido (PERLinea2), una coma, un espacio en blanco y el nombre de pila (PERLinea1). Nótese que en la variable "Update" se debe especificar que el campo PERNombre debe ser actualizado

 

Programas tipo "Pre" y "Post"

Al estar dentro del programa act.php, los programas "pre" y "post" escritos tienen disponibles un grupo de variables y de rutinas que pueden ser utilizadas por el analista. Las variables disponibles son las siguientes:

VARIABLE USO
$OperType El tipo de operación que se está ejecutando. Valores posibles: Add, Update o Delete
$XXXCodigo Número de registro que está siendo procesado. En caso de ser un ingreso, viene en cero.
$XXX Tabla en la cual se está haciendo la operación (Ej. PER, INT...)
$BD Base de datos. (Ej. 01)
$EEE El número de empresa (Ej. 703)
Campos disponibles en el caso "Pre". Algunos dependen de la tabla que está siendo actualizada
$XXXNombre El campo de nombre

Tabla AGE:
- $XXXPassword
- $XXXPerfil

El password (criptografiado) y el perfil del usuario

Tabla INT:
- $XXXAgente
- $XXXPersona
- $XXXEvento
- $XXXFecha
- $XXXHora

El código del agente, del registro PER correspondiente, del registro EVE correspondiente, la fecha y la hora de la interacción

Otras Tablas:
-$XXXCodAgente

El código del agente (AGE) correspondiente

En las formas de actualización de datos, que están en el programa act.htm y que invocan al programa act.php, las variables se denominan CPO1, CPO2,... Para saber cual es el número correspondiente a una variable, se dispone de una función llamada "NumeroCampo" que recibe como parámetro el nombre de campo (Formato interno, Ej: PERLinea3) y devuelve el número correspondiente.

Para ilustrar esto mejor, veamos un ejemplo. Hay una variable INTMonto1 que contiene los minutos que se han utilizado en hacer un trabajo y se quiere convertir a horas en la variable INTMonto2. Esta variable INTMonto2, es una variable calculada. Idealmente debería ser un campo restringido para que pueda ser visto, pero no modificado.

Para conocer los minutos, se debe acceder al contenido del campo INTMonto1 con las instrucciones siguientes:

$cc="CPO".NumeroCampo("INTMonto1");
$Minutos=$$cc;

En la primera instrucción se está buscando el número del campo INTMonto1 y se está concatenando a la palabra CPO. Por lo tanto, si la variable INTMonto1 es la número nueve, la variable $cc va a tomar el valor CPO9. Por lo tanto, al escribir $$cc (Nótese el doble dólar), se está refiriendo al valor contenido en la variable $CPO9, que en este ejemplo son los minutos. Así, con estas dos instrucciones se tiene acceso al contenido de una variable antes de actualizarla. Vamos ahora a ingresar la división de ese valor entre 60 (conversión a horas) en la variable INTMonto2:

$dd="CPO".NumeroCampo("INTMonto2");
$$dd=$Minutos/60;

En la primera instrucción se busca el nombre del campo, compuesto por las letras CPO y el número del campo. La variable $dd tomará el valor CPO10 (suponiendo que sea la décima variable). Por lo tanto el escribir $$dd (Nótese nuevamente el doble signo de dólar) es equivalente a escribir $CPO10, y es a esa variable que se asigna la división de los minutos entre 60.

A continuación veremos un ejemplo más complejo que muestra como proceder cuando en un registro se sumarizan los valores de sus registros dependientes.

Facilidades adicionales en el programa "Post"

Cuando se llama al programa "Post", si se trata de una actualización, existe una variable (tipo string) llamada "$CHANGE_MATRIX", que contiene una matríz en HTML con todos los cambios que se han realizado. En la primera columna aparece el nombre del campo, en la segunda, el valor antes del cambio y en la tercera, el valor después del cambio.

Esto puede servir, por ejemplo, para enviar un mensaje o un email a alguien notificando los cambios que ha tenido un registro.

Ejemplo1: Crear el nombre completo a partir del nombre y apellido

Este ejemplo, de uso bastante común, consiste en tener el nombre y apellidos en un solo campo en el campo PERNombre. El nombre y el apellido vienen en campos separados.

Programa "Pre"

<?
/*
  Programa: 702/preper.php 
  Objetivo: Componer el nombre del campo, como la unión del apellido y el primer nombre 
  LlamadoPor: act.php, a través de un include, justo antes de grabar el registro
*/
if ($OperType=="Add" | $OperType=="Update"){
  $nombre="CPO".NumeroCampo("PERLinea1"); $nombre=$$nombre;
  $apellido="CPO".NumeroCampo("PERLinea2"); $apellido=$$apellido;
  $XXXNombre=$apellido.", ".$nombre;
};
?>
 

Explicación

En este programa, se pregunta si la operación es de añadir o actualizar registros, ya que en caso de eliminación no aplica esta operación. En las variables $nombre y $apellido se ponen el nombre y el apellido de la persona, los cuales vienen en una variable CPOxx. Cómo no se conoce cual es el "xx", se utiliza la función "NumeroCampo" para averiguarlo. El resultado es almacenado en la variable "$XXXNombre" que es donde se debe almacenar el nombre.

Ejemplo2: Registros con sumarización

En este ejemplo, la tabla PER contiene los programas de un sistema. Tiene un campo llamado PERMonto1 que contiene la suma de los tiempos invertidos en el programa. Esos tiempos se encuentran en interacciones, en un campo llamado INTMonto1. Por lo tanto cuando se modifica una interacción, hay que recalcular el campo PERMonto1 del programa correspondiente, es decir del programa con código INTPersona (Que viene siendo el enlace a la tabla PER). Cuando se trata de una eliminación hay que guardar ese código, ANTES DE HACER LA ELIMINACIÓN (ya que después no va a estar disponible) en una variable llamada $GuardarCodPrograma. Esto es lo que se hace aquí:

Programa "Pre":

if ($OperType=="Delete"){
   /* Cuando es una eliminación hay que leer la interacción correspondiente
	(que se está eliminando) para saber cual es el programa correspondiente */
   $CantI=LeerStd($busqueda,"INT","*","INTCodigo='$XXXCodigo'","","","","");
   if ($CantI==0)$GuardarCodPrograma=0;
   else{
	 	$rowI = mysql_fetch_array($busqueda);
	 	$GuardarCodPrograma=$rowI[INTPersona];
   };
};

Explicación:

Programa "Post":

if ($OperType=="Delete"){
   $XXXPersona=$GuardarCodPrograma;
};
if ($XXXPersona!=0){ // si no hay programa asociado, no se hace nada
   $CantI=LeerStd($busqueda,"INT","*","INTPersona=$XXXPersona","","","","");
   $TotalMinutos=0;
   for ($i=0; $i<=$CantI; $i++){
   	$rowI = mysql_fetch_array($busqueda);
   	$TotalMinutos+=$rowI[INTMonto1];
   };
   $TotalHoras=$TotalMinutos/60;
   $ActP="UPDATE 703PER SET PERMonto1='$TotalMinutos',PERMONTO2='$TotalHoras'
			WHERE (PERCodigo='$XXXPersona')";
   $operacionP= mysql_query($ActP);
   if (!$operacionP) echo "<p class=mensajeerror>Hubo problemas con la actualización:</p><p>$ActP</p>";
};
 

Explicación:

Añadiendo JavaScript al programa rec.htm

Es posible incluir instrucciones de JavaScript en el programa rec.htm. Esto permite inicializar u ocultar campos o secciones según una condición específica, añadir validaciones no contempladas como estándares, dar alertas, etc.

Existen tres posibilidades de incluir los archivos JavaScript:

Secuencia de ejecución de los programas

Para poder manejar bien las distintas opciones de intervenir durante la ejecución de programas de Net2Client, es importante entender la secuencia en la cual se ejecutan los comandos.

En las gráficas siguientes se muestran donde están los include (o require) en los programs rec.htm y rec.php. En el párrafo anterior se explicaron los de Javascript, que están exclusivamente en el programa rec.htm. En rojo se han marcado los programas utilizados en la tabla de Tickets de la 701, para que puedan servir de guía y de ejemplo.

PROGRAMA rec.htm

require IncludeHTMLact$XXX (TCKHTML.htm)

<head>

Rutinas JavaScript del programa

tab.css (hoja de estilo estándar)

Hoja estilo del usuario


Include PHPCuerpo (Común a todos los programas)


inicializaciones de registros nuevos / Lectura registros viejos


function inicializar(){

}

</head>

<body>

T Í T U L O

<form onSubmit='return validarforma()' action=rec.php>

Campos de datos

Campos hidden (OLD)

</form>

inicializar();

 

require IncludePHPact$XXX

<script src='IncludeJSact$XXX'></script> (TCKJavascript.js)

 

function validarforma(){

validaciones estándares

inyección del código de JSactValidar$XXX (TCKvalidar.js)

}

</body>

 

PROGRAMA rec.php

Include PHPCuerpo (Común a todos los programas)


includes rutinas php utilities


Include programa PRE (TCKpre.php)


validaciones


INSERT u UPDATE del registro


Grabación del LOG

Anuncio de éxito

Enlaces a ver hijos

Lectura del registro actualizado en $row

Include programa Formula

Instrucción UPDATE de cualquier cambio establecido en Formula

Include programa POST (TCKpost.php)