ClientDataset
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
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
Curtidas 0
Respostas
Marco Salles
26/04/2009
Mas de qual o Before Vc se refere ..
BeforeOpen ? BeforeInserte ? BeforeDelete ? BeforePost ??? BeforeCancel ?? BeforeClose ???
BeforeOpen ? BeforeInserte ? BeforeDelete ? BeforePost ??? BeforeCancel ?? BeforeClose ???
GOSTEI 0
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;
if campo.value <> ´S´ then
begin
showmessage(´Valor incorreto´);
abort;
end;
GOSTEI 0
Rogeranalista
26/04/2009
É o evento onbeforepost.. Mas ele não está passando por esse evento quando vou salvar....
Aguardo retorno
Rogério
Aguardo retorno
Rogério
GOSTEI 0
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]
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
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
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
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
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.
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]
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
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].
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.
Código: if campo.value <> ´S´ then begin showmessage(´Valor incorreto´); abort; end;
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