 |
Club Builder Foro de C++Builder en español
|
| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
Schweiko Lt JG

Registrado: 05 Jun 2008Mensajes: 65Ubicación: Argentina - Misiones
|
Publicado: Vie 04 Sep, 2009 12:00 am Asunto: Un error que no puedo solucionar |
|
|
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 |
|
 |
Cesar C. Salazar Gonzalez Master


Registrado: 01 Oct 2002Mensajes: 2155Ubicación: San Cristóbal de Las Casas, Chiapas
|
Publicado: Vie 04 Sep, 2009 6:50 am Asunto: |
|
|
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. _________________
 |
|
| Volver arriba |
|
 |
Schweiko Lt JG

Registrado: 05 Jun 2008Mensajes: 65Ubicación: Argentina - Misiones
|
Publicado: Vie 04 Sep, 2009 5:01 pm Asunto: |
|
|
| Muchas gracias por la resouesta, voy a probarlo y estaré comentando si por ahi viene mi error o no.. gracias nuevamente... |
|
| Volver arriba |
|
 |
Schweiko Lt JG

Registrado: 05 Jun 2008Mensajes: 65Ubicación: Argentina - Misiones
|
Publicado: Vie 04 Sep, 2009 7:03 pm Asunto: |
|
|
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 |
|
 |
|
|
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
|
© 2002–2026 Club Builder · Funciona con phpBB.
|