Cuando se realiza el ingreso, la actualización o la eliminación de un registro, 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 PreXXX y PostXXX (Explicación), especificando el programa que debe ser ejecutado antes (Pre) o después de la operación (Post).
En el caso "Pre", el programa especificado es insertado en el programa act.php, con un "include" 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 y antes de escribir las especificaciones que permiten enviar una notificación por mensajería interna.
¿Para que sirven y para que se usa esta facilidad? Típicamente puede ser usadas para una de las acciones siguientes:
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: |
El password (criptografiado) y el perfil del usuario |
Tabla INT: |
El código del agente, del registro PER correspondiente, del registro EVE correspondiente, la fecha y la hora de la interacción |
Otras Tablas: |
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.
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: 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;
};
?>
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.
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í:
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];
};
};
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>";
};