terça-feira, 18 de outubro de 2011

Dicas DBXpress

Dicas DBXpress + Firebird - Parte 3

Olá, estamos aqui novamente para finalizar a saga de componentes DBXpress configurando os componentes DataSetProvider e ClientDataSet faltantes em nosso conjunto de configurações.


Conhecendo os componentes
ClientDataSet - Componente Bidirecional que é utilizado para exibir e editar os dados de uma tabela do banco de dados. Com esse componente podemos por exemplo ordenar os dados de um dataset sem precisar refazer a instrução SQL contida no componente SQLDataSet, configurado no post anterior, trabalhando totalmente com os dados em memória. Podemos ainda desconectar o banco de dados pois os dados ficam armazenados no cache do componente, sendo assim temos o mínimo de acesso ao banco de dados deixando-o livre para outras operações. Podemos dizer que o ClientDataSet é um componente TTable umas mil vezes melhorado. 
O componente DataSetProvider já foi descrito no post anterior então esse vamos somente configurar.

No nosso datamodule inclua um componente TDataSetProvider e um TClientDataSet que encontramos na paleta DataAccess.

Vamos imaginar duas situações reais: primeiramente temos uma tela de cadastro de bairros onde iremos dar manutenção aos dados da tabela.

Estrutura da tabela de bairros:
CREATE TABLE BAIRRO(
   COD INTEGER NOT NULL,
   NOME VARCHAR(50));

Com o nosso conjunto de componentes adicionados corretamente no datamodule vamos para a configuração dos mesmos.
No componente ClientDataSet alteramos a propriedade CommandText para : SELECT COD, NOME FROM BAIRRO. Altere a propriedade ProviderName para o provider adicionado anteriormente no datamodule.
Agora devemos configurar o provider para interagir com o ClientDataSet e com o SQLDataset existentes. Altere para True a subpropriedade AllowCommandText contido em Options, com isso indicamos que iremos usar a sentença SQL contida no ClientDataSet e não a do SQLDataset.
Altere a propriedade Active do ClientDataSet para True, se tudo estiver correto a conexão com o banco de dados está pronta. Agora basta utilizar os comandos existentes para alteração, inclusão e exclusão: Edit, Insert, Delete respectivamente e o seu sistema estará atualizando os dados da tabela normalmente. Após executar um desses comandos execute a procedure ApplyUpdates(0) para aplicar os dados no banco de dados senão os dados ficam salvos somente em memória.
Para alterar dados de uma tabela utilizando sentenças SQL que contenham joins precisamos realizar algumas alterações: altere a propriedade TableName do provider para a tabela que deve ser atualizada, coloque a segunte instrução no evento BeforeUpdateRecord:


procedure TfrmCadBase.dspPrincipalBeforeUpdateRecord(Sender: TObject; SourceDS: TDataSet; DeltaDS: TCustomClientDataSet; UpdateKind: TUpdateKind; var Applied: Boolean);
begin
DeltaDS.FieldByName(pCampo).ProviderFlags := [pfInKey, pfInWhere, pfInUpdate];
end;

pCampo é o campo PrimaryKey da tabela que irá ser atualizada.
Os demais campos do join que fazem parte da tabela que não vai ser atualizada coloque o seguinte:
DeltaDS.FieldByName(<pCampo>).ProviderFlags := []; para indicar que os campos não fazem parte da atualização.
Espero ter ajudado a esclarecer um pouco o funcionamente desses componentes tão fantásticos que são os componentes DBXpress, se precisar de mais alguma dica de configuração ou propriedade mande um e-mail ou poste um comentário aqui que terei o maior prazer em ajudar. "O conhecimento é de todos".

Nenhum comentário :