[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