Ver Mensaje Individual
  #2  
Antiguo 14-06-2003
mosorio mosorio is offline
Miembro
 
Registrado: may 2003
Posts: 159
Reputación: 22
mosorio Va por buen camino
Hola delphoros!

Creo que esta vez me contestaré a mi duda, y espero le sirva a todos los que han tenido y tendrán esta misma.
He utilizado un procedimiento almacenado en la BD sencillo que ejecuta un generador:

Cita:
create procedure Gen_Codigo
returns (Id Integer) as
begin
Id = Gen_Id(<NombreGenerador>, 1);
end^

:. NombreGeberador es el generador creado para cada una de las tablas o id que necesitan incremento.
Ahora en el programa Delphi, en el datamódulo se inserta un componente SP sin asignarle el procedimiento almacenado, esto para reutilizarlo con los otros.

Se crea una function para ejecutar el SP y retornar el valor:

Cita:
function TdmPrg.EjecutarGenerador(NombreGen: String): Integer;
begin
spGenerador.Close;
spGenerador.StoredProcName := NombreGen;
spGenerador.ExecProc;

Result := spGenerador.Params[0].AsInteger;
end;

procedure TdmPrg.cdsTipoIVAAfterInsert(DataSet: TDataSet);
begin
cdsTipoIVA.FieldByName('IDTIPOIVA').AsInteger := EjecutarGenerador('GEN_IDTIPOIVA');
end;
Y en CDS en el evento despues de insertar capturamos el valor para ser asignado al componente dbe que ha sido enlazado con el datasource.
Ahora la respuesta es mucho más rápida y no se nota la asignación.
Yo estoy trabajando en el mismo pc y tengo instalado un SO de servidor, esta tardanza era bastante preocupante ya que en el mismo pc daba el retardo, no quería imaginar cuando se hicieran las pruebas en red a otros pc.
Lógico esta que al cancelar una inserción se perderá el consecutivo, pero esto lo controlaré más adelante en la misma BD realizando los controles de actualiación en cascada y otras cositas que he estado viendo en el motor FireBird, IB y el libro de La cara Oculta de Delphi 4

Gracias y espero les sirva.
Responder Con Cita