Array
(
)

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

Eselvati
   - 13 set 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


Chcoelho
   - 13 set 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!!!


Rômulo Barros
   - 13 set 2004


Citação:
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:


Bon Jovi
   - 13 set 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.


Eselvati
   - 15 set 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


Bico
   - 15 set 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.


Marcosalex
   - 16 set 2004


Citação:
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


Citação:

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.


Eselvati
   - 16 set 2004

Era isso mesmo q estava precisando


valeu a ajuda



Ederson


Wanderleywm
   - 03 jul 2006

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....