Fórum transação em modo de edição... #46049

16/08/2004

0

estou usando d7, dbx, firebird 1.5

Abro uma transação para salvar os dados no banco, quando incluo um novo registro funciona blz, mas se tendo alterar um registro ele diz que a transação não foi aberta... o código pra salvar é o mesmo pra insert e edit. (a transação é feita e concluida no afterpost);


Guibas

Guibas

Responder

Posts

16/08/2004

Guibas

try
TD.TransactionID := 1;
TD.IsolationLevel := xilReadCommitted; //xilREPEATABLEREAD;
Principal.SQLConnection1.StartTransaction(TD);

//aqui fica os applyupdate das tabelas

principal.SQLConnection1.Commit(TD);
except
principal.SQLConnection1.Rollback(TD);


o erro é transction not actived ..... como é possivel não estar aberto?[/list]


Responder

Gostei + 0

16/08/2004

Afarias

Bom, não dá pra dizer ao certo com esta informação... mas uma coisa q vc tem q ter em mente é q um ApplyUpdates() no CDS abre e fecha AUTOMATICAMENTE a transação (caso a mesma não esteja aberta) e isso pode ser o motivo.



T+


Responder

Gostei + 0

16/08/2004

Guibas

tirei os apply e testei ... mas continua mesma coisa...

e invocado é que pra insert ele funciona e pra edit não!

e ambos usam o mesmo código


Responder

Gostei + 0

16/08/2004

Guibas

estou fazendo assim:

clientdataset.edit;
jogo os valor
clientdataset.post;


no afterpost abre um transação
faço o appluypdates (mas qdo faço o applyupdates ele sai da transação)
pq? não deveria sair só depois do commit?


Responder

Gostei + 0

16/08/2004

Carlos_mauricio_machado

Hum, me cheira que vc, Guibas, esqueceu de duas coisas:
1º declarar DBXpress no uses de sua unit, assim , pode-se usar o esquema de transações
2º fazer a declaração global de sua variavel TD assim:
TD : TTransactionDesc;

falo isso porque meu esquema de transação funciona...
presumo que seja isso

FaLOWS

Carlos Maurício


Responder

Gostei + 0

16/08/2004

Afarias

estou fazendo assim: no afterpost abre um transação faço o appluypdates (mas qdo faço o applyupdates ele sai da transação)


O que é ´sai da transação´ ?? não entendi!

E, como disse, o ApplyUpdates controla a transação automaticamente, vc não tem q abrir ou fechar manualmente!

Mas se quer fazer manualmente, lembre q um apllyUpdates tb NÃO gera exceção, de forma q um Try/Except para dar Commit ou Rollback não faz sentido.


T+


Responder

Gostei + 0

17/08/2004

Guibas

tipo é pq tenho que fazer um insert ou edit em várias tabelas e queria controlar para que se ocorresse um erro no procedimento em alguma tabela não fosse salvo nada.... em nenhuma tabela...


Responder

Gostei + 0

17/08/2004

Ipc$

Pq vc não testa a propriedade InTransaction do TSQLConnection após o ApplyUpdate?


Responder

Gostei + 0

17/08/2004

Vinicius2k

Acho q vc não está no caminho certo procurando um problema na transação... me arriscaria a dizer que seu problema está no(s) ApplyUpdate(s)...
Eu faria seu código desta forma :
var 
  TudoOK: Boolean;

try 
  TudoOK:= False;   
  TD.TransactionID:= 1; 
  TD.IsolationLevel:= xilReadCommitted;
  SQLConnection1.StartTransaction(TD); 
  {****}
  if ClientDataSet1.ApplyUpdates(0) = 0 then
    if ClientDataSet2.ApplyUpdates(0) = 0 then
      if ClientDataSet3.ApplyUpdates(0) = 0 then
        TudoOK:= True;
  {****}  
  if TudoOK then SQLConnection1.Commit(TD)
    else 
      begin
        ShowMessage(´Ocorreram erros !´);
        SQLConnection1.Rollback(TD);       
      end;
except 
  On E: Exception do
    ShowMessage(´Não foi possível abrir a transação.´ + #13 + E.Message); 
end;

Neste exemplo aninhei os ApplyUpdates de forma que a variável ´TudoOK´ só será True se não houver erros em nenhum deles...
Se não houverem erros ´commit´ a transação, do contrário ´rollback´...

Meu palpite é de que vc está tendo erros no ApplyUpdates quando em modo de edição... para ter certeza, verifique, ´E.Message´ do evento OnReconcileError do(s) ClientDataSets, já que como o afarias, disse, ApplyUpdates não geram exceção, apenas ReconcileError...

Espero ter ajudado...
T+


Responder

Gostei + 0

17/08/2004

Guibas

estou fazendo assim está correto?

try
TD.TransactionID := 1;
TD.IsolationLevel := xilREPEATABLEREAD;
Principal.SQLConnection1.StartTransaction(TD);
cauxec.ApplyUpdates(0);
cauxgi.ApplyUpdates(0);
Principal.SQLConnection1.Commit(TD);
except
Principal.SQLConnection1.Rollback(TD);
end;


Responder

Gostei + 0

17/08/2004

Afarias

essa parte do código::

except
Principal.SQLConnection1.Rollback(TD);
end;


NUNCA será executada -- ou melhor, será apenas se não for possível abrir a transação o q torna o código sem sentido!

Veja como o Vinicius2k pega o valor de retorno da função ApplyUpdates() para saber se houve ou não erro.



T+


Responder

Gostei + 0

17/08/2004

Guibas

amigo...

digamos que faço com mostrou o vinicius2k e no meio do dos applyupdates ocorre um erro ou tipo uma queda de energia

não foi completa a transação ... nem com commit nem com rollback

mas ja foi feito alguns applyupdates;

essas tabelas que levaram os appyupdates vão ser gravadas no banco?
(pois axo que o correto é não serem gravadas, só gravar se completar todas transação com o commit)?


Responder

Gostei + 0

17/08/2004

Afarias

|essas tabelas que levaram os appyupdates vão ser gravadas no banco?

Ai o assunto é outro -- contra queda de energia não tem TRY/EXCEPT q dê jeito! hehehehe...

A resposta para sua pergunta é NÃO -- se a transação não é fechada com o COMMIT todo o ´trabalho´ realizado pelo ApplyUpdates é perdido.


|(pois axo que o correto é não serem gravadas, só gravar se completar
|todas transação com o commit)?

É o q ocorre.


T+


Responder

Gostei + 0

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

Aceitar