Curso de dbExpress e DataSnap

Parte XXII – Clientes DataSnap

Neste artigo, veremos como construir uma aplicação cliente que fará acesso ao servidor de aplicação criado na parte anterior deste curso. Também conheceremos mais alguns detalhes envolvidos na construção de aplicações DataSnap e multicamadas.

Um Thin Client

Clique em File|New|Application. Salve a unit com o nome de “uFrmMain.pas” e o projeto com o nome de “DataSnapClient.dpr”. Dê ao formulário o nome de FrmMain e caption de “DataSnap Client”. Crie um DataModule clicando em File|New|DataModule. Salve sua unit como “uDM.pas” e dê a ele o nome de “DM”.

Coloque no DM um componente TDCOMConnection da guia DataSnap. Na propriedade ServerName escolha nosso servidor de aplicação registrado, chamado neste caso de AppServerDCOM.RDM.

 

image001.png 

Figura. Configurando ServerName do DCOMConnection

Configure a propriedade Connected para True. A janela principal do servidor de aplicação deve aparecer neste momento. Coloque um componente ClientDataSet. Configure sua propriedade RemoteServer para o DCOMConnection. Na propriedade ProviderName escolha o DataSetProvider  (que está no RDM, que por sua vez aponta para o SQLDataSet de Customers). Configure a propriedade Active para True. Os dados da tabela CUSTOMERS serão trazidos do servidor de aplicação. Dê um duplo clique no ClientDataSet e adicione todos os campos TFields. Seu DM deve estar como mostrado a seguir.

 

image003.png 

Figura. DataModule da aplicação cliente

Providing

Quando o ClientDataSet recebe os dados vindos do servidor de aplicação, os mesmos são decodificados, pois vieram empacotados em formato OLEVariant. No servidor de aplicação, o DataSetProvider  se encarrega de distribuir os dados empacotados aos clientes, numa operação chamada providing. Você pode incluir dados personalizados neste pacote se quiser, como hora do sistema, usando o evento OnGetDataSetProperties do DataSetProvider.

Formulário principal

Volte ao formulário principal. Aperte Alt+F11 e na lista escolha uDM. Coloque um DataSource da guia DataAccess e na propriedade DataSet aponte para o ClientDataSet que está no DM. Usando DBEdits e Labels (além de um DBNavigator) construa o formulário mostrado a seguir:

 

image005.png
image007.png 

Figura. Thin-Client DataSnap

Coloque um Button, dê o caption de “Apply” e no evento OnClick digite o seguinte :

 

DM.ClientDataSet.ApplyUppdates(-1);

Resolving e Reconcile

ApplyUpdates aplica a cache do ClientDataSet (chamada DELTA) no servidor de aplicação. O servidor de aplicação irá tentar aplicar a cache recebida no servidor de banco de dados por meio do componente DataSetProvider (resolving). Se algum erro for constatado, o servidor de aplicação devolve os dados ao cliente, para que sejam manipulados no evento OnReconcileError do ClientDataSet.

Chamando o método de negócio

Coloque um botão no formulário (com o caption “CPF”) e no seu evento OnClick digite:

 

procedure TFrmMain.Button2Click(Sender: TObject);

var

  CPF : string;

begin

  CPF:=InputBox('Chamando método remoto','Qual o nº do seu CPF?','');

  DM.DCOMConnection.AppServer.VerificaCPF(CPF);

  ShowMessage('CPF válido');

end;

 

Pressione F9 para executar a aplicação cliente. Insira alguns registros. Teste a validação do CPF. Não esqueça de pressionar Apply depois de gravar um registro, caso contrário, a cache (delta) não irá para o servidor de aplicação e seus dados não serão realmente gravados no servidor de banco de dados. A chamada ao método ApplyUpdates do ClientDataSet dispara o evento OnUpdateData e BeforeUpdateRecord do DataSetProvider no servidor de aplicação, onde você pode trocar alguns valores, decodificar dados, inserir novos valores antes dos dados serem realmente aplicados no banco.

SafeCall

Observe que demos um raise no servidor de aplicação quando um CPF for inválido. Essa exceção entretanto não é levantada no servidor de aplicação, o que poderia ser fatal. Observe a declaração do método VerificaCPF:

 

procedure VerificaCPF(const CPF: WideString); safecall;

 

SafeCall é a diretiva que protege uma método contra exceções. Qualquer exceção que for levantada dentro da pilha da chamada do método será propagada para a aplicação cliente.

A interface IAppServer

Neste cliente usamos a vinculação dinâmica com o servidor de aplicação, através do uso da propriedade AppServer. Como AppServer é do tipo Variant, o Delphi não pode verificar na compilação se o método VerificaCPF realmente existe no servidor de aplicação. Isto é feito em tempo de execução (vínculo dinâmico). Experimente digitar “VerCPF” e nada acontece até o método ser finalmente chamado. Se um método não é encontrado no servidor uma exceção do tipo EOleError é gerada:

 

image009.png 

Figura. Vínculo dinâmico – chamadas são resolvidas em tempo de execução

Poderíamos ter usado vínculo estático (importando a Type Library) da mesma forma como fizemos no primeiro exemplo, para que o compilador, já em design-time, identifica-se os métodos suportados pela nossa interface IRDM (observe também que nossa interface IRDM é derivada da interface IAppServer).

AppServer é propriedade de TDispatchAppServer, que  é uma das classes base de TDCOMConnection. TDispatchAppServer implementa os métodos definidos por IAppServer.

 

Download

Você pode fazer download de todos os exemplos deste curso a partir do endereço http://cc.borland.com/Author.aspx?ID=222668. É preciso fazer o cadastro na BDN, que é gratuito e pode ser feito a partir do endereço http://bdn.borland.com

 

dbExpress, DataSnap e ClientDataSet: Técnicas Avançadas

Para mais informações sobre acesso a dados no Delphi e técnicas avançadas, sugiro a leitura do meu livro, “Delphi: Programação para Banco de Dados e Web”, como apoio para o aprendizado das tecnologias. Na obra mostro várias técnicas introdutórios e avançadas de desenvolvimento com ClientDataSet, dbExpress e DataSnap (multicamadas, incluindo SOAP e COM+). Para mais informações, consulte o link http://www.clubedelphi.net/guinther

 

Leia todos artigos da série