PDA

Ver la Versión Completa : Trigger o disparador en delphi-interbase


Diego827
07-01-2012, 18:38:10
Hola amigos del club, tengo una consultita.

No soy muy bueno en base de datos; lo unico que he hecho son tablas simples y consultas a las mismas ya que hasta este año me toca en la universidad base de datos. Les comento mi problema:

Tengo un programa pequeño y sencillo que posee un DBGrid conectado a un DataSource-> ibdataset->IBDataBase. Este dbgird muestra nada mas una serie de 10 datos, contyenidos en una tabla de Interbase. hasta aqui todo Ok.

Anteriormente habia posteado un hilo donde preguntaba como hacer que3 la tabla se mostrara en "tiempo real" y claro esta que me refiero a que cuando se ingresara un nuevo registro inmediatamente la aplicacion mostrara el valor. Me dieron la solucion: un disparador o trigger. Pero resulta que no pude hacerlo porque no se como y ya busque en la web y no encuentro nada que yo entienda con mi bajo nivel de conocimientos. Ahora por favor, necesitaria que me indicaran como crear un trigger que al insertar un nuevo registro alertara de alguna forma a la aplicacion "cliente" y esta cerrara y habriera el dataset y asi refrescar el DBGrid.

Gracias amigos y disculpen las molestias.

Enviado desde mi IPad 6G (:p)

Casimiro Notevi
07-01-2012, 18:43:08
Haz una búsqueda por post_event.

Diego827
07-01-2012, 18:44:40
Hola Casimiro, gracias por responder ahora busco!

Un saludo,

Diego827
07-01-2012, 19:34:29
Haz una búsqueda por post_event.

Estimado Casimiro, tengo este codigo:

CREATE TRIGGER NUEVO_CLIENTE FOR CLIENTES AFTER INSERT
AS
BEGIN
POST_EVENT "NEW_CLIENTE";
END

Pero me da el error:

Dynamic SQL Error.
SQL error code = -206.
Column unknown.
NEW_CLIENTE.

SQL Code: -206
IB Error Number: 335544569

Que puede ser? este error siempre me lo da en cualquiier cosa que haga :(

Caral
07-01-2012, 19:37:12
Hola
Y que es NEW_CLIENTE, esta en la tabla?.
Saludos

Diego827
07-01-2012, 19:47:06
Hola Caral, te comento:

La tabla es asi:

CREATE TABLE CLIENTES (
CLAVECLIENTE INTEGER NOT NULL,
NOMBRE VARCHAR(70),
TELEFONO VARCHAR(15),
DOCUMENTO VARCHAR(20),
DIRECCION VARCHAR(100)
)

Este es el link del documento que haye pero no me funciona.

http://www.intitec.com/varios/Firebird_uso_de_eventos.pdf

Diego827
07-01-2012, 19:53:12
SOlamente para comentarles: utilizo C++builder XE e Interbase SMP 2009.

Saludos,

Caral
07-01-2012, 19:55:07
Hola
No he hecho de estos gatitos nunca, asi que no entiendo muy bien como funcionan.
El concepto es relativamente sencillo.
Se crea un disparador de evento y un gatito para la el evento.
La pregunta es:
Segun lo que entiendo lo que pretendes es que lo datos que insertas se vean de inmediato en el dbgrid.
Si es asi, por que usar un gatito, es imperativo ?.
Saludos

Diego827
07-01-2012, 19:58:51
Hola Caral; el asunto es así:

Imagina que tienes un servidor, un programa cliente para visualizar datos y otro programa por medio del cual una persona ingresa datos a la base de datos.

Si la persona ingresa datos al servidor por medio del programa de ingreso los programas clientes deben de recibir una alerta para actualizar sus datos.

Ese es el concepto, pero nada me funciona y ya me empiezo a sentir idiota

Caral
07-01-2012, 20:02:53
Hola
Yo tengo 6 ordenadores conectados a un servidor con firebird.
No uso nada de eso y no he tenido nunca problemas.
Como de esto no se lo que hago es simplemente una consulta a la tabla antes de hacer algun cambio, asi, si alguien ha modificado algo lo puedo solucionar antes.
Tambien uso vistas, que son mas sencillas que los Tiggers, por lo menos para mi.
Saludos

Diego827
07-01-2012, 20:09:47
Hola amigos, gracias por su tiempo.
El error que cometia era este:


CREATE TRIGGER NUEVO_CLIENTE FOR CLIENTES AFTER INSERT
AS
BEGIN
POST_EVENT "NEW_CLIENTE"; //Aqui mi error: no son comillas dobles (") son comillas simples (')
EN

En el Tutorial aparecia con comillas dobles y bueno grave error pueden verificarlo:

http://www.intitec.com/varios/Firebird_uso_de_eventos.pdf

Gracias por su tiempo y disculpen, la verdad siempre me ayuda muchísimo la gente de este foro.

Caral
07-01-2012, 20:11:52
Hola
Me alegro, ahora la pregunta:
Que hace el tigger?, envia un mensage despues de insertado ?.
Saludos

Diego827
07-01-2012, 20:15:06
Hola
Yo tengo 6 ordenadores conectados a un servidor con firebird.
No uso nada de eso y no he tenido nunca problemas.
Como de esto no se lo que hago es simplemente una consulta a la tabla antes de hacer algun cambio, asi, si alguien ha modificado algo lo puedo solucionar antes.
Tambien uso vistas, que son mas sencillas que los Tiggers, por lo menos para mi.
Saludos

Hola Caral, gracias por responder;

Bueno la verdad nunca he usado vistas; pero lo que sucede es esto, cuando los datos son sumamente necesarios para la toma de decisiones deben ser en tiempo real. Si se coloca un timer que tenga como labor abrir y cerrar cada cierto tiempo los dataset para actualizar el DBGrid estarias cada minuto por ejemplo estarias abusando un poco del trafico de red, ademas: recibirias los datos un minuto despues de que el usuario de ingreso inserto los datos. Entonces para evitar esto, le dejo la tarea al servidor para que este le diga al programa "Ya me ingresaron datos" y el programa al recibir el evento habra y cierre el dichoso dataset y actualice en tiempo real. Espero haberme dado a entender ya que me "cuesta" (y mucho :o)

Gracias nuevamente y un saludo a todos.

Diego827
07-01-2012, 20:17:31
Hola
Me alegro, ahora la pregunta:
Que hace el tigger?, envia un mensage despues de insertado ?.
Saludos

Si, envia un mensaje a través de un componente llamado (creo) IBEvents; asi en tu aplicacion puedes saber si insertaron, borraron o que se yo :D

Un saludo amigo (soy muuy novato).

Caral
07-01-2012, 20:20:26
Hola
Si, estoy claro en esto.
Pero como siempre digo, es lo mismo de una que de otra manera.
Si tienes que indicar con un if (como indica el ejemplo que pusiste) cada vez que se hace algun cambio y ademas recurrir al tigger, es lo mismo que hacer una sentencia sql.
Bueno, me alegro que lo solucionaras, eso es lo importante.
Saludos

Caral
07-01-2012, 21:04:59
Hola
Estoy tratando de entender la necesidad de un trigger en este caso y sigo sin entenderlo.
La unica que se me ocurre es en el caso de un solo form (general).
Esto pensando en que se tenga la tabla o dataset activo siempre.
Si se trata de varios forms, no le veo utilidad.
Se que genera un evento con el componente IBEvents, pero que ?, de que sirve ?, me puede actualizar el dataset, pero siempre y cuando este activo, de lo contrario o enviara un error o no hara nada.
No lo entiendo.
Me quedo con mi humilde IBQuery y Sql.:D
Saludos

Diego827
07-01-2012, 22:24:23
Te comento, yo no uso mucho los ibquery, de hecho nunca los he utilizado porque utilizo el componente ibdataset el cual me provee de un selectsql y demás funciones.

Ahora bien: imaginemos que tu haces una aplicación con un ibquery>ibtransaction>ibdatabase etc. y bueno tu programa es un control de existencias de productos en stock de un almacén de repuestos para aeronaves de guerra rusa (de los MiG o que se yo ;)). En ese momento hay dos tenderos trabajando y ambos tienen la lista de misiles en existencia en el monitor., y llega un cliente afgano a una de las cajas de venta y pide: necesito dos misiles Hellfire y dos toneles con gelatina de napalm; acto seguido el tendero ve en su lista que en efecto aun tienen dos misiles. Los despacha junto con el napalm y listo se va ha cocinar. Ahora llega otro con el otro tendero y este tenía activa la ventana de misiles, le piden un misil Hellfire y este dice tener dos; en efecto no hay ya ninguno en existencia, si le da refrescar o cierra y habré la ventana de existencias mostraría cero en existencias pero al no haberlo hecho dice tener dos misiles. Si estas personas hubiesen tenido el famoso trigger que mencionamos aquí, inmediatamente al modificar u/o eliminar la existencia de dichos misiles en stock se hubiera disparado un evento el cual refrescaría todos los programas cliente y al llegar el segundo cliente le habrían dicho que ya no hay misiles en venta.

Espero haberme dado a entender porque como dije anteriormente no es mi fuerte :o

Un saludo.


Enviado desde mi IPad 3G

Casimiro Notevi
07-01-2012, 22:47:48
Es que un programa que trabaja de esa forma está mal planteado. No se tiene una ventana abierta con el stock, ahí todo el rato, eso es algo inútil, sino que cuando se selecciona el artículo es cuando se muestra el stock de ese momento. Cierto que también puede irse en ese momento al baño y cuando regrese ya lo han vendido en otro terminal, pero al aceptar la línea es cuando debería de comprobar el stock de ese momento.
Lo de las dobles comillas en el evento... no me había fijado, tendré que corregirlo :D

Diego827
07-01-2012, 22:57:09
Es que un programa que trabaja de esa forma está mal planteado. No se tiene una ventana abierta con el stock, ahí todo el rato, eso es algo inútil, sino que cuando se selecciona el artículo es cuando se muestra el stock de ese momento. Cierto que también puede irse en ese momento al baño y cuando regrese ya lo han vendido en otro terminal, pero al aceptar la línea es cuando debería de comprobar el stock de ese momento.
Lo de las dobles comillas en el evento... no me había fijado, tendré que corregirlo :D

Jeje cierto Casimiro, pero es tal cual como menciono la historia: digamos que eran babosos estos cuates y ya tenian en pantalla la existencia de misiles (era solo un ejemplo, como repito soy malisimo para explicarme).

Ahora con lo del documento: ups! lo siento, no sabia que eras el autor pero bueno en fin todos ganamos algo en este hilo :o y bueno si te sirve de algo: busque y encontre otros ejemplos con comillas y me seguia dando error todo esto ya me habia arrancado todo el cabello :rolleyes:

Casimiro Notevi
07-01-2012, 23:01:41
No, en este caso no soy el autor, sólo recopilé la información de Erika Martínez (la autora) y lo publiqué en formato pdf.
Ya está cambiado, con comillas simples.

Caral
08-01-2012, 00:21:28
Hola
Hay muchas formas de hacelo, no digo que el gatito esta mal, solo digo que no es la unica.
A mi no me gusta el dataset por muchas razones, prefiero hacerlo todo con sql, me parece mucho mas rapido.
Como dice Casimiro, el programa no deberia tener las ventanas abiertas y aun asi hay muchas maneras de solucionarlo.
Bueno, como ves, ni me gustan los tigres ni los dataset y podria dar muchas razones :D
Saludos

Delphius
08-01-2012, 05:26:28
Hola,

Para entender del todo lo que quieres hacer necesitas más que una simple lectura sobre:
1) Transacciones
2) Triggers o disparadores
3) Eventos

En el FTP del club y en la misma web donde está el artículo sobre los eventos que estás consultando ;) hay material justamente sobre estos tres puntos. No está demás mencionar que primeramente te tomes el debido tiempo para irte familiarizando con la documentación oficial de Firebird, que explican en lo particular a este caso como utilizar los triggers y eventos y muuucho más.

En La Cara Oculta de Delphi 4 y en la 6 encontrarás amplio material sobre lo que hace a las transacciones y más en lo que hace a Delphi y el manejo de bases de datos en general.

La idea básica es que tu crees un trigger after insert que dispare un evento (de allí que te sugieran una búsqueda con post_event). Esto ocasiona que el motor envíe los respectivos mensajes a los clientes.
Ahora es el turno de la aplicación: tu debes disponer de un TIBEventAlert (creo recordar que era así el nombre... no Delphi en estos momentos) que capture el evento. Una vez que se capture tu haces lo que quieras. Para tu caso por ejemplo un simple refresh (O cierre y apertura) del dataset para que se muestre lo insertado.
En esto, a nivel aplicación, indice el uso de las transacciones y el nivel de aislamiento.

No tiene demasiada ciencia... es tu turno sentarte a leer el material.

Saludos,