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 el codigo SQL (https://www.clubdelphi.com/foros/showthread.php?t=77303)

Vales08 12-01-2012 22:45:43

Problemas con el codigo SQL
 
Tengo el siguiente código SQL
Código SQL [-]
DM.Q_loc.SQL.Clear;
DM.Q_loc.SQL.Add('select LOCALIDAD from LOCALIDADES GROUP BY LOCALIDAD');
DM.Q_loc.Open;
while not DM.Q_loc.Eof do
  begin
    loc_cons_inst.Items.Add(DM.Q_loc.FieldByName('LOCALIDAD').AsString);
    DM.Q_loc.Next;
  end;

La cuestion es que me salta error, y es porque siempre me solicita los otros campos que faltan de la tabla, como el ID_LOC, CODIGO_POSTAL, PROVINCIA..
Entonces no me queda otra que poner
Código SQL [-]
...
DM.Q_loc.SQL.Add('select * from LOCALIDADES');
...

Pero yo necesito solamente LOCALIDAD para poder agrupar por ese mismo campo, entonces en el combobox no se me repiten los datos..

Uso Delphi7, sql manager y motor de base de datos firebird..
Espero puedan ayudarme.. Desde ya muchas gracias..

Caral 12-01-2012 22:54:12

Hola
A ver asi:
Código Delphi [-]
DM.Q_loc.SQL.Clear;
DM.Q_loc.SQL.Add('select LOCALIDAD from LOCALIDADES ORDER BY LOCALIDAD');
DM.Q_loc.Open;
while not DM.Q_loc.Eof do
  begin
    loc_cons_inst.Items.Add(DM.Q_loc.FieldByName('LOCALIDAD').AsString);
    DM.Q_loc.Next;
  end;
o asi:
Código Delphi [-]
DM.Q_loc.SQL.Clear;
// todos los campos en el group By
DM.Q_loc.SQL.Add('select LOCALIDAD from LOCALIDADES GROUP BY ID_LOC, CODIGO_POSTAL, PROVINCIA, LOCALIDAD');
DM.Q_loc.Open;
while not DM.Q_loc.Eof do
  begin
    loc_cons_inst.Items.Add(DM.Q_loc.FieldByName('LOCALIDAD').AsString);
    DM.Q_loc.Next;
  end;
Saludos

Vales08 12-01-2012 23:04:02

Muchas gracias por contestar, pero sigue sin funcionar.. Te pongo el error que me da..

Cita:

---------------------------
Debugger Exception Notification
---------------------------
Project Project_tesis.exe raised exception class EDatabaseError with message 'Q_loc: Field 'ID_LOC' not found'. Process stopped. Use Step or Run to continue.
---------------------------
OK Help
---------------------------
Y este error salta con cada Campo de la tabla.. Por eso no me queda otra que seleccionar todos (select *).

Caral 12-01-2012 23:06:20

Hola
Segura que no va este ?:
Código Delphi [-]
DM.Q_loc.SQL.Clear;
DM.Q_loc.SQL.Add('select LOCALIDAD from LOCALIDADES ORDER BY LOCALIDAD');
DM.Q_loc.Open;
while not DM.Q_loc.Eof do
  begin
    loc_cons_inst.Items.Add(DM.Q_loc.FieldByName('LOCALIDAD').AsString);
    DM.Q_loc.Next;
  end;
Prueba este:
Código Delphi [-]
DM.Q_loc.SQL.Clear;
DM.Q_loc.SQL.Add('select LOCALIDAD from LOCALIDADES');
DM.Q_loc.Open;
while not DM.Q_loc.Eof do
  begin
    loc_cons_inst.Items.Add(DM.Q_loc.FieldByName('LOCALIDAD').AsString);
    DM.Q_loc.Next;
  end;
Saludos

Vales08 12-01-2012 23:11:24

Me sigue dando el mismo error, lo que sucede es que yo no necesito ordenar, necesito si o si agrupar para que no me repita los campos sino me los muestra 2 veces...
Y realizandolo de esta forma tampoco me funciona

Código Delphi [-]
DM.Q_loc.SQL.Clear;
DM.Q_loc.SQL.Add('select LOCALIDAD from LOCALIDADES');
DM.Q_loc.Open;
while not DM.Q_loc.Eof do
  begin
    loc_cons_inst.Items.Add(DM.Q_loc.FieldByName('LOCALIDAD').AsString);
    DM.Q_loc.Next;
  end;

La verdad que no se porque me hace eso, porque me tendria que permitir seleccionar de a un campo solo, sin necesidad de seleccionar todo..

ecfisa 12-01-2012 23:14:46

Hola Vales.

Te hago una consulta: ¿ Agregaste campos persistentes ? Es decir, ¿ Tenés DBEdits, etc., relacionados con un 'SELECT * FROM LOCALIDADES' realizado sobre el TIBQuery ?

Saludos.

Caral 12-01-2012 23:17:32

Hola
a la brava :D
Código Delphi [-]
DM.Q_loc.SQL.Clear;
DM.Q_loc.SQL.Add('select DISTINCT LOCALIDAD from LOCALIDADES');
DM.Q_loc.Open;
while not DM.Q_loc.Eof do
  begin
    loc_cons_inst.Items.Add(DM.Q_loc.FieldByName('LOCALIDAD').AsString);
    DM.Q_loc.Next;
  end;
Saludos

Caral 12-01-2012 23:19:36

Hola
Casi me la juego :D:

Código Delphi [-]
DM.Q_loc.SQL.text:= 'select DISTINCT LOCALIDAD from LOCALIDADES';
DM.Q_loc.Open;
while not DM.Q_loc.Eof do
  begin
    loc_cons_inst.Items.Add(DM.Q_loc.FieldByName('LOCALIDAD').AsString);
    DM.Q_loc.Next;
  end;
Saludos

Vales08 12-01-2012 23:19:44

Tengo DBLookupComboBox pero están conectados directamente a un DataSet, el cual en el select SQL, tiene seleccionado todos los campos de Localidad.
Sera por eso??

Vales08 12-01-2012 23:22:20

Caral lo probe al codigo pero sigue sin funcionar, lo mismo me gustria saber que funcion cumple el DISTINCT..

ecfisa 12-01-2012 23:24:04

Hola Vales.
Cita:

Tengo DBLookupComboBox pero están conectados directamente a un DataSet, el cual en el select SQL, tiene seleccionado todos los campos de Localidad.
Sera por eso??
Si, creo que es eso.

Probá algo como:
Código Delphi [-]
procedure TForm1.btnCargarClick(Sender: TObject);
begin
  with TIBQuery.Create(nil) do
  try
    Database:= DM.IBDatabase1;
    Transaction:= DM.IBTransaction1;
    Close;
    SQL.Text:= 'SELECT LOCALIDAD FROM LOCALIDADES ORDER BY LOCALIDAD';
    Open;
    while not Eof do
    begin
      ComboBox1.Items.Add(FieldByName('LOCALIDAD').AsString);
      Next
    end;
    Close
  finally
    Free
  end;
end;
Lógicamente tendrías que cambiar los nombres de IBDatabase1, IBTransaction1, ComboBox1, etc. por los que correspondan.

Saludos.

Caral 12-01-2012 23:29:48

Hola
Estoy seguro que tiene campos persistentes segun el error:
Cita:

Project Project_tesis.exe raised exception class EDatabaseError with message 'Q_loc: Field 'ID_LOC' not found'. Process stopped. Use Step or Run to continue.
Dale doble click al Query y quita todos los campos que estan en esa pantalla.
Saludos

Vales08 12-01-2012 23:35:56

Ecfisa me salta el siguiente mensaje

Cita:

---------------------------
Debugger Exception Notification
---------------------------
Project Project_tesis.exe raised exception class EIBClientError with message 'Dataset open'. Process stopped. Use Step or Run to continue.
---------------------------
OK Help
---------------------------

Caral 12-01-2012 23:42:16

Hola
Abres el query antes de darle la sentencia sql o hay otro abierto cuando no debe estarlo.
Saludos

Vales08 12-01-2012 23:52:51

El unico Query que esta abierto es el que tengo en el DataModule y a lo que entiendo, tengo que cerrar ese query para poder trabajar con el que estoy creando, pero si lo cierro antes de esto
Código Delphi [-]
with TIBQuery.Create(nil) do
  try
    Database:= DM.IBDatabase1;
    Transaction:= DM.IBTransaction1;
    Close;
    SQL.Text:= 'SELECT LOCALIDAD FROM LOCALIDADES ORDER BY LOCALIDAD';
    Open;
    while not Eof do
    begin
      ComboBox1.Items.Add(FieldByName('LOCALIDAD').AsString);
      Next
    end;
    Close
  finally
    Free
  end;

Me salta el siguiente error:
Cita:

---------------------------
Debugger Exception Notification
---------------------------
Project Project_tesis.exe raised exception class EAccessViolation with message 'Access violation at address 004A6312 in module 'Project_tesis.exe'. Read of address 00000000'. Process stopped. Use Step or Run to continue.
---------------------------
OK Help
---------------------------

ecfisa 13-01-2012 00:02:10

Hola Vales.

Vamos a simplificar... poné un TIBQuery desde la pestaña Interbase, relacionalo con el TIBDatabase y hacé de este modo:

Código Delphi [-]
procedure TForm1.btnCargarClick(Sender: TObject);
begin
  with IBQuery2 do
  try
    Close;
    SQL.Text:= 'SELECT LOCALIDAD FROM LOCALIDADES ORDER BY LOCALIDAD';
    Open;
    while not Eof do
    begin
      ComboBox1.Items.Add(FieldByName('LOCALIDAD').AsString);
      Next
    end;
    Close
  finally
    Free
  end;
end;

Saludos. :)

ecfisa 13-01-2012 00:10:51

Perdón Vales, me confundí al copiar/pegar código. :o

Debería ser:
Código Delphi [-]
procedure TForm1.btnCargarClick(Sender: TObject);
begin
  with IBQuery2 do
  begin
    Close;
    SQL.Text:= 'SELECT LOCALIDAD FROM CIUDADES ORDER BY LOCALIDAD';
    Open;
    while not Eof do
    begin
      ComboBox1.Items.Add(FieldByName('LOCALIDAD').AsString);
      Next
    end;
    Close
  end;
end;

Saludos.

Vales08 13-01-2012 00:19:22

El error no salta mas, lo único es que me muestra los registros repetidos 2 veces... y agrupando tampoco lo hace.. pero por lo menos no salta el error..

ecfisa 13-01-2012 00:33:33

Cita:

Empezado por Vales08 (Mensaje 422838)
El error no salta mas, lo único es que me muestra los registros repetidos 2 veces... y agrupando tampoco lo hace.. pero por lo menos no salta el error..

Hola Vales.

La única forma de que suceda eso con el código anterior es que, o estén duplicadas las localidades en la tabla o que no estés vaciando el TComboBox y se realice la carga dos veces...

Probá de este modo:
Código Delphi [-]
...
  with IBQuery2 do
  begin
    Close;
    SQL.Text:= 'SELECT LOCALIDAD FROM CIUDADES ORDER BY LOCALIDAD';
    Open;
    ComboBox1.Clear;  // <-
    while not Eof do
    begin
      ComboBox1.Items.Add(FieldByName('LOCALIDAD').AsString);
      Next
    end;
    Close
  end;
...
Si aún así siguen apareciendo los registros repetidos utilizá el IBExpert (o el que uses) y ejecutá la sentencia
Código SQL [-]
SELECT LOCALIDAD FROM CIUDADES ORDER BY LOCALIDAD
para verificar que el campo LOCALIDAD no esté repetido.


Un saludo.

Caral 13-01-2012 01:15:21

Hola
o:

Código Delphi [-]
with IBQuery2 do
  begin
    Close;
    SQL.Text:= 'SELECT DISTINCT LOCALIDAD FROM CIUDADES ORDER BY LOCALIDAD';
    Open;
    ComboBox1.Clear;  // <-
    while not Eof do
    begin
      ComboBox1.Items.Add(FieldByName('LOCALIDAD').AsString);
      Next
    end;
    Close
  end;

Me niego a creer que entre un Maestro y este novato no podamos solucionarlo......:D:D;)
Saludos


La franja horaria es GMT +2. Ahora son las 04:32:57.

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