Fórum Query esta duplicando valores #385311

31/08/2010

0

Pessoal, no form de cadastro de produtos existe o campo para busca de produtos cadastrados.Então, pode-se digitar um valor para localizar um produto ja cadastrado, podendo ser cód, descricao, ou cód barras.Ele localiza e tudo mais.Só que quando voce apaga os valores digitados, a query retorna os valores duplicados várias vezes...Ja tentei várias alternativas, mas sempre esta voltando duplicado... não tenho idéia do que fazer.
O código esta no evento change, conforme digita ele procura.
procedure Tfrmlocalizarproduto.EdtlocalizaChange(Sender: TObject);begin  with DataModule1.ZQuerylocalizaproduto do begin    DataModule1.ZQuerylocalizaproduto.Close;    DataModule1.ZQuerylocalizaproduto.SQL.Clear;   DataModule1.ZQuerylocalizaproduto.SQL.Add('SELECT  produtos.idproduto,produto_grade.idproduto,produto_grade.descricao,produto_grade.codbar '+         'FROM produtos,produto_grade where produtos.idproduto=produto_grade.idproduto '+'and produto_grade.descricao like ''%'+edtlocaliza.Text+  '%''or produto_grade.idproduto like ''%'+ edtlocaliza.Text + '%''or produto_grade.codbar like ''%'+  edtlocaliza.Text + '%''group by produtos.idproduto,produto_grade.idproduto,' +  'produto_grade.descricao,produto_grade.codbar');  DataModule1.ZQuerylocalizaproduto.Open;
         if IsEmpty then // aqui vc faz a verificação se a tabela for vazia            begin                   showmessage('Nome não encontrado !!!');                   DataModule1.ZQuerylocalizaproduto.Close;                   Abort;           end; // fim do if
 end; // fim do with
end;

Quando vc usa apenas uma condição de procura (edtlocaliza.Text), ele funciona perfeitamente, mas da maneira que esta ele funciona, só que quando vc apaga o valor, ele retorna várias duplicados...
Maiquelnet

Maiquelnet

Responder

Posts

31/08/2010

Pietro Braga

Seu código está um pouco confuso, mas bem, se está funcionando isso deve ajudar:

Coloque nesse mesmo evento antes desse código:

if (localiza.text = '' ) then Abort
else
begin
with DataModule1.ZQuerylocalizaproduto do begin //Esse é o começo do seu código.
...
end



agora veja no que me referi quandi disse quew estava um pouco confuso.

se você ja está usando

with DataModule1.ZQuerylocalizaproduto do begin

então nas próximas linhas basta um simples:

Close; // só não tenho certeza quanto ao Close
SQL.Clear;
SQL.Add(........................................)
Open;


Responder

Gostei + 0

31/08/2010

Pietro Braga

Só corrigindo o código acima


[code]
if (edtlocaliza.text = '' ) then Abort
else
begin
with DataModule1.ZQuerylocalizaproduto do begin //Esse é o começo do seu código.
...
end; // Fim do With
end;

Responder

Gostei + 0

31/08/2010

Maiquelnet


Só corrigindo o código acima
if (edtlocaliza.text = '' ) then Abort
end;


   

  vou tentar explicar o código[code]  DataModule1.ZQuerylocalizaproduto.Close;  DataModule1.ZQuerylocalizaproduto.SQL.Clear;  DataModule1.ZQuerylocalizaproduto.SQL.Add('SELECT produtos.idproduto,produto_grade.idproduto,produto_grade.descricao,produto_grade.codbar '+ 'FROM produtos,produto_grade where produtos.idproduto=produto_grade.idproduto '+'and produto_grade.descricao like ''%'+edtlocaliza.Text+  '%''or produto_grade.idproduto like ''%'+ edtlocaliza.Text + '%''or produto_grade.codbar like ''%'+  edtlocaliza.Text + '%''group by produtos.idproduto,produto_grade.idproduto,' +  'produto_grade.descricao,produto_grade.codbar');  DataModule1.ZQuerylocalizaproduto.Op

Nessa parte ele faz uma consulta de 3 campos nas tabelas produto e produto grade. Seriam a Descricao, o IDproduto e o CódBarras, se for digitado um valor cadastrados em qualquer um destes, ele buscaria no query e mostraria.
Só que como ele tava duplicando eu coloquei esta parte:
if IsEmpty then // aqui vc faz a verificação se a tabela for vazia     begin     showmessage('Nome não encontrado !!!');     DataModule1.ZQuerylocalizaproduto.Close;     Abort;     end;

pq pensei que ele estivesse duplicando, quando eu limpasse ou não fosse encontrado o campo edtlocaliza ele limparia a query e apresentaria os valores iniciais... fiz isso pra tentar evitar a duplicação dos valores... mas mesmo assim ele continua duplicando...
Dae coloquei um witch no inicio apenas para ele ficar no loop.
Na verdade o que precisaria seria que ele apresentasse os valores da pesquisa sem duplicá-los...não sei se tem algum função própria para isso ou atraves de algum loop eu consiga...só sei q tentei várias mutretas e nenhuma deu certo...
Responder

Gostei + 0

01/09/2010

Pietro Braga

if (edtlocaliza.text = '' ) then DataModule1.ZQuerylocalizaproduto.ClearFields;
else
begin
with DataModule1.ZQuerylocalizaproduto do begin //Esse é o começo do seu código.
...
end; // Fim do With
end;
Responder

Gostei + 0

01/09/2010

Maiquelnet


if (edtlocaliza.text = '' ) then DataModule1.ZQuerylocalizaproduto.ClearFields;
else
begin
with DataModule1.ZQuerylocalizaproduto do begin //Esse é o começo do seu código.
...
end; // Fim do With
end;

 
 

meu bruxo, funcionou!!!só alterei alguma coisa... mas a idéia funcionou, ou seja, vc limpa a query antes de testar e depois vc faz a busca... da maneira q eu tava fazendo, depois de entrar no with, ele nunca conseguia limpar...ficou assim: 
if (edtlocaliza.text = '' ) then begin  DataModule1.ZQuerylocalizaproduto.close;  DataModule1.ZQuerylocalizaproduto.SQL.Clear;  DataModule1.ZQuerylocalizaproduto.SQL.Add('SELECT produtos.idproduto,produto_grade.idproduto,produto_grade.descricao,produto_grade.codbar '+ 'FROM produtos,produto_grade where produtos.idproduto=produto_grade.idproduto group by produtos.idproduto,produto_grade.idproduto,' +  'produto_grade.descricao,produto_grade.codbar');  DataModule1.ZQuerylocalizaproduto.Open;  end else begin
 DataModule1.ZQuerylocalizaproduto.Close;  DataModule1.ZQuerylocalizaproduto.SQL.Clear;  DataModule1.ZQuerylocalizaproduto.SQL.Add('SELECT produtos.idproduto,produto_grade.idproduto,produto_grade.descricao,produto_grade.codbar '+ 'FROM produtos,produto_grade where produtos.idproduto=produto_grade.idproduto '+'and produto_grade.descricao like ''%'+edtlocaliza.Text+  '%''or produto_grade.idproduto like ''%'+ edtlocaliza.Text + '%''or produto_grade.codbar like ''%'+  edtlocaliza.Text + '%''group by produtos.idproduto,produto_grade.idproduto,' +  'produto_grade.descricao,produto_grade.codbar');  DataModule1.ZQuerylocalizaproduto.Open;

assim quando apaga o valor digita do edit ele retorna sem duplicações... resolvendo o problema!!!valew e muito obrigado!!!
e se vc quizer me salvar de outra baita engrisia, da uma olha nesse outro tópico q ainda ta aberto!!https://www.devmedia.com.br/forum/viewtopic.asp?id=384784
valew mesmo!!!
Responder

Gostei + 0

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

Aceitar