Ver Mensaje Individual
  #6  
Antiguo 09-03-2019
orodriguezca orodriguezca is offline
Miembro
 
Registrado: ene 2009
Posts: 221
Reputación: 16
orodriguezca Va por buen camino
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
Código Delphi [-]
while not query.eof do
2.
Código Delphi [-]
qconsr := nil
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.
Responder Con Cita