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 05-03-2007
memehua memehua is offline
Registrado
 
Registrado: oct 2006
Posts: 7
Poder: 0
memehua Va por buen camino
problemas con consulta SQL meter a la base de datos

Hola o:a todos estoy programando en delphi 2006, junto con oracle , mi problema es que uso el atexto para convertir un campo a letras pero cuando lo mado a que haga el update en la base unicamente cambia un valor este es el codigo:

Código Delphi [-]
QUERY1.Active:=TRUE;
while not query1.Eof do
begin
letras1.Numero:= query1.FieldByName('neto').Value;
query1.sql.Text:='update nomina_datos set importe_letra='+ QuotedStr(uppercase(letras1.AsString));
query1.ExecSQL;
query1.Next;
end;

de antemano agradezco la ayuda

Última edición por dec fecha: 05-03-2007 a las 08:33:05.
Responder Con Cita
  #2  
Antiguo 05-03-2007
mensana mensana is offline
Miembro
 
Registrado: sep 2006
Posts: 69
Poder: 18
mensana Va por buen camino
Cita:
Empezado por memehua
... unicamente cambia un valor este es el codigo:
Puedes precisar más ?

No te falta la condición where ?
Responder Con Cita
  #3  
Antiguo 05-03-2007
dperez79 dperez79 is offline
Registrado
 
Registrado: mar 2007
Posts: 3
Poder: 0
dperez79 Va por buen camino
El problema es que estás utilizando la misma Query para la consulta y el update, con lo cual al lanzar el update estás machacando los resultados de la consulta anterior. Utiliza un "Query2" para hacer el UPDATE.
Saludos.
Responder Con Cita
  #4  
Antiguo 05-03-2007
memehua memehua is offline
Registrado
 
Registrado: oct 2006
Posts: 7
Poder: 0
memehua Va por buen camino
QUERY1.Active:=TRUE;
while not query1.Eof do
begin
letras1.Numero:= query1.FieldByName('neto').Value;
query2.sql.Text:='update nomina_datos set importe_letra='+ QuotedStruppercase(letras1.AsString));
query2.ExecSQL;
query1.Next;
end;
Haciendo con dos querys unicamente me actualiza el ultimo registro y no los demas,lo que quiero hacer es que cuando hago la consulta me ponga el numero en letras y unicamente me pone el ultimo que trae ..

Última edición por memehua fecha: 05-03-2007 a las 19:24:18. Razón: por que no esta formateado
Responder Con Cita
  #5  
Antiguo 05-03-2007
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
memehua ves la diferencia entre el código delphi que acabas de postear y aquel que editó dec (el de tu primer mensaje), varía un poco la presencia, lectura, etc.

Por favor edita el primer mensaje y verás como lo hizo nuestro compañero dec, después haz lo propio con el último mensaje que has puesto.

Muchos de nosotros, no leemos mensajes sin formatear.

Como dice delphi.com.ar: "Dedique el tiempo necesario a formular su pregunta, si pretende que alguien se tome el tiempo necesario en resolverla".

Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #6  
Antiguo 05-03-2007
dperez79 dperez79 is offline
Registrado
 
Registrado: mar 2007
Posts: 3
Poder: 0
dperez79 Va por buen camino
Cita:
Empezado por memehua
QUERY1.Active:=TRUE;
while not query1.Eof do
begin
letras1.Numero:= query1.FieldByName('neto').Value;
query2.sql.Text:='update nomina_datos set importe_letra='+ QuotedStruppercase(letras1.AsString));
query2.ExecSQL;
query1.Next;
end;
Haciendo con dos querys unicamente me actualiza el ultimo registro y no los demas,lo que quiero hacer es que cuando hago la consulta me ponga el numero en letras y unicamente me pone el ultimo que trae ..
Detecto otros problemas... yo diría que falta la cláusula WHERE, para cambiar sólo la fila que quieres. Tal como está estas cambiando todas con el ultimo valor devuelto por Query1...
Responder Con Cita
  #7  
Antiguo 05-03-2007
memehua memehua is offline
Registrado
 
Registrado: oct 2006
Posts: 7
Poder: 0
memehua Va por buen camino
Smile

muchas gracias dperez79, lo que pretendo es cambiar todos los valores que traiga en mi consulta, suponiendo que tengo 1000 y 2000, que se cambie a su equivalente a mil y a dos mil para toda la consulta, asi que utilizando esa consulta unicamente me cambia por el ultimo valor y sinceramente no se como hacerle. vbmenu_register("postmenu_186455", true);
Responder Con Cita
  #8  
Antiguo 06-03-2007
dperez79 dperez79 is offline
Registrado
 
Registrado: mar 2007
Posts: 3
Poder: 0
dperez79 Va por buen camino
¿Qué consulta tienes en Query1? Yo diría que el problema es poner la WHERE del UPDATE de Query2 a lo que realmente quieres actualizar.
Responder Con Cita
  #9  
Antiguo 06-03-2007
Avatar de Ivanzinho
[Ivanzinho] Ivanzinho is offline
Miembro Premium
 
Registrado: ene 2005
Ubicación: Galicia
Posts: 595
Poder: 20
Ivanzinho Va por buen camino
¿Podrías poner un pequeño ejemplo de que es lo que realmente quieres?, porque pienso que te estas liando un poco.

Lo que estás haciendo es ir asignando continuamente al campo importe_letra todos los valores de query1Neto, quedando al final en todos los registros el último valor de query1Neto. Es decir, imaginate que tienes dos registros en la tabla nomina_datos

Código:
nomina  importe_letra
     1         1200
     2         1500
y en el query1Neto tienes los siguientes valores 1000, 500 y 1100. Tras la primera iteración tu tabla quedará así

Código:
nomina  importe_letra
     1         1000
     2         1000
tras la segunda

Código:
nomina  importe_letra
     1         500
     2         500
y finalmente

Código:
nomina  importe_letra
     1         1100
     2         1100
cosa que no creo que sea lo que buscas, ya que sino no se para que realizas todas las iteraciones ya que bastaria con hacer :

Código Delphi [-]
QUERY1.Active:=TRUE;
query1.Last
letras1.Numero:= query1.FieldByName('neto').Value;
query2.sql.Text:='update nomina_datos set importe_letra='+     QuotedStruppercase(letras1.AsString));
query2.ExecSQL;

El resultado de la ejecución de este último trozo de código y la del que tu pusiste son equivalentes, siendo mejor esta última opción ya que te ahorras unas cuantas iteraciónes inutiles.

Mi pregunta es : ¿Es esto lo que realmente quieres conseguir?, si no es así pon un ejemplo del estilo al que yo puse.

Un saúdo
__________________
Si no lees esto no vivirás tranquilo
Non lle poñades chatas â obra namentras non se remata. O que pense que vai mal que traballe n’ela; hai sitio para todos. (Castelao)
Responder Con Cita
  #10  
Antiguo 06-03-2007
memehua memehua is offline
Registrado
 
Registrado: oct 2006
Posts: 7
Poder: 0
memehua Va por buen camino
hola lo que realmente quiero realizar es lo siguiente
tengo mi consulta

select neto from nomina

al campo neto trae un importe supongamos que el resultado de la consulta sea

1000
1003
1005
1109

Lo que pretendo es que cuando entre al while me haga la conversion de numero a letras y que se actualice en la base de datos, en el campo importe letra

es decir que actualice los datos para que en la base se almecene el nombre de la cadena, entonces quedaria asi:

mil pesos
mil tres pesos
mil cinco pesos
mil ciento nueve pesos

como yo lo realizo unicamente me cambia por el ultimo valor que trae que seria mil ciento nueve pesos y lo mete en la base para todos lo que no se es como meterlo para que me haga para cada uno de los elementos de mi consulta..

con lo que me pusistes


çCódigo Delphi [-]
QUERY1.Active:=TRUE;
query1.Last;
letras1.Numero:= query1.FieldByName('neto').Value;
query2.sql.Text:='update nomina_datos set importe_letra='+ QuotedStr(uppercase(letras1.AsString));
query2.ExecSQL;






me sigue poniendo unicamente el ultimo resultado para todos los campos..
Responder Con Cita
  #11  
Antiguo 06-03-2007
memehua memehua is offline
Registrado
 
Registrado: oct 2006
Posts: 7
Poder: 0
memehua Va por buen camino
Cool

hola lo que realmente quiero realizar es lo siguiente
tengo mi consulta

select neto from nomina

al campo neto trae un importe supongamos que el resultado de la consulta sea

1000
1003
1005
1109

Lo que pretendo es que cuando entre al while me haga la conversion de numero a letras y que se actualice en la base de datos, en el campo importe letra

es decir que actualice los datos para que en la base se almecene el nombre de la cadena, entonces quedaria asi:

mil pesos
mil tres pesos
mil cinco pesos
mil ciento nueve pesos

como yo lo realizo unicamente me cambia por el ultimo valor que trae que seria mil ciento nueve pesos y lo mete en la base para todos lo que no se es como meterlo para que me haga para cada uno de los elementos de mi consulta..

con lo que me pusistes


çCódigo Delphi [-]
QUERY1.Active:=TRUE;
query1.Last;
letras1.Numero:= query1.FieldByName('neto').Value;
query2.sql.Text:='update nomina_datos set importe_letra='+ QuotedStr(uppercase(letras1.AsString));
query2.ExecSQL;






me sigue poniendo unicamente el ultimo resultado para todos los campos..
Responder Con Cita
  #12  
Antiguo 06-03-2007
Avatar de Ivanzinho
[Ivanzinho] Ivanzinho is offline
Miembro Premium
 
Registrado: ene 2005
Ubicación: Galicia
Posts: 595
Poder: 20
Ivanzinho Va por buen camino
Cita:
Empezado por memehua

con lo que me pusistes me sigue poniendo unicamente el ultimo resultado para todos los campos..
Es que lo que te puse es exactamete lo mismo que lo que tu hacías, lo que pasa que te lo puse así para que vieras mas claro donde tenías el problema.

Lo que tienes que hacer es basicamente lo siguente :

1.- Consultar los distintos importes de la base de datos de nóminas :
Código Delphi [-]
consulta := 'Select dictinct importe from nominas';
query1.Close;
query1.SQL.Clear;
query1.SQL.Add(consulta);
query1.Open;
2.- Pasar los distintos importes a letra y modifcar la base de datos
Código Delphi [-]
query1.first;
while not query1.eof do
   begin
      ImporteLetra := PasarALetra(query1Importe.Value);
      
      consulta := 'Update nominas set importe_letra = ' + QuotedStr(ImporteLetra);
      consulta := consulta + ' where importe = ' + FloatToStr(query1Importe.value);
      
      query2.Close;
      query2.SQL.Clear;
      query2.SQL.Add(Consulta);
      query2.ExecSQL;

      query1.Next;
    end;

Espero que te sirva

Un saúdo
__________________
Si no lees esto no vivirás tranquilo
Non lle poñades chatas â obra namentras non se remata. O que pense que vai mal que traballe n’ela; hai sitio para todos. (Castelao)

Última edición por Ivanzinho fecha: 06-03-2007 a las 19:09:00.
Responder Con Cita
  #13  
Antiguo 06-03-2007
Avatar de movorack
[movorack] movorack is offline
Miguel A. Valero
 
Registrado: feb 2007
Ubicación: Bogotá - Colombia
Posts: 1.346
Poder: 20
movorack Va camino a la famamovorack Va camino a la fama
así de rapidez se me ocurre que si la columna a editar está en la misma tabla, puedes obviar "talvez" la segunda y no se... hasta te ahorrarias un tantito de procesamiento. creo... digo.

Código Delphi [-]
query.edit;
query1.first;
while not query1.eof do
   begin
     query1.Fieldbyname('importe_letra').AsString := PasarALetra(query1Importe.Value);
      query1.Next;
    end;
query1.post;

espero no esté equivocado.
__________________
Buena caza y buen remar... http://mivaler.blogspot.com
Responder Con Cita
  #14  
Antiguo 06-03-2007
Avatar de movorack
[movorack] movorack is offline
Miguel A. Valero
 
Registrado: feb 2007
Ubicación: Bogotá - Colombia
Posts: 1.346
Poder: 20
movorack Va camino a la famamovorack Va camino a la fama
se me olvidaba...

para esto tendrás que usar una tabla... no una query... o si usas una query tendrás que establecer los parametros de actualización en un SQLUpdate...

OOPPPSSS.... un poco más de trabajo.

osea que quedaria algo así:

Código Delphi [-]
table.edit;
table.first;
while not table.eof do
   begin
     table.Fieldbyname('importe_letra').AsString := PasarALetra(table.fieldbyname('importe_valor').Value);
     table.Next;
    end;
table.post;
__________________
Buena caza y buen remar... http://mivaler.blogspot.com

Última edición por movorack fecha: 06-03-2007 a las 20:25:18.
Responder Con Cita
  #15  
Antiguo 07-03-2007
Avatar de Ivanzinho
[Ivanzinho] Ivanzinho is offline
Miembro Premium
 
Registrado: ene 2005
Ubicación: Galicia
Posts: 595
Poder: 20
Ivanzinho Va por buen camino
Cita:
Empezado por movorack
así de rapidez se me ocurre que si la columna a editar está en la misma tabla, puedes obviar "talvez" la segunda y no se... hasta te ahorrarias un tantito de procesamiento. creo... digo.

espero no esté equivocado.
Espero no estar equivocado yo, pero creo que no te ahorras nada de procesamiento. Te explico por qué:

1.- Al utilizar una tabla traes todos los registros de la base de datos, yo con la query solo traigo los distintos.

2.- Tu recorres toda la tabla y modificas los registros 1 a 1, yo solo realizo una iteración por cada valor distinto del importe de la nómina y modifico los registros en grupos (todos los que son iguales al mismo tiempo).

Debido a lo anterior saco en conclusión que en el peor de los casos (todos los importes distintos) los dos métodos serían equivalentes, sin embargo, el que yo propuse mejoraría en función del número de valores repetidos en el campo importe.

Si estoy equivocado, agredecería que me corrigiesen, pero así es como yo lo veo.

Un saúdo.
__________________
Si no lees esto no vivirás tranquilo
Non lle poñades chatas â obra namentras non se remata. O que pense que vai mal que traballe n’ela; hai sitio para todos. (Castelao)
Responder Con Cita
  #16  
Antiguo 07-03-2007
Avatar de movorack
[movorack] movorack is offline
Miguel A. Valero
 
Registrado: feb 2007
Ubicación: Bogotá - Colombia
Posts: 1.346
Poder: 20
movorack Va camino a la famamovorack Va camino a la fama
Compae... tiene razón... se me escapo el DISCTINCT... no lo ví, no lo noté... y eso hace la diferencia.

ahora... pienso que teniendo en cuenta que estamos hablando de ELCARO (lease alreves ORACLE)... se podria (depende de que tan importante sea) dejar esa consulta como una vista y crear una regla que permita la actualización de los registros... y luego mirar esa vista desde un TTable y procesarla línea por linea... (1 a 1) como me dices... Delphi estaria editando 1 línea y ORACLE con la regla creada estaría modificando todos los importes con el mismo valor.

digo digo digo como claudio!!!
__________________
Buena caza y buen remar... http://mivaler.blogspot.com
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
Meter un Array de strings con Datos en un PSafearray camomilass OOP 1 28-06-2006 12:09:39
como leo una consulta a la base de datos carlosmoralesm .NET 7 28-09-2004 22:05:39
Problemas con Base de datos(.dbf y .db)!!! jeni Conexión con bases de datos 1 08-11-2003 12:49:09
Problemas al meter una aplicación en un CD kasieyes Conexión con bases de datos 2 04-09-2003 02:25:49
problemas con la base de datos superhopi Conexión con bases de datos 1 19-05-2003 09:47:58


La franja horaria es GMT +2. Ahora son las 05:48:09.


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