transação em modo de edição...

Firebird

16/08/2004

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

Curtidas 0

Respostas

Guibas

Guibas

16/08/2004

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]


GOSTEI 0
Afarias

Afarias

16/08/2004

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+


GOSTEI 0
Guibas

Guibas

16/08/2004

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


GOSTEI 0
Guibas

Guibas

16/08/2004

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?


GOSTEI 0
Carlos_mauricio_machado

Carlos_mauricio_machado

16/08/2004

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


GOSTEI 0
Afarias

Afarias

16/08/2004

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+


GOSTEI 0
Guibas

Guibas

16/08/2004

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


GOSTEI 0
Ipc$

Ipc$

16/08/2004

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


GOSTEI 0
Vinicius2k

Vinicius2k

16/08/2004

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+


GOSTEI 0
Guibas

Guibas

16/08/2004

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;


GOSTEI 0
Afarias

Afarias

16/08/2004

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+


GOSTEI 0
Guibas

Guibas

16/08/2004

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)?


GOSTEI 0
Afarias

Afarias

16/08/2004

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


GOSTEI 0
POSTAR