Consulta SQL

Delphi

13/09/2010

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

Curtidas 0

Respostas

Eriley Barbosa

Eriley Barbosa

13/09/2010

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;
GOSTEI 0
Pietro Braga

Pietro Braga

13/09/2010

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;

GOSTEI 0
Eriley Barbosa

Eriley Barbosa

13/09/2010

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.
GOSTEI 0
Pietro Braga

Pietro Braga

13/09/2010

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
GOSTEI 0
Laelson Fagundes

Laelson Fagundes

13/09/2010

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

GOSTEI 0
Laelson Fagundes

Laelson Fagundes

13/09/2010

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


GOSTEI 0
Pietro Braga

Pietro Braga

13/09/2010

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;

GOSTEI 0
Laelson Fagundes

Laelson Fagundes

13/09/2010

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 ...
GOSTEI 0
Eriley Barbosa

Eriley Barbosa

13/09/2010

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.
 
 
GOSTEI 0
Pietro Braga

Pietro Braga

13/09/2010

Só retire o Break do código que eu esqueci... :D
GOSTEI 0
Pietro Braga

Pietro Braga

13/09/2010

Ahhhh Velhaaaa!!!  Faltou um End; também.... :S
GOSTEI 0
Eriley Barbosa

Eriley Barbosa

13/09/2010

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;
GOSTEI 0
Pietro Braga

Pietro Braga

13/09/2010

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

End minino!!!
GOSTEI 0
Eriley Barbosa

Eriley Barbosa

13/09/2010

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;
GOSTEI 0
Pietro Braga

Pietro Braga

13/09/2010

wow, legal...
mas pq você incrementa o i se a query estiver vazia?
GOSTEI 0
Laelson Fagundes

Laelson Fagundes

13/09/2010

Eriley desa ultima forma ele nao me localiza nada ele passa batido e nao me traz nada...
GOSTEI 0
Eriley Barbosa

Eriley Barbosa

13/09/2010

Na verdade, o laço, if, incremento para mim não precisaria de nada disso.
GOSTEI 0
Laelson Fagundes

Laelson Fagundes

13/09/2010

qual dos if vc se refere...
GOSTEI 0
Pietro Braga

Pietro Braga

13/09/2010

Concordo, para mim isso também não é necessário.
GOSTEI 0
Laelson Fagundes

Laelson Fagundes

13/09/2010

qual dos if vc se refere...


essa linha ela nao esta percorendo a tabela todo

TotReg := fmTerminais.query.recordcount;

ela so conta atpe 25


GOSTEI 0
Eriley Barbosa

Eriley Barbosa

13/09/2010

Amigo o próprio SELECT, se encarrega de percorrer a tabela toda, tente assim: function Pesquisa(Codigo:String):Boolean;
begin
  result := False;
  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
    result := True
  else
  begin
    {Se não achar nada devolve o SQL ao seu estado original, caso contrario ficaria com um comando que não retornaria nada}     ShowMessage('Código não encontrado');     fmTerminais.query.close;
    fmTerminais.query.sql.clear;
    fmTerminais.query.sql.add('select codigo, codbarra, produto, precovenda from c000025');
    fmTerminais.query.open;
  end;
end;
GOSTEI 0
Pietro Braga

Pietro Braga

13/09/2010

Há mais dados na sua tabela? e sim acho estranho mas tente com outro laço

tipo

i:= 0;
fmTerminais.query.first;
while Not(fmTerminais.query.eof) do
begin
inc(i);
fmTerminais.query.Next;
end;
GOSTEI 0
Pietro Braga

Pietro Braga

13/09/2010

Foi malz denovo... troque o I pelo TotReg!!!
GOSTEI 0
Laelson Fagundes

Laelson Fagundes

13/09/2010

eu nao posso usar boolean pq essa valor é passado para uma array do tipo inteiro que compoe uma função das dll do microterminal...


GOSTEI 0
Eriley Barbosa

Eriley Barbosa

13/09/2010

Só troca o boolean por integer
GOSTEI 0
Laelson Fagundes

Laelson Fagundes

13/09/2010

mas isso é função de uma dll

 Ind_Produto:array[0..NTerminal-1] of Integer;

essa é a instrução q vai receber a pesquiza ela é extraida de uma dll
GOSTEI 0
Eriley Barbosa

Eriley Barbosa

13/09/2010

Mas o que o array recebe, o código do produto ou o número do terminal, se é o número do terminal, nem a sua versão inicial da função devolvia este número.
GOSTEI 0
Pietro Braga

Pietro Braga

13/09/2010

Por acaso você está tentando fazer testes com o terminal 25?

Daí no array teremos 25 posições, e somente 25 registros poderiam ser exibidos...
GOSTEI 0
Laelson Fagundes

Laelson Fagundes

13/09/2010

ele vai receber o codigo da pesquiza e ele vai repassar o numero do terminal junto ao codigo da pesquiza

dessa forma funciona usando um grid...

function Pesquisa(Codigo:String):integer;
var
 i:byte;
begin
  result := -1;
  i:= 1;
  while i < fmTerminais.grid.RowCount do
  begin
    if fmTerminais.grid.Cells[0,i] = Codigo then
    begin
      result:= i;
      break;
    end;
    inc(i);
  end;
end;

mas nao posso usar dessa forma ai de cima...

aqui é aonde ele vai receber  as informações da pesquiza

begin
             Ind_Produto[terminal]:= Pesquisa(teclado[Terminal]); // faz a pesquisa do código, no exemplo está psquisando o Grid
            if  Ind_Produto[terminal] = -1  then // não encontrou
            begin
              GClear(Terminal);
              Gdisplay (Terminal,'Produto nao');
              GPosCursor(terminal,1,2);
              Gdisplay(terminal,'Localizado!');
              estado[Terminal] := 99;
              Proximo_estado[terminal]:=6;
              GGet(Terminal,'X');
            end
            else
            begin
              if grid.Cells[3,Ind_Produto[terminal]] = 'KG' then // produto por peso
               estado[Terminal]:= 10
              else    // produto por quantidade
              estado[Terminal]:=8;
              produto[Terminal]:=grid.cells[1,Ind_Produto[terminal]];
            end;
GOSTEI 0
Eriley Barbosa

Eriley Barbosa

13/09/2010

Peguei sua função inicial, cujo problema que você relatou foi apenas de não retornar nada quando pesquisa uma segunda vez e alterei para que retorna-se ao estado inicial a consulta: 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 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;
      if not(fmTerminais.query.IsEmpty) then
      begin
         result:= i;
         break;
      end;
     inc(i);
    end;
    fmTerminais.query.Next;
  end;
end;
GOSTEI 0
Laelson Fagundes

Laelson Fagundes

13/09/2010

quando chega nessa linha if i < fmTerminais.query.recordcount then o recordcount para em 25 sendo q tenho 5 mil registro no banco... ele fala sempre que nao encontrou o registro como se nao estivece nem um produto na tebela...
GOSTEI 0
Eriley Barbosa

Eriley Barbosa

13/09/2010

É uma coicidência que esta função está funcionando:
function Pesquisa(Codigo:String):integer;
var
 i:byte;
begin
  result := -1;
  i:= 1;
  while i < fmTerminais.grid.RowCount do
  begin
    if fmTerminais.grid.Cells[0,i] = Codigo then
    begin
      result:= i;{Devolve o número da linha do grid e não código do produto se tiver um produto fora da sequência da erro}
      break;
    end;
    inc(i);
  end;
end;
Pois veja que ela devolve o número da linha qual o produto está e não o código.
No caso esta função abaixo, resolveria seu problema relatado anteriormente:
function Pesquisa(Codigo:String):Integer;
begin
  result := -1;
  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
    result := fmTerminais.query.FieldByName('codigo').Value;
  else
  begin
    {Se não achar nada devolve o SQL ao seu estado original, caso contrario ficaria com um comando que não retornaria nada}
    ShowMessage('Código não encontrado');
    fmTerminais.query.close;
    fmTerminais.query.sql.clear;
    fmTerminais.query.sql.add('select codigo, codbarra, produto, precovenda from c000025');
    fmTerminais.query.open;
  end;
end;
GOSTEI 0
Laelson Fagundes

Laelson Fagundes

13/09/2010

tambem nao funcionou ele ja pula direto para a linha ShowMessage('Código não encontrado'); 
GOSTEI 0
Eriley Barbosa

Eriley Barbosa

13/09/2010

Posta ai como ta gravado no banco de dados o campo codigo e qual é o tipo de dado.
GOSTEI 0
Laelson Fagundes

Laelson Fagundes

13/09/2010

fiz dessa forma agora

function Pesquisa(Codigo:String):integer;
begin
  Result := -1;
  fmTerminais.query.sql.Clear;
  fmTerminais.query.sql.add('select codigo, codbarra, produto, precovenda from c000025');
  fmTerminais.query.sql.add('where codigo = '+QuotedStr(CompletaZero(codigo,6)));
  fmTerminais.query.Open;

  if not fmTerminais.query.IsEmpty then
    Result:=fmTerminais.query.FieldByName('codigo').AsInteger;
end;

o meu problema agora é q ele m traz o produto errado para o codigo digitado...
GOSTEI 0
Emerson Nascimento

Emerson Nascimento

13/09/2010

amigo, explique essa doideira...

function Pesquisa(Codigo:String):integer;
var
   i : byte;
begin
  result := -1;
  i:= 1;
  fmTerminais.query.first; // vai para o primeiro registro da tabela
  while fmTerminais.query.eof do // enquanto estiver no final da tabela
    if i < fmTerminais.query.recordcount then // verifico se i é menor que o total de registros
    begin
      fmTerminais.query.close; // fecha a tabela que está sendo avaliada no while e no if (doido...)
      fmTerminais.query.sql.clear;
      fmTerminais.query.sql.add('select codigo, codbarra, produto, precovenda from c000025');
      fmTerminais.query.sql.add('where codigo = '+CompletaZero(codigo,6)); // código é numérico ou char/varchar?
      fmTerminais.query.open; // abre a tabela novamente

      begin
        result:= i;
        break; // sai do loop (?!?!?!?!?!?!?)
      end;

      inc(i);
    end;
end;


li e reli e não consegui entender a lógica desse código...

o que há/deveria haver na tabela fmTerminais.query ????

explique exatamente como você espera que esse código se comporte, assim poderemos encontrar uma solução para o seu problema.

GOSTEI 0
Laelson Fagundes

Laelson Fagundes

13/09/2010

Emerson é o seguinte eu tenho um que fazer uma consulta e passar o resultado para uma array so q tem q ser uma consulta q retorne os valores corretos e que continui no loop pq todas as q testei aqui sai do loop e nao m deixa adicionar mais dados...

quando eu digito o codigo do produto vai m aparecer no painel de um micro terminal o produto digitado e vai aparecer a opção de eu fechar o pedido ou nao quando eu digo q nao ele m retorna para o produto e quando vou add novo produto ele fala q nao tem mais produto q nao foi localizado... ja tentei essas informações acima....
GOSTEI 0
Eriley Barbosa

Eriley Barbosa

13/09/2010

se traz errado é porque o seu código ou é char ou numérico, mostra como ta gravado no banco ou posta o sql de criação da tabela.
GOSTEI 0
Laelson Fagundes

Laelson Fagundes

13/09/2010


TABLE C000025 (
    CODIGO                         VARCHAR(6) NOT NULL,
    CODBARRA                     VARCHAR(25),
    PRODUTO                       VARCHAR(60),

é essa ai a tabela tem mais campos mas oq importa é esses ai...

GOSTEI 0
Eriley Barbosa

Eriley Barbosa

13/09/2010

Já tentou sem o completazeros: No caso esta função abaixo, resolveria seu problema relatado anteriormente:
function Pesquisa(Codigo:String):Integer;
begin
  result := -1;
  fmTerminais.query.close;
  fmTerminais.query.sql.clear;
  fmTerminais.query.sql.add('select codigo, codbarra, produto, precovenda from c000025');
  fmTerminais.query.sql.add('where codigo = '+codigo);
  fmTerminais.query.open;
  if not(fmTerminais.query.IsEmpty) then
    result := fmTerminais.query.FieldByName('codigo').Value;
  else
  begin
    {Se não achar nada devolve o SQL ao seu estado original, caso contrario ficaria com um comando que não retornaria nada}
    ShowMessage('Código não encontrado');
    fmTerminais.query.close;
    fmTerminais.query.sql.clear;
    fmTerminais.query.sql.add('select codigo, codbarra, produto, precovenda from c000025');
    fmTerminais.query.open;
  end;
end;
GOSTEI 0
Laelson Fagundes

Laelson Fagundes

13/09/2010

ja tente e da a mesma coisa no caso da sua função ele fala q nao tem produtos cadastrados

mudei para essa forma mas ele esta m retornando o nomes dos produtos errados


function Pesquisa(Codigo:String):integer;
begin
  Result := -1;
  fmTerminais.query.sql.Clear;
  fmTerminais.query.sql.add('select codigo, codbarra, produto, precovenda from c000025');
  fmTerminais.query.sql.add('where codigo = '+QuotedStr(CompletaZero(codigo,6)));
  fmTerminais.query.Open;

  if not fmTerminais.query.IsEmpty then
  begin
    Result:=fmTerminais.query.FieldByName('codigo').AsInteger;
  end;
end;
GOSTEI 0
Eriley Barbosa

Eriley Barbosa

13/09/2010

Pela tabela que postou: TABLE C000025 (
    CODIGO                         VARCHAR(6) NOT NULL,
    CODBARRA                     VARCHAR(25),
    PRODUTO                       VARCHAR(60),
function Pesquisa(Codigo:String):integer; var   cod: string;
begin
  Result := -1;   if length(codigo) = 1 then     cod := CompletaZero(codigo,5)   else     if length(codigo) = 2 then       cod := CompletaZero(codigo,4)     else       if length(codigo) = 3 then         cod := CompletaZero(codigo,3)       else         if length(codigo) = 4 then           cod := CompletaZero(codigo,2)         else           if length(codigo) = 5 then             cod := CompletaZero(codigo,1);   fmTerminais.query.sql.Clear;
  fmTerminais.query.sql.add('select codigo, codbarra, produto, precovenda from c000025');
  fmTerminais.query.sql.add('where codigo = '+QuotedStr(cod));
  fmTerminais.query.Open;

  if not fmTerminais.query.IsEmpty then
  begin     //Cuidado na hora que converte para asinteger, se tem zeros na frente pode perder
    Result:=fmTerminais.query.FieldByName('codigo').AsInteger;     ShowMessage(Inttostr(Result);
  end;
end;
 
GOSTEI 0
Laelson Fagundes

Laelson Fagundes

13/09/2010

tem alguma coisa errada nas suas sql pq sempre q executo uma ela fala q nao localiza os produtos...

ela nao executa essas linhas

if not fmTerminais.query.IsEmpty then
  begin     //Cuidado na hora que converte para asinteger, se tem zeros na frente pode perder
    Result:=fmTerminais.query.FieldByName('codigo').AsInteger;     ShowMessage(Inttostr(Result);
  end;
end;
GOSTEI 0
Laelson Fagundes

Laelson Fagundes

13/09/2010

tem alguma coisa errada nas suas sql pq sempre q executo uma ela fala q nao localiza os produtos...

ela nao executa essas linhas

if not fmTerminais.query.IsEmpty then
  begin     //Cuidado na hora que converte para asinteger, se tem zeros na frente pode perder
    Result:=fmTerminais.query.FieldByName('codigo').AsInteger;     ShowMessage(Inttostr(Result);
  end;
end;
GOSTEI 0
Emerson Nascimento

Emerson Nascimento

13/09/2010

nos ajude a te ajudar, Tchuck.

Dê um exemplo concreto de como as coisas devem acontecer;

Informe como os dados estão gravados na tabela e o que é a tabela fmTerminais.query.
acho estranho fechar a tabela que está sendo varrida pelo loop (e o loop é interrompido pelo break!).
está muito estranho mesmo.

preciso que você seja bem didático, tipo:

"na minha tabela tenho os registros

C000025
CODIGO    CODBARRA     PRODUTO
------------  -----------------  -------------------------------------------------------
000001    78901221     PRODUTO X
002007    78901052     PRODUTO Y
040078    78901267     PRODUTO Z

e digito em algum lugar o código tal, o que eu quero é que seja retornado assim e assado, baseado no conteúdo da tabela.... "

se não for assim vamos ficar nisso a semana toda...
GOSTEI 0
Laelson Fagundes

Laelson Fagundes

13/09/2010

EMERSON eu não gravo nada tabela eu apenas faço a consulta essa tabela oq é essa tabela q a query se refere é a tabela de produtos a minha questao é a seguinte tenho um micro terminal aonde o rapaz vem e digita o codigo do produto essa consulta q estou batendo ai é a consulta do microterminal essa consulta vai retornar uma valor no caso o produto para o garçon q esta no terminal...

esse q esta sendo o meu probrema quando eu passo a refrencia usando uma DBgrid ele funciona dessa forma

function Pesquisa(Codigo:String):integer;
var
 i:byte;
begin
  result := -1;
  i:= 1;
  while i < fmTerminais.grid.RowCount do
  begin
    if fmTerminais.grid.Cells[0,i] = Codigo then
    begin
      result:= i;
      break;
    end;
    inc(i);
  end;
end;

oq acontece eu carrego uma sql quando abro o form e carrego um grid e dessa forma a cima eu consiso passar os parametro correto mas tem um porem eu não posso usar essa grid... vou ter q remover esse grid...

e por isso q estou tentando fazer uma pesquisa para substituir essa rotina ai em cima...
GOSTEI 0
Emerson Nascimento

Emerson Nascimento

13/09/2010

se você não tiver mais a grid porém VAI continuar com o dataset que está ligado a ela:

function Pesquisa(Codigo:String): integer;
begin
  result := -1;

  with fmTerminais.query do
  begin
    first; //posiciona no primeiro registro
    while not eof do //enquanto nao chegar no final do arquivo
    begin
      if fieldbyname('codigo').asstring = codigo then //compara o codigo
      begin //se encontrou
        result := fmTerminais.query.recno; //retorna o numero do registro
        break; //sai do laço (while)
      end;
      fmTerminais.query.next; //vai para o proximo registro
    end;
  end;
end;


GOSTEI 0
Laelson Fagundes

Laelson Fagundes

13/09/2010

EMERSON ele continua pegando os nomes trocados na forma q eu inicio a pesquiza com o grid no exemplo o result no debug fica = 0 ai ele faz as consulta mas usando as sql ele sempre esta ficando -1 creio q o problema esta sendo esse...
GOSTEI 0
Emerson Nascimento

Emerson Nascimento

13/09/2010

é isso sim.
dependendo do componente de acesso ao banco, recordcount e recno nao retornar os valores corretos.

você pode fazer um 'ajuste' para simular o numero do registro:

function Pesquisa(Codigo:String): integer;
var
  i: integer;
begin
  result := -1;

  with fmTerminais.query do
  begin
    first; //posiciona no primeiro registro
    i := 0; //ou 1, depende de como voce ira tratar o retorno
    while not eof do //enquanto nao chegar no final do arquivo
    begin
      if fieldbyname('codigo').asstring = codigo then //compara o codigo
      begin //se encontrou
        result := i; //retorna o 'numero do registro'
        break; //sai do laço (while)
      end;
      fmTerminais.query.next; //vai para o proximo registro
      inc(i);; //incrementa o 'numero do registro'
    end;
  end;
end;

veja também se o conteúdo de codigo é igual ao conteudo do campo. vi que você usava uma função CompletaZero(). Veja se ela é realmente necessária.
GOSTEI 0
Laelson Fagundes

Laelson Fagundes

13/09/2010

EMERSON parabens amigo é isso ai mesmo funcionou perfeitamente... solução correta e exata

muitoooooooo obrigadoo mais uma vez amigo... 
GOSTEI 0
POSTAR