Escolar Documentos
Profissional Documentos
Cultura Documentos
Todos já sabemos como criar nossas aplicações 3 camadas com Delphi, mas quando você fez isto ficou se
perguntando o que fazer com o aquele formulário que é necessário criar para se adicionar um TRemoteDataModule
ao projeto?
Hoje venho mostrar algumas soluções para utilizarmos este formulário de forma inteligente e produtiva, com
simples técnicas de RemoteProcedures podemos torná-lo uma ferramenta muito útil e até gerenciar as conexões ao
nosso servidor DataSnap além de alertar nossos usuários sobre possíveis quedas do sistema.
Devido a outras edições já ensinarem como criar nossos servidores DataSnap não vou perder tempo com os
detalhes. Crie uma nova aplicação e salve seu projeto e sua unit com os respectivos nomes, DBServer.dpr e
untGUIServer.pas. Adicione ao seu projeto um TRemoteDataModule da guia Multitier e nomeie a CoClass como
RDMServer, salve o arquivo como untRDMServer.pas. Pronto nosso servidor DataSnap já esta com a espinha
dorsal pronta, apartir deste ponto você começa a definir suas Querys e Providers, mas vamos dar mais atenção para
nosso form.
Configure seu formulário conforme os valores das propriedades da tabela abaixo, lembre-se de desenhar os
componentes também.
TClientDataSet Fields.
uses … ShellAPI;
implementation
uses untRDMUsuario;
{$R *.dfm}
end.
Nesta listagem de código basicamente programamos as funções de inclusão / exclusão de conexões juntamente com
suas sincronizações na tela, pois devemos refletir estas mudanças no número de Clients conectados ao servidor e no
status do servidor. Também desenvolvemos um meio fácil e rápido de enviar uma mensagem para nosso Client
através do comando NetSend, assim podemos avisar que o sistema vai cair dentro de 5 minutos, ai apertamos o
botão pause para nenhum novo Client se conectar. E por fim no evento OnDestroy do form salvamos nossa lista de
Clients em xml com o ClientDataSet para em uma eventual queda inesperada entrarmos em contato com estes
Clients.
Vamos codificar nosso servidor que esta representado pela unit untRDMServer, para tanto devemos utilizar o Type
Library editor que o Delphi nos disponibiliza no menu Edit. Siga as instruções da Listagem 2. Para ter acesso aos
tipos definidos nos parâmetros e nos retornos das funções vá em Tools->Environment Options->Type Library-
>Language e mude a opção de IDL para Pascal
Listagem 2. TRemoteDataModule
Remote Procedures
const
ErrFatal = 'Anote os detalhes do erro e entre em contato com o setor de desenvolvimento do sistema.' +
#10#13;
ErrTwiceConnect = 'Você já está conectado com o nosso servidor de aplicação.' + #13#10 +
'Isto significa que este programa já está aberto na sua máquina.' + #13#10;0
ErrServerPaused = 'O servidor no qual esta hospedada esta aplicação está parado.' + #13#10 +
'Provavelmente esta ocorrendo algum tipo de atualização do sistema.' + #13#10;l
implementation
uses untGUIServer;
{$R *.DFM}
begin
with frmGuiServer do begin
//Verifica o estado
if cdsConnection.State = dsInactive then begin
//Cria o DataSet
cdsConnection.CreateDataSet;
//Abre a tabela
cdsConnection.Open;
//Seta a propriedade
cdsConnection.LogChanges := False;
end;
//Verifica se o servidor esta parado
if Paused = False then begin
//Verifica se ja esta conectado
if CheckDuplicate(pLogin,pSystem) = False then begin
//Incrementa a variavel
ClientCount := ClientCount + 1;
//Gera um id para a conexão
FIdApp := BuildIdApp;
//Inclui as info na lista
AddDetailLine(pLogin,pSystem,pMachine,pAddress,FIdApp);
//Seta o id da aplicação de retorno
pIdApp := FIdApp;
//Aceito
Result := True;
end else begin
//Seta a mensagem de erro
FErrorMsgUsr := ErrTwiceConnect;
//Aceito
Result := False;
end;
end else begin
//Seta a mensagem de erro
FErrorMsgUsr := ErrServerPaused;
//Rejeitado
Result := False;
end;
end;
end;
//Gera o id da Aplicação
//Retornos: Id Gerado
function TRDMServer.BuildIdApp(): WideString;
begin
//Escreva aqui seu código de identificação
Randomize;
Result := IntToStr(RandomRange(111111,999999));
end;
initialization
TComponentFactory.Create(ComServer, TRDMServer, Class_RDMServer, ciMultiInstance, tmApartment);
end.
Nesta listagem basicamente codificamos nossos procedimentos remotos e um gerador de Ids, Toda vez que um
Client se conectar com nosso servidor ele deverá passar toda sua identificação para ser registrado em nosso
formulário console, deste modo conseguimos até previnir 2 conexões do mesmo computador ou do mesmo login na
mesma aplicação. Para gerar os Ids eu utilizo uma sequence do PostgreSQL, mas você poderá utilizar qualquer
algoritmo de sua conveniência com ou sem Banco de Dados e até validar se um determinado Client deve ou não se
conectar.
Vamos agora criar um Client de exemplo para fazer a conexão com este servidor, devemos nos preocupar aqui em
chamar os procedimentos remotos ConnectRequest e DisconnectRequest nos pontos certos sempre avaliando o
retorno dessas funções remotas. Para tanto crie uma nova aplicação e salve o formulário como untClient.pas e o
projeto como Client.dpr. Configure e desenhe os componentes conforme a tabela abaixo.
Property
Component Property Value
Name
TForm Name frmClient
Height 106
Width 294
Border BsSingle
TLabel Name lblId
Caption DBServerClient
TButton Name cmdConnect
Caption Connect
TButton Name cmdDisconnect
Caption Disconnect
TSocketConnection Address 127.0.0.1
ServerName DBServer.RDMServer
implementation
{$R *.dfm}
//Pega o numero do IP na Rede
//Retornos: Ip Address
function TfrmClient.GetIpAddress(): String;
var
lHostEnt: PHostEnt;
lHostName: array[0..128] of char;
lIPAddress: Pchar;
begin
//Pega o nome do computador
GetHostName(@lHostName, 128);
//Pega as informações do sistema
lHostEnt := GetHostByName(@lHostName);
//Pega o número do IP
lIpAddress := iNet_ntoa(PInAddr(lHostEnt^.h_addr_list^)^);
//Retorna o número do IP
Result := String(lIpAddress);
end;
end.
Conclusões
Percebemos que em um ambiente seguro, ou seja, dentro de nossa LAN podemos adicionar recursos valiosos ao
nosso servidor DataSnap, aproveitando toda sua infraestrutura de procedimentos remotos. Também adicionamos
recursos para facilitar a manutenção do servidor podendo parar o serviço sem causar grandes transtornos aos
Clients, outro ponto importante na hora da manutenção é avisarmos aos Clients que necessitamos atualizar o
sistema e fazemos isso através do comando NetSend do windows.
Com este exemplo também podemos saber quais sistemas estão se conectando ao nosso servidor DataSnap, uma
vez que você pode programar vários Clients utilizando o mesmo servidor. Agora é só definir sua conexão e suas
tabelas dentro do seu TRemoteDataModule e acessar seu banco de dados preferido.
Este artigo pode despertar varias idéias para você implementar mais controle e robustez ao seu servidor DataSnap.
Contribua com o nosso site enviando artigos, dicas e aplicativos para uploader@clubedelphi.net