Consulta SQL
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
Respostas
Eriley Barbosa
13/09/2010
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;
Pietro Braga
13/09/2010
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;
Eriley Barbosa
13/09/2010
Pietro Braga
13/09/2010
Se não me explique melhor isso, assim posso incorporar mais uma boa prática de programação.
Abraço
Laelson Fagundes
13/09/2010
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...
Laelson Fagundes
13/09/2010
Pietro Braga
13/09/2010
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;
Laelson Fagundes
13/09/2010
nao importa o produto q eu coloco sempre vai m mostrar o mesmo ...
Eriley Barbosa
13/09/2010
Se não me explique melhor isso, assim posso incorporar mais uma boa prática de programação.
Abraço
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.
Pietro Braga
13/09/2010
Pietro Braga
13/09/2010
Eriley Barbosa
13/09/2010
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;
Pietro Braga
13/09/2010
End minino!!!
Eriley Barbosa
13/09/2010
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;
Pietro Braga
13/09/2010
mas pq você incrementa o i se a query estiver vazia?
Laelson Fagundes
13/09/2010
Eriley Barbosa
13/09/2010
Laelson Fagundes
13/09/2010
Pietro Braga
13/09/2010
Laelson Fagundes
13/09/2010
essa linha ela nao esta percorendo a tabela todo
TotReg := fmTerminais.query.recordcount;
ela so conta atpe 25
Eriley Barbosa
13/09/2010
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;
Pietro Braga
13/09/2010
tipo
i:= 0;
fmTerminais.query.first;
while Not(fmTerminais.query.eof) do
begin
inc(i);
fmTerminais.query.Next;
end;
Pietro Braga
13/09/2010
Laelson Fagundes
13/09/2010
Eriley Barbosa
13/09/2010
Laelson Fagundes
13/09/2010
Ind_Produto:array[0..NTerminal-1] of Integer;
essa é a instrução q vai receber a pesquiza ela é extraida de uma dll
Eriley Barbosa
13/09/2010
Pietro Braga
13/09/2010
Daí no array teremos 25 posições, e somente 25 registros poderiam ser exibidos...
Laelson Fagundes
13/09/2010
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;
Eriley Barbosa
13/09/2010
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;
Laelson Fagundes
13/09/2010
Eriley Barbosa
13/09/2010
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;
Laelson Fagundes
13/09/2010
Eriley Barbosa
13/09/2010
Laelson Fagundes
13/09/2010
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...
Emerson Nascimento
13/09/2010
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.
Laelson Fagundes
13/09/2010
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....
Eriley Barbosa
13/09/2010
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...
Eriley Barbosa
13/09/2010
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;
Laelson Fagundes
13/09/2010
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;
Eriley Barbosa
13/09/2010
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;
Laelson Fagundes
13/09/2010
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;
Laelson Fagundes
13/09/2010
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;
Emerson Nascimento
13/09/2010
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...
Laelson Fagundes
13/09/2010
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...
Emerson Nascimento
13/09/2010
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;
Laelson Fagundes
13/09/2010
Emerson Nascimento
13/09/2010
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.
Laelson Fagundes
13/09/2010
muitoooooooo obrigadoo mais uma vez amigo...