Si un usuario modifica una tabla quisiera saberlo.

21/04/2010 - 11:20 por Mery | Informe spam
Quisiera que si un usuario modifica el contenido de una tabla, recibir un
email con el cambio realizado, ¿es posible?, o en su defecto hacer un log de
modificaciones y al cierre de la aplicación recibir el email con todos los
cambios de contenido realizados de forma automática.

Muchas gracias a todos por las respuestas que dais y que aceleran el
aprendizaje.

Preguntas similare

Leer las respuestas

#6 Ignacio
22/04/2010 - 16:59 | Informe spam
¡Hola, Mery!

Empieza quitando los permisos de escritura a la tabla:
En Access 2003, Herramientas, Seguridad, Permisos de usuario y de
grupo... Selecciona la tabla y en la lista de Usuarios, Administrador.
Desmarca las opciones Insertar datos, Actualizar datos y Eliminar
datos. Luego haz lo mismo en la opción Grupos y el grupo de Usuarios.
El usuario Administrador pertenece al grupo de Usuarios así que debes
quitarle los permisos también al grupo. De esta manera sólo se podrá
modificar la tabla desde el formulario.
A continuación crea un formulario basado en la tabla. Si quieres que
tenga la misma apariencia que la tabla selecciona Hoja de datos en la
propiedad Vista predeterminada.
En el Evento Al abrir pon el siguiente código:
Private Sub Form_Open(Cancel As Integer)
If IsNull(OpenArgs) Then 'No es la carga definitiva
'Llama al formulario lanzador para poder cambiar los permisos
DoCmd.OpenForm "frmLanzador", , , , , acHidden, Name
End If
End Sub
En el Evento Antes de actualizar (se supone que la tabla tiene los
campos Usuario y Fecha):
Private Sub Form_BeforeUpdate(Cancel As Integer)
'Actualiza el usuario y la fecha de alta o modificación
Usuario = Environ$("UserName")
Fecha = Now
End Sub
En el Evento Al eliminar:
Private Sub Form_Delete(Cancel As Integer)
'Se va a eliminar registro
Debug.Print "Registro eliminado: " & Código, Descripción
End Sub
Crea otro formulario intermedio para cambiar los permisos antes de
abrir el formulario donde vas a modificar los datos. En este ejemplo
lo he llamado frmLanzador. No necesita ningún control sólo el
siguiente código en el evento Al abrir:
Private Sub Form_Open(Cancel As Integer)
If Not IsNull(OpenArgs) Then 'Se ha llamado desde otro formulario
DoCmd.Close acForm, OpenArgs 'Cierra el formulario desde el
cual se ha llamado para cambiar los permisos
EstablecePermisosTabla OpenArgs, PermisosPorDefecto 'Concede
permisos de escritura
DoCmd.OpenForm OpenArgs, acFormDS, , , , , Name 'Abre el
formulario definitivamente con permiso de escritura
EstablecePermisosTabla OpenArgs, PermisosSinEscritura 'Anula
permisos de escritura
DoCmd.Close acForm, Name 'Cierra este formulario (lanzador)
End If
End Sub
Por último crea un módulo nuevo y pon el siguiente código:
Public Const PermisosPorDefecto As Long = 1048319
Public Const PermisosSinEscritura As Long = 196117

Public Sub EstablecePermisosTabla(Tabla As String, TipoPermiso As
Long)
'Establece los permisos de la tabla pasada por parámetro
Dim BD As Database 'Es preciso usar el objeto Database para
cambiar el usuario de un documento

If CurrentDb.Updatable Then 'Si la base de datos no está protegida
Set BD = CurrentDb
With BD.Containers("Tables").Documents(Tabla)
.UserName = "admin"
.Permissions = TipoPermiso
.UserName = "Users"
.Permissions = TipoPermiso
End With
BD.Close
Set BD = Nothing
End If
End Sub

Cuando se abre la tabla estará protegida contra escritura. Al abrir el
formulario Access lo abre también protegido. Por eso en el código se
llama a otro formulario (frmLanzador) que cierra la primera apertura,
cambia los permisos de la tabla, abre el formulario con permiso de
escritura e inmediatamente vuelve a proteger la tabla. Finalmente
cierra el formulario intermedio.
Los eventos BeforeUpdate y Delete te informan de los registros
insertados, actualizados y borrados. Aquí puedes añadir el código
oportuno para enviar los mensajes.

Espero que te resuelva el problema.

Un saludo,
Ignacio.
Respuesta Responder a este mensaje
#7 Ignacio
23/04/2010 - 08:51 | Informe spam
¡Hola otra vez, Mery!

En realidad es más simple de lo que escribí ayer ya que se puede
prescindir del formulario lanzador.
La carga de ese formulario se puede sustituir por una llamada a un
procedimiento directamente en el módulo con lo que quedaría:
En el Evento Al abrir del formulario sustituye el código anterior por:
Private Sub Form_Open(Cancel As Integer)
If IsNull(OpenArgs) Then 'No es la carga definitiva
'Cierra y abre el formulario cambiando los permisos
AbreFormularioEscritura Name
End If
End Sub
En el módulo añade el siguiente código:
Public Sub AbreFormularioEscritura(Tabla As String)
'Descarga y carga el formulario, cambiando los permisos de la tabla
pasada por parámetro
DoCmd.Close acForm, Tabla 'Cierra el formulario desde el cual se
ha llamado para cambiar los permisos
EstablecePermisosTabla Tabla, PermisosPorDefecto 'Concede permisos
de escritura
DoCmd.OpenForm Tabla, acFormDS, , , , , "Definitiva" 'Abre el
formulario definitivamente con permiso de escritura
EstablecePermisosTabla Tabla, PermisosSinEscritura 'Anula permisos
de escritura para proteger la tabla
End Sub

Espero que te funcione.

Un saludo,
Ignacio.
Respuesta Responder a este mensaje
#8 Mery
23/04/2010 - 13:30 | Informe spam
He visto el ejemplo de la web de emilio, pero no puedo entrar en la tuya y
quisiera verlo tambien. A ver si me puedes facilitar el acceso directo al
ejemplo que dices de tu web.

Muchas gracias, creo que con esto que me aportais podré solucionarlo.

"Patxi Sanz" escribió:

Creo recordar que en la web de Emilio tienes un ejemplo de históricos.

Y en la mía tienes otro más.

Un saludo,


Patxi Sanz
Tudela (NA)
http://www.pasa.es.tt/

.

Respuesta Responder a este mensaje
#9 Patxi Sanz
23/04/2010 - 18:02 | Informe spam
Puedes probar con la dirección completa:

- http://users6.jabry.com/patxisanz/

Y puedes acceder al ejemplo aquí:

- http://users6.jabry.com/patxisanz/?id&tipo=1
- http://www.pasa.es.tt/?id&tipo=1

Un saludo,


Patxi Sanz
Tudela (NA)
http://www.pasa.es.tt/
Respuesta Responder a este mensaje
#10 Mery
26/04/2010 - 16:04 | Informe spam
Gracias, lo voy a intentar revisar esta semana. y como podria hacer que
enviara un email periodico con esta información?

"Patxi Sanz" escribió:

Puedes probar con la dirección completa:

- http://users6.jabry.com/patxisanz/

Y puedes acceder al ejemplo aquí:

- http://users6.jabry.com/patxisanz/?id&tipo=1
- http://www.pasa.es.tt/?id&tipo=1

Un saludo,


Patxi Sanz
Tudela (NA)
http://www.pasa.es.tt/

.

Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida