Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > SQL
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 08-03-2019
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.098
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Primero de todo, ¡¡¡bienvenido!!!
Por favor, lee nuestra guía de estilo, gracias.
No olvides usar las etiquetas para código, ejemplo:



También, cuando vayas a preguntar algo, debes crear un hilo nuevo, no escribas cualquier cosa en cualquier hilo.
Solamente debes escribir en otros hilos para contestar a los que han iniciado el mismo.

Seguidamente, en tu código, seguramente debas cambiar:
Código Delphi [-]
for cont := 1 to Query6.RecordCount do
por
Código Delphi [-]
for cont := 0 to Query6.RecordCount -1 do

Aunque lo mejor es:
Código Delphi [-]
while not query.eof do

Además veo cosas raras en tu código, estás mezclando qconsr y query6. Supongo que te has despistado y has hecho un copia/pega mal.
O lo mismo no lo he llegado a entender bien.

Última edición por Casimiro Notevi fecha: 08-03-2019 a las 22:30:45.
Responder Con Cita
  #2  
Antiguo 08-03-2019
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola.

Agregando a lo que te aconseja Casimiro, siempre que puedas, usa parámetros para evitar la inyección SQL.

Algo similar a esto:
Código Delphi [-]
var
  qconsr : TQuery;
  cont   : Integer;
begin
  Query6.First;
  while not Query6.Eof do
  begin
    for cont := 0 to Query6.RecordCount -1 do
    begin
      qconsr := TQuery.create(nil);
      try
        qconsr.DatabaseName := Md_comun.BASEDATOS.DatabaseName;
        qconsr.SQL.Clear;
        qconsr.SQL.Add('UPDATE PAGO SET DETER = P1 WHERE NROCREDITO = P2');
        qconsr.SQL.Add('AND DOCUMENTO = P3 AND CONSECUTIVO = P4');
        qconsr.ParamByName('P1').AsFloat  := v1;
        qconsr.ParamByName('P2').AsString := Query6.FieldByName('nro_credito').AsString;
        qconsr.ParamByName('P3').AsString := Query6.FieldByName('documento').AsString;
        qconsr.ParamByName('P4').AsString := Query6.FieldByName('consecutivo').AsString;
        qconsr.ExecSQL;
      finally
        qconsr.Free;
      end;
    end; // Fin For
    Query6.Next;
  end;
end;
Escribí el ejemplo sobre la marcha y no está probado, no des por sentado su correcto funcionamiento.

Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #3  
Antiguo 09-03-2019
JorgeDM JorgeDM is offline
Registrado
 
Registrado: mar 2019
Posts: 8
Poder: 0
JorgeDM Va por buen camino
Ecfisa, muchas gracias lo probaré, me tiene cabezón esa linea , no doy ni daré por sentado nada en la vida, en estos momentos solo quiero saber por qué se esta suspendiendo la actualización con SQL
Responder Con Cita
  #4  
Antiguo 09-03-2019
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.098
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por JorgeDM Ver Mensaje
... solo quiero saber por qué se esta suspendiendo la actualización con SQL
Ya te lo he contestado.
Responder Con Cita
  #5  
Antiguo 09-03-2019
orodriguezca orodriguezca is offline
Miembro
 
Registrado: ene 2009
Posts: 221
Poder: 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
  #6  
Antiguo 09-03-2019
WHILENOTEOF WHILENOTEOF is offline
Miembro
 
Registrado: mar 2008
Posts: 231
Poder: 17
WHILENOTEOF Va camino a la fama
Como se ha comentado, para recorrer el dataset es mejor con :

Código Delphi [-]
Dataset.First;
while not DataSet.Eof do
 begin
  //código
  DataSet.Next;
 end;

El poner
Código Delphi [-]
for cont := 1 to Query6.RecordCount do
o poner
Código Delphi [-]
for cont := 0 to Query6.RecordCount -1 do
, no te va a cambiar nada ya que la variable cont no la estás utilizando para nada.
Responder Con Cita
  #7  
Antiguo 10-03-2019
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.098
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por WHILENOTEOF Ver Mensaje
El poner Código Delphi [-]for cont := 1 to Query6.RecordCount do
o poner Código Delphi [-]for cont := 0 to Query6.RecordCount -1 do

, no te va a cambiar nada ya que la variable cont no la estás utilizando para nada.
Precisamente, aparte de todos los problemas que ya se han comentado por los compañeros que han respondido, ese bucle está claramente mal y es inservible.
Si hay 5 registros, el (0,1,2,3,4), al hacer ese bucle se están tratando los datos del 1 al 4, y el 0 (cero) se pierde y el 5 no leerá nada tampoco, pues no existe.
Responder Con Cita
  #8  
Antiguo 09-03-2019
JorgeDM JorgeDM is offline
Registrado
 
Registrado: mar 2019
Posts: 8
Poder: 0
JorgeDM Va por buen camino
Casimiro, muchas gracias por cada apunte ya había probado los puntos que me dice pero se sigue pausando allí, este es un ejemplo mas completo

Código Delphi [-]
with Query6 do
  begin
    Query6.Close;
    Query6.Params[0].AsString := Edit_ano.Text;
    Query6.Params[1].AsString := mes;
    Query6.Open;
  end;

v1 := 0;

  for cont := 1 to Query6.RecordCount 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 := nil;
    qconsr := TQuery.create(qconsr);
    qconsr.DatabaseName := Md_comun.BD_Tesoreria.DatabaseName;
    madr := '';
        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;
    with qconsr do
    begin
      Close;
      SQL.Clear;
      SQL.Add(madr);
      ExecSQL;
    end;
    Query6.Next;
  end;

como digo funciona bien hasta llegar al ultimo registro justo en ExecSQL muere, y me bloque al modulo
Código Delphi [-]
with qconsr do
    begin
      Close;
      SQL.Clear;
      SQL.Add(madr);
      ExecSQL;
    end;
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
No funciona bien KillFocusByReturn oscjae FireMonkey 2 20-12-2018 21:01:31
Recorrer una Dataset hacia atras IVAND Varios 4 15-05-2012 22:20:15
funciona bien en windows 7 64b pero en XP no funciona ASAPLTDA Varios 5 06-05-2011 16:24:50
Recorrer fichero txt y almacenarlo en un DataSet mamen .NET 2 24-04-2006 19:27:33
QRImage no funciona bien eljinete Impresión 4 16-12-2005 01:02:05


La franja horaria es GMT +2. Ahora son las 18:40:58.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi