Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Busqueda usando un DBLookupComboBox (https://www.clubdelphi.com/foros/showthread.php?t=69675)

liito16 01-09-2010 18:18:02

Busqueda usando un DBLookupComboBox
 
Hola gentes, bueno tengo un problema en como realizar una busqueda.

El problema es como se realiza.
Lo que quiero hacer es que cuando selecciones una opcion del DBLookupComboBox, en el grid aparesca los resultados, y cuando lo deje en blanco esten todos los registros.

estoy usando un modulo de datos donde tengo los dataset, query. y tngo el formulario clientes donde tngo el datasource, clientedataset, provider. qe es para conectar el DBLookupComboBox.

nosotros damos de alta localidades y estas cuando vas a dar de alta un cliente aparece el campo localidad que atraves del DBLookupComboBox seleccionas cual queres.
la tabla clientes tiene un inner join con tabla localidades.

que es lo q tendria qe hacer?. que pongo en el qryclientes, y en que evento de DBLookupComboBox tngo que hacerlo muchas gracias vi un hilo que decia de como se realizaba la busqueda pero no entendi , estoy usando delphi 7 y ems interbase/firbird.

Desde ya muchas gracias espero que me entiendan

Caro 01-09-2010 18:41:51

Hola liito16, de hecho seguro que tienees un dataset para tus localidades y otro para clientes, para hacer lo que quieres debes utilizar el evento OnCloseUp del DBLookComboBox y hacer la consulta en tu qryClientes, tomando lo que tienes en ese momento en el DBLookComboBox:

Código Delphi [-]
procedure ....DBLookupComboBox1CloseUp(.............);
begin
 QryClientes.Close;
 QryClientes.SQL.Text := 'Select * From Clientes Where fk_cod='+ QuotedStr(QryLocal.fieldbyName('cod').AsString);
 QryClientes.Open;
end;

Saluditos

liito16 01-09-2010 18:52:31

es que cuando pongo qryclientes. salta
error [Error] Clientes.pas(80): Undeclared identifier: 'QryClientes'
[Error] Clientes.pas(80): Missing operator or semicolon
[Error] Clientes.pas(81): Missing operator or semicolon
[Error] Clientes.pas(81): Undeclared identifier: 'QryLocal'
[Error] Clientes.pas(81): Missing operator or semicolon
[Fatal Error] Videoclub.dpr(10): Could not compile used unit 'Clientes.pas'

liito16 01-09-2010 18:58:30

solucione el problema de arriba y ahora cuando selecciono alguno para que muestre los resultados me tira:

project videoclub.exe raised exeption class edatabaseerror with message 'qrylocalidades':field 'cod ' not found

Caro 01-09-2010 19:03:43

Cita:

Empezado por liito16 (Mensaje 375239)
project videoclub.exe raised exeption class edatabaseerror with message 'qrylocalidades':field 'cod ' not found

Hola de nuevo liito16, tienes que reemplazar por los campos que tienes en tus tablas, donde fk_cod sería el campo que se relaciona con tu tabla localidades y cod es el codigo de tu tabla localidades o el nombre que le hayas dado.

Saluditos

liito16 01-09-2010 19:16:27

Código SQL [-]
 mdmodulodedatos.QryClientes.SQL.Text := 'Select * From Clientes Where LOCALIDAD_NOMBRE='+ QuotedStr(mdmodulodedatos.Qrylocalidades.fieldbyName('LOCALIDAD_NRO').AsString);

asi lo deje yo y me tira ese error
no sera que en el qryclientes este poniendo algo mal?
lo puse en la propiedad SQL.
Código SQL [-]
select
  Clientes.*,
  localidades.nombre as localidad_nombre
from CLIENTES
inner join LOCALIDADES on clientes.localidad_nro = localidades.localidad_nro
 Where localidad_nro=:cod

Caro 01-09-2010 19:50:32

Muestranos el codigo completo que tienes en el OnCloseUp y ¿que componentes estas utilizando a parte del ClientDataSet?.

Saluditos

liito16 01-09-2010 19:57:56

Código SQL [-]
  mdmodulodedatos.QryClientes.Close;
  mdmodulodedatos.QryClientes.SQL.Text := 'Select * From CLIENTES  Where LOCALIDAD_NOMBRE='+ QuotedStr(mdmodulodedatos.QryLocalidades.fieldbyName('LOCALIDAD_NRO').AsString);

  mdmodulodedatos.QryClientes.Open;

ese es el codigo que puse en el evento del bdlookupcombobox

utilizo el clientdataset que lo conecto con el provider y data source lo conecto con el client y el grid esta conectado con el data source el provider va a dataset clientes. para cada dblookupcombobox que utilizo creo uno de cada uno un data source, client, provider, y un qry porq es una consulta. :) espero que entiendas

Caro 01-09-2010 20:48:16

Ahora que he leído mejor tus anteriores respuestas, el problema esta en el parámetro cod de tu qrylocalidades el cual no lo encuentra, revisa bien esa parte, para que estas utilizando esa parametro, cuando le asignas valor a cod......

Cita:

Empezado por liito16 (Mensaje 375251)
utilizo el clientdataset que lo conecto con el provider y data source lo conecto con el client y el grid esta conectado con el data source el provider va a dataset clientes. para cada dblookupcombobox que utilizo creo uno de cada uno un data source, client, provider, y un qry porq es una consulta. :) espero que entiendas

Entiendo ;), ¿tus querys pertenecen a los componentes BDE, ADO, DBExpres....., a cual?.

Por la consulta que muestras mas arriba en el Where tienes que comparar por el campo LOCALIDAD_NRO de tu tabla clientes que es con el campo con el que se realcionan tus tablas y no por LOCALIDAD NOMBRE.

Código Delphi [-]
With mdmodulodedatos do
begin
  QryClientes.SQL.Text := 'Select * From CLIENTES  ';
                 'Where LOCALIDAD_NRO='+ QuotedStr(QryLocalidades.fieldbyName('LOCALIDAD_NRO').AsString);
end;

Saluditos

liito16 02-09-2010 00:38:36

los qrys pertenecen a DBExpres,
y dsp el parametro se crea automaticamente en el qryclientes, y tngo que crear otro en el qrylocalidades?

en el parametro del qryclientes en propiedades pongo
name: cod
datatype: ftinteger
paramtype: ptInput

nose si tiene que ver pero los formularios vienen heredados de una plantilla que creamos.

ecfisa 03-09-2010 09:49:13

Hola lito16.

Cita:

Lo que quiero hacer es que cuando selecciones una opcion del DBLookupComboBox, en el grid aparesca los resultados, y cuando lo deje en blanco esten todos los registros.
Hice la prueba directamente con los IBDataSet (para simplificar) usando los eventos OnCloseUp y OnDropDown del DBLookupComboBox .
Hace exáctamente lo que especificas en la cita.

Código Delphi [-]
// (DBLookupComboBox -> Cliente ; DBGrid -> Localidades)
...
procedure TForm1.FormCreate(Sender: TObject);
begin
  IBDataSetCliente.Open;
  IBDataSetLocalidad.Open;
  with DBLookupClientes do
  begin
    ListSource:= dsCliente;
    ListField:= 'NOMBRE';
    KeyField:= 'CLIENTE_ID';
  end;
end;

procedure TForm1.DBLookupClientesCloseUp(Sender: TObject);
begin
  if DBLookupClientes.Text > '' then
    with IBDataSetLocalidad do
    begin
      Close;
      SelectSQL.Text:= 'SELECT * FROM LOCALIDADES WHERE LOCALIDAD_ID = '+
           IBDataSetCliente.FieldByName('LOCALIDAD').AsString;
      Open;
    end;
end;

procedure TForm1.DBLookupClientesDropDown(Sender: TObject);
begin
  DBLookupClientes.KeyValue:='';
  with IBDataSetLocalidad do
  begin
    Close;
    SelectSQL.Text:= 'SELECT * FROM LOCALIDADES';
    Open;
  end;
end;
...

Espero haberte interpretado bíen...

Saludos. :)

liito16 03-09-2010 19:36:20

Influye algo que use los componentes de DBexPRESS, SQLDATASET? eso son los que estoy usando

ecfisa 03-09-2010 20:23:28

Hola liito.

No he trabajado con DBexPRESS, pero supongo que la lógica del programa es la misma para cualquier
base de datos o componentes con los que trabajes.

.Al abrir el combo asignas la propiedad KeyValue a '' para limpiar lo que está en la propiedad Text
y mostras todos los registros el el DBGrid.
.Al cerrarlo, verificas si hizo una seleccion (if KeyValue >''...) y si es así mostras en el DBGrid los registros
que indique la consulta acorde a la seleccion del DBLookupComboBox.

No tomes al pié de la letra el código que puse. Fué solo una prueba que realizé a fín de ejemplificar que eventos del
DBLookupComboBox usar, para que funcione del modo que pediste.

Saludos.

liito16 04-09-2010 04:03:17

Solucion
 
Gente comparto la solucion a mi problema,

Los componentes que use como el query y dataset estan en DBExpress.

tube que agregar el modulo de datos creado en el dataset llamado dsetclientes en la propiedad commandtext

Código SQL [-]
where (clientes.localidad_nro=:LOCALIDAD) or (0=:LOCALIDAD)

ademas de las lineas que ya tenia este dataset como el select from y order by,
acomodar los dos parametros creados por medio de la propiedad params, que fue ponerle datatype ftInteger.

y en el clientedataset, llamado clidatos poner en la propiedad Params los dos parametros creados y ponerle el mismo nombre y el mismo datatype.

agregar en el formulario Clientes Un dblookupcombobox y en datasource y datafield nada. y en el listsource conectarlo con el query localidades llamado qrylocalidades que se encuentra en el modulo de datos,

dsp ir al formulario Clientes y en el evento OnShow

Código:


 with clidatos do
  begin
    Close;
    params.ParamByName('LOCALIDAD').AsInteger:=0;
    Open;
  end;

y dsp en el evento del combobox - OnExit

Código:

  with Clidatos do begin
    close;    Params.ParamByName('LOCALIDAD').AsInteger:=dbcLocalidadFiltro.KeyValue;
    open;
  end;
  chkTodos.Checked:=False;

agrege un Chekbox para poder ver todos los clientes en el cual en el evento OnClic puse:
Código:

  dbcLocalidadFiltro.KeyValue:=null;
  if chkTodos.Checked then begin
    with clidatos do
    begin
    Close;
    params.ParamByName('LOCALIDAD').AsInteger:=0;
    Open;
    end;
  end;

para cuando presione si quiere ver en el combo aparesca en blanco y se vean todos los clientes

ademas en la propiedad de estos dos componentes puse TabStop false para que si el usuario apretara tab no pase por estos dos componentes. ya que es un filtro que si quiere hacerlo lo hace.

Hoy en la facu le pregunte al profesor como se hacia y me explico.
Muchas gracias por ayudarme y comparto con ustdes la solucion que use espero que me entiendan :).


La franja horaria es GMT +2. Ahora son las 23:52:59.

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