Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Firebird e Interbase (https://www.clubdelphi.com/foros/forumdisplay.php?f=19)
-   -   Trigger o disparador en delphi-interbase (https://www.clubdelphi.com/foros/showthread.php?t=77252)

Diego827 07-01-2012 18:38:10

Trigger o disparador en delphi-interbase
 
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

Eres increible!!!
 
Hola Casimiro, gracias por responder ahora busco!

Un saludo,

Diego827 07-01-2012 19:34:29

Consultita
 
Cita:

Empezado por Casimiro Notevi (Mensaje 422506)
Haz una búsqueda por post_event.

Estimado Casimiro, tengo este codigo:

Código SQL [-]
CREATE TRIGGER NUEVO_CLIENTE FOR CLIENTES AFTER INSERT
AS
BEGIN
  POST_EVENT "NEW_CLIENTE";
END

Pero me da el error:

Código:

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

Gracias
 
Hola Caral, te comento:

La tabla es asi:

Código SQL [-]
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/Firebi...de_eventos.pdf

Diego827 07-01-2012 19:53:12

Unos detallles mas...
 
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

Gracias por responder Caral
 
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

jaja la estaba arruinando
 
Hola amigos, gracias por su tiempo.
El error que cometia era este:

Código SQL [-]
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/Firebi...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

Puede ser
 
Cita:

Empezado por Caral (Mensaje 422520)
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

Exacto
 
Cita:

Empezado por Caral (Mensaje 422522)
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

Vamos a ver...
 
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

Ups!!!
 
Cita:

Empezado por Casimiro Notevi (Mensaje 422535)
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.


La franja horaria es GMT +2. Ahora son las 00:40:55.

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