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

08/05/2015

0

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

Responder

Post mais votado

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.

Joel Rodrigues

Joel Rodrigues
Responder

Mais Posts

08/05/2015

Felippe Tadeu

Poderia postar o erro ?
Responder

13/12/2017

Helton Garrido

Boa tarde, Willian Pavan

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

13/12/2017

Willian Pavan

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''); 
Responder

13/12/2017

Willian Pavan

Desconsiderar os <br />
Responder

15/02/2018

Emerson Nascimento

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

15/02/2018

Emerson Nascimento

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

06/01/2020

Socrates Foschera

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
Responder

02/10/2020

Jefferson

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

09/10/2020

Claudio Andrade

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

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

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

Aceitar