Transação em aplicação multicamadas/dbexpress

Delphi

13/09/2004

Caros colegas,

tenho uma aplicacao multicamadas(COM+) usando no servidor dbexpress para a conexao com o banco de dados, gostaria de saber como implementar na aplicação cliente o controle de transaçao visto q o sqlconnection está no servidor de aplicação e na aplicação cliente só tenho um dcomconnection fazendo a ligação com o servidor, procurei no forum mas somente encontrei respostas para dbexpress mas não rodando em aplicações distribuidas.

ex: tenho uma tabela de pedidos e itens de pedido
insiro todos os dados na tabela de pedidos e dou um post (seguido de applyupdates) para obter a chave primaria, no meio do caminho o usuário desistiu de inserir os produtos do pedido e cancelou a operação, como fazer o rollback nesta situacao ?




qquer ajuda é importante


Ederson


Eselvati

Eselvati

Curtidas 0

Respostas

Chcoelho

Chcoelho

13/09/2004

Essa duvida que vc está tendo, é uma duvida de muitas pessoas!!! Já solicitei ajuda pelo site da Clube Delphi aos editores da revista, mas eles so enrolam! Pois ao invés deles fazerem uns artigos interessantes como esse de TRANSAÇÕES COM DBEXPRESS, ficam fazendo coisas que pouco interessa, como um dos ultimos artigos que foi como colocar numero de pagina no relatório :? Um artigo desse tipo é pra rir!!!


GOSTEI 0
Rômulo Barros

Rômulo Barros

13/09/2004

Essa duvida que vc está tendo, é uma duvida de muitas pessoas!!! Já solicitei ajuda pelo site da Clube Delphi aos editores da revista, mas eles so enrolam! Pois ao invés deles fazerem uns artigos interessantes como esse de TRANSAÇÕES COM DBEXPRESS, ficam fazendo coisas que pouco interessa, como um dos ultimos artigos que foi como colocar numero de pagina no relatório :? Um artigo desse tipo é pra rir!!!


Que ´macaquice´ sua, amigo .... Opa!!! pelo contrário: Que ´Coelhice´ :lol: :lol: :lol:


GOSTEI 0
Bon Jovi

Bon Jovi

13/09/2004

Não dê ApplyUpdates antes do usuário confirmar toda a operação. Só fique dando Posts.

No botao OK em que o usuário confirma toda a operacao, chame todos os ApplyUpdates:
cdsPedido.ApplyUpdates(0);
cdsItens.ApplyUpdates(0);

Controlar transacao via aplicacao cliente nao sei se é seguro, nem se é aplicável, acho q foge do conceito. Mas se fosse o caso, vc criaria procedures na aplicação servidora para serem chamadas na aplicação cliente, onde estas executariam métodos do SQLConnection.


GOSTEI 0
Eselvati

Eselvati

13/09/2004

Obrigado pela dica bon jovi mas seguindo o fluxo da aplicação


se depois do

cdsPedido.ApplyUpdates(0) ter gravado certinho no banco e der pau no

cdsItens.ApplyUpdates(0); ? ou seja vou ter um cabecalho de pedido gravado sem itens ?


uma possível solução seria eu mandar dar um delete no cdspedidos ?


Estou meio q perdido nesta situação


GOSTEI 0
Bico

Bico

13/09/2004

Colega,

Proceda da seguinte forma:
Primeiro abra uma transação;
Dê ApplyUpdates;
Se não ocorrer erro dê Commit, caso contrário Rollback;

Exemplo:

IniciarTransação;
try
cdsPedido.ApplyUpdates(0);
cdsItens.ApplyUpdates(0);
Commit;
except
Rollback;
end;

Atenciosamente,
Fernando.


GOSTEI 0
Marcosalex

Marcosalex

13/09/2004

Caros colegas, tenho uma aplicacao multicamadas(COM+) usando no servidor dbexpress para a conexao com o banco de dados, gostaria de saber como implementar na aplicação cliente o controle de transaçao visto q o sqlconnection está no servidor de aplicação e na aplicação cliente só tenho um dcomconnection fazendo a ligação com o servidor, procurei no forum mas somente encontrei respostas para dbexpress mas não rodando em aplicações distribuidas. ex: tenho uma tabela de pedidos e itens de pedido insiro todos os dados na tabela de pedidos e dou um post (seguido de applyupdates) para obter a chave primaria, no meio do caminho o usuário desistiu de inserir os produtos do pedido e cancelou a operação, como fazer o rollback nesta situacao ? qquer ajuda é importante Ederson

Tive esse mesmo problema que voce.

No Servidor, voce deve criar pela Type Lybrary funções para as transações. E também

function TdmdQTServer.StartTransaction : integer; begin with TransacaoCorrente do begin TransactionID := 1; GlobalID := 1; IsolationLevel := xilREADCOMMITTED; CustomIsolation := 0; end; SQLConnectionGuiche.StartTransaction( TransacaoCorrente ); Result := 1; end; function TdmdQTServer.Commit : integer; begin SQLConnectionGuiche.Commit( TransacaoCorrente ); Result := 1; end; function TdmdQTServer.Rollback : integer; begin SQLConnectionGuiche.Rollback( TransacaoCorrente ); Result := 1; end;


E Transacao corrente no caso declarei como private
TransacaoCorrente : TTransactionDesc; // Descritor da transação corrente no DBExpress

No cliente, quando precisar iniciar uma transacao, é só chamar suas funcoes e elas estarão valendo para as querys dos servers.


GOSTEI 0
Eselvati

Eselvati

13/09/2004

Era isso mesmo q estava precisando


valeu a ajuda



Ederson


GOSTEI 0
Wanderleywm

Wanderleywm

13/09/2004

Também estou com problemas com transações em Multicamadas...
Eu inicio a transação normalmente, porém ela não permanece ativa. Estou usando dbexpress e servidor de aplicação soap....


GOSTEI 0
POSTAR