Portal    Foro    Buscar    FAQ    Registrarse    Conectarse


Publicar nuevo tema  Responder al tema 
Página 1 de 2
Ir a la página 1, 2  Siguiente
 
Como Saber Que Se Inserto Actualizo O Elimino 1 Registro En La BD Sin Usar ...
Autor Mensaje
Responder citando   Descargar mensaje  
Mensaje 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..
 



 
kexxya - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje 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

 

 



 
shordi - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje 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
 



 
kexxya - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje 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.
 



 
shordi - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje 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
 



 
kexxya - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje 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
 



 
última edición por shordi el Miercoles, 20 Julio 2011, 19:29; editado 2 veces 
shordi - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje 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!!!
 



 
kexxya - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje 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.
 




===================
No podemos regresar
 
última edición por shordi el Jueves, 21 Julio 2011, 13:33; editado 2 veces 
shordi - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje 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
 



 
kexxya - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje 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
 




===================
No podemos regresar
 
shordi - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Mostrar mensajes anteriores:    
 
Ocultar¡Este tema fue útil?

 

Elegir valoración:                       

Media de valoración Valoración mínima Valoración máxima Número de valoraciones
10.00 10 10 1
 
OcultarTemas parecidos
Tema Autor Foro Respuestas último mensaje
No hay nuevos mensajes Cómo Puedo Saber El Total De Registro De ... DEATH General 2 Miercoles, 27 Abril 2011, 20:22 Ver último mensaje
DEATH
No hay nuevos mensajes Como Saber Si Una URL Es Válida? v3ctor General 17 Lunes, 06 Julio 2015, 10:26 Ver último mensaje
Shell
No hay nuevos mensajes Consulta A Base De Datos Para Saber Si El ... willyanjose Bases de Datos 1 Viernes, 10 Junio 2016, 17:56 Ver último mensaje
shordi
No hay nuevos mensajes En El IDE De Gambas Existe Alguna Manera D... gambafeliz General 2 Sabado, 31 Agosto 2019, 12:08 Ver último mensaje
gambafeliz
 

Publicar nuevo tema  Responder al tema  Página 1 de 2
Ir a la página 1, 2  Siguiente

Usuarios navegando en este tema: 0 registrados, 0 ocultos y 1 invitado
Usuarios registrados conectados: Ninguno


 
Lista de permisos
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas
No puede adjuntar archivos
No puede descargar archivos
No puede publicar eventos en el calendario