Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > SQL
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 01-03-2008
odrack odrack is offline
Miembro
 
Registrado: feb 2008
Posts: 167
Poder: 19
odrack Va por buen camino
error while..do

Que tal a todos!!

Tengo un problemita con el ciclo while, lo que esta pasando es que no termina el ciclo while con este codigo:

Código Delphi [-]
 
Begin
             query2.close;
             query2.sql.clear;
             query2.sql.add('SELECT usuario as nomart FROM usuarios');
             query2.Open;
              while not query2.eof do
                begin
                 if edit1.Text=query2.Fieldvalues['nomart'] then
                   begin
                    showmessage('El usuario ya existe');
                    query2.Last;
                   end
                 else
                    begin
                     query1.Close;
                     query1.SQL.Clear;
                     query1.SQL.Add('insert into usuarios (usuario, password)');
                     query1.SQL.Add('values('+quotedstr(edit1.Text)+','+quotedstr(edit2.Text)+')');
                     query1.ExecSQL;
                     query3.close;
                     query3.Open;
                     edit1.Text:='';
                     edit2.Text:='';
                     showmessage('Se ha agregado con exito');
                    end;
                end;
              query2.Next;
          end;

alguien sabe por que no lo termina?? Esto pasa cuando no encontro ninguno registro igual y comienza a agregar registros vacios (esto es por que borro el contenido de los edit) pero no logro que termine el while

Última edición por odrack fecha: 01-03-2008 a las 01:39:17.
Responder Con Cita
  #2  
Antiguo 01-03-2008
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 28
Delphius Va camino a la fama
Cita:
Empezado por odrack Ver Mensaje
Que tal a todos!!

Tengo un problemita con el ciclo while, lo que esta pasando es que no termina el ciclo while con este codigo:

Código Delphi [-]
Begin query2.close; query2.sql.clear; query2.sql.add('SELECT usuario as nomart FROM usuarios');
query2.Open;
while not query2.eof do begin if edit1.Text=query2.Fieldvalues['nomart'] then begin showmessage('El usuario ya existe');
query2.Last;
end else begin query1.Close; query1.SQL.Clear; query1.SQL.Add('insert into usuarios (usuario, password)');
query1.SQL.Add('values('+quotedstr(edit1.Text)+','+quotedstr(edit2.Text)+')');
query1.ExecSQL;
query3.close;
query3.Open;
edit1.Text:='';
edit2.Text:='';
showmessage('Se ha agregado con exito');
end;
end;
query2.Next;
end;


alguien sabe por que no lo termina??
Hola odrack,
Por empezar veo un Query1.Next que está fuera del ciclo. Muevele una línea antes y dime:

Código Delphi [-]
Begin
             query2.close;
             query2.sql.clear;
             query2.sql.add('SELECT usuario as nomart FROM usuarios');
             query2.Open;
              while not query2.eof do
                begin
                 if edit1.Text=query2.Fieldvalues['nomart'] then
                   begin
                    showmessage('El usuario ya existe');
                    query2.Last;
                   end
                 else
                    begin
                     query1.Close;
                     query1.SQL.Clear;
                     query1.SQL.Add('insert into usuarios (usuario, password)');
                     query1.SQL.Add('values('+quotedstr(edit1.Text)+','+quotedstr(edit2.Text)+')');
                     query1.ExecSQL;
                     query3.close;
                     query3.Open;
                     edit1.Text:='';
                     edit2.Text:='';
                     showmessage('Se ha agregado con exito');
                    end;
                query2.Next; // aqui ebería ir....
                end; // fin while...
              
end;

Saludos,
__________________
Delphius
[Guia de estilo][Buscar]
Responder Con Cita
  #3  
Antiguo 01-03-2008
Avatar de Caral
[Caral] Caral is offline
Miembro Premium
 
Registrado: ago 2006
Posts: 7.659
Poder: 27
Caral Va por buen camino
Hola
Para que hacer un while, no hace falta.
Código Delphi [-]
 
Begin
             query2.close;
             query2.sql.clear;
             query2.sql.add('SELECT usuario as nomart FROM usuarios');
             query2.Open;
              if edit1.Text=query2.Fieldvalues['nomart'] then
                   begin
                    showmessage('El usuario ya existe');
                    query2.Last;
                   end
                 else
                    begin
                     query1.Close;
                     query1.SQL.Clear;
                     query1.SQL.Add('insert into usuarios (usuario, password)');
                     query1.SQL.Add('values('+quotedstr(edit1.Text)+','+quotedstr(edit2.Text)+')');
                     query1.ExecSQL;
                     query3.close;
                     query3.Open;
                     edit1.Text:='';
                     edit2.Text:='';
                     showmessage('Se ha agregado con exito');
                    end;
                end;
              query2.Next;
          end;
Saludos
Responder Con Cita
  #4  
Antiguo 01-03-2008
Avatar de Caral
[Caral] Caral is offline
Miembro Premium
 
Registrado: ago 2006
Posts: 7.659
Poder: 27
Caral Va por buen camino
Hola
Rectifico, viendo en codigo de delphius, tambien sobra el next.
Código Delphi [-]
Begin
             query2.close;
             query2.sql.clear;
             query2.sql.add('SELECT usuario as nomart FROM usuarios');
             query2.Open;
              if edit1.Text=query2.Fieldvalues['nomart'] then
                   begin
                    showmessage('El usuario ya existe');
                    query2.Last;
                   end
                 else
                    begin
                     query1.Close;
                     query1.SQL.Clear;
                     query1.SQL.Add('insert into usuarios (usuario, password)');
                     query1.SQL.Add('values('+quotedstr(edit1.Text)+','+quotedstr(edit2.Text)+')');
                     query1.ExecSQL;
                     query3.close;
                     query3.Open;
                     edit1.Text:='';
                     edit2.Text:='';
                     showmessage('Se ha agregado con exito');
                    end;
                end;
              query2.Next; // esto sobra
          end;
Saludos
Responder Con Cita
  #5  
Antiguo 01-03-2008
odrack odrack is offline
Miembro
 
Registrado: feb 2008
Posts: 167
Poder: 19
odrack Va por buen camino
he modificado moviendo el next y agregue un last al final de insert, con eso detengo el while, pero ahora solo me funciona para el primer registro ya que no se mueve al siguiente
Código Delphi [-]
   Begin
             query2.close;
             query2.sql.clear;
             query2.sql.add('SELECT usuario as nomart FROM usuarios');
             query2.Open;
              while not query2.eof do
                begin
                 if edit1.Text=query2.Fieldvalues['nomart'] then
                   begin
                    showmessage('El usuario ya existe');
                    query2.Last;
                   end
                 else
                    begin
                     query1.Close;
                     query1.SQL.Clear;
                     query1.SQL.Add('insert into usuarios (usuario, password)');
                     query1.SQL.Add('values('+quotedstr(edit1.Text)+','+quotedstr(edit2.Text)+')');
                     query1.ExecSQL;
                     query3.close;
                     query3.Open;
                     edit1.Text:='';
                     edit2.Text:='';
                     showmessage('Se ha agregado con exito');
                     query2.Last;
                    end;
                    query2.Next;
                end;
Responder Con Cita
  #6  
Antiguo 01-03-2008
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 28
Delphius Va camino a la fama
¿Caral estás seguro? Porque pareciera que odrack desea insertar los usuarios desde una tabla a otra....

odrack, Para que el Last al final de la parte else? A me parece que está demás....

Saludos,
__________________
Delphius
[Guia de estilo][Buscar]
Responder Con Cita
  #7  
Antiguo 01-03-2008
odrack odrack is offline
Miembro
 
Registrado: feb 2008
Posts: 167
Poder: 19
odrack Va por buen camino
lo que estoy haciendo es insertar a usuarios nuevo en una tabla con un query, eso si lo hace, y tengo el last al final por que sin no termina el ciclo ya que agrega uno tras otro.
Responder Con Cita
  #8  
Antiguo 01-03-2008
Avatar de Caral
[Caral] Caral is offline
Miembro Premium
 
Registrado: ago 2006
Posts: 7.659
Poder: 27
Caral Va por buen camino
Hola
Mas que seguro, hacer un recorrido a la tabla es innecesario.
1- revisar si el usuario existe.
2- crear el if, else
3- terminar.
que se inserte en otra tabla es lo de menos.
Saludos
Responder Con Cita
  #9  
Antiguo 01-03-2008
odrack odrack is offline
Miembro
 
Registrado: feb 2008
Posts: 167
Poder: 19
odrack Va por buen camino
Perdon caral, pero hasta donde tengo entendido para recorrer los registros de una tabla tiene que ser con un while.. do, si no como los recorre?? o estoy equivocado??
Responder Con Cita
  #10  
Antiguo 01-03-2008
Avatar de Caral
[Caral] Caral is offline
Miembro Premium
 
Registrado: ago 2006
Posts: 7.659
Poder: 27
Caral Va por buen camino
Hola
Perdoname pero si estas equivocado en este caso.
Un codigo mio en uso, revisalo.
Código Delphi [-]
 OrdenCompra.Active := False;
   OrdenCompra.SQL.Text := 'Select OrdenCompra From OrdenProd WHERE OrdenCompra ='+QuotedStr(Edit7.Text);
   OrdenCompra.Active := True;
   If Edit7.Text = '' then
   Edit7.Text:= Edit2.Text
   else
   If Edit7.Text = OrdenCompra.Fields[0].Value then
   MessageDlg('La orden de Compra ya Existe',mtError,[mbOK],0)
   else
   If Edit3.Text = '' then MessageDlg('Debe especificar el código del cliente',mtError,[mbOK],0)
 else
Si encuentras donde la recorro me lo dices.
Saludos
Responder Con Cita
  #11  
Antiguo 01-03-2008
odrack odrack is offline
Miembro
 
Registrado: feb 2008
Posts: 167
Poder: 19
odrack Va por buen camino
Tienes razon, pero no entiendo en que momento recorre los datos, he puesto tu codigo en practiva pero solo busca en el primer registro,
Saludos
Responder Con Cita
  #12  
Antiguo 01-03-2008
Avatar de Caral
[Caral] Caral is offline
Miembro Premium
 
Registrado: ago 2006
Posts: 7.659
Poder: 27
Caral Va por buen camino
Hola
Vamos Delphius, que paso, explicale la razon.
Hay unas diferencias entre tu codigo y el mio, examilalas, las vas a ver, seguro.
Saludos
Responder Con Cita
  #13  
Antiguo 01-03-2008
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 28
Delphius Va camino a la fama
Parte de lo dicho por Caral me ha llevado a darme cuenta de que hay un error conceptual en el diseño de odrack.

Al comienzo estaba pensando que odrack lo que deseaba es mover los registros de una tabla a otra... pero tal vez lo que desea hacer es insertar el registro en caso de que no existiese...

Si lo que deseas es insertar un registro que es inexistente lo que comenta Caral es cierto.

Por otro lado, si lo que deseas es mover registros de una tabla a otra... deberás explicar mejor tu situación porque no está claro... ¿mueves de usuarios a usuarios?

Deberás explicar mejor tu situación.

Saludos,
__________________
Delphius
[Guia de estilo][Buscar]
Responder Con Cita
  #14  
Antiguo 01-03-2008
Avatar de Caral
[Caral] Caral is offline
Miembro Premium
 
Registrado: ago 2006
Posts: 7.659
Poder: 27
Caral Va por buen camino
Hola
Veo que no captas, revisa la sentencia sql, vas a ver, analiza la situacion, que es lo que necesito: (saber si el usuario existe).
Vamos, se que puedes, si tienes dudas, pregunta.
Saludos
Responder Con Cita
  #15  
Antiguo 01-03-2008
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 28
Delphius Va camino a la fama
Cita:
Empezado por Caral Ver Mensaje
Hola
Veo que no captas, revisa la sentencia sql, vas a ver, analiza la situacion, que es lo que necesito: (saber si el usuario existe).
Vamos, se que puedes, si tienes dudas, pregunta.
Saludos
¿Me lo dices a mi?
Vi claramente lo que dices amigo, hay un pequeño filtro indispensable en tu consulta

Y si es realmente esto lo que desea conseguir odrack, debe hacer algo parecido a eso.

A mi me ha mareado el hecho de que odrack lance un select de todos los registros y pretenda insertar x cantidad de registros... Habia entendido que lo que deseaba conseguir es pasar de una tabla a otra...

Ahora es odrack el que debe ver y explicar su situación.

odrack, ¿Deseas verificar si existe un determinado usuario?

Saludos,
__________________
Delphius
[Guia de estilo][Buscar]
Responder Con Cita
  #16  
Antiguo 01-03-2008
Avatar de Caral
[Caral] Caral is offline
Miembro Premium
 
Registrado: ago 2006
Posts: 7.659
Poder: 27
Caral Va por buen camino
Hola
Como te lo voy a decir a ti amigo, yo se que tu si sabes la diferencia.
Lo que pretendo es que odrack trate de analizar el asunto, si no puede no hay problema, le explicaremos con gusto, pero siempre es bueno que analice un poco, asi aprendera mas y mejor.
Saludos
Responder Con Cita
  #17  
Antiguo 01-03-2008
odrack odrack is offline
Miembro
 
Registrado: feb 2008
Posts: 167
Poder: 19
odrack Va por buen camino
Smile

Caral tiene razon, lo que quiero hacer es una busqueda en la base de datos y verificar que ese usuario no este agregado, si no esta lo agrego solo que no he podido hacerlo con el while ni con el codigo de caral, he analizado tu codigo caral y creo que hace el recorrido o busca el registro con
Código Delphi [-]
If Edit7.Text = OrdenCompra.Fields[0].Value then
, o estoy mal??,
Algo mas CARAL, asi aprendo mas y les doy las gracias por su ayuda!!

Saludos!!, pero sigo sin saber que esta pasando con mi codigo , por que no termina el ciclo.
Responder Con Cita
  #18  
Antiguo 01-03-2008
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 28
Delphius Va camino a la fama
Hola odrack,
Analicemos lo que tu pides:

1. Necesitas determinar si un usuario existe en la base de datos
2. En caso de existir no se debe hacer nada
3. Sino existe entonces hay que agregarlo

¿Qué se necesita para conseguir esto?
Para saber si existe el usuario necesitamos hacer una consulta a la base de datos. Esta consulta debe ser restrictiva. Tu error es muy conceptual: ¡No se necesita recorrer toda la tabla para saber si existe!

La verdadera consulta SQL que debes emplear debe ser así:

Código SQL [-]
select id_usuario 
from usuarios
where usuario.Nombre = :pNombre

pNombre es un parámetro y se los distingue por esos dos puntos que lo anteceden. Recomiendo el uso de éstos.
Ahora bien, en la consulta pedimos que nos busque al usuario por un nombre. Entonces antes de lanzar dicha consulta debemos hacer algo como esto:

Código Delphi [-]
ADOQuery1.Parameters.ParamByName('pNombre').Value := Edit1.Text;
ADOQuery1.Parameters.ParamByName('pNombre').DataType := ftString;

Suponiendo que son Componentes ADO. Hice el supuesto de que en Edit1 escribimos el nombre del usuario que deseamos buscar.

Una vez lanzada la consulta tenemos muchas posibilidades de saber si existe este usuario... no se requiere de ningún bucle. ¿Porqué? Porque supuestamente estamos recibiendo al menos un registo (Esto dependerá de tus circunstancias, pero en fin para ejemplo basta).

Podríamos decir que:

Código Delphi [-]
Existe := ADOQuery1.RecordCount >= 1;

¿Que significa esto? Que si la consulta ha devuelto al menos un registro es porque existe. ¿Recorrí los registros afectados para saber si existe? No... y no es necesario... basta con saber si la consulta regresa registros.

Y de aqui en más la actividad es muy simple... basta un simple condicional para saber que acción tomar:

Código Delphi [-]
if Existe
  then ShowMessage('Este usuario ya existe');
  else begin
           // Aqui viene todo el alta
        end;

Creo que con esto se explica mejor la situación y su solución.
Recomiendo una mejor lectura sobre consultas SQL. Tu problema es que haces un select sin restricciones, y asi te ves obligado a examinar los registros... si podemos averiguar a traves de SQL sobre algo en particular vale la pena hacerlo.

Saludos,
__________________
Delphius
[Guia de estilo][Buscar]

Última edición por Delphius fecha: 01-03-2008 a las 17:18:21.
Responder Con Cita
  #19  
Antiguo 01-03-2008
odrack odrack is offline
Miembro
 
Registrado: feb 2008
Posts: 167
Poder: 19
odrack Va por buen camino
Que tal!! les doy las gracias a los dos por haberme hecho entender que no necesitaba el ciclo while..do, simplemente habia que igualar los campos y comparar, he comprendido el problema y lo he solucionado gracias a ustedes!!, asi es como quedo el codigo:
Código Delphi [-]
Begin
             query3.close;
             query3.sql.clear;
             query3.sql.add('SELECT * FROM usuarios where usuario='+quotedstr(edit1.Text));
             query3.ExecSQL;
             query3.Open;
               if edit1.text=dbedit2.text then
                  showmessage('El usuario ya existe')
                   else
                    begin
                     query1.Close;
                     query1.SQL.Clear;
                     query1.SQL.Add('insert into usuarios (usuario, password)');
                     query1.SQL.Add('values('+quotedstr(edit1.Text)+','+quotedstr(edit2.Text)+')');
                     query1.ExecSQL;
                     query3.close;
                     query3.Open;
                     edit1.Text:='';
                     edit2.Text:='';
                     showmessage('Se ha agregado con exito');
                    end;
          end;

Con esto funciona de maravilla, lo unico que tube que hacer es igualar los campos a un dbedit.text que ya tenia anteriormente para una consulta, obviamente primero seleccione los datos e hice que se movieran en el dbedit asi comparo los datos entre EDIT1 y DBEDIT si son iguales que me muestre que ya esta el usuario de lo contrario que lo agrege.

Gracias nuevamente!!
Responder Con Cita
  #20  
Antiguo 01-03-2008
Avatar de Caral
[Caral] Caral is offline
Miembro Premium
 
Registrado: ago 2006
Posts: 7.659
Poder: 27
Caral Va por buen camino
Hola
Me alegro que lo resolvieras, y mas me alegro de que lo hicieras solo, así es como se aprende mas, lo único que necesitabas era una pequeña guía.
La explicación que te dio el Maestro Delphius fue impresionante, típica de el.
Por suerte hay Maestros como el en el club para ayudarnos a los Novatos.
Saludos
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

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
error:[Fatal Error] Unit1.pas(7): Unit ZDbcConnection was compiled with a different.. karaoke Conexión con bases de datos 2 19-12-2007 10:22:36
Error en este código. FF funciona/IE da error papulo HTML, Javascript y otros 7 14-11-2007 09:44:23
Error 10093 al ver un informe - Que error es este? URBANO Impresión 1 03-02-2006 18:44:39
¿Por qué me da este error?Error creating cursor manejador nuri SQL 2 01-08-2005 17:30:28
Error: RichEdit line insertation error DarkByte Varios 3 19-07-2004 12:28:09


La franja horaria es GMT +2. Ahora son las 19:17:37.


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