Esta pregunta es algo habitual a lo que nos someten en la empresa cuando «pasa algo». Esta claro que cuando ya ha pasado, si no registramos la información antes de poco nos puede servir, nos tocará tirar de copias para saber que dato había antes pero seguiremos sin saber la respuesta a «Quién»
Cierto es que los programas cada vez tienen más y más logs con que ha pasado, pero no siempre guardan el dato concreto que queremos o de la manera que nos interesa. Continua y te enseñaré una idea «ingeniosa» y básica con la que hacer nuestro propio log
Como siempre el aviso a navegantes:
NINGUNA DE LAS ACCIONES QUE VOY A EXPLICAR TIENE SOPORTE POR PARTE DE GEINFOR. MUCHO OJO Y BAJO VUESTRA RESPONSABILIDAD
Y empezamos con la faena para registrar nuestros datos…
Nuestro propio log
Todo se basa en 2 sencillos pasos
- Crear una tabla propia donde guardar la información
- Crear los triggers necesarios para que guarden los datos (como vimos aquí)
Nuestra tabla de log
Lo básico y principal es que esta tabla sea lo suficientemente genérica para que nos sirva en el máximo de situaciones que nos encontremos.
Mi ejemplo base de tabla de log lo crearíamos así:
CREATE TABLE DB2ADMIN.EMP_SIS_LOG ( ID INTEGER NOT NULL GENERATED BY DEFAULT AS IDENTITY (CACHE 1 ORDER), FECHA TIMESTAMP DEFAULT CURRENT TIMESTAMP, TABLA VARCHAR (200), COMENTARIO VARCHAR (200), EQUIPO VARCHAR (200), MEMO CLOB (1M) ) IN GEINFORSPC;
La tabla se compone de:
- un autoincremental (ID)
- una fecha: tipo fecha/hora para controlar cuando sucede el evento dentro del día
- Tabla: para indicar sobre que tabla sucede la modificación y poder filtrar con mayor comodidad
- Comentario: una cadena de texto donde registremos un texto estandarizado para buscar u ordenar
- Memo: Dar manga ancha para poder anexar toda la descripción que queramos/necesitemos
El trigger que controle los cambios:
Se pueden definir todos los triggers que queramos, siempre con un poco de miramiento de que el trabajo del trigger no suponga mucha carga a la base de datos y trabajar con ella se vuelva imposible.
Os pongo el ejemplo que registraría en caso de que se modifique quien ha realizado un pedido. Esta información está en la cabecera del pedido y GEINFOR ERP no tiene log de dicho cambio. El código sería el siguiente: (ojo que incluye una función que ya creamos en otra entrada)
CREATE OR replace TRIGGER TR_CAB_PEDIDOS_CLIENTES_BUP BEFORE UPDATE ON CAB_PEDIDOS_CLIENTES REFERENCING NEW AS N OLD AS O FOR EACH ROW BEGIN IF O.REALIZADO_POR<>N.REALIZADO_POR THEN INSERT INTO EMP_SIS_LOG (TABLA, COMENTARIO,EQUIPO) VALUES ('CAB_PEDIDOS_CLIENTES',N.SERIE||'-'||N.PEDIDO||' REALIZADO: ' ||O.REALIZADO_POR||' A '||N.REALIZADO_POR,FX_SIS_EQUIPO); END IF; END;
Como nos interesa un cambio de valor, ejecuta Antes de actualizar la tabla de forma que podamos guardar el valor previo y el nuevo en nuestra tabla de logs
Con estos dos simple pasos, pasamos a registrar información de forma transparente al usuario y al ERP, centrándonos en la capa de la base de datos.
Ahora solo queda que adaptéis la idea y el código a vuestras propias necesidades
Espero que os sea útil, suscribiros para que os lleguen avisos de la próxima entrada y no dudéis en comentar o mandar un mensaje con cualquier consulta, aportación o inquietud que tengáis…
… y si algo sale mal… La Culpa de Sistemas 😉