Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (https://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   update del query4 dentro de un while (https://www.clubdelphi.com/foros/showthread.php?t=81577)

angel.sosa 27-11-2012 01:03:45

update del query4 dentro de un while
 
hola amigos tengo un problema que no tengo idea de que hacer, tengo un cliclo while que se encarga de recorrer los datos desplegados en un DBgrid, el cual utiliza una combinación de datos de varias tablas mediante un IBQuery1. todo eso se despliega mediante un boton "Consultar".
el problema es q tengo un boton modificar que debe recorrir la informacion filtrada y desplegada en el DBgrid.
Pero al intentar Actualizar con otro IBQuery4 al cumplirse la condicion deseada me marca "Token UNkNOWn" Line 2.1

Código Delphi [-]
while not IBQuery1.Eof do
begin
  if((StrToInt(IBQuery1.FieldByName('DIAS_EN_PAGAR').AsString) > 50) And (StrToInt(IBQuery1.FieldByName('DIAS_EN_PAGAR').AsString) <= 10000) And (IBQuery1.FieldByName('POLITICA_ACTUAL').AsString <> '7') And (IBQuery1.FieldByName('POLITICA_ACTUAL').AsString <> 'TELEMARKETING')) then
   begin
   ShowMessage('Encontre uno Sin Descuento ' + IBQuery1.FieldByName('CLAVE_CTE').AsString);
   IBQuery4.SQL.Add('UPDATE PRECIOS_CLI_CLI');
   IBQuery4.SQL.Add('SET POLITICA_DSCTO_ART_CLI_ID = '+ Char(39)+'48'+Char(39)+' ');
   IBQuery4.SQL.Add('WHERE CLAVE_CLIENTE ='+Char(39)+ IBQuery1.FieldByName('CLAVE_CTE').AsString +Char(39)+ ' ');
   IBQuery4.Open;
   end;
    if((StrToInt(IBQuery1.FieldByName('DIAS_EN_PAGAR').AsString) > 40) And (StrToInt(IBQuery1.FieldByName('DIAS_EN_PAGAR').AsString) <= 50) And (IBQuery1.FieldByName('POLITICA_ACTUAL').AsString <> '7') And (IBQuery1.FieldByName('POLITICA_ACTUAL').AsString <> 'TELEMARKETING')) then
   begin
   ShowMessage('Encontre un DESCUENTO 4' + IBQuery1.FieldByName('CLAVE_CTE').AsString);
   IBQuery4.SQL.Add('UPDATE PRECIOS_CLI_CLI');
   IBQuery4.SQL.Add('SET POLITICA_DSCTO_ART_CLI_ID = '+ Char(39)+'11246'+Char(39)+' ');
   IBQuery4.SQL.Add('WHERE CLAVE_CLIENTE ='+Char(39)+ IBQuery1.FieldByName('CLAVE_CTE').AsString +Char(39)+ ' ');
   IBQuery4.Open;
   end;
   if((StrToInt(IBQuery1.FieldByName('DIAS_EN_PAGAR').AsString) > 30) And (StrToInt(IBQuery1.FieldByName('DIAS_EN_PAGAR').AsString) <= 40) And (IBQuery1.FieldByName('POLITICA_ACTUAL').AsString <> '7') And (IBQuery1.FieldByName('POLITICA_ACTUAL').AsString <> 'TELEMARKETING')) then
   begin
   ShowMessage('Encontre un DESCUENTO 3' + IBQuery1.FieldByName('CLAVE_CTE').AsString);
   IBQuery4.SQL.Add('UPDATE PRECIOS_CLI_CLI');
   IBQuery4.SQL.Add('SET POLITICA_DSCTO_ART_CLI_ID = '+ Char(39)+'11245'+Char(39)+' ');
   IBQuery4.SQL.Add('WHERE CLAVE_CLIENTE ='+Char(39)+ IBQuery1.FieldByName('CLAVE_CTE').AsString +Char(39)+ ' ');
   IBQuery4.Open;
   end;

 IBQuery1.Next;
end;

olbeup 27-11-2012 08:37:29

DIAS_EN_PAGA,
POLITICA_DSCTO_ART_CLI_ID,
CLAVE_CLIENTE,
CLAVE_CTE

Todos estos campos son Numéricos creo yo, porque lo pasa a Alfanuméricos y sino es así, porque defines campos Alfanuméricos cuanto tenían que ser Numéricos.

Creo que el problema está en SET y WHERE de cada uno de los UPDATE
Código Delphi [-]
IBQuery4.SQL.Add('SET POLITICA_DSCTO_ART_CLI_ID = '+ Char(39)+'48'+Char(39)+' ');

Un saludo.

Casimiro Notevi 27-11-2012 11:47:26

Sólo tienes que poner un breakpoint en las sentencias .open y mirar lo que contiene antes de ejecutarlo.

olbeup 27-11-2012 14:25:02

También puede poner un ShowMessage(IBQuery4.SQL.Text) antes del .Open haber lo que muestra.

Un saludo.

Casimiro Notevi 27-11-2012 15:52:49

Cita:

Empezado por olbeup (Mensaje 450641)
También puede poner un ShowMessage(IBQuery4.SQL.Text) antes del .Open haber lo que muestra.

Hombre, sí, puede hacer eso, que es precisamente lo que se hacía hace 20 ó 30 años, cuando yo empezaba y no teníamos herramientas ni utilidades como las de ahora, en las que no tienes que teclear nada para depurar un programa, como el caso este en el que estamos, ¿para qué sirve el depurador, los puntos de ruptura, la posibilidad de avanzar paso a paso el programa, etc.?, se lo podían ahorrar ;)

angel.sosa 27-11-2012 19:36:36

listo ya esta resuelto

Código Delphi [-]
while not IBQuery1.Eof do
begin
  if((StrToInt(IBQuery1.FieldByName('DIAS_EN_PAGAR').AsString) > 50) And (StrToInt(IBQuery1.FieldByName('DIAS_EN_PAGAR').AsString) <= 10000) And (IBQuery1.FieldByName('POLITICA_ACTUAL').AsString <> '7') And (IBQuery1.FieldByName('POLITICA_ACTUAL').AsString <> 'TELEMARKETING')) then
   begin
   ShowMessage('Encontre uno Sin Descuento ' + IBQuery1.FieldByName('CLAVE_CTE').AsString);
   IBQuery4.SQL.Add('UPDATE PRECIOS_CLI_CLI');
   IBQuery4.SQL.Add('SET POLITICA_DSCTO_ART_CLI_ID = '+ Char(39)+'48'+Char(39)+' ');
   IBQuery4.SQL.Add('WHERE CLAVE_CLIENTE ='+Char(39)+ IBQuery1.FieldByName('CLAVE_CTE').AsString +Char(39)+ ' ');
   IBQuery4.ExecSQL;
   end;
    if((StrToInt(IBQuery1.FieldByName('DIAS_EN_PAGAR').AsString) > 40) And (StrToInt(IBQuery1.FieldByName('DIAS_EN_PAGAR').AsString) <= 50) And (IBQuery1.FieldByName('POLITICA_ACTUAL').AsString <> '7') And (IBQuery1.FieldByName('POLITICA_ACTUAL').AsString <> 'TELEMARKETING')) then
   begin
   ShowMessage('Encontre un DESCUENTO 4' + IBQuery1.FieldByName('CLAVE_CTE').AsString);
   IBQuery4.SQL.Add('UPDATE PRECIOS_CLI_CLI');
   IBQuery4.SQL.Add('SET POLITICA_DSCTO_ART_CLI_ID = '+ Char(39)+'11246'+Char(39)+' ');
   IBQuery4.SQL.Add('WHERE CLAVE_CLIENTE ='+Char(39)+ IBQuery1.FieldByName('CLAVE_CTE').AsString +Char(39)+ ' ');
  IBQuery4.ExecSQL;
   end;
   if((StrToInt(IBQuery1.FieldByName('DIAS_EN_PAGAR').AsString) > 30) And (StrToInt(IBQuery1.FieldByName('DIAS_EN_PAGAR').AsString) <= 40) And (IBQuery1.FieldByName('POLITICA_ACTUAL').AsString <> '7') And (IBQuery1.FieldByName('POLITICA_ACTUAL').AsString <> 'TELEMARKETING')) then
   begin
   ShowMessage('Encontre un DESCUENTO 3' + IBQuery1.FieldByName('CLAVE_CTE').AsString);
   IBQuery4.SQL.Add('UPDATE PRECIOS_CLI_CLI');
   IBQuery4.SQL.Add('SET POLITICA_DSCTO_ART_CLI_ID = '+ Char(39)+'11245'+Char(39)+' ');
   IBQuery4.SQL.Add('WHERE CLAVE_CLIENTE ='+Char(39)+ IBQuery1.FieldByName('CLAVE_CTE').AsString +Char(39)+ ' ');
   IBQuery4.ExecSQL;
   end;

 IBQuery1.Next;
  IBQuery4.SQL.Clear;
end;

tenia que limpiar el IBQuery4 para cada una de las vueltas. y en vez de usar IBQuery4.Open use IBQuery.ExecSQL.

egostar 27-11-2012 19:47:24

Cita:

Empezado por Casimiro Notevi (Mensaje 450645)
Hombre, sí, puede hacer eso, que es precisamente lo que se hacía hace 20 ó 30 años, cuando yo empezaba y no teníamos herramientas ni utilidades como las de ahora, en las que no tienes que teclear nada para depurar un programa, como el caso este en el que estamos, ¿para qué sirve el depurador, los puntos de ruptura, la posibilidad de avanzar paso a paso el programa, etc.?, se lo podían ahorrar ;)

jeje, yo suelo hacerlo aún amigo Casi, normalmente genero las consultas (que normalmente son kilométricas) en tiempo de ejecución y coloco un showMessage() para hacer un "copy & paste" y evaluarla en un manejador de consultas. :)

Saludos

Casimiro Notevi 27-11-2012 19:54:02

Con el 'breakpoint' puedes también copiar y pegar, y te ahorras de escribir código :)

egostar 27-11-2012 20:11:54

Cita:

Empezado por Casimiro Notevi (Mensaje 450669)
Con el 'breakpoint' puedes también copiar y pegar, y te ahorras de escribir código :)

Si, claro, pero a veces.... no regresa completo el valor. :)

Saludos

Casimiro Notevi 27-11-2012 20:21:27

Cita:

Empezado por egostar (Mensaje 450674)
Si, claro, pero a veces.... no regresa completo el valor. :)

:eek: Eso me pasaba con sqls muuuuy largos, en delphi 5, pero con versiones superiores no me ha pasado nunca.

egostar 27-11-2012 20:29:33

Cita:

Empezado por Casimiro Notevi (Mensaje 450676)
:eek: Eso me pasaba con sqls muuuuy largos, en delphi 5, pero con versiones superiores no me ha pasado nunca.

Cita:

Empezado por mi mismo
normalmente genero las consultas (que normalmente son kilométricas)

Yo uso D2007 y a veces me pasa, además de que la depuración en mi máquina es terrible y mientras no me la cambien pues seguiré usando el arcaico showMessage(), nada pasa pues, una linea no es nada :)

Saludos

olbeup 28-11-2012 08:36:09

Cita:

Empezado por Casimiro Notevi (Mensaje 450645)
Hombre, sí, puede hacer eso, que es precisamente lo que se hacía hace 20 ó 30 años, cuando yo empezaba y no teníamos herramientas ni utilidades como las de ahora, en las que no tienes que teclear nada para depurar un programa, como el caso este en el que estamos, ¿para qué sirve el depurador, los puntos de ruptura, la posibilidad de avanzar paso a paso el programa, etc.?, se lo podían ahorrar ;)

El depurador, una herramienta muy necesaria en la programación, pero cuando el problema está delante de ti y no lo ves, pues recurres al ShowMessage(), para saber que es lo se esconde, es una manera arcaica de resolver el problema, ¿cual es el problema? o ¿es que nunca has utilizado el ShowMessages() en tús aplicaciones?, pues yo un h...vo, para descubrir donde esta la rata cuando no he podido hacerlo con el depurador y he tenido que recurrir al ShowMessage() con mucho gusto y no retrocedo 30 años.

Un saludo.

Casimiro Notevi 28-11-2012 11:56:20

Cita:

Empezado por egostar (Mensaje 450677)
Yo uso D2007 y a veces me pasa, además de que la depuración en mi máquina es terrible y mientras no me la cambien pues seguiré usando el arcaico showMessage(), nada pasa pues, una linea no es nada :) Saludos

Claro, cada uno tiene sus gustos y necesidades. Lo comentaba por si acaso el forero olbeup desconocía esa característica.


Cita:

Empezado por olbeup (Mensaje 450710)
El depurador, una herramienta muy necesaria en la programación, pero cuando el problema está delante de ti y no lo ves, pues recurres al ShowMessage(), para saber que es lo se esconde, es una manera arcaica de resolver el problema, ¿cual es el problema? o ¿es que nunca has utilizado el ShowMessages() en tús aplicaciones?, pues yo un h...vo, para descubrir donde esta la rata cuando no he podido hacerlo con el depurador y he tenido que recurrir al ShowMessage() con mucho gusto y no retrocedo 30 años. Un saludo.

Con el depurador lo puedes ver directamente también, y muchos más detalles. Sólo es pulsar F5 en la línea.
No sé con qué tono lo has dicho, supongo que "bueno", aunque parece que estuvieses recriminando algo.
Aunque lo decía por si desconocías esa opción, no tengo ni idea de tus conocimientos, pero no he dicho nada malo, es que es verdad que antes no había depuradores y había que hacerlo de esa manera, todo el programa lleno de showmessages por todos lados para encontrar errores. Desde hace años ya no hace falta, pero a quien le guste... pues que lo haga así.

olbeup 28-11-2012 12:33:56

Lo he dicho en un tono normal, que yo utilizo el ShowMessage() cuando algo no veo, utilizo mucho el depurador cuando algo no funciona como debería, el F5 es para marcar la línea y cuando la ejecución este en esa línea se pare e ir comprobando con F8

Te decía que utilizo ShowMessage() cuando ya no veo el error y si has pensado que te estaba recriminando pues no era mi intención y si lo has interpretado así pues mil disculpas.

Estamos aquí para comentar, aprender y hacer amigos, no para recriminar, pues resulta muy desagradable.

:D:D:D^\||/

Un saludo.

Casimiro Notevi 28-11-2012 14:29:57

Cita:

Empezado por olbeup (Mensaje 450720)
Estamos aquí para comentar, aprender y hacer amigos

Eso, eso :)


La franja horaria es GMT +2. Ahora son las 06:45:05.

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