Club Builder - Foros de discusión Club Builder
Foro de C++Builder en español
 
 FAQFAQ   BuscarBuscar   MiembrosMiembros   Grupos de UsuariosGrupos de Usuarios   RegistrarseRegistrarse 
 PerfilPerfil   Entra para ver tus mensajes privadosEntra para ver tus mensajes privados   EntrarEntrar 

Un error que no puedo solucionar

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Bases de Datos
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: Un error que no puedo solucionar Responder citando

Hola gente, un saludo a todos...

Bueno tengo el siguiente problema, una aplicación que estoy haciendo (c++ builder 2007 y Firebird-2.0.0.12748) acceden a una base de datos, hasta acá ningún drama, la cosa es que cuando hago una modificación (insert, delete o update) en la tabla, aveces se dispara el trigger y aveces no, y si tengo 2 instancias de la aplicación abierta y se dispara el trigger al hacer una modificación, solo registra el evento la aplicación que hizo dicha modificación.

Agrego un poco de estructuras para que vean si no es un error conceptual mio. (una aclaración, la base de datos esta echa con SQL MANAGER 2005)

Código:

  CREATE TABLE ARTICULO (
  CODIGO INTEGER DEFAULT 0 NOT NULL,
  NOMBRE VARCHAR(35) CHARACTER SET ISO8859_3 DEFAULT '' NOT NULL COLLATE ISO8859_3,
  FECHA DATE,
  PRECIO DOUBLE PRECISION DEFAULT 0.0 NOT NULL,
  DESCRIPCION VARCHAR(100) CHARACTER SET ISO8859_3 COLLATE ISO8859_3);


SET TERM ^ ;

CREATE TRIGGER ARTICULO_BI FOR ARTICULO
ACTIVE BEFORE INSERT
POSITION 0
AS
BEGIN
  /* Trigger body */
  NEW.CODIGO=GEN_ID(G_CODIGO,1);
END^

SET TERM ; ^

SET TERM ^ ;

CREATE TRIGGER BORRAR_ART FOR ARTICULO
ACTIVE AFTER DELETE
POSITION 0
AS
BEGIN
  /* Trigger body */
  POST_EVENT 'del_reg';
END^

SET TERM ; ^

SET TERM ^ ;

CREATE TRIGGER MODIFICAR_ART FOR ARTICULO
ACTIVE AFTER UPDATE
POSITION 0
AS
BEGIN
  /* Trigger body */
  POST_EVENT 'mod_reg';
END^

SET TERM ; ^

SET TERM ^ ;

CREATE TRIGGER NUEVO_ART FOR ARTICULO
ACTIVE AFTER INSERT
POSITION 0
AS
BEGIN
  /* Trigger body */
  POST_EVENT 'new_reg';
END^

SET TERM ; ^


Bueno esa es la BD.
y en mi aplicación utilizo un IBTransaction, un IBDatabase, IBQuery, IBEvents...

el IBEvents lo registro al abrir la aplicacion

Código:
 
  this->IBEvents1->Events->Add("new_reg");
  this->IBEvents1->Events->Add("del_reg");
  this->IBEvents1->Events->Add("mod_reg");
  this->IBEvents1->RegisterEvents();


y en OnEventAlert del mismo tengo una ShowMessage que me avisa que hay cambios.

un poco de codigo que tengo al insertar un articulo

Código:

  IBQuery1->Active=false;
  IBQuery1->SQL->Clear();
  IBQuery1->SQL->Add("Insert Into ARTICULO (CODIGO,NOMBRE,PRECIO,FECHA,DESCRIPCION) Values (:COD,:NOM,:PRE,:FEC,:DES)");
  IBQuery1->ParamByName("COD")->AsInteger=StrToInt(Edit1->Text);
  IBQuery1->ParamByName("NOM")->Text=Edit2->Text;
  IBQuery1->ParamByName("PRE")->AsFloat=StrToFloat(Edit3->Text);
  IBQuery1->ParamByName("FEC")->AsDate=this->DateTimePicker1->Date.FormatString("dd/mm/yyyy");
  IBQuery1->ParamByName("DES")->Text=Memo1->Text;
  IBQuery1->Prepare();
  IBQuery1->ExecSQL();
  Form1->IBTransaction1->Commit();
  Form1->IBDatabase1->Close();
  Form1->IBDatabase1->Open();
  Form1->IBTransaction1->Active=true;
  Form1->IBQuery1->Open();


uso de forma similar el query para los delete y los update.. pero sigue el problema.. desde ya muchas gracias y el que tenga una solucion que me avise xq estoy quedando loco con esto jaja.. un abrazo..
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Creo que la manera que estas estableciendo el query y la forma de trabajarlo es incorrecta o al menos a mi parecer asi estoy viendo.

Analizando tu código ve lo siguiente.
Código:
IBQuery1->Active=false; // ok
  IBQuery1->SQL->Clear(); // ok
  IBQuery1->SQL->Add("Insert Into ARTICULO (CODIGO,NOMBRE,PRECIO,FECHA,DESCRIPCION) Values (:COD,:NOM,:PRE,:FEC,:DES)");
  IBQuery1->ParamByName("COD")->AsInteger=StrToInt(Edit1->Text);
  IBQuery1->ParamByName("NOM")->Text=Edit2->Text;
  IBQuery1->ParamByName("PRE")->AsFloat=StrToFloat(Edit3->Text);
  IBQuery1->ParamByName("FEC")->AsDate=this->DateTimePicker1->Date.FormatString("dd/mm/yyyy");
  IBQuery1->ParamByName("DES")->Text=Memo1->Text;
  IBQuery1->Prepare(); // ok
  IBQuery1->ExecSQL(); // ok
  Form1->IBTransaction1->Commit();  //??
  Form1->IBDatabase1->Close(); //??
  Form1->IBDatabase1->Open(); //??
  Form1->IBTransaction1->Active=true;
  Form1->IBQuery1->Open();//??


viendo esta forma considero que debes hacerlo de la siguiente manera
1.- Abrir la base de datos
Form1->IBDatabase1->Open();
2.- Activar las transacciones
Form1->IBTransaction1->Active=true;
3.-Realizar tus operaciones
IBQuery1->Active=false;
IBQuery1->SQL->Clear();
IBQuery1->SQL->Add("Insert Into ARTICULO (CODIGO,NOMBRE,PRECIO,FECHA,DESCRIPCION) Values (:COD,:NOM,:PRE,:FEC,:DES)");
IBQuery1->ParamByName("COD")->AsInteger=StrToInt(Edit1->Text);
IBQuery1->ParamByName("NOM")->Text=Edit2->Text;
IBQuery1->ParamByName("PRE")->AsFloat=StrToFloat(Edit3->Text);
IBQuery1->ParamByName("FEC")->AsDate=this->DateTimePicker1->Date.FormatString("dd/mm/yyyy");
IBQuery1->ParamByName("DES")->Text=Memo1->Text;
IBQuery1->Prepare();
IBQuery1->ExecSQL();

4.- ¿Y si quieres? cerrar la conexion de la base de datos
Form1->IBDatabase1->Close();

Esto es que para que los Triggers actuen debe estar conectada la base datos y lo que hace es que primero generas sentencias que actuan en la segunda vez que activas la base de datos, aun cuando las hayas generado primero.

Saludos.
_________________
Cool
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: Responder citando

Muchas gracias por la resouesta, voy a probarlo y estaré comentando si por ahi viene mi error o no.. gracias nuevamente...
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

La verdad que gracias, no me hubiese dado cuenta...
esta perfecto lo que me has dicho, solo que al final agrego

Código:
Form1->IBTransaction1->CommitRetaining();


para que ejecute las transacciones y se mantenga abierta la Base..
Muchísimas gracias Cesar
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mostrar mensajes de anteriores:   
Cambiar a:  
No puedes publicar temas nuevos en este foro
No puedes responder a temas en este foro
No puedes editar tus mensajes en este foro
No puedes borrar tus mensajes en este foro
No puedes votar en las encuestas de este foro


Hosting WordPress Indedmedia desde 3,99 €
© 2002–2026 Club Builder · Funciona con phpBB.