GARANTIR DESCONTO

Fórum DBExpress TClientDataSet Transação #174352

11/08/2003

0

sqlconnection.starttranzaction(TD);
Try
clientdataset1.applyupdates;
clientdataset2.applyupdates;
sqlconnection.commit(TD);
except
sqlconnection.rollback(TD);
end;

Esse có digo quase funciona ... mas ainda tenho problemas, e sério, com ele.
Minha aplicação é WEB e eu não posso trabalhar com Cache em Disco. O maior problema q eu tenho é o seguinte.
Se o primeiro applyupdates der tudo certo e o segunde der erro, eu caio no except e dou Rollback, mas o problema é que o CLIENTDATASSET1.DELTA foi perdido, ou seja, quando eu tentar dara applyupdates denovo as alterações do primeiro clientdataset não vão para o servidor.
Com o BDE e UpdateSQL eu tinha um negocio que chamava commitupdates, servia basicamente para limpar o Cache, Ou seja eu podeia dar varios applyupdates e todos eles me mandavam minha instrução SQL, ela somente não era mais mandada quando eu desse um commitupdates.
Como eu faço para solucionar esse problema com DBExpress+ClientDataSet????

[]´s


Sousa_thiago

Sousa_thiago

Responder

Posts

11/08/2003

Sousa_thiago

Estou precisando de uma luz ... se algum puder me ajudar por favor ..

[]´s


Responder

Gostei + 0

12/08/2003

Sousa_thiago

Sobe


Responder

Gostei + 0

12/08/2003

Sousa_thiago

Nossa ... Isso é básico ... será que todo mundo fala mas niguem tentou usar DBExpress de verdade? :/

Só relembrando eu não posso usar cache em disco pois meu sistema é WEB ...

:)


Responder

Gostei + 0

13/08/2003

Sousa_thiago

Sobe


Responder

Gostei + 0

13/08/2003

Sousa_thiago

Sobe


Responder

Gostei + 0

13/08/2003

Afarias

O ´problema´ é q o processo q está tentando implementar não está de acordo com modelo do MIDAS -- onde as transações devem ser controladas pelo Provider (no ´contexto´ de um ApplyUpdates).

Em geral o método sugerido quando existem CDSs com uma relação mestre/detalhe é usar Nested Datasets.

Quando se tem uma relação M/D e não se deseja usar Nested DataSets *ou* queremos atualizar vários CDSs que não possuem relação M/D no contexto de uma transação --- uma solução é usar a unidade CDSUtil do pacote MIDESS:

http://sourceforge.net/projects/midess/


Baixe o pacote e dê uma olhada no exemplo na pasta CDSUtil.


T+


Responder

Gostei + 0

14/08/2003

Sousa_thiago

Valeu cara ...

Já tinham me mandado esse UNIT CDSUtils mas ela não tinha exemplos e eu não concegui entender direito como ela fcuncionava.

Baixei ela já lá no Site q vc indicou e acho q é bem isso mesmo que estou precisando.

Só não entendi muito bem o que vc falou sobre os Provider´s se vc puder me falar mais alguma coisa sobre isso .. ou me indicar um lugar onde ler sobre isso eu agradeço tb ...

[]´s


Responder

Gostei + 0

14/08/2003

Afarias

|Só não entendi muito bem o que vc falou sobre os Provider´s se vc
|puder me falar mais alguma coisa sobre isso

Quando vc executa o ApplyUpdates o CDS envia seu Delta (alterações realizadas pelo usuário) para o DataSetProvider q automaticamente abre a transação, envia as alterações (do Delta) para o banco de dados e então, caso esteja tudo certo, efetua o commit. -- isto se a transação estiver fechada no início de tudo -- o DataSetProvider (ou simplesmente o Provider) cuida de tudo automaticamente.


|.. ou me indicar um lugar onde ler sobre isso eu agradeço tb ...

Algumas leituras recomendadas:

http://bdn.borland.com/article/0,1410,28876,00.html
http://bdn.borland.com/article/0,1410,20567,00.html
http://bdn.borland.com/article/0,1410,22571,00.html
http://bdn.borland.com/article/0,1410,20846,00.html


T+


Responder

Gostei + 0

14/08/2003

Sousa_thiago

Valeu pelas dicas
Com certeza vou dar uma olhada nos artigos
[]´s


Responder

Gostei + 0

14/08/2003

Sousa_thiago

Estou postando a Solução q foi adotada em minha applicação.

Lembrando que para essa minha applicação eu não estou fazendo tratamento do erro no Evento OnReconcileError. Se você for fazer esse tratamento a sua Procedure terá de ser pouca coisa diferente dessa.

Mas acho que essa ai tá valendo pra poder entender um pouquinho da lógica por traz do Cliente+Provider

O ´PLUS´ Dessa minha procedure é o seguinte: Se algum dos Client´s não for aplicado com sucesso, nenhum deles perde o Buffer (DELTA).



procedure TForm1.btnApply(Sender: TObject);
var
Error : Integer;
TD: TTransactionDesc;
VDelta1, vDelta2:OleVariant;
begin
SQLConnection1.StartTransaction(TD);
try
vDelta1 := ClientDataSet1.Delta;
vDelta2 := ClientDataSet2.Delta;

vDelta1 := Provider.ApplyUpdates(vDelta1,-1, Error);
if error >0 then
SysUtils.Abort;
vDelta2 := Provider.ApplyUpdates(vDelta2,-1, Error);
if error >0 then
SysUtils.Abort;
SQLConnection1.Commit(TD);
//Atializa o Delta
Client.Reconcile(vDelta1);
Client.Reconcile(vDelta2);
except
SQLConnection1.Rollback(TD);
end;
end;


[]´s


Responder

Gostei + 0

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

Aceitar