Verificar se já existe o registro gravado

Delphi

06/02/2008

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.


Help Desk1

Help Desk1

Curtidas 0

Respostas

Rickyale2

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


GOSTEI 0
Alecsandro Moura

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:


GOSTEI 0
Paullsoftware

Paullsoftware

06/02/2008

basta fazer:
DataModule2.ClientDataSet2.Locate(´COD_CLIENTE´,StrToInt(DBEdit3.Text),[]);// colocando os [] fora do StrToInt() :wink:


GOSTEI 0
Eselvati

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


GOSTEI 0
Help Desk1

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.


GOSTEI 0
Paullsoftware

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:


GOSTEI 0
Help Desk1

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.


GOSTEI 0
Djjunior

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:

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
POSTAR