transação em modo de edição...
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);
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
Curtidas 0
Respostas
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]
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
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+
T+
GOSTEI 0
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
e invocado é que pra insert ele funciona e pra edit não!
e ambos usam o mesmo código
GOSTEI 0
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?
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
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
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
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
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$
16/08/2004
Pq vc não testa a propriedade InTransaction do TSQLConnection após o ApplyUpdate?
GOSTEI 0
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 :
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+
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
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;
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
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+
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
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)?
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
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+
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