PDA

Ver la Versión Completa : actualización de tablas tras un Post


Giniromero
04-07-2003, 12:05:28
Hola.

estoy usando delphi6 e interbase 7.

En una parte de mi aplicación, al pulsar un botón, se inserta, en un nuevo registro de mi tabla econo, varios campos y se muestra la ventana para pagar.

Haciendo doble click sobre el grid de esta ventana, me selecciona, lo que quiero tramitar, de lo que hay pendiente de pago para un cliente.

Una vez seleccionado el pago que quiero realizar, damos a aceptar, y se guardan los datos del registro que habiamos
insertado.

De este registro, tenemos que tomar inmediatamente despues, el valor que toma el campo CODIGO, que es un campo auto numérico, y que adquiere su valor de un generador que tiene asociado directamente en la base de datos interbase.

El caso es que, al hacer el post, no se actualiza directamente , y si pongo un refresh a esa tabla, se me situa en el primer registro, no en el que acabo de insertar, por lo que el valor que toma en ese caso, no es el que yo necesito.

¿Hay alguna forma de guardar este registro, y que se actualizen los datos que se generan desde la base de datos, directamente en la tabla de Delphi, sin que se me cambie de registro?

Necesito ayuda.....

Alguna idea???:(

Muchas gracias de ante mano.

Virginia

jachguate
04-07-2003, 12:56:40
Si estas conectado via BDE (que no lo mencionas), y el campo CODIGO es parte de la llave primaria, no hay forma de hacer lo que pedis... pues el BDE se basa en la llave primaria para identificar al registro.

El comportamiento es que al hacer un POST, el BDE, luego de recibir de nuevo el control, relee el registro de la base de datos (digamos, genera un Select * from tabla where llaveprimaria = llaveprimaria antes de actualizar).

De alli, que si el valor de esta cambia durante el post (mediante triggers), el BDE pierde el registro y te situa al inicio de la tabla.

Lo que si podes hacer para evitar esto, es llamar vos directamente al generador, digamos en el evento BeforePost de la tabla, y asignarle el valor dentro del mismo BDE.

Yo lo hago normalmente llamando a un stored procedure, que obtiene el valor del generador y lo devuelve en un parámetro.

y en el evento BeforePost hago algo cómo:



Procedure Table1BeforePost(aDataSet : TDataSet);

Begin
if (Table1.State = dsInsert) and (Table1CODIGO.IsNull) Then
Begin
spObtieneCodigoTable1.ExecProc;
Table1CODIGO.AsInteger := spObtieneCodigoTable1.ParamByName('aID').AsInteger;
end;
end;


la idea es esa...

Hasta luego

;)

rafadrover
14-08-2003, 18:32:43
Sabeis si se puede solucionar este problema utilizando los componentes de interbase?

Gracias.

jachguate
18-08-2003, 20:31:39
Supongo que el procedimiento es el mismo... :(

Cabanyaler
19-08-2003, 10:49:26
Debes percatarte de que el código autonumérico se incrementa una vez hecho el post, por lo que, como tantas veces hemos comentado la naturaleza de este tipo de campos no es aconsejable para su posterior utilización en claves ajenas p.e. en tablas master:detail.
Para ello busca otra clave alternativa aunque debas hacerlo manualmente la simulación de este tipo de campos.

Suerte.