Mi granito de arenta:
Un simple log puede ser un procedimiento como este:
Código Delphi
[-]
procedure TDMMain.Log(s: string);
var
F : TextFile;
FileName : string;
begin
FileName := ChangeFileExt(Application.ExeName, '.log');
AssignFile(F, FileName);
try
Append(F);
except
try
Rewrite(F);
except
on e: Exception do
ShowMessage('Error al abrir fichero : ' + FileName + #13#10 + e.Message);
end;
end;
WriteLn(F, FormatDatetime('[yyyy-mm-dd hh:nn:ss.zzz] ', Now) + s);
CloseFile(F);
end;
Prueba el bulce principal sin hacer nada y ves cuanto tarda.
Código Delphi
[-]with sqnominadetalle do
begin
close;
SQL.Clear;
SQL.Add('SELECT * FROM a2NominaDetalle');
ExecSQL;
sqnominadetalle.First;
while not sqnominadetalle.Eof do
begin
Log(sqnominadetalle.FieldByName('FNM_INTEGRANTE').AsString);
sqnominadetalle.Next;
end;
end;
Si es algo lógico (segundos), agregas la validación:
Código Delphi
[-]
with sqnominadetalle do
begin
close;
SQL.Clear;
SQL.Add('SELECT * FROM a2NominaDetalle');
ExecSQL;
sqnominadetalle.First;
while not sqnominadetalle.Eof do
begin
Log(sqnominadetalle.FieldByName('FNM_INTEGRANTE').AsString);
cedintegrante := sqnominadetalle.FieldByName('FNM_INTEGRANTE').AsString;
codconstante := sqnominadetalle.FieldByName('FNM_CONSTANTE').AsString;
fnmtipo := sqnominadetalle.FieldByName('FNM_TIPO').AsInteger;
fnmvalorperiodo := sqnominadetalle.FieldByName('FNM_VALORPERIODO').AsCurrency;
fnmvalordefault := sqnominadetalle.FieldByName('FNM_VALORDEFECTO').AsCurrency;
fnmdescripcion := sqnominadetalle.FieldByName('FNM_DESCRIPCIONPERIODO').AsString;
with sqverificardetalle do
begin
close;
ParamByName('PINTEGRANTE').AsString := cedintegrante;
ParamByName('PCONSTANTE').AsString := codconstante;
ExecSQL;
close;
end;
sqnominadetalle.Next;
end;
end;
Si sigue siente un tiempo lógico, prueba agregando le update.
Código Delphi
[-]
with sqnominadetalle do
begin
close;
SQL.Clear;
SQL.Add('SELECT * FROM a2NominaDetalle');
ExecSQL;
sqnominadetalle.First;
while not sqnominadetalle.Eof do
begin
Log(sqnominadetalle.FieldByName('FNM_INTEGRANTE').AsString);
cedintegrante := sqnominadetalle.FieldByName('FNM_INTEGRANTE').AsString;
codconstante := sqnominadetalle.FieldByName('FNM_CONSTANTE').AsString;
fnmtipo := sqnominadetalle.FieldByName('FNM_TIPO').AsInteger;
fnmvalorperiodo := sqnominadetalle.FieldByName('FNM_VALORPERIODO').AsCurrency;
fnmvalordefault := sqnominadetalle.FieldByName('FNM_VALORDEFECTO').AsCurrency;
fnmdescripcion := sqnominadetalle.FieldByName('FNM_DESCRIPCIONPERIODO').AsString;
with sqverificardetalle do
begin
close;
ParamByName('PINTEGRANTE').AsString := cedintegrante;
ParamByName('PCONSTANTE').AsString := codconstante;
ExecSQL;
if not sqverificardetalle.IsEmpty then
begin
with squpdatenomina do
begin
ParamByName('PTIPO').AsInteger := fnmtipo;
ParamByName('PCONSTANTE').AsString := codconstante;
ParamByName('PINTEGRANTE').AsString := cedintegrante;
ParamByName('PVALOR1').AsCurrency := fnmvalordefault;
ParamByName('PVALOR2').AsCurrency := fnmvalorperiodo;
ParamByName('PPERIODO').AsString := fnmdescripcion;
ExecSQL;
close;
end
end;
close;
end;
sqnominadetalle.Next;
end;
end;
Si todo está en un tiempo lógico, el problema estará en el INSERT o en UPDATE final que haces.
Finalmente, trata de traerte todo lo que necesites en el primer SELECT.
Con algo así solo deberás ver si el campo existe_integrante contiene algo o es nulo/cero y te ahorras un SQL por cada vuelta de bucle.
Código SQL
[-]
select n.*,
(select first 1 integrante
from detalle
where
integrante = n.fnm_integrante and
constante = n.fnm_cosntante) as existe_integrante
from a2nominadetalle n