Transação em aplicação multicamadas/dbexpress
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
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
Curtidas 0
Respostas
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
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
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.
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
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
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
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.
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
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
13/09/2004
Era isso mesmo q estava precisando
valeu a ajuda
Ederson
valeu a ajuda
Ederson
GOSTEI 0
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....
Eu inicio a transação normalmente, porém ela não permanece ativa. Estou usando dbexpress e servidor de aplicação soap....
GOSTEI 0