Fórum Transações em multicamadas #292584

22/08/2005

0

Boa tarde pessoal,

Volto a solicitar a ajuda de vcs sobre transações em aplicações multicamadas...

Estou com o seguinte problema:

Tenho o seguinte cenário:

BD -> Camada de Acesso -> Camada de apresentação

na camada de acesso, tenho o componente de conexao, query´s e dsp´s.
na camada de apresentação tenho os clientdataset´s q sao ligados aos providers, frente a isto, insiro, altero e excluo normalmente..

porém, estou implementando um log de usuarios, onde eu gravo tudo q o usuario fez, se incluiu, alterou, excluiu..etc

estou fazendo isto no evento beforeupdaterecord dos dsp´s na camada de acesso: ex.


procedure Tmeudm.dspbeforeupdaterecord...
begin
if updatekind=ukinsert then
   minhaqry.sql.add(´usuario inseriu´);
 else if updatekind=ukmodify then
   minhaqry.sql.add(´usuario alterou´);
 else if updatekind=ukdelete then
   minhaqry.sql.add(´usuario excluiu´);
minaqry.execsql;
end;


entao, toda vez q postar ou excluir um registro em um clientdataset na camada de apresentação, vou gravar um registro em uma tabelinha de logs, só q desta forma, eu corro risco de ter um log sem q o registro em questao tenha sido gravado ou excluido, pq o banco de dados ainda poderá me retornar erro como violação de PK ou FK, o q é facilmente tratado no evento onreconcileerror do clientdataset, mas e a inserção na tabela de logs ? q ja ocorrera ?

Este é um assunto complicado e meu problema e outros ´empecilhos´ tem deixado a tecnologia Midas, na minha opinião muito aquem do q realmente é atribuido a ela.

Ficarei grato caso alguem possa esclarecer esta dúvida


PS: Deixo aqui uma solicitação aos editores da revista se possível formularem uma materia sobre este assunto (Transações em multi camadas), acho q será de grande utilidade a muitos.



Ederson Selvati


Eselvati

Eselvati

Responder

Posts

23/08/2005

Orpolonio

Sugestão....
Sua tabela de LOG não é regra de sistema certo?
Coloque em um trigger.
Digo para economizar codigo no RDM para metodos complexos.


Se quiser usar o commit,rollbabk basta criar um metodo
TRANSACAO(´COMMIT´)
TRANSACAO(´ROLLBACK´);

Dentro do metodo TRANSACAO vc faz normalmente como se estivesse escrevendo em duas camadas....


Responder

Gostei + 0

23/08/2005

Eselvati

Blz orpolonio, quer dizer entao q dentro da aplicacao cliente se eu chamar um metodo criado no rdm q faça por exemplo

rdm.meumetoddeiniciartransacao
var
  trans: ttransactiondesc
begin
  trans.transactionid...
  minhaconexao.starttransaction(trans)
end;

rdm.meumetodoparacommit
begin
  minhaconexao.commit(trans)
end;





se eu chamar estes metodos na aplicacao cliente

procedure_tal
begin
   meumetododeiniciartransacao;
   clientdataset1.insert;
   clientdataset1.pppppp
   clientdataset1.post;

   clientdataset2.delete;

   clientdataset3.edit;
   clientdataset3.pppppp
   clientdataset3.post;


   if clientdataset1.applyupdates(0)=0 then
      if clientdataset2.applyupdates(0)=0 then
         if clientdataset3.applyupdates(0)=0 then 
            meumetododecommit
          else
            meumetododerollback;
       else
          meumetoderollback
     else
        meumetododerollback;
end;


seria algo deste tipo ?



Vlw

Ederson Selvati


Responder

Gostei + 0

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

Aceitar