[firebase-br] RES: Problema com Mestre/Detalhe e Transações. Complicado!
Jose Aparecido da Silva
joseasilva em bol.com.br
Sex Jun 13 22:41:35 -03 2008
Lembre-se que por ser CachedUpdates = True os dados não são gravados no
banco após o post. É preciso dar o ApplyUpdates para que os dados sejam
enviados ao banco. Aí você vai poder usar a sua lógica e da mesma maneira se
alguma coisa der errado é só dar um rollback. Use todos numa mesma transação
que não tem erro. Para ligar as tabelas logo no inicio adquira o código que
vai unir os dados através de generators. Eu faço desse modo e tenho sido
muito feliz. Exemplo em Delphi e IBX que e igual a MDO:
qrCodigo.Sql.Clear;
qrCodigo.Sql.Add('select gen_id(MeuGenerator, 1) as Codigo from RDB$DATABASE
');
qrCodigo.Open;
Código:= qrCodigo.FieldByName('Codigo').asInteger ;
Aí utilizo o Código retornado tendo a certeza que não se repetirá visto que
o generator independe de transação.
[ ]'s
José Aparecido da Silva
-----Mensagem original-----
De: lista-bounces em firebase.com.br [mailto:lista-bounces em firebase.com.br] Em
nome de Enio Marconcini -:- www.Enio.Pro.Br -:-
Enviada em: sexta-feira, 13 de junho de 2008 11:00
Para: FireBase
Assunto: [firebase-br] Problema com Mestre/Detalhe e Transações. Complicado!
Saudações amigos,
estou com um problema sério, em que depois de muita pesquisa no Google,
listas e foruns ainda não consegui resolver, só me resta pedir pra St.
Expedito o Santo das causas impossíveis me ajudar!
Cadastro Mestre/Detalhe
Na teoria não há mistério. O problema vem na impelentação.
Atualmente eu tenho feito assim: gravo primeiro (commit) no registro mestre,
gravo os detalhes (commit) e exibo-os num dbgrid dentro do form de cadastro
do registro mestre.
O inconveniente é que pode haver sido cadastrado mestres incompletos, sem
registros detalhes.
Estou usando MDO (semelhante ao IBX)
Minha idéia é ter tudo amarrado num mesmo MDOTransaction, se eu commitar,
grava tudo, do contrário abandona tudo... ATÉ AÍ TUDO BEM: o problema é ir
inserindo registros detalhe e exibir na grade, antes de commitar a
transação.
Minhas tabelas:
Produtos -> Acessorios <- Itens
Onde cada Produto (mestre) possui N acessórios, e os Itens são os acessórios
que compõem o Produto final
Assim, na tabela acessório contém a PK e as FK´s de Produtos e Items
(espero que fui claro)
tentei amarrar tudo ao mesmo MDOTransaction e proceder assim:
*StartTransaction;*
*Produtos.Insert;*
// preenchido os dados do produto
*Produtos.Post;*
// para cada item inserido
*Detalhe.Insert;*
// adiciono o PK de Itens
// adiciono a PK de Produtos
*Detalhe.Post;*
*QueryExibeItens.Close;
QueryExibeItens.Open;*
// aqui deveria ser exibido os itens adicionados num DBGrid
// possui um SQL para trazer os dados dos itens adicionados, e relacionados
com a tabela detalhe
// no entanto não aparece nada.
os DataSet´s foram setados para CachedUpdates True
ao término, se for Commit:
*Produtos.ApplyUpdates;
Detalhe.ApplyUpdates;
Transação.Commit;*
senão:
*Detalhes.CancelUpdates;
Produtos.CancelUpdates;
Transacao.Rollback;*
até uma aplicação de exemplo, seguindo as dicas que encontrei, eu
implementei e não teve acordo, quem quiser dar uma olhada
ftp.santafedosul.sp.gov.br/publico/Teste_MasterDetail.rar
se alguém tiver alguma dica me fala.
abraços
--
M.I.C.T.M.R.
ENIO RODRIGO MARCONCINI
...: www.santafedosul.sp.gov.br
....................: www.enio.pro.br
......: gtalk: eniorm em gmail.com
.......................: skype: eniorm
Linux User................. #433647
______________________________________________
FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
Para saber como gerenciar/excluir seu cadastro na lista, use:
http://www.firebase.com.br/fb/artigo.php?id=1107
Para consultar mensagens antigas: http://firebase.com.br/pesquisa
Mais detalhes sobre a lista de discussão lista