Fórum Pesquisa no DBGrid #134601

10/04/2010

0

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

Responder

Posts

10/04/2010

Robson Catunda

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.
Responder

Gostei + 0

10/04/2010

Robson Catunda

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.
Responder

Gostei + 0

10/04/2010

Ewerton Batista

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!
Responder

Gostei + 0

10/04/2010

Ewerton Batista

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...
Responder

Gostei + 0

12/04/2010

Robson Catunda

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.
Responder

Gostei + 0

12/04/2010

Wilson Junior

Faltou você abrir o DataSet.

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

Espero ter colaborado.
Responder

Gostei + 0

12/04/2010

Ewerton Batista

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!
Responder

Gostei + 0

13/04/2010

Wilson Junior

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.
Responder

Gostei + 0

13/04/2010

Ewerton Batista

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!
Responder

Gostei + 0

13/04/2010

Wilson Junior

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.
Responder

Gostei + 0

14/04/2010

Ewerton Batista

É 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.


Responder

Gostei + 0

15/04/2010

Wilson Junior

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

Comando := 'SELECT * FROM PRODUTO ';

Responder

Gostei + 0

15/04/2010

Ewerton Batista

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; 


Responder

Gostei + 0

15/04/2010

Wilson Junior

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.
Responder

Gostei + 0

16/04/2010

Wilson Junior

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

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar