[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