Esse artigo faz parte da revista Clube Delphi Edição 80. Clique aqui para ler todos os artigos desta edição

Atenção: por essa edição ser muito antiga não há arquivo pdf para download desta revista. Os artigos disponíveis somente em doc.

DataSnap

ClientDataSet - Técnicas Avançadas

 

Estamos acostumados a utilizar uma gama de recursos cada vez mais interessantes e úteis que vem sendo disponibilizados a cada versão da VCL. Porém, como nem tudo é perfeito, ainda assim nos deparamos com situações em que não encontramos soluções para problemas relativamente simples. Vou relatar um caso que vivenciei.

Certa vez, quando participava do desenvolvimento de um software, optei por utilizar em cada módulo do sistema um formulário inicial onde o usuário pudesse inserir ou, através de vários parâmetros para filtragem, localizar um registro para alteração. Esse formulário por sua vez chamava um segundo que trabalhava totalmente em memória, trazendo os campos do registro preenchidos ou vazios em caso de inserção.

Se houvesse confirmação da operação, era feita a validação e envio ao banco de dados, caso contrário os dados eram descartados. No caso de formulários com informações mestre/detalhe, utilizava um DBGrid ligado a um ClientDataSet para apresentação dos detalhes. Esse era alimentado por uma procedure de busca que montava em tempo de execução uma consulta SQL para retornar os detalhes de acordo com o código do registro mestre passado como parâmetro e, através de um while inseria os registros no ClientDataSet.

Certo, boa idéia para trabalhar os dados em memória antes do envio ao banco. No entanto, surgiu o seguinte problema: quando estamos alterando um registro que tinha detalhes e esses estando carregados no ClientDataSet, no momento de salvar as informações, a procedure responsável pela gravação passava pelos detalhes verificando seu UpdateStatus para definir qual instrução SQL executar.

O retorno era usInserted mesmo que os registros não tivessem sofrido nenhuma modificação pelo usuário. Ao tentar inserir no banco de dados uma exceção de violação de chave era levantada. Agora chegamos a um problema que poderia ser facilmente solucionado. Bastava que no momento de carregar os detalhes, após inserir o registro no ClientDataSet, tivéssemos um recurso do componente para voltar seu estado para usUnModified, porém não temos. O que fazer?

 

Funcionamento interno do ClientDataSet

Como todo problema deve ser resolvido, mãos a obra! Minha saída foi estudar o funcionamento do ClientDataSet para encontrar uma maneira de manipular o estado dos registros.  Analisando a classe TClientDataSet descobri que ela somente publica as propriedades, métodos e eventos de sua ancestral, TCustomClientDataSet ...

Quer ler esse conteúdo completo? Tenha acesso completo