Desenvolvimento - Delphi

Delphi: Programação Cliente/Servidor - parte 2

A partir de agora iremos utilizar os recursos disponibilizados nas versões 6.0 e posteriores do Delphi, mas precisamente na versão 7.0, a que é a mais atual, já que na versão 8.0 foi implementada a tecnologia .NET...

por Flávio Lamberti



Na primeira parte deste artigo vimos um modelo antigo de desenvolvimento com tecnologia Cliente/Servidor, o que equivaleria ao desenvolvimento na versão 5.0 do Delphi ou anterior.

A partir de agora iremos utilizar os recursos disponibilizados nas versões 6.0 e posteriores do Delphi, mas precisamente na versão 7.0, a que é a mais atual, já que na versão 8.0 foi implementada a tecnologia .NET, a qual não se encontra 100% estável.

Vocês irão reparar que não existem diferenças no que diz respeito aos conceitos Cliente/Servidor e na prática também não será difícil de se desenvolver, já que a arquitetura de desenvolvimento Cliente/Servidor se mantém a mesma, com alguns objetos diferentes.

No modelo acima podemos rever o esquema de conexão ao banco de dados, utilizado no artigo anterior, o que envolve Um SGBD, uma Middleware, um objeto TDatabase para o controle das transações, um objeto TQuery para a persistência de dados, um TUpdateSQL para a complementação de código SQL para a manipulação de dados, e um TDataSource para a liberação de informações em modo visual nos TDataControls (objetos de interação com o usuário) e/ou para relacionamentos entre TDataSets.

A partir de agora nosso esquema de conexão com o banco de dados irá mudar um pouco, mas não para “melhor“. Calma não precisa se desesperar, a metodologia será a mesma, as únicas coisas que irão mudar a princípio serão os objetos de conexão.

No modo antigo de conexão nós dependíamos de uma Middleware, o que nos tomava tempo na implementação e na manutenção dos nossos sistemas, pelo simples fato de que na implementação de nossos sistemas na rede, era obrigatória a instalação da camada intermediária de acesso (Middleware) em todas as estações da rede, o que nos tomava muito tempo e, caso acontecesse algum problema nesta (seja por atualizações de drivers ou problemas físicos - usuário) devíamos reinstalar a Middleware ou simplesmente copiar o driver de conexão da mesma.

Agora esta Middleware será “extinta” juntamente ao TDatabase, pois entrará em seus lugares um objeto do tipo TSqlConnection (palheta de objetos dbexpress), o qual, além de conter os drivers de acesso a banco de dados, também irá fazer o controle das transações.

E em lugar de utilizarmos um TQuery sendo complementado com um TUpdateSQL iremos utilizar três objetos, isso mesmo, três objetos :

TSQLDataSet – responsável pelo acesso a tabela;

TDataSetProvider – responsável por prover os dados para a persistência e

TClientDataSet – responsável pela persistência dos dados.

Resumindo, o número de objetos aumenta, porém os benefícios são maiores que o trabalho que isto irá acarretar no desenvolvimento, pelo simples fato de que, no caso de uma migração de seu sistema para um modelo n-tier (multi-camada) de acesso a banco de dados, o seu sistema não será alterado em praticamente nada, pois estes serão os mesmos objetos utilizados para este tipo de desenvolvimento. Estas especificações serão abordadas nos artigos de desenvolvimento N-tier e Web.

E o nosso bom e velho objeto TDataSouce permanecerá o mesmo de sempre.

Passando para a Prática

É muito simples desenvolver sistemas desta maneira, a primeira coisa que deve ser sabida para tanto é que os objetos citados deverão estar sempre no mesmo ambiente, isto é, no mesmo formulário, sendo utilizado para isto, geralmente um TDataModule, que não passa de um centralizador de objetos de conexão ao banco de dados.

Configurando o TSQLconnection (palheta de objetos DBExpress)

Dê um duplo-click no TSQLConnection, e aparecerá a tela abaixo :

Nesta tela devemos criar uma conexão ao banco de dados desejado, assim como se era feito na Middleware de acesso a banco de dados. Para tanto basta clicar no botão com o sinal de “+”.

Na tela seguinte, em Driver Name deve-se escolher o driver de acesso correspondente ao banco de dados o qual se deseja acessar e em Connection Name informaremos o nome pelo qual esta conexão será chamada. Ao passar por esta etapa, a tela anterior será re-estabelecida para que se proceda as configurações de acesso ao banco de dados que se deseja. Tomei como exemplo um driver de acesso ao Interbase, mas isso funcionaria com quaisquer driver de acesso, porém as configurações de acesso seriam diferentes, mas a facilidade de configuração seriam as mesmas.

Nesta tela basta configurar a propriedade Database, no lado esquerdo da tela, onde se encontram as configurações de acesso, para que o seu driver passe a acessar o banco desejado.

OBS.: No caso do driver do Interbase, o nome do arquivo .GDB se precede do caminho completo (IP:Drive:\caminho\arquivo.gdb).

Para testarmos esta conexão basta clicar no botão Test Connection, que se encontra na barra de botões desta tela (segundo da direita para a esquerda). Caso ocorra tudo bem partimos para o próximo passo.

Configurando os Demais Objetos

A configuração dos demais objetos é muito simples. Começando pelo TSQLDataSet (palheta de objetos DbExpress):

Propriedades

SQLConnection : indicar o TSQLConnection que acabamos de configurar;

CommandText : indicar a instrução SQL que irá acessar a(s) tabela(s) do banco de dados.

TDataSetPrivider (palheta de objetos DataAccess):

Propriedade

DataSet : indicar a qual TSQLDataSet este objeto irá se conectar para prover os dados para a persistência.

TClientDataSet (palheta de objetos DataAccess):

Propriedade

ProviderName : indicar a qual TDataSetProvider o mesmo irá se conectar para a recepção dos dados para persistência.

TDataSource (palheta de objetos DataAccess):

Propriedade

DataSet : indicar a qual TClientDataSet este estará linkado para a liberação visual dos dados para interação com o usuário.

OBS.: É importante tomar cuidado na hora de conectar o TDataSource ao TClientDataSet, pois na lista que aparece na propriedade de conexão aparecerão também os objetos do tipo TSQLDataSet.Caso a conexão seja feita ao objeto errado o resultado esperado não será alcançado. Caso isto aconteça revise todas as conexões realizadas.

Pronto, basta conectar seus TDataControls ao seu TDataSource que seu sistema estará funcionando.

Em relação ao código que será gerado para a manipulação de dados, não teremos muitas diferenças. Para ativar a conexão do sistema com o banco de dados, iremos abrir o nosso objeto TSQLConnection, assim como fazíamos com o objeto TDataBase. Para manipularmos os dados iremos aplicar todos os métodos que já aplicávamos anteriormente : Insert, Delete, Update, Post, ApplyUpdates, etc..., sendo que, não a partir de um objeto TQuery e sim a partir do objeto TCllientDataSet, isto mesmo, é o objeto TClientDataSet o responsável pela persistência de dados, então será a partir dele que iremos manipular os dados, aplicando o método de acordo com a operação desejada. No que diz respeito aos objetos TSQLDataSet e TDataSetProvider, não é necessário que se invoque estes, via código, em nenhum momento, pois toda operação realizada no TClientDataSet é automaticamente repassada para os objetos de conexão anteriores a ele (TDataSetProvider e TSQLConnetion), de acordo com a funcionalidade do método invocado.

É importante enfatizar que a utilização dos objetos mencionados neste artigo é expressamente recomendada não só pela preparação para uma possível migração de tecnologia Cliente/Servidor para N-Tier e sim, também, pelo fato de que outros objetos encontrados nas palhetas de acesso a dados podem não funcionar 100%.

Comparando o modelo antigo com o novo

Quaisquer dúvidas sobre esta matéria estarei disponível para esclarecimentos através do email.

Flávio Lamberti

Flávio Lamberti