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)
-   -   Problema dblookupcombobox al hacer consulta (https://www.clubdelphi.com/foros/showthread.php?t=79113)

gersojn 08-06-2012 15:43:28

Problema dblookupcombobox al hacer consulta
 
Hola, les comento que tengo una aplicacion, en la cual tengo una conexion a una BD Oracle XE, mediante componentes de la libreria ZeosLib, y tengo un problema con el componente dblookupcombobox.

El problema radica, que se deben efectuar consulta en la tabla X de la BD y mostrarlo en un formulario(hasta aca todo bien), dichas consultas se generan en base a los valores de la tabla Y, los valores de la Tabla Y los muestro en un dblookupcombobox. Pero al efectuar la primer consulta, el dblookupcombobox (asumiendo que tengo los siguientes valores en la tabla Y: 1,2,3) si selecciono la opcion 1 o 2 o 3, al intentar hacer otra consulta el dblookupcombobox solo me muestra la opcion elegida y ya no mas todas las que estan en la Tabla Y.

Alguen tiene una idea de que pueda causar el Problema, de antemano muchas gracias por la ayuda.

Casimiro Notevi 08-06-2012 15:58:03

Hombre, no somos adivinos, ya podrías poner el código fuente que usas ;)

microbiano 08-06-2012 15:58:22

Bueno que te parece si expresas mejor tu pregunta.

gersojn 08-06-2012 16:02:11

Claro, siento no ha ver colocado el codigo, la funcion donde realizo la consulta es el siguiente.
dblookupcombobox = COMBOTIPOSALA
Código Delphi [-]
procedure TForm4.BOTONBUSCARSALAClick(Sender: TObject);
var tiposala:String;
begin
if COMBOTIPOSALA.Text = '' then
begin
QUERYSALA.Close;
QUERYSALA.SQL.Clear;
QUERYSALA.SQL.Add('SELECT * FROM SALA WHERE ESTADO='+quotedstr('LIBRE'));
QUERYSALA.Open;
end;

if COMBOTIPOSALA.Text <> EmptyStr then
begin
tiposala:= COMBOTIPOSALA.Text;
QUERYTIPOSALA.Close;
QUERYTIPOSALA.SQL.Clear;
QUERYTIPOSALA.SQL.Add('SELECT TIPO_SALA,NOMBRE FROM TIPO_SALA WHERE NOMBRE='+quotedstr(tiposala));
QUERYTIPOSALA.Open;
tiposala:=QUERYTIPOSALA.FieldByName('TIPO_SALA').AsString;
QUERYSALA.Close;
QUERYSALA.SQL.Clear;
QUERYSALA.SQL.Add('SELECT * FROM SALA WHERE TIPO_SALA='+quotedstr(tiposala)+'AND ESTADO='+quotedstr('LIBRE'));
QUERYSALA.Open;
COMBOTIPOSALA.KeyValue:=null;

end;

end;

En cuanto al dblookupcombobox lo tengo configurado en las propiedades del componente, en la barra Object Inspector.
Y nuevamente gracias por las respuestas

gersojn 08-06-2012 16:10:12

Solucionado
 
Hola, ya lo he solucionado, aunque quiza no sea lo mas optimo, pero ya me funciona, adjunto el codigo.
Boton Consulta:

Código Delphi [-]
procedure TForm4.BOTONBUSCARSALAClick(Sender: TObject);
var tiposala:String;
begin
if COMBOTIPOSALA.Text = '' then
begin
QUERYSALA.Close;
QUERYSALA.SQL.Clear;
QUERYSALA.SQL.Add('SELECT * FROM SALA WHERE ESTADO='+quotedstr('LIBRE'));
QUERYSALA.Open;
end;

if COMBOTIPOSALA.Text <> EmptyStr then
begin
tiposala:= COMBOTIPOSALA.Text;
QUERYTIPOSALA.Close;
QUERYTIPOSALA.SQL.Clear;
QUERYTIPOSALA.SQL.Add('SELECT TIPO_SALA,NOMBRE FROM TIPO_SALA WHERE NOMBRE='+quotedstr(tiposala));
QUERYTIPOSALA.Open;
tiposala:=QUERYTIPOSALA.FieldByName('TIPO_SALA').AsString;
QUERYSALA.Close;
QUERYSALA.SQL.Clear;
QUERYSALA.SQL.Add('SELECT * FROM SALA WHERE TIPO_SALA='+quotedstr(tiposala)+'AND ESTADO='+quotedstr('LIBRE'));
QUERYSALA.Open;
Timer1.Enabled:=True;//Agrege un timer
end;

end;

Funcion Timer

Código Delphi [-]
procedure TForm4.Timer1Timer(Sender: TObject);
begin
QUERYTIPOSALA.Close;
QUERYTIPOSALA.SQL.Clear;
QUERYTIPOSALA.SQL.Add('SELECT NOMBRE FROM TIPO_SALA');
QUERYTIPOSALA.Open;
Timer1.Enabled:=False;
end;
Lo que hago es limpiar el Query y lanzar el mismo query nuevamente, para que el dblookupcombobox quede nuevamente con los mismos valores de la Tabla.

Gracias por la ayuda.

Cañones 08-06-2012 16:54:45

Lo que te recomiendo es que en un datamodule tengas las consultas, fuera del form, para que sean independientes y poder llamar de distintos forms un datamodule.
Entonces en el datamodule creas un procedimiento que sea cargar TIPOSSALAS donde cerrar el dataset, lo limpias y cargas la consulta base.
Cita:

QUERYSALA.SQL.Add('SELECT * FROM SALA')
Desde el form pasas los parametros para filtrar y filtras el dataset en el datamodule de la misma forma que lo haces en el form.
Cita:

QUERYSALA.SQL.Add('WHERE TIPO_SALA='+quotedstr(elParametroDelFiltro)+'AND ESTADO='+quotedstr('LIBRE'));
La idea es aislar las consultas del formulario para ahorar volver a codificar cuando lo necesites en otra parte del sistema.

Casimiro Notevi 08-06-2012 17:01:24

Lo del timer no solamente es una chapuza, es que además ese no es el problema, ni la solución.

ecfisa 08-06-2012 20:47:35

Hola.

El problema se produce por que usas el mismo query para el DBLookupComboBox y para realizar la consulta. De ese modo, cuando asignas la cadena SQL de la consulta (en el evento OnClick) se sobreescribe la primera cadena que alimentaba al combo.

Te sugiero dos alternativas:
La primera es usar dos componentes query, uno para el DBLookupComboBox y otro para la consulta (a mi criterio la mejor opción).
La otra es poner el código que asignaste al evento OnTimer al finalizar la consulta. O también salvar previamente la consulta original en una variable y asignarla al query una vez finalizada (que es lo mismo).
Código Delphi [-]
procedure TForm4.BOTONBUSCARSALAClick(Sender: TObject);
var
  ..
  ConsultaOriginal: string;
begin
  ConsultaOriginal:= QUERYTIPOSALA.SQL.Text; // salvar cadena anterior
  //...
  // las operaciones que desees con QUERYTIPOSALA...
  //...
  QUERYTIPOSALA.Close;
  QUERYTIPOSALA.SQL.Text:= ConsultaOriginal; 
  QUERYTIPOSALA.Open;
end;
Pero como dice Casimiro, usar un TTimer no soluciona nada.

Saludos.


La franja horaria es GMT +2. Ahora son las 05:29:58.

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