Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (https://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   Ejecucion automatica de Triggers IB65 con Delphi 7 Dbexpress (https://www.clubdelphi.com/foros/showthread.php?t=3024)

norberto_larios 18-08-2003 22:33:22

Ejecucion automatica de Triggers IB65 con Delphi 7 Dbexpress
 
* Tengo una base de datos (Interbase 6.5) en un Servidor Win 2000
- El Interbase Manager esta corriendo como un servicio En windows
- Tengo una tabla almacenes con 2 campos:

id_alm Integer Autoincrementado (LLAVE PRIMARIA)
descripcion Character


por lo tanto tengo un generador del id_alm q inicia en o e incrementa en 1
ademas de un Disparador antes de insertar

BEGIN
IF (NEW.ID_ALM IS NULL) THEN
NEW.ID_ALM = GEN_ID(GEN_ALM_ID,1);
END

Los cuales estoy seguro q funcionan por que inserto datos desde el InterBase Expert
y al insertar registros pone automaticamente el ID incrementando en el generador

PERO CON DELPHI 7 NO LO HACE, TENGO LO SIGUIENTE
* Utizo DBExpress
- 1 SQLConnection1 (con mis respectivos parametros de coneccion)
- 1 SimpleDataSet1
connection := SQLConnection1
commandtype:= ctTable
commandtext:= almacenes
- 1 DataSourse1
DataSet := SimpleDataSet1

Tengo una forma donde use un Grid, un boton de Agregar y un boton de Guardar
- 1 DbGrid1
DataSource:= DataSourse1

Al oprimir el Boton de Agregar
SimpleDataSet1.Insert;
se genera el nuevo registro con los campos en blanco
NO CAPTURO NADA en id_alm y tecleo datos par adescripcion

Al oprimir el boton de Guardar
SimpleDataSet1.Post;
SimpleDataSet1.ApplyUpdates(-1);

Y ENTONCES ME DA EL SIGUIENTE ERROR
"Field 'id_alm'must have a value'
Y esto para mi es que no se ejecuta el disparador, en cambio si manualmente le doy un
valor al campo id_alm entonces lo acepta y guarda el registro sin problema.

OTRO DETALLE Q DETECTE ES QUE SI MANUALMETE YO LE DOY VALORES AL ID_ALM
Y REPITO UN VALOR DEL ID_ALMA CUANDO LO REPITO Y LE DOY GUARDAR
NO ME MANDA NINGUN MESAJE DE ERROR Y APARENTEMENTE LO ACEPTA, PERO
AL REFRESCAR LA TABLA EN REALIDAD NO REGISTRO.
LO CUAL ES CORRECTO POR QUE ES UNA RESTRICCION, POR SER UN CAMPO LLAVE.


!!!!!Por favor Alguien me podria decir que tengo q hacer para que funcione
el disparador y el valor del campo se genere automaticamente con
el generador que esta en Base de Datos.
CON DELPHI 7


GRACIAS
Atte: Norber norberto_larios@hotmail.com

kinobi 18-08-2003 23:26:30

Hola,

Cita:

Posteado originalmente por norberto_larios
PERO CON DELPHI 7 NO LO HACE,
los triggers no se ejecutan en el lado cliente, siempre se ejecutan en el lado servidor. Es decir, el trigger se ejecuta (en el servidor) en el momento en que se produce la acción que lo desencadena.

Indicas un par de problemas en tu mensaje:

1. El asunto de: "Field 'id_alm'must have a value'". Esto es debido a que tienes definido un TField para el campo "id_alm" con la propiedad Required establecida a True. Solución: cámbiala a False.

2. El tema de no ver el valor del campo (al que da valor el trigger en el servidor) al hacer el post. Esto es debido a que tu mandas el registro con un valor en el campo en cuestión que, al llegar al servidor, es machacado por el trigger. Soluciones: hay varias ...

2.1 Recuperar el valor del generador desde la aplicación cliente y asignarle allí el valor obtenido. Para obtener el valor de un generador puedes lanzar una consulta del tipo ...

Código:

select gen_id("<generador>", 1) from rdb$database
tendrás que modificar el trigger para que no te machaque el valor que tu le pasas:

Código:

CREATE TRIGGER <trigger> FOR <tabla>
BEFORE INSERT AS
BEGIN
  IF (NEW.<campo> is NULL) THEN
    NEW.<campo> = GEN_ID(<generador>, 1);
END;

2.2 No dar valor al campo en el cliente, dejando que lo haga el trigger, pero ésto implica que deberás "refrescar" (puede ser necesario relanzar la consulta asociada al DataSet) el contenido del registro tras el post.

En resumen, Delphi funciona correctamente. La cuestión es que trabajas con dos procesos (relativamente) independientes, por un lado tu aplicación (el cliente) y por otro el servidor InterBase.

Saludos.

norberto_larios 19-08-2003 18:14:08

Kinobi, Te agradezco la informacion, voy a trabajar con tus recomendaciones y ya vere si ma salen otras dudas, GRACIAS


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

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