Verificar se já existe o registro gravado
Boa Tarde
Estou usando Delphi 7 e Banco de Dados FireBird 2.0
Tenho um código que grava os dados no banco de dados, até aki blz.
Ma fui implementar, antes de gravar no banco verificar se já existe o cadastro, se não existir realiza o cadastro, caso contrário gera a mensagem de Cliente já cadastrado.
Mas não estou conseguindo fazer.
Segue abaixo o código.
procedure TForm2.BitBtn1Click(Sender: TObject);
begin
if not DataModule2.ClientDataSet2.Locate(´COD_CLIENTE´,StrToInt(DBEdit3.Text,[])) then
begin
DataModule2.ClientDataSet2.Post;
DataModule2.ClientDataSet2.ApplyUpdates(0);
BitBtn1.Enabled :=False;
BitBtn2.Enabled :=False;
Button1.SetFocus;
ShowMessage(´Registro gravado com sucesso´+#13+´Total cadastrado:´+ IntToStr(DataModule2.ClientDataSet2.RecNo));
end
else
ShowMessage(´cliente ja cadastrado´);
end;
OBS.: Qd eu compilo mostra que a linha abaixo esta com erro
if not DataModule2.ClientDataSet2.Locate(´COD_CLIENTE´,StrToInt(DBEdit3.Text,[])) then
e a seguinte mensagem
[Error] cadastro.pas(64): Too many actual parameters
[Fatal Error] Project2.dpr(7): Could not compile used unit ´cadastro.pas´
Grato pela atenção de todos.
Estou usando Delphi 7 e Banco de Dados FireBird 2.0
Tenho um código que grava os dados no banco de dados, até aki blz.
Ma fui implementar, antes de gravar no banco verificar se já existe o cadastro, se não existir realiza o cadastro, caso contrário gera a mensagem de Cliente já cadastrado.
Mas não estou conseguindo fazer.
Segue abaixo o código.
procedure TForm2.BitBtn1Click(Sender: TObject);
begin
if not DataModule2.ClientDataSet2.Locate(´COD_CLIENTE´,StrToInt(DBEdit3.Text,[])) then
begin
DataModule2.ClientDataSet2.Post;
DataModule2.ClientDataSet2.ApplyUpdates(0);
BitBtn1.Enabled :=False;
BitBtn2.Enabled :=False;
Button1.SetFocus;
ShowMessage(´Registro gravado com sucesso´+#13+´Total cadastrado:´+ IntToStr(DataModule2.ClientDataSet2.RecNo));
end
else
ShowMessage(´cliente ja cadastrado´);
end;
OBS.: Qd eu compilo mostra que a linha abaixo esta com erro
if not DataModule2.ClientDataSet2.Locate(´COD_CLIENTE´,StrToInt(DBEdit3.Text,[])) then
e a seguinte mensagem
[Error] cadastro.pas(64): Too many actual parameters
[Fatal Error] Project2.dpr(7): Could not compile used unit ´cadastro.pas´
Grato pela atenção de todos.
Help Desk1
Curtidas 0
Respostas
Rickyale2
06/02/2008
tenta retirar os [] que estão no lugar errado pq a funcao StrToInt só tem 1 parametro e vc está passando 2.
Ficaria assim:
if not DataModule2.ClientDataSet2.Locate(´COD_CLIENTE´,StrToInt(DBEdit3.Text)) then
Ou assim
if not DataModule2.ClientDataSet2.Locate(´COD_CLIENTE´,StrToInt(DBEdit3.Text), []) then
Ficaria assim:
if not DataModule2.ClientDataSet2.Locate(´COD_CLIENTE´,StrToInt(DBEdit3.Text)) then
Ou assim
if not DataModule2.ClientDataSet2.Locate(´COD_CLIENTE´,StrToInt(DBEdit3.Text), []) then
GOSTEI 0
Alecsandro Moura
06/02/2008
Boa Tarde!
Bom no seu codigo esta faltando os parametros do locate [loPartialKey, loCaseInsensitive] em sua rotina que seria algo parecido com isso:
e ja que vc usa fb pq vc não gera uma store proc para cuidar da inserção no banco dai vc pode fazer o banco cuidar da inserção caso não tenha ou mandar uma mensagem caso o registro ja tenha sido cadastrado e trazer seus dados é só uma dica
Qualquer duvida é só postar!
DataModule2.ClientDataSet2.Locate(´COD_CLIENTE´,StrToInt(DBEdit3.Text,[loPartialKey])) :wink:
Bom no seu codigo esta faltando os parametros do locate [loPartialKey, loCaseInsensitive] em sua rotina que seria algo parecido com isso:
e ja que vc usa fb pq vc não gera uma store proc para cuidar da inserção no banco dai vc pode fazer o banco cuidar da inserção caso não tenha ou mandar uma mensagem caso o registro ja tenha sido cadastrado e trazer seus dados é só uma dica
Qualquer duvida é só postar!
DataModule2.ClientDataSet2.Locate(´COD_CLIENTE´,StrToInt(DBEdit3.Text,[loPartialKey])) :wink:
GOSTEI 0
Paullsoftware
06/02/2008
basta fazer:
DataModule2.ClientDataSet2.Locate(´COD_CLIENTE´,StrToInt(DBEdit3.Text),[]);// colocando os [] fora do StrToInt() :wink:
DataModule2.ClientDataSet2.Locate(´COD_CLIENTE´,StrToInt(DBEdit3.Text),[]);// colocando os [] fora do StrToInt() :wink:
GOSTEI 0
Eselvati
06/02/2008
Pessoal,
posso estar enganado, mas Locate(...) em um dataset em edição acredito q não funciona...
Acho q vc terá de implementar outro método para verificar se o registro existe ou não, uma stored procedure por exemplo
Ederson Selvati
posso estar enganado, mas Locate(...) em um dataset em edição acredito q não funciona...
Acho q vc terá de implementar outro método para verificar se o registro existe ou não, uma stored procedure por exemplo
Ederson Selvati
GOSTEI 0
Help Desk1
06/02/2008
Bom Dia
Desde já agradeço pela atenção de todos.
Alguém pode me ajudar a criar a Store Proc, dessa forma com certeza seria o ideal.
Grato pela atenção de todos.
Desde já agradeço pela atenção de todos.
Alguém pode me ajudar a criar a Store Proc, dessa forma com certeza seria o ideal.
Grato pela atenção de todos.
GOSTEI 0
Paullsoftware
06/02/2008
Eu respondi antes, mais lendo novamente a sua pergunta o que você quer fazer exatamente??
você ta fazendo a pesquisa por qual dado do cliente?
qual a informação que não pode se repetir no seu banco?
você está usando gerador?
nos forneça mais informações para que possamos ajudá-lo melhor!! :wink:
você ta fazendo a pesquisa por qual dado do cliente?
qual a informação que não pode se repetir no seu banco?
você está usando gerador?
nos forneça mais informações para que possamos ajudá-lo melhor!! :wink:
GOSTEI 0
Help Desk1
06/02/2008
Bom Dia
Já consegui ajustar o código, eu estava usando um dbedit para entrar com o valor, qd digitava o código do cliente no dbedit o mesmo já garregava no grid, gravando em cache no clientdataset, para resolver no lugar do dbedit inseri um edit, dessa forma solucionou o problema.
Desde já agradeço pela atenção de todos.
Alguém pode me mostrar como resolver usando uma Store Proc.
Já consegui ajustar o código, eu estava usando um dbedit para entrar com o valor, qd digitava o código do cliente no dbedit o mesmo já garregava no grid, gravando em cache no clientdataset, para resolver no lugar do dbedit inseri um edit, dessa forma solucionou o problema.
Desde já agradeço pela atenção de todos.
Alguém pode me mostrar como resolver usando uma Store Proc.
GOSTEI 0
Djjunior
06/02/2008
O ideal é vc fazer o seguinte
1º crie uma Primary Key/Unique Keys no seu banco de dados.
2º no Delphi crie uma query do tipo:
select count(*) cont from clientes where cod = :cod
3º em vez do locate faça:
Quanto maior for sua tabela menos aconselhavel é o locate, e desta forma com a PK/UK e a query utilizando-as sua consulta independente do tamanho da tabela será instantânea.
1º crie uma Primary Key/Unique Keys no seu banco de dados.
2º no Delphi crie uma query do tipo:
select count(*) cont from clientes where cod = :cod
3º em vez do locate faça:
qry.close; qry.ParamByName(´cod´).AsInteger := seuCod; qry.OPen; try if qry.fieldByName(´cod´).AsInteger > 0 then raise Exception.create(´Registro duplicado´); finally qry.Close; end;
Quanto maior for sua tabela menos aconselhavel é o locate, e desta forma com a PK/UK e a query utilizando-as sua consulta independente do tamanho da tabela será instantânea.
GOSTEI 0