Estaría bien que explicaras un poco lo que deseas hacer, facilita el que los demás puedan entenderlo, más que tener que revisar el código.
Por otro lado das pocos datos para saber dónde está la parte que "tarda demasiado".
Lo primero sería añadir un
log de tiempo a ese código para saber qué parte está tardando.
También estaría bien saber de cuantos registros hablamos (en cada uno de los Datasets -sqnominadetalle, sqverificardetalle, squpdatenomina, dbtsdetallenomina,...-).
Una vez que añadas los de tiempos y sepas qué parte tarda, se pueden revisar si faltan índices en las tablas para las búsquedas (por ejemplo).
Por otro lado veo que primero ejecutas una consulta con
sqnominadetalle y para cada registro que recorres con un
while, realizas una nueva búsqueda con
sqverificardetalle, utilizando los parámetros
PINTEGRANTE y
PCONSTANTE.
Código Delphi
[-]
while not sqnominadetalle.Eof do
begin
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;
...
Deberías intentar realizar eso utilizando una única consulta con una
JOIN, De esa forma aunque la consulta será más costosa, pero te evitarás lanzar las consultas de dentro del WHILE.
Se puede seguir, pero es un poco dar palos de ciego sin saber más detalles...