Consulta(SELECT) com três campos ao mesmo tempo. [DELPHI]
08/05/2015
0
Estou desenvolvendo uma "consulta" onde vou buscar por três campos da tabela ao mesmo tempo. (CODIGO(6), BARRAS(20) e DESCRICAO(40)) todos eles estão declarados como varchar no banco.
Porem essa consulta estou fazendo com apenas um EDIT, e estou mostrando ele em um DBGRID.
Ou seja, a informação da busca vai ser capturada do EDIT, e independentemente se for digitado, o código, o cod.Barras ou a descrição do produto, o mesmo tem que ser encontrado.
Como quero que ele faça a busca em tempo real, conforme vou digitando no edit, no evento OnKeypress declarei o seguinte:
With IBQuery1 do
begin
Close;
SQL.Clear;
SQL.Add(' SELECT t1.codigo, t1.descricao, t1.barras');
SQL.Add(' FROM estoque t1 ');
Sql.Add(' WHERE t1.codigo LIKE :P00 ');
Sql.Add(' or t1.barras = :P01 ');
Sql.Add(' or t1.descricao LIKE :P00 ');
Params[00].AsString := '%'+(Edit1.text)+'%' ;
Params[01].AsString := (Edit1.text);
Open;
end;
O meu problema esta em relação ao tamanho definido de cada campo.
Por exemplo, como o meu campo CODIGO tem um size de 6, quando ele ultrapassa essa quantidade de caracteres no edit, ele apresenta erro no delphi.
Acredito que teria que fazer com que ele fizesse uma 'validação', ou seja, enquanto a quantidade de caracteres for até 6 ele vai fazer a busca em todos os campos.
Se for maior que 6 ele vai passa a desconsiderar o CODIGO e buscar apenas pela DESCRICAO.
O problema é que não sei como colocar isso em pratica.
Se alguém pudesse me orientar, seria grato. Obrigado!
Willian Pavan
Post mais votado
08/05/2015
Joel Rodrigues
Mais Posts
13/12/2017
Helton Garrido
você conseguiu resolver esta consulta? pois estou passando pelo mesmo problema, teria como me ajudar nesta mesma situação?
13/12/2017
Willian Pavan
Para resolver eu tive que fazer 3 consultas. <br />
- Pesquisa primeiro por código, se não achar nada <br />
- Pesquisa pela descrição, se não achar nada <br />
- Pesquisa pelo proximo campo. <br />
<br />
Fazer tudo em uma consulta só vai dar erro mesmo. <br />
Então faça a primeira pesquisa e verifica com um IF se retornou algo, se não pesquise pelo proximo campo e assim por diante ok. <br />
Segue como ficou o código<br />
<br /> try <br /> IBQuery1.Close; <br /> IBQuery1.SQL.Clear; <br /> IBQuery1.SQL.Add('' SELECT t1.codigo, t1.descricao, t1.barras FROM estoque t1 WHERE t1.codigo LIKE =:p1''); <br /> IBQuery1. parambyname(''p1'').asstring := inttostr(''Edit1.text''); <br /> IBQuery1.Open; <br /> <br /> if IBQuery1.IsEmpty then <br /> begin <br /> IBQuery1.Close; <br /> IBQuery1.SQL.Clear; <br /> IBQuery1.SQL.Add('' SELECT t1.codigo, t1.descricao, t1.barras FROM estoque t1 WHERE t1.barras LIKE =:p1''); <br /> IBQuery1.parambyname(''p1'').asstring := Edit1.text; <br /> IBQuery1.Open; <br /> end; <br /> <br /> if IBQuery1.IsEmpty then <br /> begin <br /> IBQuery1.Close; <br /> IBQuery1.SQL.Clear; <br /> IBQuery1.SQL.Add('' SELECT t1.codigo, t1.descricao, t1.barras FROM estoque t1 WHERE upper (t1.descricao) like upper (:p1)''); <br /> IBQuery1.parambyname(''p1'').asstring := ''%''+(Edit1.text)+''%'' ; <br /> IBQuery1.Open; <br /> end; <br /> end; <br /> except <br /> showmessage(''ocorreu erro nao localizar'');
15/02/2018
Emerson Nascimento
IBQuery1.Close;
IBQuery1.SQL.Clear;
IBQuery1.SQL.Add('' SELECT t1.codigo, t1.descricao, t1.barras FROM estoque t1'');
WHERE t1.codigo LIKE =:p1 OR t1.barras LIKE =:p2 OR upper (t1.descricao) like :p3");
IBQuery1. parambyname(''p1'').asstring := '%' + left(Edit1.text, TamanhoDoCampoCodigo) + '%';
IBQuery1. parambyname(''p2'').asstring := '%' + left(Edit1.text, TamanhoDoCampoBarras) + '%';
IBQuery1. parambyname(''p3'').asstring := '%' + left(Edit1.text, TamanhoDoCampoDescricao) + '%';
IBQuery1.Open;
obs.: não faz sentido usar o like para comparar igualdade. para isso use o operador =
15/02/2018
Emerson Nascimento
IBQuery1.Close;
IBQuery1.SQL.Clear;
IBQuery1.SQL.Add('' SELECT t1.codigo, t1.descricao, t1.barras FROM estoque t1'');
IBQuery1.SQL.Add(''WHERE t1.codigo LIKE =:p1 OR t1.barras LIKE =:p2 OR upper(t1.descricao) like :p3");
IBQuery1. parambyname(''p1'').asstring := '%' + leftstr(Edit1.text, TamanhoDoCampoCodigo) + '%';
IBQuery1. parambyname(''p2'').asstring := '%' + leftstr(Edit1.text, TamanhoDoCampoBarras) + '%';
IBQuery1. parambyname(''p3'').asstring := '%' + AnsiUpperCase(leftstr(Edit1.text, TamanhoDoCampoDescricao)) + '%';
IBQuery1.Open;
da forma como você fez nunca encontrará nada pelo código.
06/01/2020
Socrates Foschera
IBQuery1.Close;
IBQuery1.SQL.Clear;
IBQuery1.SQL.Add('' SELECT t1.codigo, t1.descricao, t1.barras FROM estoque t1'');
IBQuery1.SQL.Add(''WHERE t1.codigo LIKE =:p1 OR t1.barras LIKE =:p2 OR upper(t1.descricao) like :p3");
IBQuery1. parambyname(''p1'').asstring := '%' + leftstr(Edit1.text, TamanhoDoCampoCodigo) + '%';
IBQuery1. parambyname(''p2'').asstring := '%' + leftstr(Edit1.text, TamanhoDoCampoBarras) + '%';
IBQuery1. parambyname(''p3'').asstring := '%' + AnsiUpperCase(leftstr(Edit1.text, TamanhoDoCampoDescricao)) + '%';
IBQuery1.Open;
da forma como você fez nunca encontrará nada pelo código.
Olá tudo bem
com este tipo de codigo sem utilizar uma query de pesquisa consigo fazer, pois estou desenvolvendo um sistema de cadastro de maquinas agricolas onde coloco o codigo do cliente de no dbedit aparece o nome do cliente. Com esse codigo consigo resolver
02/10/2020
Jefferson
Estou a procura do código, pois estou querendo fazer esse tipo de consulta, mais tenho muitas duvidas em questão ao código. Quero saber se o problema do amigo Willian Pavan foi resolvido.
09/10/2020
Claudio Andrade
Se for a 3 acho que posso ajudar.
Clique aqui para fazer login e interagir na Comunidade :)