Locate, FindKey - como usar na Query?

Delphi

21/05/2005

Bom dia amigos
Eh o seguinte: Estou querendo que meu programa na hora de incluir um novo produto verifique se ja existe o mesmo cadastrado, estou usando uma query para incluir os dados, mais nao consigo fazer a verificaçao, fiz da seguinte forma, mais nao funcionou

No Events/OnExit do DBedit1

if query1.LOCATE(´produto´,dbedit1.TEXT,[]) then begin
ShowMessage(´Produto ja Cadastrado !´);
dbedit1.SetFocus;
end else
dbedit2.setfocus;
end;

Ai toda vez mesmo que ainda nao tenha gravado o produto aparece como Produto ja cadastrado.

Se uso o FindKey como faço com o Table nao compila da erro
query1.FINDKEY([DBEDIT1.TEXT]);
if QUERY1.FindKey([DBEDIT1.Text]) then
begin
SHOWMESSAGE(Produto já registrado...´);
dbedit1.setfocus;
end ELSE
begin
dbedit2.setfocus;
end
end;

Usava o FindKey no Table, mais acho que no Query nao funciona.

Alguem pode me dar uma dica como fazer para nao incluir duas vezes o mesmo produto?

Obrigado pela Atençao!
Adriano.


Adriano_servitec

Adriano_servitec

Curtidas 0

Respostas

Idivaldo.mb

Idivaldo.mb

21/05/2005

Amigo

If query.locate(´campo onde vai fazer a busca´,texto que se vai buscar,[lopartialkey,locasensitive] )= true then
begin
.....
end
else
begin
....
end;


GOSTEI 0
Adriano_servitec

Adriano_servitec

21/05/2005

Ola amigo,
Desculpe mais nao consigo compilar [b:37c109c021]locasensitive[/b:37c109c021][u:37c109c021]

sera que errei o nome?

Obrigado pela ajuda
Um abraço![/u:37c109c021]


GOSTEI 0
Marco Salles

Marco Salles

21/05/2005

Não tenho certeza , Mas o que ocorre é o Seguinte

Como voce esta usando Um Controle consciente de Dados (No Caso o DbEdit1)Como Parametro No Método Locate
if query1.LOCATE(´produto´,dbedit1.TEXT,[]) then begin

é Claro que voce esta editando Nele.. Se esta digitando nele, o mesmo registro , esta no modo de edição ou de inserção.. Ai que esta o Problema
Quando se executa o Método Locate , Aquele registro que voce esta digitando é salvo ..Imediatemente a Tabela sai do modo de edição ou Inserção e o ultimo registro foi salvo

Para testar o Que estou a dizer , nada melhor do que um exemplo:::
Tente colocar o segui te Código:

if DataSource1.State in [Dsedit,DsInsert] Then
  showmessage(´Esta no modo de edição´)
else
  showmessage(´Esta Inativo´);
if query1.LOCATE(´produto´,dbedit1.TEXT,[]) then begin
ShowMessage(´Produto ja Cadastrado !´);
dbedit1.SetFocus;
end else
dbedit2.setfocus;
if DataSource1.State in [Dsedit,DsInsert] Then
  showmessage(´Esta no modo de edição´)
else
  showmessage(´Esta Inativo´); //significa que ja foi salvo
end;


A Dica de nosso amigo Idivaldomb
If query.locate(´campo onde vai fazer a busca´,texto que se vai buscar,[lopartialkey,locasensitive] )= true then

e´importante , mas acredito não ira resolver o seu problema

Veja:
A utilização de "loPartialKey,loCaseInsensitive" no método Locate em uma pesquisa e que a pesquisa a ser feita independe de que se tenha maiscula ou minuscula...sem o "loPartialKey,loCaseInsensitive" no método Locate, para se ter o resultado da pesquisa voce deve informar caracter por caracter igual o campo no Banco...Assim se o Banco tiver por exemplo um Pais Chamado Brazil, na pesquisa voce deve digitar Brazil...Ja usando "loPartialKey,loCaseInsensitive" voce pode digitar independende de se ter maiscula ou minuscula que ele fara a pesquisa... 
se voce digitar bRaZiL Ele retornara o Campo Brazil...E so Isto..


Este problema que voce apresentou é um problema Classico.. E muitas são as Dúvidas principalmente quando se trata de um campo Chave

A Saida para este tipo de problema e geral . Depende deste do Tipo de Banco Que Voce esta Usando , O Tipo de Componjentes Que voce esta usando , o Tipo de definição do Campo na sua base de Dados, se este Campo é Indice etc...


GOSTEI 0
Adriano_servitec

Adriano_servitec

21/05/2005

Ola meu amigo Marco Salles, eh muito interessante o que vc me disse, testei o comando, so que ainda nao resolveu meu problema, lembro-me que o LopartialKey funcionava perfeitamente, mais estou migrango para o SQL e estou com dificuldades nessa parte de produrar se ja esta cadastrado o produtos pelo dbedit no events onexit, pq ele fica em modo de ediçao, por isso mesmo ja aparece como produto ja cadastrado, a nao ser que em vez de colocar ele no onexit do dbedit coloco o comando no botao gravar, vou fazer um teste.

Obrigado amigao pela atençao
Agradeço a todos pela ajuda

Adriano


GOSTEI 0
Idivaldo.mb

Idivaldo.mb

21/05/2005

Amigo

Para vc usar o Locate inclua a Biblioteca ´DB´ na uses do seu Form

Ate mais...


GOSTEI 0
Marco Salles

Marco Salles

21/05/2005

[b:9af417dfbe]Acho que voce não entendeu [/b:9af417dfbe]:cry: :cry: :cry:

Ola meu amigo Marco Salles, eh muito interessante o que vc me disse, testei o comando, so que ainda nao resolveu meu problema,


[color=darkred:9af417dfbe][b:9af417dfbe]Mas eu não lhe forneci nada que resolveria o seu problema[/b:9af417dfbe][/color:9af417dfbe].. A unica coisa que fiz , foi achar uma causa do seu tipo de erro.. O Código que lhe passei so serve para tentar te Mostarr o que se passa na Tabela , apos o comando Locate ser executado

[b:9af417dfbe]Entendeu agora[/b:9af417dfbe] :?: :?: :?:

lembro-me que o LopartialKey funcionava perfeitamente


Funciona , mas não vai evitar que a sua tabela saia do Modo de Inserção , ao usar o comando Locate ..

estou com dificuldades nessa parte de produrar se ja esta cadastrado o produtos pelo dbedit no events onexit,


É um tipo de Duvida Clássica

a nao ser que em vez de colocar ele no onexit do dbedit coloco o comando no botao gravar,


:arrow: Acho que não vai adiantar

estou migrango para o SQL


Por acaso , na definição do Campo Produto, voce o Definiu Como sendo Unico :?: :?: :?: :?: :?:


GOSTEI 0
Idivaldo.mb

Idivaldo.mb

21/05/2005

Amigo

Me desculpe eu errei na primeira mensagem eu digitei ´locasensitive´ e é ´locaseinsensitive´..

Ate mais...


GOSTEI 0
Adriano_servitec

Adriano_servitec

21/05/2005

Ola meus amigos, obrigado pela atençao sobre o meu problema, vi que o locate nao esta dando certo pq. na hora que vou incluir um produto no Dbgrid a tabela fica em modo de inserir, ai no onexit do dbedit vai sempre acusar que ja esta cadastrado o produto pq ja esta mandando ele para dbgrid, preciso que fique em modo de inserir e que procure se o produto ja existe que esta no dbgrid e nao o que eu quero incluir.

Ja tentei com o Locate nao funcionou, ja tentei com SQL tambem nao consegui, o que estou fazendo de errado? Qual a maneira correta de pesquisar se o produto existe sem pesquisar o que estou incluindo?

em SQL fiz assim (mas nao funcionou)

with qrpreco do begin
close;
sql.clear;
Sql.Add(´SELECT * FROM qrpreco´);
Sql.Add(´WHERE produto = :Vproduto´);
Parambyname(´vProduto´).AsString := dbedit12.text;
Open;

If not QRpreco.IsEmpty Then
begin
ShowMessage(´Produto Repetido´);
Exit;
end Else
dbedit10.setfocus;
end;

Obrigado amigos pera atençao
Sao pessoas assim dedicadas como vcs. que torna esse forum serio
Um abraço!


GOSTEI 0
Marco Salles

Marco Salles

21/05/2005

Beleza , mas para gente chegar a um denominador comum é necessário um perfeito diálogo. Isto envolve leitura atenta das sugestoes e replica
sobre os pontos envolvidos...

Por exemplo , eu lhe formulei uma pergunta

Por acaso , na definição do Campo Produto, voce o Definiu Como sendo Unico :?: :?: :?:


e voce não retornou....


GOSTEI 0
Adriano_servitec

Adriano_servitec

21/05/2005

Ola amigo Marco Salles

Desculpe minha ignorancia, sou novo em Delphi, nao sei o que seria
(Por acaso , na definição do Campo Produto, voce o Definiu Como sendo Unico)

Fiz da seguinte forma:
Tenho que incluir um novo produto da tabela qrpreco.db (paradox)
Os produtos ja estao cadastrado em outra tabela qrproduto
ai quando vou incluir um novo produto na qrpreco aperto F1 para abrir o dbgrid do qrproduto para achar o produto que tenho que incluir para passar para a tabela qrpreco, tambem nao uso chave primaria para o produto.

Nao sei se fui correto na questao, mais eh assim que quero fazer

Um abraço!


GOSTEI 0
Marco Salles

Marco Salles

21/05/2005

Não tem que se desculpar , temos é que nus entender

Pelo que to percebendo este tópico ainda vai crescer muito...

[b:acb830494c]Tem vária maneiras de atacar este Problema[/b:acb830494c]

Vamos por parte..vamos tentar construir cada etapa desse problema

nao sei o que seria (Por acaso , na definição do Campo Produto, voce o Definiu Como sendo Unico)


isto no meu entender é ponto chave e é uma das maneiras de Atacar o Problema.... Voce deve abrir a sua tabela Produto e cria um Indice para o Campo Descrição... Isto pode ser  Feito usando o DataBase Desktop.... Qaundo voce abrir a sua tabela , escolha a opção para reetrutura-la.. Na criação do Indice Voce deve escoler a Opção Unique...


[color=darkred:acb830494c][b:acb830494c]Da para fazer isto [/b:acb830494c][/color:acb830494c]:?: :?: :?: :?:

P:s Isto é umas das maneiras , a idéia consiste em todas vez que voce Tentar Gravar No Banco um produto com o mesmo nome , ele ira retornar um erro, e esta gravação não ira ocorrer Vela , ao usar o método locate , voce faz inconscientemente uma gravação no Banco


[b:acb830494c]Esta Gravação , to tentando deste a primeira Postagem de Informar[/b:acb830494c]


GOSTEI 0
Adriano_servitec

Adriano_servitec

21/05/2005

Ta amigo, vamos la entao, vc quer que eu crie uma chave primaria sobre a tabela e use o key * no item produto para indexar ele no DataBase Desktop e escolher a opcao Unique, sim pronto criei uma chave primaria e salvei como ixdproduto no DataBase Desktop, mais ai vem mais uma duvida usando a query nao sei como fazer para indexar a chave que criei, no Table uso o Index Name, mas no Query preciso de ajuda.

Mais uma perguntinha, lembro-me que indexando pela chave primaria na tabela se for duplicado aparece uma mensagem assim: KEY VIOLATION, ai ele nao duplicara o mesmo item, no caso posso ate usar uma chave primaria para executar essa tarefa, mais minha duvida vem depois se caso eu possa a partir dessa chave incluir o mesmo produto, pq no que eu queria era pesquisar o produto e me informar que ele ja esta incluido, podendo o mesmo ser incluido novamente, seria mais como um aviso de atençao.

Obrigado pela Atençao


GOSTEI 0
Marco Salles

Marco Salles

21/05/2005

mais minha duvida vem depois se caso eu possa a partir dessa chave incluir o mesmo produto, pq no que eu queria era pesquisar o produto e me informar que ele ja esta incluido, podendo o mesmo ser incluido novamente, seria mais como um aviso de atençao.


:arrow: ai ja muda de figura... então amigo , esquece o ultimo passo e vamos atacar de outro Modo.. Esquece mas esquece mesmo

Pergunta:

[color=darkred:a5abb8f779][b:a5abb8f779]Ao inves de usar um controle consciente de Dados porque voce não usa um Edit e faz com que ele se comporte como um DbEdit[/b:a5abb8f779][/color:a5abb8f779]

Tem algum incoveniente de Trabalhar com esta Hipotese :?: :?: :?:


GOSTEI 0
Adriano_servitec

Adriano_servitec

21/05/2005

Vamos la entao amigo, gostei da ideia acho ate melhor, nesse caso o edit fica no lugar do DBedit isso? Entao na hora que eu forçar o append do query o edit podera recolhecer se tem um produto ja cadastrado no dbgrid, vou montar um aqui trocando o dbedit por edit, vamos ver no que vai dar.

Obrigado pela dica amigo!
Um abraço!


GOSTEI 0
Adriano_servitec

Adriano_servitec

21/05/2005

Ola mais uma vez amigao Salles, eh o seguinte ficou file usando o edit, funcionou que uma beleza, so falta uns ajustes que nao consegui fazer, tipo excluir o appende que estou fazendo se caso nao queira que ele entre no dbgrid, tentei mais quando o locate localiza o produto vai para o primeiro da lista e se eu for deletar deleta o que ja esta incluido, e tambem como faço para no dbgrid aparecer o que esta no edit antes de gravar (no botao gravar)

olha como ficou o onexit do edit que nesse caso usei o nome dbedit12 para nao mexer em outros lugares.

procedure TForm20.Edit3Exit(Sender: TObject);
begin
If FORM20.qrpreco.locate(´produto´,dbEDIT12.text,[lopartialkey,locaseinsensitive] )= true then
begin
ShowMessage(´Produto ja Cadastrado !´);
if application.messagebox(´Deseja Incluir esse Produto novamente?´,´Confirma´,36)=idyes
then
begin
DBedit10.SetFocus;
end else
qrpreco.delete; //[color=red:c429a2199d]aqui nao esta excluindo o que estou querendo incluir e sim o primeiro que ja esta incluido no DB[/color:c429a2199d]
qrpreco.Append;
DBEDIT12.SETFOCUS;
end;
end;

O resto ficou 10 meu amigo
Vc me ajudou muito, obrigado.


GOSTEI 0
Marco Salles

Marco Salles

21/05/2005

tentei mais quando o locate localiza o produto vai para o primeiro da lista e se eu for deletar deleta o que ja esta incluido, e tambem como faço para no dbgrid aparecer o que esta no edit antes de gravar (no botao gravar)


Voce deve usar uma variavel StringOpaca

assim:

var
 bookmark:TBookmarkStr;

antes do Locate fazer
 Query1.disablecontrols
 bookMark:=query1.Bookmark;
depois do locate
 Query1.EnableControls;
 query1.bookmark:=bookMark;



nesta situação , ele deve retornar para o registro atua; mas ja deve estar Gravado ... Ai voce deve exclui-lo ou editalo...

:arrow: [b:90ca19274f]Tente isto[/b:90ca19274f]... :arrow:


GOSTEI 0
Adriano_servitec

Adriano_servitec

21/05/2005

Ola meu amigo Marco Salles

Eh o seguinte, ta quase perfeito, nao esta mais apontando para o registro que ja foi incluido, mais na hora de excluir o que estou tentando incluir ele nao exclui e sim o que ja esta incluido no dbgrid, acho que esta errado o que eu fiz

procedure TForm20.Edit3Exit(Sender: TObject);
var
bookmark:TBookmarkStr;
begin
Qrpreco.disablecontrols;
bookMark:=qrpreco.Bookmark;

If FORM20.qrpreco.locate(´produto´,dbEDIT12.text,[lopartialkey,locaseinsensitive] )= true then

begin
ShowMessage(´Produto ja Cadastrado !´);
if application.messagebox(´Deseja Incluir novamente esse Produto?´,´Confirma´,36)=idyes
then
begin
DBedit10.SetFocus;
end else
qrpreco.delete;
qrpreco.Append;
DBEDIT12.SETFOCUS;
end;
Qrpreco.EnableControls;
qrpreco.bookmark:=bookMark;
end;

Obrigado pela ajuda amigo


GOSTEI 0
Adriano_servitec

Adriano_servitec

21/05/2005

Ola meu amigo Marco Salles

Eh o seguinte, ta quase perfeito, nao esta mais apontando para o registro que ja foi incluido, mais na hora de excluir o que estou tentando incluir ele nao exclui e sim o que ja esta incluido no dbgrid, acho que esta errado o que eu fiz

procedure TForm20.Edit3Exit(Sender: TObject);
var
bookmark:TBookmarkStr;
begin
Qrpreco.disablecontrols;
bookMark:=qrpreco.Bookmark;

If FORM20.qrpreco.locate(´produto´,dbEDIT12.text,[lopartialkey,locaseinsensitive] )= true then

begin
ShowMessage(´Produto ja Cadastrado !´);
if application.messagebox(´Deseja Incluir novamente esse Produto?´,´Confirma´,36)=idyes
then
begin
DBedit10.SetFocus;
end else
qrpreco.delete;
qrpreco.Append;
DBEDIT12.SETFOCUS;
end;
Qrpreco.EnableControls;
qrpreco.bookmark:=bookMark;
end;

Obrigado pela ajuda amigo


GOSTEI 0
Marco Salles

Marco Salles

21/05/2005

Tente....

procedure TForm20.Edit3Exit(Sender: TObject); 
var
bookmark:TBookmarkStr;
begin
Qrpreco.disablecontrols;
bookMark:=qrpreco.Bookmark;

  If FORM20.qrpreco.locate(´produto´,dbEDIT12.text,[lopartialkey,locaseinsensitive] )=
     true then

    begin
       Qrpreco.EnableControls;
       qrpreco.bookmark:=bookMark;
      ShowMessage(´Produto ja Cadastrado !´);
      if application.messagebox(´Deseja Incluir novamente esse Produto?´,´Confirma´,36)=idyes
        then
          begin
            qrpreco.edit;
            DBedit10.SetFocus;
          end
        else
           qrpreco.delete;
    end
  else
    begin
      Qrpreco.EnableControls;
      qrpreco.bookmark:=bookMark;
      qrpreco.edit;
      DBEDIT12.SETFOCUS;
    end;
end;



GOSTEI 0
Adriano_servitec

Adriano_servitec

21/05/2005

Ola amigo,
Acho que ja seria o caso de eu desistir disso pra nao ti encomodar mais, fiquei a tarde toda tentando fazer, modifiquei, inclui outros codigos e nada, primeiro estava funcionando corretamente, mais nao deletava quem eu queria, mesmo apontando o ponteiro no arquivo que ia incluir, insistia em excluir o primeiro registro que ele achava...Bom agora nao consigo que ele va para frente nem usando o enter nem o tab, nao consigo entender quando deixo sem o comando no onexit ele passa para o proximo edit, se mudo para o onchange ele nao inclui um novo registro e pula para o primeiro, se for no onenter acontece a mesma coisa do onchange, o que sera que houve dessa vez???? Ha ja mudei ate de edit que era edit3 para edit6 para ver se funcionava e nada. nao passa para o proximo edit de maneira alguma.

vou mostrar o codigo
procedure TForm20.Edit6Exit(Sender: TObject);
var
bookmark:TBookmarkStr;
begin
Qrpreco.disablecontrols;
bookMark:=qrpreco.Bookmark;

If FORM20.qrpreco.locate(´produto´,dbEDIT12.text,[lopartialkey,locaseinsensitive] )=
true then

begin
Qrpreco.EnableControls;
qrpreco.bookmark:=bookMark;
ShowMessage(´Produto ja Cadastrado !´);
if application.messagebox(´Deseja Incluir novamente esse Produto?´,´Confirma´,36)=idyes
then
begin
qrpreco.edit;
DBedit10.SetFocus;
end
else
qrpreco.delete;
end
else
begin
Qrpreco.EnableControls;
qrpreco.bookmark:=bookMark;
qrpreco.edit;
DBEDIT12.SETFOCUS;
end;

end;

esta do mesmo jeito que vc me passou, mudei mais nao tive exito ai retornei do teu jeito novamente.


Obrigado pela atençao!
Desde ja agradeço


GOSTEI 0
Marco Salles

Marco Salles

21/05/2005

Ola amigo, Acho que ja seria o caso de eu desistir disso pra nao ti encomoda


não incomoda não.

primeiro estava funcionando corretamente, mais nao deletava quem eu queria


acho que devemos partir dessa etapa

O Que voce tem que entender , ja te diise isto , desde do inicio , é que se voce esta fazendo uma edição ou uma inserção em uma tabela, quando voce faz uma pesquisa na mesma Tabela, usando no caso o locate , esta tabela grava este registro e faz depoiis disso Esta pesquisa...
Se voce usa o conteudo de um edit para fazer uma pesquisa , também a tabela saira do modo de edição ou inserção
De qualquer maneira a tabela saira do modo de edição e salvara automaticamente o que tem nos campos ...
isto voce tem que entender
nos temos que descobrir é um jeito de excluir este ultimo registro ou de edita-lo se for o caso

Melhor ainda se voce disponibilizado o Dowload do Projeto para que eu Pudesse abrir aqui

Salhamoda@uol.com.br


GOSTEI 0
Joelson

Joelson

21/05/2005

Eu tenho um estoque de 50.000 itens e mesmo usando o locate na query continuou lento, então eu fiz assim, como mostra código abaixo e ficou bem mais rápido. (Antes de localizar usando a query eu executo um select):

#procedure TfrmBalcao.btn7Click(Sender: TObject);
#codbarras:= string;
#begin
#codbarras:= Edit.Text;

#dm_dados.sqlestoque.Close;
#dm_dados.sqlestoque.SQL.Clear;
#dm_dados.sqlestoque.SQL.Add('select * from estoque');
#dm_dados.sqlestoque.SQL.Add('where est_barras = :codbarras');
#dm_dados.sqlestoque.ParamByName('codbarras').Value:= codbarras;
#dm_dados.sqlestoque.Open;

#if dm_dados.sqlEstoque.locate('est_barras', codbarras,[])then
#begin
#showmessage ('Produto Cadastrado!');
#end;
#end;
GOSTEI 0
POSTAR