Consulta(SELECT) com três campos ao mesmo tempo. [DELPHI]
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!
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
Curtidas 0
Melhor post
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
08/05/2015
Poderia postar o erro ?
GOSTEI 0
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?
você conseguiu resolver esta consulta? pois estou passando pelo mesmo problema, teria como me ajudar nesta mesma situação?
GOSTEI 1
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 />
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
08/05/2015
Desconsiderar os <br />
GOSTEI 0
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 =
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
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.
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
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.
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
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.
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
08/05/2015
Qual versão do firebird você esta usando?
Se for a 3 acho que posso ajudar.
Se for a 3 acho que posso ajudar.
GOSTEI 0