Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > Firebird e Interbase
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

 
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 24-08-2003
ElSanto24 ElSanto24 is offline
Miembro
 
Registrado: ago 2003
Ubicación: Elche
Posts: 14
Poder: 0
ElSanto24 Va por buen camino
porqué es tan dificil actualizar la informacion en interbase?

Hola a todo el mundo que lea esto:

Soy un verdadero newbie en esto de postear en foros y mas newbie todavia en lo que se refiere a desarrollos clientes/servidor en delphi...desgraciadamente me he visto obligado a dar un salto cuantitativo desde delphi3 y sus tablas paradox a Delphi 7 e interbase para hacer algo serio...así que he de reciclarme en poco tiempo y, aunque lo hago de buena gana y he leido mucha documentacion que me ha servido bastante (la cara oculta de delphi) pues aun me surgen cantidad de dudas que si alguien ya ha resuelto me gustaria que me ayudara y de todo corazón se lo agradeceré:

La interfaz de mi aplicacion ya está hecha así que para mi aprendizaje estoy haciendo pruebas con tan solo una tabla, cuando mis dudas desaparezcan...continuaré con seguridad el resto de la aplicacion (una filosofia como otra cualquiera...creo yo)

En fin...ahí va mi duda!


Tengo una tabla que tan solo tiene 2 campos, uno que es el CodId y otro que es descripcion, CodId es la pkey.
He creado un generador para crear autovalores para codId y el procedure asociado que llama a gen_id(nombregenerador,incremento)....hasta ahí todo es correcto.

En cuanto a los componentes que utilizo, tengo un database que se engancha con mi BD,un ibtransaction enganchado al database,un ibdataset enganchado al database y al ibtransaction, un ibstoredproc para poder obtener el valor del autoincremental (CodId), y finalmente tengo un datasource que engancha con los VCL´s (en este caso un par de dbedits y un dbgrid).

En fin....defino para el ibdataset los campos selectsql modifysql deletesql insertsql y REFRESHSQL (lo pongo en mayusculas porque este es el origen de mi quebradero de cabeza)

he leido que para rellenar la sentencia refreshsql debo hacer algo como
select * from MItabla
where CodId=:CodId (otra version de lo mismo: where CodId=:new_CodId)

El problema es QUE NO ACTUALIZA LA INFORMACIÓN!!!!!
es decir....
en el afterpost y afterdelete hago uso de los commitretaining etc...tal y como he leido en otros foros y en la cara oculta...

Abro mi aplicacion 2 veces en mi maquina (simulando concurrencia o si dos clientes atacaran a mi server) cuando modifico la info de la tabla, la guardo, en esa ventana la info aparece, pero sin embargo en la ventana del "otro usuario" no aparece ni siquiera cuando le doy tb a refresh, (teniendo en cuenta que se ha llamado a commit)....cual es el problema de esto?????

Tambien he leido que utilizando post_events y triggers se podria obtener el mismo resultado porque cuando actualizas el server (after update) se supone que lanza el trigger y ahí se supone que lanzará el evento (tengo insertado el componente ibEventAlerter que se supone que capturará el evento y que me permitirá hacer lo que me plazca....) PUES NOP!!!! es como si el evento nunca se lanzara porque pongo como prueba showmessages y no los visualiza (en el evento EventAlert del componente) y he configurado correctamente (creo el componente)

Alguie podria arrojar luz a esta gran duda que me preocupa??? por qué no funciona???? hay alguien que haya necesitado actualizar la informacion y el refesh le funcione o el post_event??? si fuera así....por favor, escribidme a mi mail o por aki como lo haceis porque de verdad estoy bastante preocupado al no saber ninguna alternativa a todo esto.

Os voy a poner el código que tengo implementado, a ver si quizas el problema sea que no lo estoy escribiendo bien:

procedure TFFPago.FormCreate(Sender: TObject);
begin
ibtransaction1.StartTransaction;
ibdataset1.Close;
ibdataset1.Open;
ibevents1.Registered:=true;
end;

procedure TFFPago.FormDestroy(Sender: TObject);
begin
if ibtransaction1.InTransaction then
ibtransaction1.commit;

end;

procedure TFFPago.IBDataSet1AfterInsert(DataSet: TDataSet);
begin
ibstoredproc1.ExecProc;
ibdataset1codId.Value:=ibstoredproc1.Params[0].asinteger;
end;


procedure TFFPago.IBDataSet1AfterPost(DataSet: TDataSet);
begin
try
ibtransaction1.CommitRetaining;
except
ibtransaction1.RollbackRetaining;
end;
end;

procedure TFFPago.IBDataSet1AfterDelete(DataSet: TDataSet);
begin
try
ibtransaction1.CommitRetaining;
except
ibtransaction1.RollbackRetaining;
end;
end;

procedure TFFPago.IBEvents1EventAlert(Sender: TObject; EventName: String;
EventCount: Integer; var CancelAlerts: Boolean);
begin
ibdataset1.close;
showmessage('cierro');
ibdataset1.open;
showmessage('abro?');
end;


Gracias a todos los que leais este post por vuestro interes y gracias en especial a quien me pueda ayudar con este tema
Un saludo
__________________
El camino para llegar al conocimiento de las cosas pasa por el aprendizaje humilde de lo que nos rodea
Responder Con Cita
 



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 15:22:03.


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