Fórum Locate, FindKey - como usar na Query? #282530
21/05/2005
0
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
Curtir tópico
+ 0Posts
21/05/2005
Idivaldo.mb
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
21/05/2005
Adriano_servitec
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
21/05/2005
Marco Salles
Como voce esta usando Um Controle consciente de Dados (No Caso o DbEdit1)Como Parametro No Método Locate
é 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
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
21/05/2005
Adriano_servitec
Obrigado amigao pela atençao
Agradeço a todos pela ajuda
Adriano
Gostei + 0
21/05/2005
Idivaldo.mb
Para vc usar o Locate inclua a Biblioteca ´DB´ na uses do seu Form
Ate mais...
Gostei + 0
21/05/2005
Marco Salles
[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] :?: :?: :?:
Funciona , mas não vai evitar que a sua tabela saia do Modo de Inserção , ao usar o comando Locate ..
É um tipo de Duvida Clássica
:arrow: Acho que não vai adiantar
Por acaso , na definição do Campo Produto, voce o Definiu Como sendo Unico :?: :?: :?: :?: :?:
Gostei + 0
21/05/2005
Idivaldo.mb
Me desculpe eu errei na primeira mensagem eu digitei ´locasensitive´ e é ´locaseinsensitive´..
Ate mais...
Gostei + 0
23/05/2005
Adriano_servitec
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
23/05/2005
Marco Salles
sobre os pontos envolvidos...
Por exemplo , eu lhe formulei uma pergunta
e voce não retornou....
Gostei + 0
23/05/2005
Adriano_servitec
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
23/05/2005
Marco Salles
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
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]:?: :?: :?: :?:
[b:acb830494c]Esta Gravação , to tentando deste a primeira Postagem de Informar[/b:acb830494c]
Gostei + 0
23/05/2005
Adriano_servitec
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
23/05/2005
Marco Salles
: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
23/05/2005
Adriano_servitec
Obrigado pela dica amigo!
Um abraço!
Gostei + 0
23/05/2005
Adriano_servitec
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
Clique aqui para fazer login e interagir na Comunidade :)