IBExpress, Master/Detail e Cached Updates

07/03/2003

0

Imagino que muitos programadores Delphi já imaginaram o problema só olhando para o título... Pois é, mais um cara que não consegue mandar o pedido e seus itens para o banco em uma única transação...

Nos casos de tabelas interligadas, acho que é bastante comum o uso da abordagem Master/Detail usando a propriedade DataSource da Query Detail, certo ?

Também imagino que seja muito intuitivo dar Apply´s e CommitRetaining em Master e Details no evento AfterPost da tabela Master...

QryMaster.AfterPost
begin
Master.ApplyUpdates;
Detalhe.ApplyUpdates;
Transaction.CommitRetaining;
end;

Acontece que exatamente quando se dá o Post na tabela Master, os cached updates das tabelas detalhe são perdidas, e quando se chega na linha ´Detalhe.Apply...´ não há nada a aplicar.
Então eu tentei de tudo, o TIBClientDataSet (quando eu dava Ctrl+F pra adicionar os campos, dava o erro ´Empty SQL Statement´ - mas a query estava lá na propriedade Comand-sei-lá-o-q), até abri as demos do Delphi (e tive que desinstalar o IB6 e colocar o IB5 pra isso) e percebi que o exemplo do BDE funcionava, mas o do IBExpress não. Fazia-se do mesmo jeito (Aplly´s e commit na AfterPost da Master) e dava o mesmo problema. Então eu disse adeus ao IBExpress e mudei tudo pra BDE.

Reinstalei o IB6 e qual foi a minha surpresa ao ver que o componente TDatabase não conectava de jeito nenhum no IB6 (lembrem-se, eu testei o demo no IB5)... ´Invalid Parameter´... mais uma vez, tentei todo o tipo de combinação possível de coisas mas sempre a mesma mensagem...

Então pensei mais um pouco: se nem o exemplo do Delphi funcionava, pode ser que algo esteja corrompido... desinstalei o Delphi 7 (e o 5 que estava na mesma máquina tb) e instalei só o 7. Ainda, baixei a versão atualizada do IBExpress no site da Borland.

Agora consigo fazer a transação mas só em alterações. Quando insiro um registro novo da master, ainda ocorre o mesmo problema: perco os cached updates da detalhe no Post da master. Por enquanto, resolvo o problema com Master.Post (com Apply/commit no AfterPost); Master.Edit, tudo no beforeinsert/edit das detail... mas até quando vamos ter que ficar fazendo gambiarra pra resolver problemas tão comuns ? Vi sites que sugeriam desligar a propriedade DataSource da query-detalhe antes do post, mas e se der um erro no processo ? Quando se programa em eventos não há lugar adequado para um try...except.

Será que existe alguma maneira de simplesmente ligar uma query na outra em Master/Detail e dar Apply´s e Commit´s na AfterPost da Master sem ter que ficar fazendo gambiarra ?

Abraço a todos,

Edilson.


Anonymous

Anonymous

Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar