Hola.
Cita:
Empezado por anubis
...
De todas formas, el problema que tengo es que, despues de insertar un nuevo registro, si pido ese registro el, id_producto por ejemplo, me devuelve 0 y en el dbgrid me sale en blanco.
Lo soluciono cerrando la tabla y abriendola de nuevo.
Ya probe con refresh y tampoco me lo resuelve.
|
Es que cuando Firebird incrementa el generador desde un trigger (vg.
BEFORE INSERT) el DataSet no se entera del nuevo valor asignado hasta que lo cierres y abras nuevamente.
Una cosa que podes hacer es usar la propiedad
GeneratorFielddel
TIBDataSet, ejemplo:
Código Delphi
[-]
procedure TForm1.FormCreate(Sender: TObject);
var
DS: TIBDataSet;
begin
DS := IBDataSet1;
DS.GeneratorField.Generator := 'G_TABLA';
DS.GeneratorField.Field := 'ID';
DS.GeneratorField.IncrementBy := 1;
DS.GeneratorField.ApplyEvent := gamOnPost;
end;
(Configuré la propiedad en tiempo de ejecución para clarificar, pero podes hacerlo en tiempo de diseño desde el
Inspector Object)
Hay dos cosas que olvidé mencionarte, la primera es que los componentes
IBX para Delphi hasta la versión 7.8 inclusive, no soportan la cláusula
RETURNING (no sé si es así en versiónes posteriores de
IBX).
La segunda y mas importante, es que no uses el modo del mensaje
#7
Código SQL
[-]SELECT MAX(ID_PRODUCTO) as ULTIMO_ID FROM PRODUCTO
para obtener el último identificador en un entorno multiusuario, por que fácilmente se podría generar incongruencia en los datos. Lo conveniente es solicitar la generación de un ID
Código SQL
[-]SELECT GEN_ID(G_PRODUCTO, 1) AS TENTATIVE_ID FROM RDB$DATABASE
, almacenarlo y luego utilizarlo (
Commit) o bién descartar ese valor (
Rollback).
Saludos