dbxpress e transactions
Gostaria de saber como funcionam e como controlar as transações no dbXpress.
Quando eu tento, por exemplo, incluir um item numa venda já salva, recebo a mesnagem de erro: ´record not found or changed by another user´
Talvez o meu problema nem sejam as transações e eu esteja falando besteira, mesmo assim gostaria de consertar isso.
Grato!
Quando eu tento, por exemplo, incluir um item numa venda já salva, recebo a mesnagem de erro: ´record not found or changed by another user´
Talvez o meu problema nem sejam as transações e eu esteja falando besteira, mesmo assim gostaria de consertar isso.
Grato!
Vitor Rubio
Curtidas 0
Respostas
Macario
21/01/2007
Olá, Vitor
Veja este tópico:[url=http://forum.clubedelphi.net/viewtopic.php?t=58547&highlight=bidirecionalurl]Transações com DbExpress de forma Bidirecional[/url]
Acredito que irá lhe ajudar. 8)
Veja este tópico:[url=http://forum.clubedelphi.net/viewtopic.php?t=58547&highlight=bidirecionalurl]Transações com DbExpress de forma Bidirecional[/url]
Acredito que irá lhe ajudar. 8)
GOSTEI 0
Adriano Santos
21/01/2007
Muito bem lembrado, este tópico indicado está excelente e bem explicado.
Qq dúvida postae.
Qq dúvida postae.
GOSTEI 0
Vitor Rubio
21/01/2007
porque no exemplo ele usa o número 1 para identificador da transação?
O que aconteceria se tivesse duas transações com o id 1?
Se eu estou trabalhando com mestre-detalhe, a venda e seus itnes, eu tenho que trabalhar com duas transções?
Grato!
O que aconteceria se tivesse duas transações com o id 1?
Se eu estou trabalhando com mestre-detalhe, a venda e seus itnes, eu tenho que trabalhar com duas transções?
Grato!
GOSTEI 0
Adriano Santos
21/01/2007
E ai véio blz? Faz teeeemmmpo que não apareço...hehehe, tudo certo?
Mano, pelo que entendi não é necessário termos duas ID´s de transação, já que todos os ClientDataSet´s estarão ligados no mesmo SqlConnection. Olha isso:
Aqui abrimos uma única transação. Quem comita ou dá rollback é o SqlConection:
Ou seja, tudo que estiver envolvido (leia-se conectado) na transção/SqlConnection será comitado.
Alguém me corrija se eu falei besteira.
Fui
Mano, pelo que entendi não é necessário termos duas ID´s de transação, já que todos os ClientDataSet´s estarão ligados no mesmo SqlConnection. Olha isso:
var TudoOK: Boolean; Transacao: TTransactionDesc; begin TudoOK:= False; Transacao.TransactionID:= 1; Transacao.IsolationLevel:= xilReadCommitted; SQLConnection1.StartTransaction(Transacao); // Aplicando os updates if ClientDataSet1.ApplyUpdates(0) = 0 then if ClientDataSet2.ApplyUpdates(0) = 0 then if ClientDataSet3.ApplyUpdates(0) = 0 then if ClientDataSet4.ApplyUpdates(0) = 0 then TudoOK:= True; // Note que TudoOK só será true se não houver nenhum erro em nenhum dos Updates if TudoOK then begin SQLConnection1.Commit(Transacao); ShowMessage(´Atualizações OK.´); end else begin SQLConnection1.Rollback(Transacao); ShowMessage(´Ocorreram erros. Alterações descartadas.´); end; end;
Aqui abrimos uma única transação. Quem comita ou dá rollback é o SqlConection:
SQLConnection1.Commit(Transacao);
SQLConnection1.Rollback(Transacao);
Ou seja, tudo que estiver envolvido (leia-se conectado) na transção/SqlConnection será comitado.
Alguém me corrija se eu falei besteira.
Fui
GOSTEI 0
Vitor Rubio
21/01/2007
Obrigado.. Mesmo assim o meu problema não era com transações, então isso não resolveu. O meu problema é que numa relação mestre-detalhe, eu não consigo editar e alterar o detalhe. Na hora de salvar o mestre, dá erro de ´record not found or changed by another user...´
Valew!
Valew!
GOSTEI 0
Macario
21/01/2007
Olá.
Veja que nos exemplos do topico indicado, não é usado as propriedades MasterSource dos Datasets envolvidos.
Você faz mestre/detalhe usando esta propriedade?
[]´s
Veja que nos exemplos do topico indicado, não é usado as propriedades MasterSource dos Datasets envolvidos.
Você faz mestre/detalhe usando esta propriedade?
[]´s
GOSTEI 0
Vitor Rubio
21/01/2007
não usei mastersource no clientdataset, mas usei datasource no sqlDataset( dbxpress) de onde vem os dados desse clientdataset, sendo assim, o mestre (vendas) tem um campo do tipo ´datasetField´ que é o proprio clientdataset detalhe (itens)
Valew!
Valew!
GOSTEI 0
Macario
21/01/2007
Olá.
Eu não ´manjo´ deste tipo de ´ligações´, por isso não compreendi o seu metodo.
Na pratica trabalho com Datasets independentes, pois usando o controle de transação, posso ficar tranquilo sobre a integridade dos dados.
:roll:
Eu não ´manjo´ deste tipo de ´ligações´, por isso não compreendi o seu metodo.
Na pratica trabalho com Datasets independentes, pois usando o controle de transação, posso ficar tranquilo sobre a integridade dos dados.
:roll:
GOSTEI 0
Vitor Rubio
21/01/2007
cara, eu consegui resolver o problema dando um refresh, ou fechando e reabrindo, o clientdataset depois do applyupdates e commit.
Os dois jeitos funcionam.
Gostaria de saber como seria a sua abordagem, [b:19e7220153]Macario[/b:19e7220153]
como funciona manter o dataset desligado de tudo? como grava no banco depois? um loop que popula outro ou direto via SQL? como você deleta o mestre ou, ao cancelar o mestre, não inclui nenhum dos detalhes?
Grato!
Os dois jeitos funcionam.
Gostaria de saber como seria a sua abordagem, [b:19e7220153]Macario[/b:19e7220153]
como funciona manter o dataset desligado de tudo? como grava no banco depois? um loop que popula outro ou direto via SQL? como você deleta o mestre ou, ao cancelar o mestre, não inclui nenhum dos detalhes?
Grato!
GOSTEI 0