Adaptando rec a mis necesidades

En la sección anterior, vimos como se podía llamar al programa rec.htm y prometimos que tendrías la posibilidad de adaptar los programas rec.htm y rec.php (recuerda que el primero es el que presenta la forma de entrada/actualización y el segundo la procesa). Vamos a explicarte ahora como puedes "introducir" código durante la entrada de datos, y antes y después de la actualización. Pero antes, es muy importante que entiendas los puntos en donde se puede introducir el código

Lo que se puede añadir en la forma de entrada

Programa rec.htm

El programa rec.htm es el que muestra la forma para que el usuario pueda ingresar o actualizar un registro. Si quieres cambiar el look, hacer validaciones adicionales, incluir opciones adicionales lo puedes hacer aquí. Debes decidir cual de las llamadas en rojo es la quieres utilizar.

require IncludeHTMLact$XXX (XXXHTML.htm) - XXX es el nombre interno de la tabla -

<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> (XXXJavascript.js)

 

function validarforma(){
validaciones estándares
inyección del código de JSactValidar$XXX (XXXvalidar.js)
}

require IncludeFinHTMLact$XXX

</body>

Nota: El IncludeFinHTMLact$XXX entró en vigencia a partir de la versión 5.1.b (nov 2007)

Adaptando la actualización

Programa rec.php

 Tal como te estábamos explicando, es posible intervenir la creación y la actualización de los registros, con 3 mecanismos disponibles (además del PHPCuerpo que es común a todos los programas.

¿Para que querría yo usar esta facilidad? Típicamente puede ser usadas para una de las acciones siguientes:

  • Campos calculados: Muchas veces un campo es el resultado de un cálculo de otros campos. En este caso, se puede escribir un conjunto de instrucciones que realice la operación deseada, antes de hacer la grabación. Esto se ilustra más adelante en el ejemplo del texto.
  • Registros con sumarización: Es el caso en el cual en un registro (padre) se tiene la suma de un campo de los registros asociados (hijos). Cuando se realiza la actualización de cualquiera de esos hijos, se debe recalcular el total, para mantener la consistencia de los datos.
Include PHPCuerpo (Común a todos los programas)
includes rutinas php utilities

Include programa PRE (XXXpre.php) - XXX es el nombre interno de la tabla -
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 (XXXpost.php) - XXX es el nombre interno de la tabla - 
Facilidad de envíos de mensajes

Estoy un poco enredado

¿Cual es la diferencia entre el programa "pre", el "post" y el "fórmula"?

Fíjate bien en el programa de actualización (rec.php) arriba. El primer include en rojo, es el de un programa que puedes incluír en todos los programas de N2C. ¿Para que se usa? Puede ser para  poner el logo de la empresa o para ampliar o modificar la tabla de traducciones (OJO: Poner link). Pero, lo que vinimos a explicar son los enlaces siguientes.

Antes de explicárlos, por favor, fíjate donde está la instrucción de ingresar o actualizar el registro (recuerda que este programa es llamado en ambos casos). ¿La viste? Está en la quinta instrucción. Sigue fijándote. ¿Cual es el include que se ejecuta antes de esa instrucción? Únicamente, XXXpre.php. Por lo tanto, si quieres hacer una validación adicional (en php), aquí es donde lo puedes hacer. Esto es lo que vamos a llamar el programa "PRE".

Después de grabar el registro, se realiza la grabación del LOG, es decir que se anota quien y cuando hizo el ingreso o actualización del registro (Ver explicación OJO PONER LINK AQUÏ  Ver explicación del log aquí), luego se escribe que la actualización fue exitosa. Luego se pone el enlace a ver los registros dependientes (hijos) y se lee el registro que se acaba de grabar, para que tengas todos los campos a tu disposición. Aquí es donde puedes actuar tú, con el programa "Formula" y cuando hayas terminado, rec.php va a actualizar el registro que acabas de grabar. Esto te permite, hacer una modificación, como sumar dos campos para obtener un tercer campo calculado, o extraer una parte del campo con un "substr", como por ejemplo, obtener el mes de una fecha.

Finalmente, tendrás otra oportunidad de interactuar con rec.php. Es con el programa "POST". ¿Para que querrías hacer esto? Por ejemplo, para actualizar el registro padre, que puede tener los totales de todos los hijos. O para pasar el control a otro programa, o para... No te preocupes, ya te vendrán las necesidades.

Aquí hay que mencionar algo MUY IMPORTANTE: El programa "Formula" es siempre llamado cuando se actualiza un registro a través de net2client: Tanto si la actualización se hace desde un reporte de entrada/salida (como listarsup)  como si se hace aquí. No es así los programas "PRE" y "POST". Eso puede requerir que tengas que prohibir que se puedan actualizar campos en listarsup, lo cual puede hacerse en el setup de tablas, a través del parámetro llamado "¿Prohibir actualización a través de reportes?" (OJO Poner ENLACE AQUÍ)

Usar preferiblemente este programa

El programa "Formula"

Por lo que explicamos previamente, este programa siempre es invocado siempre, cuando se actualiza o se añade un registro, por lo cual, siempre debes preferirlo a los programas "PRE" y "POST".

Ahora bien, si quiero utilizar un campo, ¿Cómo hago?

Es muy sencillo. ¿Recuerdas que después de grabar el registro, se volvía a leer? Pues en la variable $row vas a tener acceso a todos los campos del registro, por su nombre interno. Así, en $row[PERNombre] está el nombre del registro, en $row[PERCodigo], el código y en $row[PERCant1], tu primer campo numérico. 

Luego en la variable "$Update", tienes que indicar (separados por comas), los nombre internos de los campos que se deben actualizar.

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 INTCant1. Esta variable INTCant1, es lo que se llama una "variable calculada". Idealmente debería ser un campo restringido para que pueda ser visto, pero no modificado, ya que quieres que la modificación se haga, cada vez que se actualiza un registro.

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

$Minutos=$row["INTMonto1"]; // Obtener los minutos
$INTCant1=$Minutos/60; // Calcular las horas
$Update="INTCant1"; // Indicar que se debe actualizar la variable Cant1

El programa "PRE"

En el programa "PRE" es muy posible que quieras utilizar un campo que vino en la FORMA (recuerda que no se llama cuando la actualización es desde un reporte - listarsup -). ¿Cómo se hace? 

En las formas de actualización de datos, que están en el programa rec.htm, las variables se denominan CPO1, CPO2,... según el orden en que vayan apareciendo. 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.

Aquí tienes que tener muchísimo cuidado de no poner el número "hard coded" es decir escrito ya con un número determinado ya que ese número puede cambiar. Basta que un usuario (siempre los usuarios), cambie el orden de los campos para que tu programa deje de funcionar. Así que considera el uso de esta función como OBLIGATORIO y el no usarlo como una pésima práctica de programación

Veamos ahora un ejemplo. Hay una variable llamada PERLista2, que contiene la ciudad de un cliente. Como no sé en que orden va a salir en la forma, tengo que usar la función "NumeroCampo". Esto lo haces así:  :

$cc="CPO".NumeroCampo("INTLinea3"); // Formar la variable CPOxx
$Ciudad=$$cc; // Guardar el CONTENIDO de la variable

Fíjate en el doble dólar que está en la variable cc. No es un error. Es la facilidad que brinda PHP para que una variable sea variable. (suena a juego de palabras). $cc contiene algo así como CPO15, que es el NOMBRE de la variable. Para usar el CONTENIDO, se debe usar $$cc.

El programa "POST"

El programa "POST" es invocado cuando ya todo (o más bien casi todo) está listo. Te va a permitir tomar control cuando ya se ha hecho la actualización. Por ejemplo, puedes necesitar que cuando se elimine un registro, se actualice un valor en el registro padre.

Las variables disponibles en "PRE" y "POST"

Al estar dentro del programa rec.php, los programas "PRE" y "POST" tienen disponibles un grupo de variables y de rutinas que puedes utilizar. 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

La primera variable ($OperType - Tipo de operación) es la que te va a decir si se está añadiendo, modificando o eliminando un registro. Es muy común que se tenga que preguntar por esta variable, ya que es típico que las operaciones que tienes que hacer dependen del caso.