Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > Firebird e Interbase
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 11-11-2010
El_Raso El_Raso is offline
Miembro
 
Registrado: oct 2003
Posts: 135
Poder: 21
El_Raso Va por buen camino
Question Como saber si la tabla cambio al editarla?

Que tal a todos...

Tengo una tabla que tiene unos 100 campos de una encuesta, y quiero saber si al editar la tabla algunos de ellos sufrio algun cambio para mandar a grabar el usuario que realizo dicho cambio.

Se que uno a uno con un triguer se podria usando el OLD y NEW, pero quiero saber si existe algun truco de la tabla completa para no tirar tantos codigos.

O si con los componentes que uso lo puedo conseguir.

Uso Delphi 2010 con FIBPlus 6.9.9 y Firebird 2.5.

Un saludo desde el caribe...
Responder Con Cita
  #2  
Antiguo 12-11-2010
Gallosuarez Gallosuarez is offline
Miembro
 
Registrado: feb 2007
Posts: 92
Poder: 18
Gallosuarez Va por buen camino
Talking Sugerencia...

El_Raso:

Mira, en mi caso hice una pequeña consulta que me genera el código que después inserto en mi procedimiento almacenado. Básicamente lo que hace esta consulta es utilizar las tablas del sistema para obtener TODOS los campos de la tabla especificada en la clausula WHERE y generar el código que se necesita para cada campo involucrado en dicha tabla.
Código SQL [-]
SELECT 'IF (NEW.' || TRIM(RDB$FIELD_NAME) || ' IS DISTINCT FROM OLD.' ||
  TRIM(RDB$FIELD_NAME) || ') THEN REG_CHANGES;'
FROM RDB$RELATION_FIELDS
WHERE RDB$RELATION_NAME = 'NOMBRE_TABLA'

Adecua la a tus necesidades, ignoro si existe algún otro truco que nos facilite este trabajo.

Saludos
Gerardo Suárez Trejo

P.D. Estaremos atentos a ver si alguien mas ha hecho algo al respecto.
Responder Con Cita
  #3  
Antiguo 12-11-2010
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Poder: 30
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
Hola El_Raso.

Si utilizas componentes TClientDataSet con dbExpress tendrás la ventaja de que al servidor no llegará ninguna sentencia SQL Update "inútil", es decir, solamente que el registro haya sufrido alguna modificación real se enviarán al servidor los cambios.

Eso te facilitaría mucho las cosas del lado del servidor, porque en la base de datos podrás usar un sencillo disparador (trigger) Before / After Update con la seguridad de que el registro realmente cambió.

En tu caso implicaría que cambies los componentes de acceso a datos que utilizas (además de asegurar un buen controlador DBX para Firebird 2.5 si tu edición de Delphi 2010 no es la Enterprise). Así que es algo que deberás considerar, junto con el tamaño de tu aplicación y el tiempo que dispongas para hacer el cambio de componentes.

Como dato interesante, decir que TClientDataSet maneja de una manera eficiente el registro de cambios. El usuario puede modificar un registro en memoria y su propiedad ChangeCount aumentará en 1, y si luego lo modifica nuevamente para dejarlo como estaba al principio, ChangeCount disminuirá en 1, aunque antes de hacer este segundo cambio se haya movido de registro o hecho más cambios en otros.

Saludos.

Al González.
Responder Con Cita
  #4  
Antiguo 12-11-2010
Avatar de guillotmarc
guillotmarc guillotmarc is offline
Miembro
 
Registrado: may 2003
Ubicación: Huelva
Posts: 2.638
Poder: 24
guillotmarc Va por buen camino
Hola.

Cita:
Empezado por Gallosuarez Ver Mensaje
El_Raso:

Mira, en mi caso hice una pequeña consulta que me genera el código que después inserto en mi procedimiento almacenado. Básicamente lo que hace esta consulta es utilizar las tablas del sistema para obtener TODOS los campos de la tabla especificada en la clausula WHERE y generar el código que se necesita para cada campo involucrado en dicha tabla.
Código SQL [-]SELECT 'IF (NEW.' || TRIM(RDB$FIELD_NAME) || ' IS DISTINCT FROM OLD.' || TRIM(RDB$FIELD_NAME) || ') THEN REG_CHANGES;' FROM RDB$RELATION_FIELDS WHERE RDB$RELATION_NAME = 'NOMBRE_TABLA'


Adecua la a tus necesidades, ignoro si existe algún otro truco que nos facilite este trabajo.

Saludos
Gerardo Suárez Trejo

P.D. Estaremos atentos a ver si alguien mas ha hecho algo al respecto.
¿ Esto te funciona ?.

Yo lo he intentado varias veces, pero al ejecutar ese comando con un EXECUTE STATEMENT, se hace en un contexto distinto y las variables NEW.XXX y OLD.XXX no se reconocen (incluso aunque el comando se ejecute en el mismo trigger).

¿ Puedes poner un poco más de código para ver como lo haces ?. Me interesa mucho.

Saludos.
__________________
Marc Guillot (Hi ha 10 tipus de persones, els que saben binari i els que no).
Responder Con Cita
  #5  
Antiguo 12-11-2010
Gallosuarez Gallosuarez is offline
Miembro
 
Registrado: feb 2007
Posts: 92
Poder: 18
Gallosuarez Va por buen camino
Explicación...

Guillotmarc:

Mira, como explico en mi primera participación, esa sentencia la utilizo solo para generar el código que después inserto en el procedimiento almacenado (posteriormente tengo que compilar ese procedimiento almacenado), es decir, ejecuto la sentencia en IBExpert y esta me va a devolver las sentencias ya listas de los todos los campos involucrados. Lo hago principalmente para todas aquellas tablas que tienen muchos campos y quiero evitarme la fatiga de escribir todas las sentencias por cada campo (interpreté así la pregunta de El_Raso que es lo que él precisamente quiere evitarse, ¿o estoy equivocado?).

Creo que Guillotmarc, quiere lograr lo que yo en un principió también intenté hacer (poner este código dentro del disparador y posteriormente hacer un EXECUTE STAMENT. No, no funciona de esta manera (para desgracia de todos nosotros). Pero tengo otro código donde logré grabar la sentencia (UPDATE, DELETE o INSERT), tal como se la envió la capa de datos de nuestro FRONT END, sin importar que sea DELPHI, PHP, JAVA, IBExpert, etc. El problema que me falta resolver (ignoro si se pueda hacer), es cuando en una sola transacción hay varias sentencias (solo logro grabar una de ellas). Sin embargo, déjenme rescatar ese código, y lo publico. A lo mejor hay al guíen en este foro que se le ocurra como hacerlo. ¿Les parece la idea?.

Saludos,
Gerardo Suárez Trejo
Responder Con Cita
  #6  
Antiguo 12-11-2010
Avatar de guillotmarc
guillotmarc guillotmarc is offline
Miembro
 
Registrado: may 2003
Ubicación: Huelva
Posts: 2.638
Poder: 24
guillotmarc Va por buen camino
Gracias Gerardo.

Ahora lo entiendo. La verdad es que supone mucho mantenimiento, hay que estar siempre pendiente de que cada vez que modificas algún campo tendrás que regenerar el trigger.

Pero está claro que siempre es mejor utilizar esto que te da el cuerpo del trigger automáticamente, que no tener que escribirlo manualmente.

NOTA: Gracias por ofrecerte a buscar el código para recuperar la sentencia que actualizó el registro. Pero por mi no te molestes, no lo utilizaría.

Saludos.
__________________
Marc Guillot (Hi ha 10 tipus de persones, els que saben binari i els que no).
Responder Con Cita
  #7  
Antiguo 19-11-2010
Avatar de rastafarey
rastafarey rastafarey is offline
Miembro
 
Registrado: nov 2003
Posts: 927
Poder: 21
rastafarey Va por buen camino
Resp

Si mas no recuerdo hay algo asi como rowafect o algo por el estilo. Lee un poco hacerca de esto. Ahora no recuerdo desde que version de firebird esta disponible.
__________________
Todo se puede, que no exista la tecnología aun, es otra cosa.
Responder Con Cita
  #8  
Antiguo 12-11-2010
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por El_Raso Ver Mensaje
quiero saber si al editar la tabla algunos de ellos sufrio algun cambio para mandar a grabar el usuario que realizo dicho cambio.
No trabajo con Firebird, pero en MySQL, luego de una sentencia update, insert o delete, es posible saber cuántos registros fueron realmente afectados. Es decir, si un UPDATE abarca 100 registros pero sólo dos de ellos realmente cambiaron, el motor indica que cambiaron dos registros.

Entonces, si lo único que interesa es saber si realmente hubo un cambio y así poder acreditarlo al usuario, podrías ver si Firebird cuenta con algo similar y así te evitas triggers y demás.

// Saludos
Responder Con Cita
  #9  
Antiguo 12-11-2010
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola El_Raso.

Cuando leí tu post, interpreté que deseabas averiguar solamente si un campo determinado de un registro había sido modificado. Y como no conozco nada al respecto, mejor hice silencio.

Ahora si como dice roman, te alcanza con saber si hubo un cambio en el/los registros, podes utilizar POST_EVENT en un trigger AFTER UPDATE y capturar el evento.

Saludos.

Última edición por ecfisa fecha: 12-11-2010 a las 17:21:24.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Como saber si un schema/tabla existe JULIPO PostgreSQL 1 26-11-2009 16:54:12
Como saber si una tabla existe en MySql Stanley Conexión con bases de datos 2 05-01-2008 14:24:14
como saber si una tabla temporal existe? droguerman MS SQL Server 1 06-01-2006 18:48:31
Como saber el tipo de datos de un campo de una tabla Javi2 SQL 1 27-06-2005 14:18:28
Como saber si una Tabla existe con Ado manuelpr Conexión con bases de datos 7 02-03-2005 16:23:01


La franja horaria es GMT +2. Ahora son las 14:32:49.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi