Consulta(SELECT) com três campos ao mesmo tempo. [DELPHI]

Delphi

Firebird

08/05/2015

Bom dia!

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

Willian Pavan

Curtidas 0

Melhor post

Joel Rodrigues

Joel Rodrigues

08/05/2015

Tente fazer o seguinte: ao atribuir o texto do edit para cada parâmetro, pegue apenas os N primeiros caracteres, de acordo com o tamanho do campo. Ou seja, faça um substring pegando as 6 primeiras posições para preencher o parâmetro do campo, 20 para o código de barras, etc.
GOSTEI 1

Mais Respostas

Felippe Tadeu

Felippe Tadeu

08/05/2015

Poderia postar o erro ?
GOSTEI 0
Helton Garrido

Helton Garrido

08/05/2015

Boa tarde, Willian Pavan

você conseguiu resolver esta consulta? pois estou passando pelo mesmo problema, teria como me ajudar nesta mesma situação?
GOSTEI 1
Willian Pavan

Willian Pavan

08/05/2015

Boa noite amigo. <br />
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''); 
GOSTEI 1
Willian Pavan

Willian Pavan

08/05/2015

Desconsiderar os <br />
GOSTEI 0
Emerson Nascimento

Emerson Nascimento

08/05/2015

e se fosse algo assim:

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 =
GOSTEI 0
Emerson Nascimento

Emerson Nascimento

08/05/2015

corrigindo...

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.
GOSTEI 0
Socrates Foschera

Socrates Foschera

08/05/2015

corrigindo...

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
GOSTEI 0
Jefferson

Jefferson

08/05/2015

Olá boa noite!
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.
GOSTEI 0
Claudio Andrade

Claudio Andrade

08/05/2015

Qual versão do firebird você esta usando?
Se for a 3 acho que posso ajudar.
GOSTEI 0
POSTAR