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.
Que tal, implemente tu código en un sistema que tengo, pero no realiza ningún registro, me queda la duda de cp_login, de donde le asigno valor, hay algo más que se deba hacer????, gracias!!!
ResponderBorrar