Tuve la necesidad de crear una solución para ver las transacciones que podrían hacer los usuarios, debido a que trabajo con bases e datos de foxpro(DBC) , y se trataba de no meter mas código o funciones en el mismo sistema realizado, si no que el proceso fuera transparente, osea se trata de escribir un código en los procedimientos almacenados de la DBC y esto si crear programas.
1 - Abrir la base de datos a usar
Crear una tabla con con la siguiente información en la base de datos abierta
NOMBRE: HISTORIAL.DBF Campo Campo Nombre Tipo Ancho 1 USUARIO Caracter 20 2 TIPO Caracter 20 3 FECHA DateTime 8 4 TABLA Caracter 30 5 EQUIPO Caracter 50 6 OBSERVA Memo 4
Los indices de la tabla pueden ser creados a su consideración para generar reportes o métodos de consulta propios
2 - Ir a las propiedades de la base de datos y activar la casilla de verificación "SET EVENTS ON " y despues dar click a el botón "EDIT CODE", después insertar el siguiente código:
PROCEDURE Hsts(clTipo) LOCAL clobser STORE SPACE(0) TO clObser,clObservaciones,clValor,clDatos IF !TYPE("cp_login")="C" cp_login="DESCONOCIDO" ENDIF clAlias=Alias() If Empty("clAlias") Return Endif Select (clAlias) clRutaHistorico=ADDBS(justpath(CURSORGETPROP("Database")))+"HISTORIAL.DBF" USE IN (SELECT("Historial_cfg")) nl_error=0 ON ERROR nl_error=1 USE (clRutaHistorico) IN 0 SHARED AGAIN Alias Historial_cfg ON ERROR IF nl_error=0 clObser="Campos Modificados"+CHR(13) FOR Ind=1 TO FCOUNT(clAlias) clObser=clObser+" "+FIELD(Ind)+"= " clValor=ALLTRIM(clAlias)+"."+FIELD(Ind) DO Case CASE VARTYPE(&clValor) = "N" clDatos=STR(&clValor,16,2) CASE VARTYPE(&clValor) = "C" clDatos=&clValor CASE VARTYPE(&clValor) = "D" clDatos=DTOC(&clValor) CASE VARTYPE(&clValor) = "T" clDatos=TTOC(&clValor) OTHERWISE clDatos="" ENDCASE clObser=clObser+clDatos+CHR(13) NEXT clObservaciones=clObser SELECT Historial_cfg APPEND BLANK Replace Historial_cfg.TIPO WITH clTipo,; Historial_cfg.FECHA WITH DATETIME(),; Historial_cfg.USUARIO WITH Cp_LOGIN,; Historial_cfg.TABLA WITH clAlias,; Historial_cfg.EQUIPO WITH LEFT(SYS(0),AT("#",SYS(0))-1),; Historial_cfg.OBSERVA WITH clObservaciones USE IN (SELECT("Historial_cfg")) ENDIF IF !EMPTY(clalias) SELECT &clAlias ENDIF ON ERROR RETURN ENDPROC
3 - En la tablas importantes en donde se requiera el registro de transacciones se realizar lo siguiente modificar datos de la tabla, y ir a la pestaña "Table" y en cada Triggers insertar el siguiente código:
Insert Trigger = Hsts("AGREGAR") update Trigger = Hsts("MODIFICAR") delete Trigger = Hsts("ELIMINAR")
4 - Listo después de esto entonces cada transacción se estará grabando el la tabla de Historial, solo faltaría hacer un reporte para visualizar información del historial.