GARANTIR DESCONTO

Fórum Verificar se já existe o registro gravado #353145

06/02/2008

0

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

Responder

Posts

06/02/2008

Rickyale2

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


Responder

Gostei + 0

06/02/2008

Alecsandro Moura

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:


Responder

Gostei + 0

06/02/2008

Paullsoftware

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


Responder

Gostei + 0

06/02/2008

Eselvati

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


Responder

Gostei + 0

07/02/2008

Help Desk1

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.


Responder

Gostei + 0

07/02/2008

Paullsoftware

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:


Responder

Gostei + 0

08/02/2008

Help Desk1

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.


Responder

Gostei + 0

08/02/2008

Djjunior

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.


Responder

Gostei + 0

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

Aceitar