Delphi XE8?, A veces pasan cosas "raras" con el depurador y nos hace creer que la ejecución se ha detenido en una sentencia cuando en realidad se detiene en sentencias posteriores. Sugerencia: Coloca un punto de interrupción en Query6.Next. Esto con el objetivo de verificar si realmente el código se "congela" en ExecSQL.
A Tener en cuenta:
1. La observación de casimiro: al recorrer DataSet de principio a fin lo recomendado es usar
2.
NO libera el objeto
qconsr . En tu código está ocurriendo una fuga de memoria cada vez que creas el objeto
qconsr porque nunca está siendo liberado. En el código mostrado por ecfisa se ilustra una forma correcta de crear y destruir el objeto
qconsr
3. Del código se puede deducir que los componentes utilizados son BDE, por lo que supongo que utilizas tanto BDE como FireDac en la aplicación. Pregunta ¿El código funcionaba bien antes de FireDac o FireDac fue necesario para resolver otro problema?
4. Verifica el siguiente código, no probado, en el que se hace uso del while y de try-finally:
Código Delphi
[-]
Query6.Close;
Query6.Params[0].AsString := Edit_ano.Text;
Query6.Params[1].AsString := mes;
Query6.Open;
while not Query6.eof do
begin
v1 := Query6.FieldByName('reversion').AsInteger;
Table2.Open;
Table2.Insert;
Table2.FieldByName('cuenta').Value := '139905';
Table2.FieldByName('num_mov').Value := '138';
Table2.FieldByName('tipo_mov').Value := 'DT';
Table2.FieldByName('consec').Value := cons;
Table2.FieldByName('ano_mov').Value := Editano.Text;
Table2.FieldByName('mes_mov').Value := mes;
Table2.Post;
Table2.Close;
qconsr := TQuery.create(qconsr);
try
qconsr.DatabaseName := Md_comun.BD_Tesoreria.DatabaseName;
madr := 'update pagos set deter = ' + FloatToStr(v1) +
' where nrocredito = ' + Query6.FieldByName('nro_credito').AsString +
' and documento = ' + Query6.FieldByName('documento').AsString +
' and consecutivo = ' + Query6.FieldByName('consecutivo').AsString;
qconsr.SQL.Text := madr;
qconsr.ExecSQL;
finally
qconsr.free;
end;
Query6.Next;
end;
5. En un enfoque completamente alternativo, y aprovechando el
poder de las bases de datos, prueba a utilizar la sentencia
SQL MERGE, la cual te permite actualizar/modificar/borrar masivamente registros de una tabla a partir de otra tabla o de una subconsulta.