ClientDataset

Delphi

26/04/2009

Pessoal

Para que serve o evento onbefore do ClientDataset ???
Bom a princípio seria para fazer tratamento de algum erro que possa ocorrer antes de salvar mas o que ocorre é que quando vai salvar ele náo passar por esse evento, conferi isso debugando....


Estou usando o SQLDATASET, PROVIDER e o CLIENTDATASET...
Entáo como podeira tratar isso ?? Ou teria que ser no próprio evento do bbotao


Estou usando o Delphi 2006 e o banco Firebird 2.0

Aguardo retorno

Rogério


Rogeranalista

Rogeranalista

Curtidas 0

Respostas

Marco Salles

Marco Salles

26/04/2009

Mas de qual o Before Vc se refere ..

BeforeOpen ? BeforeInserte ? BeforeDelete ? BeforePost ??? BeforeCancel ?? BeforeClose ???


GOSTEI 0
Emarcolongo

Emarcolongo

26/04/2009

Se for o BeforePost ele é acionado antes de salvar, ai vc pode colocar algumas regras para validar as informações, por exemplo:

if campo.value <> ´S´ then
begin
showmessage(´Valor incorreto´);
abort;
end;


GOSTEI 0
Rogeranalista

Rogeranalista

26/04/2009

É o evento onbeforepost.. Mas ele não está passando por esse evento quando vou salvar....

Aguardo retorno

Rogério


GOSTEI 0
Marco Salles

Marco Salles

26/04/2009

Tem que passar sim , a não ser que algo esteja desviando o curso Normal
de processamento.. Com o Cancelamento do Post , uma exceção silenciosa

No BreakPoint

[b:2be45bbd0e]cds.Post aonde esta Indo o Seu Codigo[/b:2be45bbd0e]


GOSTEI 0
Rogeranalista

Rogeranalista

26/04/2009

Colega

No evento onbeforepost do ClientDataset poderia usar o POST ??
Ex: CdsCliente.post

Bom, se caso sim como faço para disparar esse evento lá no botão salvar quando for pressionado no evento onclick

Ou o evento onbeforepost, serve somente para fazer validacões...


Aguardo retorno

Rogério


GOSTEI 0
Marco Salles

Marco Salles

26/04/2009

No evento onbeforepost do ClientDataset poderia usar o POST ?? Ex: CdsCliente.post


Acho que não.. O Post chama o BeforePost , se tiver um Post ai , vc fica
nun loop

Bom, se caso sim como faço para disparar esse evento lá no botão salvar quando for pressionado no evento onclick


Pela lógica , no seu Botão salva vc coloca o post

procedute SeuForm.BtbSlavarOnClick(sender:TObject)
var
...
begin
Seu Codigos;
cds.Post;  //Geralmnente é Aqui
end;


o evento onbeforepost, serve somente para fazer validacões...

Não necessariamente.. Mas é um bom Local para Vc abortar o post,
Seguindo algum Critério , ou norma , antes que o evento OnAfterPost
seje executado

No evento OnBeforePost para sair crie uma exceção


GOSTEI 0
Discorpio

Discorpio

26/04/2009

Boa tarde a todos.

A meu ver o evento BeforePost não é o melhor evento para se implementar uma validação de dados, pois a validação deve sim ser implementada antes de acionar o método Post.

O método BeforePost é ideal para voce atribuir valores a chave estrangeira, fazer algum cálculo e atribuir a algum campo e etc.

Isto não impede que se faça a validação nesse evento, e por isso analisemos o código do nosso amigo Emarcolongo.

  if campo.value <> ´S´ then 
  begin 
       showmessage(´Valor incorreto´); 
       abort; 
  end;


Com o código acima, a instrução abort não vai impedir o salvamento dos dados no banco, isto porque abort que é um instrução do antigo Pascal, equivale a mesma coisa que Exit, ou seja, vai abortar a procedure a partir de sua linha e somente isso.

Como o método Post salva apenas os registros no DataSet local, ao chegar a execução do evento BeforePost, voce não pode mais utilizar ClientDataSet.Cancel, isto porque o método Post já foi acionado, entretanto voce pode acionar o método ClientDataSet.CancelUpdates que cancela a atualização feita no DataSet Local.

Então o código do nosso amigo acima ficaria melhor assim:

code]
if campo.value <> ´S´ then
begin
showmessage(´Valor incorreto´);
ClientDataSet.CancelUpdates;
end;
[/code]


GOSTEI 0
Marco Salles

Marco Salles

26/04/2009

Isto não impede que se faça a validação nesse evento, e por isso analisemos o código do nosso amigo [b:4456e60966]Emarcolongo[/b:4456e60966].
Código: 

  if campo.value <> ´S´ then 
  begin 
       showmessage(´Valor incorreto´); 
       abort; 
  end; 
Com o código acima, a instrução abort não vai impedir o salvamento dos dados no banco, isto porque abort que é um instrução do antigo Pascal, equivale a mesma coisa que Exit, ou seja, vai abortar a procedure a partir de sua linha e somente isso.


O Codigo postado não é meu.. Mas eu vou tomar a liberdade de questionar. A instrução Abort gera uma Exceção. Uma exceção Silenciosa,
e é diferentemente da instrução exit.

Basta Fazer o Test em duas chamadas

//Método Abort
procedure TForm1.Button1Click(Sender: TObject);
begin
try
 Abort;  //Gera uma exceção
except
 on e:Exception do
 Showmessage(e.ClassName);
end;
end;


Diferentemente da Instrução [b:4456e60966]exit[/b:4456e60966]

procedure TForm1.Button2Click(Sender: TObject);
begin
try
 exit;//Nenhuma exceção é disparada
except
 on e:Exception do
 Showmessage(e.ClassName);
end;
end;


Esta Exceção gerada no Evento OnBeforepost do Cds impede a continuação do processo e portanto o evento OnAfterPost não é disparado
evitando assim o salvamento dos Dados.

Realmente o metodo OnBeforepost é um ´bom local´ para
atribuir valores a chave estrangeira . Sobre a questão de Validações
acho que dependera muito da Arquitetura do Aplicativo bem como as
regras de negócios envolvidas, pois o delphi tem Contraints , onValidade , OnSetText , enfim vários recursos que vc pode fazer
as Validaçoes necessárias.


GOSTEI 0
POSTAR