Pesquisa no DBGrid

Delphi

10/04/2010

Boa Tarde a Todos,

Antes de tudo quero dizer que sou iniciante em Delphi, estou aprendendo sozinho e com apostilas...
mais vai lá minha dúvida...

tenho uma DBGrid (DBGrid1)
um campo Edit (Edit1)
um BitBtn (BitBtn1)
e um ComboBox (ComboBox1)

preciso fazer com que ao digitar um texto no Edit, vai alimentando minha DbGrid,

por exemplo, inicio o form listando todos os registros de um cadastro de produtos no DBGrid, e ao começar digitar "COCA" no Edit1, apareça tudo que contenha a palavra "COCA", ou quando eu clicar no BitBtn, mas isso filtrando de acordo com meu combobox que tem as seguintes opções: Descrição, Código e Código de Barras.

já tentei com algumas formas que achei na net, mas não funcionou.

conto com a ajuda de vocês, Ótimo Fim de Semana pra todos!


Ewerton Batista

Ewerton Batista

Curtidas 0

Respostas

Robson Catunda

Robson Catunda

10/04/2010

Uma forma bem simples.   No evento onclick do botão faça:   var   xcamando: string; begin   case combobox1.itemindex of     0 : xcamando:='select * from produtos where descricao=%'+quotedstr(edit1.text)+'%';     1 : xcamando:='select * from produtos where codigo='+quotedstr(edit1.text);     2 : xcamando:='select * from produtos where codigodebarras=%'+quotedstr(edit1.text)+'%';   end;   datasource1.dataset.close;   sqldataset1.commandText:=xcomando;   datasource1.dataset.open; end;   obs: como vc não especificou o componente de acesso aos dados, eu considerei um conjunto sqldataset e clientdataset, com o clientdataset ligado ao datasource.
GOSTEI 0
Robson Catunda

Robson Catunda

10/04/2010

ah... um conselho, já que vc diz ser iniciante:   Nunca abra uma tabela trazendo todos os registros, à menos que vc tenha certeza de ser uma tabela tipicamente pequena.   Cadastros de produtos, clientes e vendas por exemplo, costumam ser muito grandes.   Sempre defina uma condição antes de executar o sql.
GOSTEI 0
Ewerton Batista

Ewerton Batista

10/04/2010

Então Robson eu uso um DataModule (como a propridade Name= Dm) e dentro dele eu tenho:

SimpleDataSetProdutos
DataSourceProdutos

como ficaria então?

eu modifiquei de acordo com meus campos e ficou assim somente a em vermelho que não sei como ficaria

var
  comando: string;
begin

  case combobox1.itemindex of
    0 : comando:='select * from PRODUTOS where PRODESCRICAO=%'+quotedstr(Edit1.text)+'%';
    1 : comando:='select * from PRODUTOS where PROCODIGO='+quotedstr(Edit1.text);
    2 : comando:='select * from PRODUTOS where PROCODBAR=%'+quotedstr(Edit1.text)+'%';
  end;

  Dm.DataSourceProduto.DataSet.Close;
  sqldataset1.commandText:=comando;
  Dm.DataSourceProduto.DataSet.Close;
end;

Brigadãooo!
GOSTEI 0
Ewerton Batista

Ewerton Batista

10/04/2010

Fiz assim, acho que ta certo,
mas quando clico no botão, não aparece nada na DBGrid!
fica sem nenhum registro, e não apresenta nenhuma mensagem de erro.

begin
Close;
end;

procedure TFrmPesquisaUsuario.BitBtn1Click(Sender: TObject);
var
  comando: string;
begin

  case ComboBox1.itemindex of
    0 : comando:='select * from PRODUTOS where PRODESCRICAO=%'+quotedstr(Edit1.text)+'%';
    1 : comando:='select * from PRODUTOS where PROCODIGO='+quotedstr(Edit1.text);
    2 : comando:='select * from PRODUTOS where PROCODBAR=%'+quotedstr(Edit1.text)+'%';
  end;

  Dm.DataSourceProduto.DataSet.Close;
  Dm.SimpleDataSetProdutos.DataSet.CommandText:=comando;
  Dm.DataSourceProduto.DataSet.Close;
end;

Espero pela sua ajuda...
GOSTEI 0
Robson Catunda

Robson Catunda

10/04/2010

Tente colocando o case como segue abaixo:   (observe que foram alteradas as opções 0 e 2)  case ComboBox1.itemindex of
    0 : comando:='select * from PRODUTOS where PRODESCRICAO containing '+quotedstr(Edit1.text);
    1 : comando:='select * from PRODUTOS where PROCODIGO='+quotedstr(Edit1.text);
    2 : comando:='select * from PRODUTOS where PROCODBAR containing '+quotedstr(Edit1.text);
  end;. Além disso, verifique se o DBGrid está realmente ligado ao DataSource e este ao SimpleDataSet. Outras observações:   1 - Sempre prefira o Dialect 3. 2 - O CharSet e Collate definidos tem influencia nos selects efetuados, devido a letras maiúsculas, minúsculas e acentos. 3 - Eu costumo utilizar o CharSet=ISO8859_1 e o Collate=ISO8859_1 para Firebird 1.5, ou Collate=PT_BR no Firebird 2.0.
GOSTEI 0
Wilson Junior

Wilson Junior

10/04/2010

Faltou você abrir o DataSet.

  Dm.DataSourceProduto.DataSet.Close;
  Dm.SimpleDataSetProdutos.DataSet.CommandText:=comando;
  Dm.DataSourceProduto.DataSet.Open;

Espero ter colaborado.
GOSTEI 0
Ewerton Batista

Ewerton Batista

10/04/2010

Obrigado Wilson, Obrigado Robson...

está funcionando agora certinho...porém...mais uma ajudinha de vocês

se eu por pra filtrar por código, e deixar o Edit em branco ele apresenta essa msg de erro:



acho que vai precisar de um if mas não sei onde por, poderiam me ajudar?

Obrigado!
GOSTEI 0
Wilson Junior

Wilson Junior

10/04/2010

Substitua:
1 : comando:='select * from PRODUTOS where PROCODIGO='+quotedstr(Edit1.text);


Por:

1 : comando:='select * from PRODUTOS where 
PROCODIGO='+IntToStr( StrToIntDef(Edit1.text, -1) );




Qualquer dúvida sobre o código é só perguntar.
Espero ter colaborado.
GOSTEI 0
Ewerton Batista

Ewerton Batista

10/04/2010

Muito Obrigado Wilsson, deu mas se o Edit1 estiver em branco não mostra nada, como eu faço para que quando estiver em branco, mostre todos os registros?

Obrigado!
GOSTEI 0
Wilson Junior

Wilson Junior

10/04/2010

Comando := 'SELECT * FROM PRODUTO';

if  Trim(Edit1.Text) <> '' then
  begin
    case ComboBox1.ItemIndex of
      0: Comando := Comando + 'WHERE ProDescricao CONTAINING ' + QuotedStr( Edit1.text );
      1: Comando := Comando + 'WHERE ProCodigo = ' + IntToStr( StrToIntDef(Edit1.text, -1) );
      2: Comando := Comando + 'WHERE ProCodBar CONTAINING ' + QuotedStr( Edit1.text );
    end;
  end
;


Espero ter colaborado.
GOSTEI 0
Ewerton Batista

Ewerton Batista

10/04/2010

É Wilson, não deu certo não...

substiui o código, e quando faço a pesquisa continua do mesmo jeito, não apresenta nenhuma mensagem mas não efetua a pesquisa tambem.


GOSTEI 0
Wilson Junior

Wilson Junior

10/04/2010

Acho que deve ser porque eu esqueci de colocar um espaço após o nome da tabela

Comando := 'SELECT * FROM PRODUTO ';

GOSTEI 0
Ewerton Batista

Ewerton Batista

10/04/2010

Agora quando eu digito qualquer coisa no Edit1, aparece o seguinte erro:



olhe meu código como está, verifique se é isso mesmo:


procedure TFrmPesquisaProduto.Edit1Change(Sender: TObject);
var
  comando: string;
begin
Comando := 'SELECT * FROM PRODUTO ';

if  Trim(Edit1.Text) <> '' then
  begin
    case ComboBox1.ItemIndex of
      0: Comando := Comando + 'WHERE ProDescricao CONTAINING ' + QuotedStr( Edit1.text );
      1: Comando := Comando + 'WHERE ProCodigo = ' + IntToStr( StrToIntDef(Edit1.text, -1) );
      2: Comando := Comando + 'WHERE ProCodBar CONTAINING ' + QuotedStr( Edit1.text );
    end;
  end
;

  Dm.DataSourceProduto.DataSet.Close;
  Dm.SimpleDataSetProdutos.DataSet.CommandText:=comando;
  Dm.DataSourceProduto.DataSet.Open;
end; 


GOSTEI 0
Wilson Junior

Wilson Junior

10/04/2010

O erro é porque você está tentando acessar a tabela PRODUTO e o nome dela é PRODUTOS, pois escrevi errado no código que lhe passei anteriormente.

Espero ter colaborado.
GOSTEI 0
Wilson Junior

Wilson Junior

10/04/2010

Funcionou???
Se sim, coloque como concluído o post, caso contrário informe o erro que está acontecendo.
GOSTEI 0
Andre Batista

Andre Batista

10/04/2010

E ae galera tudo bem??? como vcs pdem ver tmb sou novato, mas dando uma olhada no forum e neste post ja que preciso fazer um desses, eu percebi uma coisa mas naum sei c estou certo, mas assim, isso soh vai funcionar se tiver alguma coisa escrita no edit1,  esse edit1 é do nome, mas se vc escolher o codigo de barra por exemplo isso naum vai funcionar, talvez eu esteja errado, mas naum fica mais facil fazer assim: var
  comando: string;   resultado: string;
begin
Comando := 'SELECT * FROM PRODUTO ';

if  Edit1.Text <> '' then   resultado:= 'WHERE ProDescricao CONTAINING ' + QuotedStr( Edit1.text );   dm.datasourceproduto.dataset.commandtext := comando+resultado; if edit2.text <> '' then   resultado:= 'WHERE ProCodigo = ' + IntToStr( StrToIntDef(Edit2.text, -1) );   dm.datasourceproduto.dataset.commandtext := comando+resultado; if edit3.text <> '' then   resultado:='WHERE ProCodBar CONTAINING ' + QuotedStr( Edit2.text );   dm.datasourceproduto.dataset.commandtext := comando+resultado; end;

  Dm.DataSourceProduto.DataSet.Open;
end;   Acho que eh isso, lembrando que edit1 campo para nome, edit2 para codigo e edit3 paracodigo de barra, apesar de naum saber se esta certo acho que assim vcs ja podem me ajudar no meu dbgrid e na minha consulta, minha consulta vai ser para um formulario de pedido, assim, eu naum lembro o codigo do cliente entaum faço  pesquisa para saber e continuar o pedido, vai ser +o- isso ae em cima   Valeu espero ter ajudado e depois ser ajudado com isso ae, valeu   André Batista

GOSTEI 0
Andre Batista

Andre Batista

10/04/2010

Bem galera, seguinte, depois de ler esse post resolvi fazer o meu form de consulta, fico assim:   procedure TFRMConsultaCliente.BTOFiltrarClick(Sender: TObject);
begin
  inherited;
  IBQRYConsulta.Close;
  IBQRYConsulta.SQL.Clear;
  IBQRYConsulta.SQL.Add('select * from TBL_Cliente where (0=0)');
  if EDTNome.Text <> '' then
    IBQRYConsulta.SQL.Add('and (cli_nome like '+EDTNome.Text+'%'')');
  if EDTRazao.Text <> '' then
    IBQRYConsulta.SQL.Add('and (cli_razao like '+EDTNome.Text+'%'')');
  if EDTCidade.Text <> '' then
    IBQRYConsulta.SQL.Add('and (cli_cidade like '+EDTCidade.Text+'%'')');
  if edtCNPJ.Text <> '' then
    IBQRYConsulta.SQL.Add('and (cli_cnpj = '+QuotedStr(edtCNPJ.Text)+')');
  case RDGClassificar.ItemIndex of
    0:IBQRYConsulta.SQL.Add('order by Cli_nome');
    1:IBQRYConsulta.SQL.Add('order by Cli_Razao');
    2:IBQRYConsulta.SQL.Add('order by Cli_Cidade');
    3:IBQRYConsulta.sql.Add('order by Cli_CNPJ');
  end;
  IBQRYConsulta.Open;
end;   mas esta dando o seguinte erro:   eu naum sei o que esta acontecendo alguem consegue me ajudar     Valeu galera   André Batista
GOSTEI 0
Andre Batista

Andre Batista

10/04/2010

Seguinte, 2 coisas, eu tava dando uma verificada nos componentes para ver se estava td certo, o DBGrid estava conectado no DS errado por isso naum funcionava, agora sim funciona, em termos, auhauhuha, se naum tiver nenhuma condicaum nos edits, ele aparece no DBGrid todos os campos, mas se coloco por exemplo um nome e mando filtrar, da o mesmo erro abaixo, quer dizer, continuo na mesma, auhauhauh, por favor alguem me fale o q esta errado
Bem galera, seguinte, depois de ler esse post resolvi fazer o meu form de consulta, fico assim:   procedure TFRMConsultaCliente.BTOFiltrarClick(Sender: TObject);
begin
  inherited;
  IBQRYConsulta.Close;
  IBQRYConsulta.SQL.Clear;
  IBQRYConsulta.SQL.Add('select * from TBL_Cliente where (0=0)');
  if EDTNome.Text <> '' then
    IBQRYConsulta.SQL.Add('and (cli_nome like '+EDTNome.Text+'%'')');
  if EDTRazao.Text <> '' then
    IBQRYConsulta.SQL.Add('and (cli_razao like '+EDTNome.Text+'%'')');
  if EDTCidade.Text <> '' then
    IBQRYConsulta.SQL.Add('and (cli_cidade like '+EDTCidade.Text+'%'')');
  if edtCNPJ.Text <> '' then
    IBQRYConsulta.SQL.Add('and (cli_cnpj = '+QuotedStr(edtCNPJ.Text)+')');
  case RDGClassificar.ItemIndex of
    0:IBQRYConsulta.SQL.Add('order by Cli_nome');
    1:IBQRYConsulta.SQL.Add('order by Cli_Razao');
    2:IBQRYConsulta.SQL.Add('order by Cli_Cidade');
    3:IBQRYConsulta.sql.Add('order by Cli_CNPJ');
  end;
  IBQRYConsulta.Open;
end;   mas esta dando o seguinte erro:   eu naum sei o que esta acontecendo alguem consegue me ajudar     Valeu galera   André Batista
GOSTEI 0
Andre Batista

Andre Batista

10/04/2010

Bem galera, devem estar me achando chato já, mas descobri o erro, logo, me aparece outro, uhauhauh, o codigo ficou assim agora:   begin
  inherited;
  IBQRYConsulta.Close;
  IBQRYConsulta.SQL.Clear;
  IBQRYConsulta.SQL.Add('select * from TBL_Cliente where (0=0)');
  if EDTNome.Text <> '' then
    IBQRYConsulta.SQL.Add('and (cli_nome like ''%'+EDTNome.Text+'%'')');
  if EDTRazao.Text <> '' then
    IBQRYConsulta.SQL.Add('and (cli_razao like ''%'+EDTNome.Text+'%'')');
  if EDTCidade.Text <> '' then
    IBQRYConsulta.SQL.Add('and (cli_cidade like ''%'+EDTCidade.Text+'%'')');
  if edtCNPJ.Text <> '' then
    IBQRYConsulta.SQL.Add('and (cli_cnpj = '+QuotedStr(edtCNPJ.Text)+')');
  case RDGClassificar.ItemIndex of
    0:IBQRYConsulta.SQL.Add('order by Cli_nome');
    1:IBQRYConsulta.SQL.Add('order by Cli_Razao');
    2:IBQRYConsulta.SQL.Add('order by Cli_CNPJ');
    3:IBQRYConsulta.sql.Add('order by Cli_Cidade');
  end;
  IBQRYConsulta.Open;   Agora naum da erro nenhum, mas se coloco um nome para a pesquisa o DBGrid fica em branco, mas se tiro o nome aparece todos os campos, a ordem está funcionando corretamente, e agora o que fazer??? acredito q seja alguma coisa bem pequena que naum consegui ver, pois no erro anterior faltava apenas %, agora q naum falta mais pq ele insiste em naum fazer a pesquisa Valeu André Batista  
 
GOSTEI 0
Andre Batista

Andre Batista

10/04/2010

Agora sim fiquei insuportavel, auhauhauhauhhua, ninguem quer ver mais meus posts aqui, mas finalmente funcionou, e espero que ajude alguem ou até mesmo de alguma outra ideia para melhorias, finalmente ficou assim o codigo:   begin
  inherited;
  IBQRYConsulta.Close;
  IBQRYConsulta.SQL.Clear;
  IBQRYConsulta.SQL.Add('select * from TBL_Cliente where (0=0)');
  if EDTNome.Text <> '' then
    IBQRYConsulta.SQL.Add('and (cli_nome like ''%'+EDTNome.Text+'%'')');
  if EDTRazao.Text <> '' then
    IBQRYConsulta.SQL.Add('and (cli_razao like ''%'+EDTRazao.Text+'%'')');
  if EDTCidade.Text <> '' then
    IBQRYConsulta.SQL.Add('and (cli_cidade like ''%'+EDTCidade.Text+'%'')');
  if edtCNPJ.Text <> '' then
    IBQRYConsulta.SQL.Add('and (cli_cnpj = '+QuotedStr(edtCNPJ.Text)+')');
  case RDGClassificar.ItemIndex of
    0:IBQRYConsulta.SQL.Add('order by Cli_nome');
    1:IBQRYConsulta.SQL.Add('order by Cli_Razao');
    2:IBQRYConsulta.SQL.Add('order by Cli_CNPJ');
    3:IBQRYConsulta.sql.Add('order by Cli_Cidade');
  end;
  IBQRYConsulta.Open;
  O unico problema que me apresentou, mas naum vou me preocupar com isso por enquanto, é que se por exemplo eu digitar  no nome "Pedro" e filtrar ele acha, mas se eu digitar "pedro" ele naum acha, naum esta case sensitive, para mim está servindo, se ajudar alguem, otimo, mas pode ser que precise de algumas melhorias, entaum é isso, neste post naum escrevo mais, apenas se me pedirem, auhauhauhuhahua Valeu   André Batista
GOSTEI 0
Wilson Junior

Wilson Junior

10/04/2010

Tente desta maneira

  if  
EDTNome.Text <> '' then
      IBQRYConsulta.SQL.Add(' and 
(UPPER(cli_nome) LIKE UPPER( ' + QuotedStr( '%' + EDTNome.Text + '%' ) + ') )' )
  ;

  if  EDTRazao.Text <>
 '' then
      IBQRYConsulta.SQL.Add( ' and (UPPER(cli_razao) LIKE 
UPPER(' + QuotedStr( '%' + EDTRazao.Text + '%' ) + ') )' )
  ;


  if  EDTCidade.Text <> '' then
      IBQRYConsulta.SQL.Add( ' and (UPPER(cli_cidade) like UPPER( 
' + QuotedStr( '%' + EDTCidade.Text + '%' ) + ') )' )
  ;


  if  edtCNPJ.Text <> '' then
      IBQRYConsulta.SQL.Add( ' and (cli_cnpj = ' + QuotedStr(edtCNPJ.Text)+ ')' )
  ;



Espero ter colaborado.
GOSTEI 0
Ewerton Batista

Ewerton Batista

10/04/2010

Olá Pessoal, desculpem pela demora, fiquei sem computador por um tempo, mas agora já está tudo de bowa, Wilson muito obrigado pela ajuda, funcionou perfeitamente! Nota 10!

GOSTEI 0
Bruno Henrique

Bruno Henrique

10/04/2010

Pessoal, boa noite!!!

Tenho um edit e um combobox, seleciono o indice no combobox e digito no edit para trazer os dados no dbgrid, o indice do codigo funcionou normal, mais o nome e o usuario quando digito a letra no edit para pesquisar me retorna um erro, não consigo solucionar.

Mensagem de erro:

.exe raised exception EOleException white message Line1:Incorrect syntax near CONTAINING".Process stopped.Use Step or run continue.

Abaixo o meu codigo fonte.







unit U_Pesquisa_Funcionarios;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, DB, ADODB, Grids, DBGrids, ExtCtrls;

type
TFrm_Pesquisa_Funcionarios = class(TForm)
GroupBox1: TGroupBox;
GroupBox2: TGroupBox;
Dbg_Pesquisa_Funcionarios: TDBGrid;
ADODataSet1: TADODataSet;
DataSource1: TDataSource;
Edit1: TEdit;
ComboBox1: TComboBox;
Label1: TLabel;
procedure Edit1Change(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Frm_Pesquisa_Funcionarios: TFrm_Pesquisa_Funcionarios;
var
comando: string;


implementation


{$R *.dfm}

procedure TFrm_Pesquisa_Funcionarios.Edit1Change(Sender: TObject);
begin

begin
Comando := SELECT * FROM Cad_Funcionarios ;

if Trim(Edit1.Text) then
begin
case ComboBox1.ItemIndex of
0: Comando := Comando + WHERE Codigo = + IntToStr( StrToIntDef(Edit1.text, -1) );
1: Comando := Comando + WHERE Nome CONTAINING + QuotedStr( Edit1.text);
2: Comando := Comando + WHERE Usuario CONTAINIG + QuotedStr( Edit1.text);
end;
end;


ADODataSet1.Close;
ADODataSet1.CommandText:=comando;
ADODataSet1.Open;
end;
end;
GOSTEI 0
POSTAR