KAYO
03-07-2007, 17:04:24
Por alguna razon la rutina que os detallo va superlenta....., MDO con Firebird , Delphi 7 en XP.
estoy utilizando TMDOTable y tarda mas de 30 minutos en actualizar 900 registro con la siguiente rutina.
Agradezco vuestra paciencia en darme alguna pista de como optimizar esta rutina......
{Desactivo el MasterDetail}
Dm.TListasClientes.MasterSource := nil;
{filtro la tabla para que solo se contabilicen los registros NO ENTREGADOS}
Dm.TListasClientes.Filter := 'RECIBIDO = '+CHR(39)+'0'+CHR(39);
Dm.TListasClientes.Filtered := True;
DM.TListasClientes.Open;
DM.TListasClientes.Last;
{me voy al ultimo registro porque si no me aparece como si la base tuviese 0 registros para iniciar el progressbar}
ProgressBar1.Min := 0;
ProgressBar1.Max := DM.TListasClientes.RecordCount;
i := 0;
DM.TListasClientes.First;
while not DM.TListasClientes.eof do begin
i := i +1;
ProgressBar1.Position := i;
{verifico si existe en la base si existe para incrementar el aticulo y si no lo incluye}
if DM.TPedidosDetallados.Locate('NUMERO',DM.TListasClientesNumero.AsString,[loPartialKey]) then begin
DM.TPedidosDetallados.Edit;
DM.TPedidosDetalladosCantidad.AsInteger := DM.TPedidosDetalladosCantidad.AsInteger + (DM.TListasClientesCantidad.AsInteger-DM.TListasClientesCantidadRecibido.AsInteger);
DM.TPedidosDetalladosTotal.AsCurrency := DM.TPedidosDetalladosCantidad.AsInteger * DM.TPedidosDetalladosCosto.AsCurrency;
end
else begin
{busco en la base de articulos para completar datos como precios y costos}
DM.TArticulos.Locate('Numero',DM.TListasClientesNumero.AsString,[loPartialKey]);
DM.TPedidosDetallados.Insert;
DM.TPedidosDetalladosNumero.AsString := DM.TListasClientesNumero.AsString;
DM.TPedidosDetalladosCantidad.AsInteger := DM.TListasClientesCantidad.AsInteger-DM.TListasClientesCantidadRecibido.AsInteger;
DM.TPedidosDetalladosEditorial.AsInteger := DM.TArticulosEditorial.AsInteger;
DM.TPedidosDetalladosDepartamento.AsInteger := DM.TArticulosDepartamento.AsInteger;
DM.TPedidosDetalladosProveedor.AsString := DM.TArticulosProveedor.AsString;
DM.TPedidosDetalladosLinea.AsString := DM.TArticulosLinea.AsString;
DM.TPedidosDetalladosCurso.AsString := DM.TArticulosCurso.AsString;
DM.TPedidosDetalladosDescripcion.AsString := DM.TArticulosDescripcion.AsString;
DM.TPedidosDetalladosCosto.AsCurrency := DM.TArticulosCosto.AsCurrency;
DM.TPedidosDetalladosTotal.AsCurrency := DM.TPedidosDetalladosCantidad.AsInteger * DM.TPedidosDetalladosCosto.AsCurrency;
end;
DM.TListasClientes.Next;
end;
DM.TListasClientes.Close;
DM.TListasClientes.Filtered := False;
ProgressBar1.Position := 0;
ESPERO SE ENTIENDA!!!!
estoy utilizando TMDOTable y tarda mas de 30 minutos en actualizar 900 registro con la siguiente rutina.
Agradezco vuestra paciencia en darme alguna pista de como optimizar esta rutina......
{Desactivo el MasterDetail}
Dm.TListasClientes.MasterSource := nil;
{filtro la tabla para que solo se contabilicen los registros NO ENTREGADOS}
Dm.TListasClientes.Filter := 'RECIBIDO = '+CHR(39)+'0'+CHR(39);
Dm.TListasClientes.Filtered := True;
DM.TListasClientes.Open;
DM.TListasClientes.Last;
{me voy al ultimo registro porque si no me aparece como si la base tuviese 0 registros para iniciar el progressbar}
ProgressBar1.Min := 0;
ProgressBar1.Max := DM.TListasClientes.RecordCount;
i := 0;
DM.TListasClientes.First;
while not DM.TListasClientes.eof do begin
i := i +1;
ProgressBar1.Position := i;
{verifico si existe en la base si existe para incrementar el aticulo y si no lo incluye}
if DM.TPedidosDetallados.Locate('NUMERO',DM.TListasClientesNumero.AsString,[loPartialKey]) then begin
DM.TPedidosDetallados.Edit;
DM.TPedidosDetalladosCantidad.AsInteger := DM.TPedidosDetalladosCantidad.AsInteger + (DM.TListasClientesCantidad.AsInteger-DM.TListasClientesCantidadRecibido.AsInteger);
DM.TPedidosDetalladosTotal.AsCurrency := DM.TPedidosDetalladosCantidad.AsInteger * DM.TPedidosDetalladosCosto.AsCurrency;
end
else begin
{busco en la base de articulos para completar datos como precios y costos}
DM.TArticulos.Locate('Numero',DM.TListasClientesNumero.AsString,[loPartialKey]);
DM.TPedidosDetallados.Insert;
DM.TPedidosDetalladosNumero.AsString := DM.TListasClientesNumero.AsString;
DM.TPedidosDetalladosCantidad.AsInteger := DM.TListasClientesCantidad.AsInteger-DM.TListasClientesCantidadRecibido.AsInteger;
DM.TPedidosDetalladosEditorial.AsInteger := DM.TArticulosEditorial.AsInteger;
DM.TPedidosDetalladosDepartamento.AsInteger := DM.TArticulosDepartamento.AsInteger;
DM.TPedidosDetalladosProveedor.AsString := DM.TArticulosProveedor.AsString;
DM.TPedidosDetalladosLinea.AsString := DM.TArticulosLinea.AsString;
DM.TPedidosDetalladosCurso.AsString := DM.TArticulosCurso.AsString;
DM.TPedidosDetalladosDescripcion.AsString := DM.TArticulosDescripcion.AsString;
DM.TPedidosDetalladosCosto.AsCurrency := DM.TArticulosCosto.AsCurrency;
DM.TPedidosDetalladosTotal.AsCurrency := DM.TPedidosDetalladosCantidad.AsInteger * DM.TPedidosDetalladosCosto.AsCurrency;
end;
DM.TListasClientes.Next;
end;
DM.TListasClientes.Close;
DM.TListasClientes.Filtered := False;
ProgressBar1.Position := 0;
ESPERO SE ENTIENDA!!!!