Fórum transação em modo de edição... #46049
16/08/2004
0
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
Curtir tópico
+ 0Posts
16/08/2004
Guibas
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
16/08/2004
Afarias
T+
Gostei + 0
16/08/2004
Guibas
e invocado é que pra insert ele funciona e pra edit não!
e ambos usam o mesmo código
Gostei + 0
16/08/2004
Guibas
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
16/08/2004
Carlos_mauricio_machado
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
16/08/2004
Afarias
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
17/08/2004
Guibas
Gostei + 0
17/08/2004
Ipc$
Gostei + 0
17/08/2004
Vinicius2k
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
17/08/2004
Guibas
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
17/08/2004
Afarias
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
17/08/2004
Guibas
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
17/08/2004
Afarias
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
Clique aqui para fazer login e interagir na Comunidade :)