Como Saber Que Se Inserto Actualizo O Elimino 1 Registro En La BD Sin Usar Triggers


Goto page 1, 2  Next

Subject: Como Saber Que Se Inserto Actualizo O Elimino 1 Registro En La BD Sin Usar Triggers
Ubuntu 10.10 - Maverick Meerkat
Escritorio Gnome
gambas 2.21

Buen dia!!
Quisiera saber como puedo evaluar dentro de un procedimiento o función si el evento INSERT, DELETE o UPDATE (se ha disparado)han realizado algún cambio o modificación en mi base de datos. Por ejemplo yo tengo este codigo:
PUBLIC SUB btnguardarU_Click()
IF txtnombreU.Text <> "" AND txtpasswordU.Text <> "" THEN
IF editando THEN
TRY ModConexion.rs1["cant_usuarios"] = txtcantusuarios.Text
TRY ModConexion.rs1["usuario"] = cmbusuarios.Text
TRY ModConexion.rs1["nombre_usuario"] = txtnombreU.Text
TRY ModConexion.rs1["contrasena"] = txtpasswordU.Text
TRY ModConexion.rs1["tipoU"] = cmbtipousuarios.Text
TRY ModConexion.rs1.Update
ELSE
TRY ModConexion.db.Exec("insert into usuarios values (&1,&2,&3,&4,&5)", txtcantusuarios.Text, cmbusuarios.Text, txtnombreU.Text, txtpasswordU.Text, cmbtipousuarios.Text)
ENDIF
txtnombreU.Clear
txtpasswordU.Clear
txtnombreU.SetFocus
CATCH
Message.Error("Imposible introducir los datos solicitados")
ELSE
Message.Warning("Hay uno o más campos vacios debe \n introducir todos los datos solicitados")
ENDIF
END

como haria para saber que ese insert de verdad me ejecuto alguna inserción del registro en mi base de datos sin usar triggers o algo parecido porque ademas quisiera que en el procedimiento pudiera guardarse a que hora y fecha ocurrio el evento asi como captura que usuario del sistema que estoy desarrollando en gambas lo hizo..Me explico: si el usuario pepe hizo una eliminacion de un usuario x quiero almacenar la hora,fecha,decir que el evento realizado fue una eliminación y guardar el nombre de pepe,para esto cree en mi base de datos liceo una tabla llamada auditoria donde se guardara el nombre del usuario, la fecha, hora y tipo de evento realizado..Estoy trancada con esto porque no se como evaluar cuando se dispara alguno de esos eventos...
Gracias por la ayuda que puedan aportar..

Subject: Re: Como Saber Que Se Inserto Actualizo O Elimino 1 Registro En La BD Sin Usar Triggers
Utilizas el try con excesiva ligereza, deberías limitarte sólo a los puntos "delicados", insert y update y controlar el error en ellos (en tu ejemplo, si intentas meter una cadena en un campo numérico y genera un error ¿Cómo lo distingues de un error en la base de datos?.
Pero como eso, mal que bien, ya lo tienes resuelto, supongo que te refieres a cómo controlarlo en la base de datos....
Pues depende de la base de datos que uses. Las hay que dan información al respecto (SQLITE ofrece algunas funciones como total_changes y last_insert_rowid que ayudan a todo esto) y las hay que no.
Siempre puedes hacer un recuento de registros (o comparativa de la última clave) si es una inserción y una re-lectura y comprobación si es una actualización, no es complicado de implementar con un par de funciones.
Algo así:

dim ultimo as integer
dim r as result

r=miconexion.exec("select max(id) ultimaclave from mitabla")
ultimo=r!ultimaclave
....
operaciones de inserción...
... que incluyan un Commit para asegurarte que se ven los cambios
....

r=miconexion.exec("select max(id) ultimaclave from mitabla")
if r!ultimaclave<=ultimo then
message("Error en la inserción")
endif


Profile PM  
Subject: Re: Como Saber Que Se Inserto Actualizo O Elimino 1 Registro En La BD Sin Usar Triggers
Muchas gracias Sr. Shordi.. Esa es una opción y quizás solucionaria una pequeña parte de mi planteamiento, pero como haria para guardar los demas datos que necesito capturar

Subject: Re: Como Saber Que Se Inserto Actualizo O Elimino 1 Registro En La BD Sin Usar Triggers
sustituye donde te digo: "operaciones de inserción...." por tu código.

Profile PM  
Subject: Re: Como Saber Que Se Inserto Actualizo O Elimino 1 Registro En La BD Sin Usar Triggers
Yo en realidad lo que busco es simular el uso y comportamiento de un triggers pero por supuesto sin hacer uso de este..
algo como: (ojo es un ejemplo de lo que quiero más o menos)
PUBLIC SUB ACTIVO_UPDATE()
Dim Sql as string
IF UPDATE se activo en la tabla alumnos THEN
FOR EACH ROW
sql="INSERT INTO auditoria (usuario, fecha,hora,tipo_evento,cedula_cambiada,nombre_cambiado,apellido_cambiado) VALUES (usuario_actual,date(NOW()), time(NOW()),'ACTUALIZÓ O EDITO EL REGISTRO DE:',12345678,'pepe', 'perez')"
Modconexion.exec(sql)
ENDIF
END

se que en Sqlite3 la función total_changes() retorna el numero de row que fueron cambiadas por los eventos INSERT, UPDATE o DELETE lamentablemente no lo puedo usar porque estoy trabajando con base de datos Mysql y lo que me gustaria es hacer un procedimiento con condiciones como las que puse en el ejemplo
espero haberme explicado mejor esta vez

Subject: Re: Como Saber Que Se Inserto Actualizo O Elimino 1 Registro En La BD Sin Usar Triggers
Ahora sí te he entendido. Lo que tu quieres es un seguimiento de actividades del usuario. Fuera de los triggers, yo he automatizado ese mecanismo con un par de funciones "artesanas" que me graban en una tabla todas las actividades de los usuarios. Estas funciones las sitúas en un módulo independiente llamado "formularios" y en tu formulario sólo tienes que poner algo así como:

Código: [Descargar] [Mostrar]
PUBLIC SUB btnguardarU_Click()

DIM lExito as boolean
if not validaciones 'ver esta función más abajo.
RETURN
endif
'Suponiendo que la tabla se llame Alumnos, id sea el campo clave de la misma y tengamos un valuebox llamado también id cuyo value es el valor de la clave

lExito = formularios.grabaRegistro("Alumnos", "id", id.value, ME)

if lExito
formularios.limpiacampos(ME) 'función que deja el formulario en blanco
ELSE
Message.Error("Se produjo algún error en la grabación de datos")
ENDIF
txtnombreU.SetFocus

END

PUBLIC FUNCTION validaciones() as boolean
dim lret as boolean

IF txtnombreU.Text <> "" AND txtpasswordU.Text <> "" THEN
lret =true
endif
'aquí se añaden todas las demás validaciones que quieras poner
RETURN lret
end




En el módulo Formulario estarían las funciones de actualizar y demás. Te adjunto como ejemplo la función de modificar registro. Esiste una para crear otra para borrar y esta modificar, naturalmente.

PUBLIC FUNCTION grabaRegistro(tabla AS String, campoClave AS String, clave AS Variant, oContenedor AS Object) AS Boolean

DIM rsDatos AS Result
DIM lret AS Boolean
DIM f AS ResultField
DIM cad AS String

lret = TRUE 'valor de retorno

rsDatos = laconexion.edit(tabla, campoClave, clave) 'result en modo de edicion

rsdatos = pasacampos(oContenedor, rsDatos) 'función que me pasa los campos de cualquier formulario al result

'aquí genero una cadena de texto que contiene una línea con "nombredecampo: valor grabado " por cada registro
FOR EACH f IN rsdatos.Fields
cad &= f.name & ": " & rsDatos[f.name] & "\n"
NEXT

TRY rsDatos.Update 'actualizamos los datos

IF ERROR THEN
lret = FALSE
ELSE
TRY laconexion.Commit
IF ERROR THEN
Message.Error("No se pudo ejecutar Commit \n" & Error.text)
lret = FALSE
END IF
hlog("Modifica " & tabla, cad) 'Esto es lo que buscas, aquí generamos el log de lo que el usuario ha modificado
END IF

RETURN lret

PUBLIC SUB hlog(tipo AS String, operacion AS String) 'esta función es la que graba en la tabla de log

operacion = Replace(operacion, "'", "\\'") 'escapamos comillas simples y dobles
operacion = Replace(operacion, "\"", "\\\"")
operacion = "insert into hlog (tipo, operacion, usr,fmod) values ('" & tipo & "', '" & operacion & "', '" & usuario_nick & "', " & "now()" & ")" 'usuario_nick variable pública declarada antes
laconexion.Exec(operacion)

END



Si te interesa el sistemade actualización de registro, puedes ver más sobre cómo funciona En éste hilo

Puede parecer engorroso, pero ten en cuenta que vale para cualquier tabla y cualquier formulario de manera genérica. Supongo que hay mil maneras distintas de hacer lo mismo y que enseguida surgirán voces explicándolas en éste hilo, pero así es como yo lo hago.

Suerte

Last edited by shordi on Wednesday, 20 July 2011, 18:29; edited 2 times in total
Profile PM  
Subject: Re: Como Saber Que Se Inserto Actualizo O Elimino 1 Registro En La BD Sin Usar Triggers
Buen dia Sr. Shordi disculpe mi ignorancia y mi insistencia será que Usted porfavor seria tan amable de decirme o desarrollarme estas funciones estuve tratando de cuadrar como hacerlo pero estoy cerrada no se como,porque ademas no deduzco que tipo de datos son los parametros que pasa:
limpiacampos(ME)
pasacampos(oContenedor, rsDatos)
Mil gracias de antemano!!!

Subject: Re: Como Saber Que Se Inserto Actualizo O Elimino 1 Registro En La BD Sin Usar Triggers
ME es una referencia al propio formulario. oContenedor es un objeto contenedor de otros controles, como un panel o una frame o un formulario...

Lo mejor es que te bajes el ejemplo que subí aquí http://desconcertado.es/archivos/Ejemplo_formularios.zip y lo ejecutes paso a paso (F8) mirando cada tipo de variable...
Tienes una pequeña descripción del proceso en el hilo que te indiqué más arriba.

El ejemplo no incluye el asunto de los seguimientos de log, pero cuando lo entiendas verás lo sencillo que es añadírselo.


Suerte.

Last edited by shordi on Thursday, 21 July 2011, 12:33; edited 2 times in total
Profile PM  
Subject: Re: Como Saber Que Se Inserto Actualizo O Elimino 1 Registro En La BD Sin Usar Triggers
Ya consegui las funciones en el hilo que dejó Sr Shordi...
Ahora me sale un error en esta linea:
cad &= f.name & ": " & rsDatos[f.Name] & "\n"
este es el error: result is not avaible
en realidad no se como trabaja este tipo de datos:
DIM f AS ResultField
me gustaria q me aclarara la duda

Subject: Re: Como Saber Que Se Inserto Actualizo O Elimino 1 Registro En La BD Sin Usar Triggers
Un Result, que es el resultado de una consulta a la base de datos, tiene una colección de campos (Fields), puedes obtener información sobre los campos, tales como el nombre, el tipo, etc explorando esa conexión.
En la línea que destacas se construye una cadena compuesta por el nombre del campo, dos puntos, el contenido del campo y un retorno de carro. Así si tienes dos campos uno llamado apellidos y otro nombre y los actualizas, se crea una cadena que sería más o menos así:

apellidos: Garcia Pérez
nombre: Juan

Esto es lo que se graba en la tabla de log, como testigo de lo que ha grabado el usuario.

Si te da ese error es que el objeto de tipo Result rsDatos, no está "alimentado" con una consulta válida a la base de datos.

Suerte

Profile PM  
Goto page 1, 2  Next

Page 1 of 2


  
You cannot post new topics
You cannot reply to topics
You cannot edit your posts
You cannot delete your posts
You cannot vote in polls
You cannot attach files
You can download files
You cannot post calendar events

   

This is a "Lo-Fi" version of our main content. To view the full version with more information, formatting and images, please click here.

Powered by Icy Phoenix based on phpBB
Design by DiDiDaDo

Generation Time: 0.4905s (PHP: -54% SQL: 154%)
SQL queries: 25 - Debug Off - GZIP Enabled