[firebase-br] Problema com Mestre/Detalhe e Transações. Complicado!
Valdir Marcos
valdir.marcos em ig.com.br
Sex Jun 13 16:56:33 -03 2008
Boa tarde.
Uma sugestão:
Crie um único Generator que servirá para interligar as três tabelas.
Crie uma Stored Procedure para manipular esse Generator (nesse caso,
triggers nem pensar).
Nas tableas Produtos, Acessorios e Itens crie uma coluna para receber
o valor desse generator. Por exemplo, a coluna código.
Idependente da liguagem de programação ou componentes de acesso, pense
na seguinte lógica:
- Iniciar a transação
- iCodigo recebe o valor retornado pela Stored Procedure
- Nova linha em Produtos
Produtos.Codigo = iCodigo
Preencher os dados do produto
Gravar os dados do Produto (sem commit)
- // continue com a sua lógica
- finalizar a transação
- Tudo cero, Commit
- Algo errado, Rollback
Um abraço,
Valdir
Em 13/06/08, Enio Marconcini -:- www.Enio.Pro.Br -:-<eniorm em gmail.com> escreveu:
> 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