Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Conexión con bases de datos
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Conexión con bases de datos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 18-08-2003
norberto_larios norberto_larios is offline
Miembro
 
Registrado: ago 2003
Ubicación: Mexico, D.F.
Posts: 15
Poder: 0
norberto_larios Va por buen camino
Question 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
Responder Con Cita
  #2  
Antiguo 18-08-2003
Avatar de kinobi
kinobi kinobi is offline
Miembro
 
Registrado: may 2003
Posts: 2.621
Poder: 23
kinobi Va por buen camino
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.

Última edición por kinobi fecha: 18-08-2003 a las 23:31:51.
Responder Con Cita
  #3  
Antiguo 19-08-2003
norberto_larios norberto_larios is offline
Miembro
 
Registrado: ago 2003
Ubicación: Mexico, D.F.
Posts: 15
Poder: 0
norberto_larios Va por buen camino
Smile

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


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

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


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


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