La Web del Programador: Comunidad de Programadores
 
    Pregunta:  4128 - REGISTRO DE CONTROL DE CAMBIOS
Autor:  Oscar Lopez Calderon
Tengo una base de datos con la que trabajamos varios usuarios y quiero tener un registro de que cambios cuando y que usuario los ha hecho.
La primera idea es colocar el código para registrar estos datos en el envento CHANGE de cada control de cada formulario de la base de datos, pero me llevaría mucho trabajo.
¿Alguien sabe si hay otra forma de hacerlo que sea más simple?.
Si alguien ya tiene algo parecido programado,¿me lo podría pasar para adaptarlo, si es posible?
Gracias de antemano

  Respuesta:  Oscar M.
1 hay que saber que datos han cambiado en el formulario
para saber cuantos datos han cambiado en el formulario, en el evento \"antes de actualizar\" (del formulario) puedes colocar los IF para saber cual dato a cambiado. ej:
IF Not txtNombre.OldValue = txtNombre.Value then
\'EL VALOR A CAMBIADO
2 generar una cadena con el nombre del campo más el valor nuevo y el antiguao ej:
strCambios = strCambios & \"/Nombre: Valor Antiguo: \" & txtnombre.oldvalue & \" Valor nuevo: \" & txtNombre.value
ENDIF
Una vez generada la cadena, pues la mandas a grabar en una tabla de historial con la fecha y hora actual, el nombre del usuairo que efecturo la modificacion, el id del registro modificado y el nombre de la tabla ej:

Function Add_Hist(strCambios, strNomTabla, lngId)
Dim rs as dao.recordset
Dim db as dao.database
set db = currentdb
set rs = db.OpenRecordSet("Historial", dbopendynaset)
rs.addnew
rs!NomTabla = strTabla
rs!IdReg = lngId
rs!NomUser = CurrentUser()
rs!Fecha = Now
rs!Cambios = strCambios
rs.update
end function

Luego generas un formulario con la tabla historial que se puede llamar
frmHistorial

Para saber que cambios se han hecho al registro de un cliente, puedes colocar un boton el el formulario clientes que abra el formulario historial usando como filtro el nombre de la tabla y el id del registro. ej.
DoCmd.OpenForm \"frmHistorial\", , , \"NomTabla = \'Clientes\' And IdReg = \" & Me.txtIdCli

Bueno, espero que te sirva esta rutina, A mi me ha funcionado bastante bien

  Respuesta:  Jorge A. Marquez Windgasse
EL EVENTO CHANGE SE ACTIVA CADA VEZ QUE USTED OPRIME UNA TECLA DE UN CONTROL. O SEA SI USTED ESCRIBE HOLA EL EVENTO CHANGE SE INVOCA 4 VECES. LA UNICA FORMA ES QUE USTED TENGA UN ARCHIVO DE REGISTRO CON 3CAMPOS : TIPO DE TRANSACCION, USUARIO HORA Y FECHA.
USTED TIENE QUE AGREGAR UN REGISTRO A ESTA TABLA EN LOS SIGUIENTES EVENTOS: 1.BEFORE_UPDATE DEL FORMULARIO O DEL RECORDSET SUBYACENTE Y EN EK EVENTO AFTER_DELETE.EL CODIGO QUE USTED PODRIA LLAMA PUEDE SER ALGO ASI:
SUB ACT_REGISTRO
DIM DB AS DATABASE
DIM RS RECORDSET
SET DB=CURRENTDB
´ SET DB=DBENGINE.OPENDATABASE(..)
´ SI ES VISUAL BASIC
SET RS=DB.OPENRECORDSET("REGISTRO")
RS.ADD
RS!EVENTO="MODIFICAR"
RS!USUARIO = VariableUsuario
RS!FECHA = NOW()
RS.UPDATE
RS.CLOSE
DB.CLOSE (SI USO OPENDATABASE)
END SUB

ESTE ES EL CODIGO QUE TIENE QUE USAR. NO CONOZCO OTRO FORMA QUE FUNCIONE BIEN EN UN AMBIENTE MULTIUSUARIO