Fórum Consulta SQL #386170

13/09/2010

0

Pessoal tem uma consulta sql aonde a mesma so localiza o primeira cosulta preciso q aque quando ela seja feita a primeira consulta e quando o executo de novo ela tem q m consulta de novo o produto mas na segundo vez ela m diz q o produto nao foi localizado...

function Pesquisa(Codigo:String):integer;
var
   i : byte;
begin
  result := -1;
  i:= 1;
  fmTerminais.query.first;
  while fmTerminais.query.eof do
  if i < fmTerminais.query.recordcount then
  begin
    fmTerminais.query.close;
    fmTerminais.query.sql.clear;
    fmTerminais.query.sql.add('select codigo, codbarra, produto, precovenda from c000025');
    fmTerminais.query.sql.add('where codigo = '+CompletaZero(codigo,6));
    fmTerminais.query.open;
    begin
       result:= i;
       break;
    end;
   inc(i);
  end;
end;

sempre q executo ela duas vezes ele nao localiza o produto... como posso resolver isso...
Laelson Fagundes

Laelson Fagundes

Responder

Posts

13/09/2010

Eriley Barbosa

Sua query não acha nada, quando roda pela segunda vez por que está filtrada, basta remover o filtro após executar todo o laço: function Pesquisa(Codigo:String):integer;
var
   i : byte;
begin
  result := -1;
  i:= 1;
  fmTerminais.query.first;
  while fmTerminais.query.eof do
    if i < fmTerminais.query.recordcount then
    begin
      fmTerminais.query.close;
      fmTerminais.query.sql.clear;
      fmTerminais.query.sql.add('select codigo, codbarra, produto, precovenda from c000025');
      fmTerminais.query.sql.add('where codigo = '+CompletaZero(codigo,6));
      fmTerminais.query.open;
      begin
         result:= i;
         break;
      end;
     inc(i);
    end;
  fmTerminais.query.close;
  fmTerminais.query.sql.clear;
  fmTerminais.query.sql.add('select codigo, codbarra, produto, precovenda from c000025');
  fmTerminais.query.open;
end;
Responder

Gostei + 0

13/09/2010

Pietro Braga

Olá, porque você usa o laço na sua função?

Sugiro criar uma procedure para isto:

[code]

procedure Pesquisa (codigo: String);
begin
    fmTerminais.query.close;
    fmTerminais.query.sql.clear;
    fmTerminais.query.sql.add('select codigo, codbarra, produto, precovenda from c000025');
    fmTerminais.query.sql.add('where codigo = '+CompletaZero(codigo,6));
    fmTerminais.query.open;
end;

Depois chame em qualquer lugar do seu código.

begin
    Pesquisa();
end;

Responder

Gostei + 0

13/09/2010

Eriley Barbosa

Pietro, mas isso não resolveria o mproblema de executar pela segunda vez a query, já que na segunda vez estaria filtrada, teria que devolver a query ao seu estado inicial antes.
Responder

Gostei + 0

13/09/2010

Pietro Braga

Eriley, sempre faço minhas consultas dessa maneira, ela não está sendo limpa com o SQL.Clear?

Se não me explique melhor isso, assim posso incorporar mais uma boa prática de programação.

Abraço
Responder

Gostei + 0

13/09/2010

Laelson Fagundes

Pietro eu nao posso tirar as referencias abaixo

var
   i : byte;
begin
  result := -1;
  i:= 1;
  fmTerminais.query.first;
  while fmTerminais.query.eof do
  if i < fmTerminais.query.recordcount then
  begin

pois estou desenvolvendo para o sistema se comicar com o Microterminal Tec 16 e tem q essas instruções se forma fazer uma consulta mormal eu faço numa boa so q aqui a pessoa vai digitando no micro terminal e ele tem q dar o loop até ele nao querer digitar mais produto...

vou testar a dica do Eriley agora para vr se ele volta a mesmo estado...

Responder

Gostei + 0

13/09/2010

Laelson Fagundes

Eriley tentei da forma q vc determinou mas tambem nao deu certo ele so localiza o primeiro registro e nao localiza mais...


Responder

Gostei + 0

13/09/2010

Pietro Braga

Pessoal tem uma consulta sql aonde a mesma so localiza o primeira cosulta preciso q aque quando ela seja feita a primeira consulta e quando o executo de novo ela tem q m consulta de novo o produto mas na segundo vez ela m diz q o produto nao foi localizado...

function Pesquisa(Codigo:String):integer;
var
   i : byte;
begin
  result := -1;
  i:= 1;
  fmTerminais.query.first;
  while fmTerminais.query.eof do
  if i < fmTerminais.query.recordcount then
  begin
    fmTerminais.query.close;
    fmTerminais.query.sql.clear;
    fmTerminais.query.sql.add('select codigo, codbarra, produto, precovenda from c000025');
    fmTerminais.query.sql.add('where codigo = '+CompletaZero(codigo,6));
    fmTerminais.query.open;
    begin
       result:= i;
       break;
    end;
   inc(i);
  end;
end;

sempre q executo ela duas vezes ele nao localiza o produto... como posso resolver isso...


Ok, mas vou tentar altera um pouco esse código, teste dessa maneira e veja se da certo:


function Pesquisa(Codigo:String):integer;
var
   i : byte;
begin
  result := -1;
  i:= 1;
  fmTerminais.query.first;
  while Not(fmTerminais.query.eof) do
begin
  if i < fmTerminais.query.recordcount then
  begin
    fmTerminais.query.close;
    fmTerminais.query.sql.clear;
    fmTerminais.query.sql.add('select codigo, codbarra, produto, precovenda from c000025');
    fmTerminais.query.sql.add('where codigo = '+CompletaZero(codigo,6));
    fmTerminais.query.open;
    result:= i;
    break;
    inc(i);
  end;
end;

Responder

Gostei + 0

13/09/2010

Laelson Fagundes

Eriley da forma q vc passou eu da um loop sempre no mesmo produto...

nao importa o produto q eu coloco sempre vai m mostrar o mesmo ...
Responder

Gostei + 0

13/09/2010

Eriley Barbosa

Eriley, sempre faço minhas consultas dessa maneira, ela não está sendo limpa com o SQL.Clear?

Se não me explique melhor isso, assim posso incorporar mais uma boa prática de programação.

Abraço
Caro Pietro, o problema esta na lógica, o Tchuck está usando a mesma query para fazer a pesquisa, quando roda pela primeira vez, a query deve ter a seguinte instrução: select codigo, codbarra, produto, precovenda from c000025 Ai ele roda a pesquisa e a query passa a ter a seguinte instrução: 'select codigo, codbarra, produto, precovenda from c000025
codigo = '+CompletaZero(codigo,6)); Ai se rodar uma segunda vez a instrução que tem na query é a ultima: 'select codigo, codbarra, produto, precovenda from c000025
codigo = '+CompletaZero(codigo,6)); Pelo laço deve ter apenas 1 registro, que é o ultimo, logo não localiza nada.
 
 
Responder

Gostei + 0

13/09/2010

Pietro Braga

Só retire o Break do código que eu esqueci... :D
Responder

Gostei + 0

13/09/2010

Pietro Braga

Ahhhh Velhaaaa!!!  Faltou um End; também.... :S
Responder

Gostei + 0

13/09/2010

Eriley Barbosa

function Pesquisa(Codigo:String):integer;
var
   i : byte;
begin
  result := -1;
  i:= 1;   fmTerminais.query.close;
  fmTerminais.query.sql.clear;
  fmTerminais.query.sql.add('select codigo, codbarra, produto, precovenda from c000025');
  fmTerminais.query.open;
  fmTerminais.query.first;
  while Not(fmTerminais.query.eof) do
begin
  if i < fmTerminais.query.recordcount then
  begin
    fmTerminais.query.close;
    fmTerminais.query.sql.clear;
    fmTerminais.query.sql.add('select codigo, codbarra, produto, precovenda from c000025');
    fmTerminais.query.sql.add('where codigo = '+CompletaZero(codigo,6));
    fmTerminais.query.open;
    result:= i;
    inc(i);
  end;
end;
Responder

Gostei + 0

13/09/2010

Pietro Braga

Xiiiiiiiiiiii... no seu também Eriley...

End minino!!!
Responder

Gostei + 0

13/09/2010

Eriley Barbosa

Realmente esqueci de um end e fiz mais algumas correções, tente assim: function Pesquisa(Codigo:String):integer;
var
   i, TotReg : byte;
begin
  result := -1;
  i:= 1;
  fmTerminais.query.close;
  fmTerminais.query.sql.clear;
  fmTerminais.query.sql.add('select codigo, codbarra, produto, precovenda from c000025');
  fmTerminais.query.open;
  TotReg := fmTerminais.query.recordcount;
  fmTerminais.query.first;
  while Not(fmTerminais.query.eof) do
  begin
    if i < TotReg then
    begin
      fmTerminais.query.close;
      fmTerminais.query.sql.clear;
      fmTerminais.query.sql.add('select codigo, codbarra, produto, precovenda from c000025');
      fmTerminais.query.sql.add('where codigo = '+CompletaZero(codigo,6));
      fmTerminais.query.open;
      if not(fmTerminais.query.IsEmpty) then
      begin
        result := i;
        Break;
      end
      else
        inc(i);
    end;
  end;
end;
Responder

Gostei + 0

13/09/2010

Pietro Braga

wow, legal...
mas pq você incrementa o i se a query estiver vazia?
Responder

Gostei + 0

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

Aceitar