Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   PRoblemas con Between (https://www.clubdelphi.com/foros/showthread.php?t=73531)

elturu15 29-04-2011 15:56:49

PRoblemas con Between
 
Hola a todos...tengo una problema....tengo que hacer un listado entre dos claves ingresadas por el usuario, las cuales se muestran en un ComboBox...y en la consulta uso between..esta bien usar eso?..y el problema que tengo es que cuando ejecute el progam y preciono LIstar para quenerar el listado me salta un error que dice "Clave1 no tiene un valor predeterminado" no se cual es el error porque en el codigo que esta mas abajo, yo le asigno un valor....CUAL ES EL PROBLEMA?? AYUDAAAA
GRACIAS


Este es el Codigo parte del codigo donde me tira el error:

Código Delphi [-]
 Clave:=integer(ComboBox1.Items.Objects[ComboBox1.ItemIndex]);
 Clave1:=integer(ComboBox2.Items.Objects[ComboBox2.ItemIndex]);
 ADOQuery1.Close;
 ADOQuery1.SQL.Clear;
 ADOQuery1.SQL.Text:='SELECT Provincias.Clave,  Provincias.Nombre,Ciudades.Codigo_Postal, Ciudades.Nombre_Ciudad  '+
'FROM Provincias LEFT JOIN Ciudades ON Provincias.Clave = Ciudades.Clave_Provincia '+
'WHERE clave between clave and clave1 order by Clave';
 ADOQuery1.Open;
 ADOQuery1.Active:=true;

Caro 29-04-2011 16:24:23

Hola elturu15 y bienvenido a clubdelphi, te da el error porque le estas dando como valor clave y clave1 y no así lo que tienes en tus variables.

Código Delphi [-]
  Clave:=integer(ComboBox1.Items.Objects[ComboBox1.ItemIndex]);
  Clave1:=integer(ComboBox2.Items.Objects[ComboBox2.ItemIndex]);

  ADOQuery1.Close;
  ADOQuery1.SQL.Clear;
  ADOQuery1.SQL.Text:='SELECT P.Clave, P.Nombre, C.Codigo_Postal, C.Nombre_Ciudad '+
                      'FROM Provincias P LEFT JOIN Ciudades C ON P.Clave = C.Clave_Provincia '+
                      'WHERE P.clave between '+IntToStr(clave)+' and '+IntToStr(clave1)+' order by Clave';
  ADOQuery1.Open;

Solo debes utilizar uno de los dos para ejecutar la consulta (Open o Active=True). Tambien puedes pasar valores a tu consulta utilizando parámetros.

Saluditos

elturu15 29-04-2011 16:49:09

Between
 
Mucjas gracias solucione el error, pero el problema que tengo ahora es que siempre me lista el Primero nada mas..
Código Delphi [-]
Clave:=integer(ComboBox1.Items.Objects[ComboBox1.ItemIndex]);
Clave1:=integer(ComboBox2.Items.Objects[ComboBox2.ItemIndex]);
ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Text:='SELECT Provincias.Clave,  Provincias.Nombre,Ciudades.Codigo_Postal, Ciudades.Nombre_Ciudad  FROM Provincias LEFT JOIN Ciudades ON Provincias.Clave = Ciudades.Clave_Provincia WHERE clave between '+IntToStr(clave)+' and '+IntToStr(clave1)+' order by Clave';
 ADOQuery1.Open;
 ListBox1.Clear;
    While not ADOQuery1.EOF do
     Begin
      Clave2:=ADOQuery1.Fields[0].AsInteger;
      Nombre:=ADOQuery1.Fields[1].AsString;
      CP:=ADOQuery1.Fields[2].AsString;
      NombreCiudad:=ADOQuery1.Fields[3].AsString;
      ListBox1.Items.Add('Clave :' +  inttostr(Clave2));
      ListBox1.Items.Add('Nombre :' + Nombre);
      ListBox1.Items.Add('codigo_postal : '+  CP);
      ListBox1.Items.Add('Nombre_Ciudad :' + NombreCiudad);
      ListBox1.Items.Add('----------------------------');
      ADOQuery1.Next;
      ADOQuery1.ExecSQL;
     End

Esta bien el While?

Caro 29-04-2011 16:56:59

Hola de nuevo, esta linea esta demas dentro del While.

Código Delphi [-]
 ADOQuery1.ExecSQL;

te quedaría así:

Código Delphi [-]
    ............................................. 
    ListBox1.Clear;
    AdoQuery1.First; // nos posicionamos en el primer registro
    While not ADOQuery1.EOF do
     Begin
      Clave2:=ADOQuery1.Fields[0].AsInteger;
      Nombre:=ADOQuery1.Fields[1].AsString;
      CP:=ADOQuery1.Fields[2].AsString;
      NombreCiudad:=ADOQuery1.Fields[3].AsString;
      ListBox1.Items.Add('Clave :' +  inttostr(Clave2));
      ListBox1.Items.Add('Nombre :' + Nombre);
      ListBox1.Items.Add('codigo_postal : '+  CP);
      ListBox1.Items.Add('Nombre_Ciudad :' + NombreCiudad);
      ListBox1.Items.Add('----------------------------');
      ADOQuery1.Next;
     End

Saluditos

ecfisa 29-04-2011 16:57:07

Hola.

En principio quitá esta línea:
Código Delphi [-]
 ADOQuery1.ExecSQL;

Te debería quedar algo como:
Código Delphi [-]
 ADOQuery1.Close;
 ADOQuery1.SQL.Clear;
 ADOQuery1.SQL.Text:='SELECT Provincias.Clave,  Provincias.Nombre,Ciudades.Codigo_Postal, Ciudades.Nombre_Ciudad  FROM Provincias LEFT JOIN Ciudades ON Provincias.Clave = Ciudades.Clave_Provincia WHERE clave between '+IntToStr(clave)+' and '+IntToStr(clave1)+' order by Clave';
 ADOQuery1.Open;
 ListBox1.Clear;
 while not ADOQuery1.EOF do
 begin
   ListBox1.Items.Add('Clave :' +  inttostr(ADOQuery1.Fields[0].AsInteger));
   ListBox1.Items.Add('Nombre :' + ADOQuery1.Fields[1].AsString);
   ListBox1.Items.Add('codigo_postal : '+ ADOQuery1.Fields[2].AsString);
   ListBox1.Items.Add('Nombre_Ciudad :' + ADOQuery1.Fields[3].AsString);
   ListBox1.Items.Add('----------------------------');
   ADOQuery1.Next;
 end

Un saludo.

elturu15 29-04-2011 17:06:50

Between
 
Hola otra vez..lamento informarte que sigue sin funcionar.. me lista siempre el primero,,, este es el codigo que tengo
Código Delphi [-]
ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Text:='SELECT P.Clave, P.Nombre, C.Codigo_Postal,  C.Nombre_Ciudad '+
                     'FROM Provincias P LEFT JOIN Ciudades C ON P.Clave = C.Clave_Provincia '+
                     'WHERE P.clave between '+IntToStr(clave)+' and '+IntToStr(clave1)+' order by Clave';
ADOQuery1.Open;
ListBox1.Clear;
AdoQuery1.First; // nos posicionamos en el primer registro
ADOQuery1.Active:=true;
    While not ADOQuery1.EOF do
     Begin
      Clave2:=ADOQuery1.Fields[0].AsInteger;
      Nombre:=ADOQuery1.Fields[1].AsString;
      CP:=ADOQuery1.Fields[2].AsString;
      NombreCiudad:=ADOQuery1.Fields[3].AsString;
      ListBox1.Items.Add('Clave :' +  inttostr(Clave2));
      ListBox1.Items.Add('Nombre :' + Nombre);
      ListBox1.Items.Add('codigo_postal : '+  CP);
      ListBox1.Items.Add('Nombre_Ciudad :' + NombreCiudad);
      ListBox1.Items.Add('----------------------------');
      ADOQuery1.Next;
     End
esta bien esto? ADOQuery1.Active:=true;


Mil disculpas por molestarte

Caro 29-04-2011 17:12:53

Cita:

Empezado por elturu15 (Mensaje 398378)
esta bien esto? ADOQuery1.Active:=true;

No es necesario ejecutar la consulta dos veces, tanto el open como el active=true, ejecutan la consulta que esta dentro de tu DataSet (AdoQuery), solo debes escoger uno de ellos.

Puede ser que la consulta solo te este devolviendo un solo registro, prueba de enlazar tu consulta a un dbgrid para que veas el resultado.

Saluditos

Caro 29-04-2011 17:19:40

O también puedes probar esto:

Código Delphi [-]
...............................
'WHERE P.clave between '+IntToStr(clave)+' and '+IntToStr(clave1)+' order by Clave';
ADOQuery1.Open;
showmessage(IntToStr(AdoQuery1.RecordCount));
.........................

y nos dices el resultado que te salga. No te olvides de leer nuestra guia de estilo por favor y utiliza etiquetas en tu codigo para que se vea mejor, en este caso [ delphi]tu codigo[ /delphi] sin el espacio, también los puedes encontrar en editor.

Saluditos

ecfisa 29-04-2011 17:38:04

Hola.

Y a modo de complemento de lo que ya te ha sugerido Caro sobre la lectura de la guia de estilo y las etiquetas, el amigo Casimiro,
ha echo un [ gráfico ] que explica cláramente el uso de estas últimas.

Un saludo.

Casimiro Noteví 29-04-2011 17:42:51

Cita:

Empezado por ecfisa (Mensaje 398381)
Hola. Y a modo de complemento de lo que ya te ha sugerido Caro sobre la lectura de la guia de estilo y las etiquetas, el amigo Casimiro, ha echo un [ gráfico ] que explica cláramente el uso de estas últimas.
Un saludo.

Bueno, ese gráfico se lo he "robado" a Neftalí :D




.

oscarac 29-04-2011 17:47:15

Cita:

Empezado por Casimiro Notevi (Mensaje 398384)
Bueno, ese gráfico se lo he "robado" a Neftalí :D




.


Seria bueno colocar esta imagen en la guia de estilo

ecfisa 29-04-2011 18:08:10

Cita:

Empezado por Casimiro Notevi (Mensaje 398384)
Bueno, ese gráfico se lo he "robado" a Neftalí :D

Bueno entonces arréglatelas con sus abogados... :D

Un saludo.


La franja horaria es GMT +2. Ahora son las 18:53:56.

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