Estimados y admirados amigos:
Tengo un procedimiento que en teoría recorre una tabla que hoy x hoy tiene mas de 100 mil registros (Mal diseño por supuesto).
Antes de ese numero no daba ningun lio por lo que no consideraba ninguna alternativa. sucede que al intentar grabar un nuevo registro luego de unos 3 segundos sale el error "Out Of Memory".
El copdigo con el que no he tenido problema sino solo hasta ahora que sobre paso un importante numero de registros es el siguiente:
Código Delphi
[-]
procedure TFormPersonas.BitBtn7Click(Sender: TObject);
var
Current_reg, I, vCurrentRepeticion: Integer;
begin
Des;
CDSProcedimientos.DisableControls;
try
Current_reg := 0;
CDSProcedimientos.First;
while not CDSProcedimientos.EOF do
begin
for I := 0 to CDSProcedimientos.FieldCount - 1 do
begin
if ((Pos('CheckBox_', CDSProcedimientos.Fields[i].FieldName) = 0) and
(Pos('Codigo_', CDSProcedimientos.Fields[i].FieldName) = 0) and
(Pos('Valor_', CDSProcedimientos.Fields[i].FieldName) = 0) and
(Pos('Repeticiones_', CDSProcedimientos.Fields[i].FieldName) = 0) and
(Pos('Abono_', CDSProcedimientos.Fields[i].FieldName) = 0) and
(Pos('Neto_', CDSProcedimientos.Fields[i].FieldName) = 0) and
(Pos('Saldo_', CDSProcedimientos.Fields[i].FieldName) = 0) and
(Pos('Copago_', CDSProcedimientos.Fields[i].FieldName) = 0)) then
begin
if CDSProcedimientos.FieldByName('CheckBox_' + vgEntidad)
.AsBoolean then
begin
for vCurrentRepeticion := 1 to CDSProcedimientos.FieldByName
('Repeticiones_' + vgEntidad).AsInteger do
begin
Inc(Current_reg);
if Current_reg <> 1 then
DuplicarDatos(TablePersonas);
TablePersonas.Edit;
TablePersonasProcedimiento.AsString := CDSProcedimientos.Fields
[i].AsString;
TablePersonasCodigo_Procedimiento.AsInteger :=
CDSProcedimientos.FieldByName('Codigo_' + vgEntidad).AsInteger;
TablePersonasValor.AsFloat := CDSProcedimientos.FieldByName
('Valor_' + vgEntidad).AsFloat;
TablePersonasAbono.AsFloat := CDSProcedimientos.FieldByName
('Abono_' + vgEntidad).AsFloat;
TablePersonasSaldo.AsFloat := CDSProcedimientos.FieldByName
('Saldo_' + vgEntidad).AsFloat;
TablePersonasCopago.AsFloat := CDSProcedimientos.FieldByName
('Copago_' + vgEntidad).AsFloat;
TablePersonas.Post;
end;
end;
end;
end;
CDSProcedimientos.Next;
end;
CDSProcedimientos.Close;
for I := CDSProcedimientos.FieldCount - 1 downto 0 do
begin
CDSProcedimientos.Fields[i].DataSet := nil;
end;
Luego de muchas horas de busquedas y lecturas y de leer incluso que esto no se ha solucionado o que es mejor cambiar el componente; tambien he visto que se puede solucionar con simplemente cerrar y abrir donde corresponda para liberar la memoria. Lo he intentado sin un positivo. agradezco a Uds alguna sugerencia en la medida de lo posible. Mil gracias.