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 |