Yo antes lo hacia de esa manera, pero es un desastre. La mejor forma de hacerlo: Olvidate de la base de datos hasta el momento de grabar
Manten todo en memoria (usa objetos) y luego mandas todo a grabar, en una transaccion
Piensa en codigo de este estilo:
Código Delphi
[-]
var
f: TFactura;
d: TDetalle;
begin
f := TFactura.Create;
f.Cliente :=
d := f.AgregarDetalle;
d.Producto :=
GrabarFactura(f);
end;
procedure GrabarFactura(f: TFactura);
var
IdCabecera: Integer;
begin
IniciarTrans;
try
IdCabecera := GrabarCabecera;
GrabarDetalle(IdCabecera, f.Detalle);
Commit;
except
Rollback;
raise;
end;
end;