GARANTIR DESCONTO

Fórum Locate, FindKey - como usar na Query? #282530

21/05/2005

0

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

Responder

Posts

21/05/2005

Idivaldo.mb

Amigo

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


Responder

Gostei + 0

21/05/2005

Adriano_servitec

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]


Responder

Gostei + 0

21/05/2005

Marco Salles

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


Responder

Gostei + 0

21/05/2005

Adriano_servitec

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


Responder

Gostei + 0

21/05/2005

Idivaldo.mb

Amigo

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

Ate mais...


Responder

Gostei + 0

21/05/2005

Marco Salles

[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 :?: :?: :?: :?: :?:


Responder

Gostei + 0

21/05/2005

Idivaldo.mb

Amigo

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

Ate mais...


Responder

Gostei + 0

23/05/2005

Adriano_servitec

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!


Responder

Gostei + 0

23/05/2005

Marco Salles

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


Responder

Gostei + 0

23/05/2005

Adriano_servitec

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!


Responder

Gostei + 0

23/05/2005

Marco Salles

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]


Responder

Gostei + 0

23/05/2005

Adriano_servitec

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


Responder

Gostei + 0

23/05/2005

Marco Salles

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 :?: :?: :?:


Responder

Gostei + 0

23/05/2005

Adriano_servitec

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!


Responder

Gostei + 0

23/05/2005

Adriano_servitec

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.


Responder

Gostei + 0

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

Aceitar