FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
|||
|
|||
actualización de tablas tras un Post
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
__________________
Sonrie al mundo, y el mundo te sonreirá :) Última edición por Giniromero fecha: 04-07-2003 a las 12:11:26. |
#2
|
||||
|
||||
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: Código:
Procedure Table1BeforePost(aDataSet : TDataSet); Begin if (Table1.State = dsInsert) and (Table1CODIGO.IsNull) Then Begin spObtieneCodigoTable1.ExecProc; Table1CODIGO.AsInteger := spObtieneCodigoTable1.ParamByName('aID').AsInteger; end; end; Hasta luego
__________________
Juan Antonio Castillo Hernández (jachguate) Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate |
#3
|
|||
|
|||
Sabeis si se puede solucionar este problema utilizando los componentes de interbase?
Gracias. |
#4
|
||||
|
||||
Supongo que el procedimiento es el mismo...
__________________
Juan Antonio Castillo Hernández (jachguate) Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate |
#5
|
||||
|
||||
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.
__________________
El meu país és tan petit, que des de dalt d'un campanar es pot veure el campanar veí. |
|
|
|