You are on page 1of 15

Mini-tutorial: Aplicao Multi-camadas

Nesse artigo vamos abranger o desenvolvimento de aplicaes 3 camadas, um recurso que est sendo muito utilizado hoje, mas poucos conhecem como faz-lo. O nosso trabalho foi dividido em 3 etapas, sendo elas: Criao do banco de dados Criao do Servidor de aplicao Criado do Cliente Todas essas etapas sero bem detalhadas, motivo pelo qual foi dividido em 3 partes, para maiores detalhes sobre cada uma e em particular o servidor de aplicao. A criao de nossa base de dados ser bem simplria nada que vocs no tenham feito antes. Criao da Base de dados A criao da base de dados relativamente fcil. Grande parte dos desenvolvedores j domina essa etapa muito bem. Criaremos aqui uma Base de dados no Interbase para a nossa aplicao, e para isso vocs devem ter instalado o Interbase Server / Client no computador de vocs. A partir da base que ser dada no artigo vocs podero e devero expandir esse trabalho, pois uma soluo muito vivel e fcil. A estrutura do banco segue o modelo abaixo: Clientes Atributo Cod_Cliente Fantasia Razo_Social Rua Numero Bairro Cidade UF Telefone1 Ramal1 Telefone2 Ramal2 EMail CNPJ_CPF Tipo de dado Nmero Texto(50) Texto(50) Texto(60) Nmero Texto(25) Texto(30) Texto(2) Texto(14) Nmero Texto(14) Nmero Texto(50) Texto(18) "00.000.000/000000" ou "000.000.000Obrigatrio Descrio PK Obrigatrio Obrigatrio

Mini-tutorial: Aplicao Multi-camadas

00"; Obrigatrio IE_RG Observacao Abra o IBConsole. Texto(25) Texto(255) R.G: 00.000.000-a; Obrigatrio

D um duplo clique em Local Server.

Mini-tutorial: Aplicao Multi-camadas

Digite a senha masterkey. Essa a senha padro do Interbase. Clique no sinal de + que aparece ao lado de Local Server para exibir as opes. Clique com o boto direito em Databases e escolha Create Database. Digite, abaixo do titulo Filename(s), o seguinte: Casdastro.gdb e no Alias digite Casdastro.

Mini-tutorial: Aplicao Multi-camadas

Clique no boto OK. Agora clique no menu Tools e escolha o sub-menu Interactive SQL. Digite a instruo abaixo para criar a tabela.

Pressione as teclas CTRL + E para executar a instruo. Feche a janela Interactive SQL e veja que no sub-item Tables do nosso DataBases Clientes aparece a tabela que acabamos de criar.

Mini-tutorial: Aplicao Multi-camadas

A nossa base de dados com a nossa tabela j est criada. Nessa matria discorreremos sobre como desenvolver o servidor de aplicao. Observao: Nesse artigo foi usado o Delphi 2006. Servidor de aplicao (Aplicativo servidor) O servidor de aplicao nada mais que que um programa que fica entre o aplicativo cliente e o sistema de gerenciamento de banco de dados (SGDB). Ele fica em uma mquina e todos os clientes se conectam a ele, o servidor de aplicao quem se encarregar de acessar os dados do SGBD e passar em forma de pacote ao cliente que solicitou.

Observe que temos somente um aplicativo conectando ao SGBD, isso faz ento com que consumamos somente uma licena de banco de dados e no uma licena para cada cliente, como geralmente feito. Isso ser abordado mais frente.

Mini-tutorial: Aplicao Multi-camadas Como funciona Quando um aplicativo cliente iniciado, ele conectado ao servidor de aplicao (Remote DataModule), ativando o servidor de aplicao, caso no esteja ativado, e criando uma instncia do Remote DataModule. Ento, o aplicativo cliente faz uma solicitao de dados ao servidor de aplicao, que empacota esses dados e envia ao aplicativo cliente para que o usurio trabalhe com essa informao. O aplicativo cliente envia ento essas modificaes feitas pelo usurio em forma de pacote para que o servidor de aplicao possa fazer as atualizaes dos dados. O pacote enviado pelo aplicativo cliente chama-se Delta, que uma propriedade do ClientDataSet que contm as alteraes feitas pelo usurio, pode at ser usada para gerar logs de alteraes no registro. O servidor de aplicao recebe esse pacote e tenta atualizar os dados nos registros originais, caso ningum tenha feito alteraes. Se algum fez alguma alterao, o servidor de aplicao envia um erro que capturado no evento OnReconcileError do ClientDataSet. BDE e Multi-Camadas Um dos problemas de se trabalhar com BDE, que tem que ser instalado em todas as mquinas que o aplicativo cliente est. Quando trabalhamos com multi-camadas, isso no necessrio, pois, criamos um servidor de aplicao que vai se comunicar com o BDE e o BDE vai se comunicar com o banco de dados, a nossa aplicao cliente simplesmente vai se comunicar com o servidor de aplicao. Dessa forma, o BDE s ser instalado na mquina que estiver o servidor de aplicao. Veja a estrutura abaixo:

Criando o servidor de aplicao No nosso servidor de aplicao, teremos uma lista de todos os usurios que esto acessando o servidor, teremos tambm a interface com o SGBD. Inicie uma nova aplicao no delphi. Desenhe a tela parecida com a abaixo:

Mini-tutorial: Aplicao Multi-camadas

Para facilitar a insero e remoo dos usurios no ListBox, criaremos duas procedures para fazer isso.Declare a seguinte assinatura antes da sesso private: Type TForm1 = class(TForm) ... procedure Inserir(Usuario : String); procedure Remover(Usuario : String); private { Private Declarations } ... Pressione as teclas CTRL + SHIFT + C para gerar a implementao dessas procedures e digite o cdigo abaixo: procedure TForm1.Inserir(Usuario: String); begin lstUsuarios.Items.Add(Usuario) end; procedure TForm1.Remover(Usuario: String); var PosUsuario : Integer; begin

Mini-tutorial: Aplicao Multi-camadas PosUsuario := lstUsuarios.Items.IndexOf(Usuario); if (PosUsuario > -1) then lstUsuarios.Items.Delete(PosUsuario) end; Agora, vamos salvar nosso projeto. V em File Save All ou pressione CTRL + SHIFT + S, salve a Unit1 como untMain e o projeto como ServerApplication. Pronto. A tela do servidor j est pronta, agora vamos montar a estrutura de acesso a dados. V em File New Other, selecione Multitier e selecione Remote Data Module e clique em OK. Vai aparecer uma tela como a mostrada abaixo:

CoClass Name: o nome e a classe do nosso Remote Data Module, esse o nome do servidor que ser usado para nossa aplicao cliente se conectar. Instancing: Indica a forma de instanciar nosso servidor de aplicao. . Internal: Indica que o modulo de dados criado em um aplicativo servidor em processo, usado para criar um mdulo de dados remoto como parte de uma DLL. . Single Instance: Toda vez que um cliente se conectar em nosso servidor de aplicao, ser aberto um executvel para esse cliente, ou seja, uma instncia de cada executvel ser criada dedicada a esse cliente. O mdulo de dados remoto e o executvel nico para cada cliente. . Multiple Instance: Ser um nico executvel, e toda vez que um cliente se conectar em nossa aplicao, ser instanciado um mdulo de dados remoto para ele, mas com o mesmo executvel. Threading Model: Especifica como os clientes que chamaro o servidor de aplicao e como ser passada a requisio para a Interface do mdulo de dados remoto. . Single: O mdulo de dados servir uma requisio do cliente de cada vez. . Apartment: Significa que cada instncia do mdulo de dados remoto servir uma requisio de cada vez. . Free: O mdulo de dados remoto pode receber, simultaneamente, requisies de vrios clientes, onde sero criados threads para atender essas

Mini-tutorial: Aplicao Multi-camadas requisies. Voc dever se assegurar que a instncia dos dados e a memria global so protegidas contra conflitos de threads. Recomendvel para quem usa tecnologia ADO. . Both: Esse modelo equivalente a Free, com a diferena que todas as chamadas para a interface dos aplicativos clientes sero serializadas. Em CoClass name, digite Server e deixe as opes que j vem por default. Ser criada uma tela parecida com a do DataModule que estamos acostumados a usar, a diferena que o Remote DataModule permite conexo remota de outros aplicativos. Observe que o CoClass name que colocamos serve tambm como nome do mdulo de dados remoto. Salve essa unit como untRDM, aps voc salvar essa unit, pedir para voc salvar o Type Library, mantenha o nome que sugerido, que nada mais do que o nome do nosso projeto. Coloque tambm um DataModule. Para isso, v em File New Other, selecione Delphi files e selecione DataModule e clique em OK. Em seguida, coloque um componente SQLConnection, d ao DataModule o nome de DM e ao SQLConnection o nome de sqlConexao, vai ficar como mostrado abaixo:

Esse DataModule necessrio para que, quando ele criar uma nova instncia do Remote DataModule, ele no crie tambm uma nova instncia de conexo no servidor. Pois toda vez que um cliente se conecta em nosso servidor de aplicao, ser criada uma instncia do Remote DataModule na memria e, consecutivamente, uma instncia de todos os objetos que estiverem nele. Se o SQLConnection, que responsvel pela conectar com a base de dados, estiver no Remote DataModule, ser criada tambm uma nova instncia dele e criando uma nova conexo com o banco. Por isso, separamos a conexo do banco em um DataModule. D um duplo clique em sqlConexo. Crie uma nova conexo clicando no boto Add Connection . Em DriveName, escolha Interbase e em Connection Name coloque Servidor, ao clicar em OK vai ficar como mostrado abaixo:

Mini-tutorial: Aplicao Multi-camadas

Em Database, coloque o caminho onde foi salva a base de dados criada no artigo anterior. Clique no boto Test Connection para ver a situao da conexo. N o se esquea de iniciar o servio do interbase, se no apareceu Successfully Connected, verifique os passos descritos acima novamente. Clique em OK na caixa de dialogo do dbExpress Connections voltando para o DataModule. Certifique-se de que em Projects Options na opo Forms o DataModule (DM) esteja na lista de autocreate forms e em primeiro lugar na lista. Salve essa unit com o nome untDM. Agora que a conexo foi criada com sucesso, vamos colocar os componentes para acessar esses dados. Volte ao Remote DataModule e adicione um componente SQLDataSet (dbExpress) e d o nome de sdsClientes e outro DataSetProvider (Data Access) com o nome de dspClientes. Pressione as teclas ALT + F11, que a mesma coisa que File Use Unit, escolha a unit do DataModule, que contm a conexo com a base de dados. Selecione o componente sdsClientes e, na sua propriedades SQLConnection, selecione o componente sqlConexao que est no DataModule, selecione a propriedade CommandText e clique no boto ao lado, vai aparecer a seguinte tela:

Mini-tutorial: Aplicao Multi-camadas

Em Tables d um duplo clique em clientes e em Fields d um duplo clique no *. Observe que o comando SQL montado ao lado, agora clique em OK. Coloque a propriedade Active para True para saber se est tudo ok, caso d algum erro, verifique se no faltou nenhum dos passos descritos acima. V ao menu View e selecione Type Library, atravs do Type Library podemos criar procedures e functions para a interface que o Delphi cria para o Remote DataModule, atravs dessa interface que nossa aplicao cliente acessa nosso servidor de aplicao. Ao clicar em Type Library, vai aparecer uma tela como mostrada abaixo:

Selecione a opo IServer, ou seja, nossa interface, agora clique no boto

Mini-tutorial: Aplicao Multi-camadas

New Method . Atravs do New Method, podemos criar uma procedure ou uma function, d a esse mtodo o nome de Login, selecione o mtodo que apareceu e clique na guia parameters nas opes ao lado, vamos criar para esse mtodo 2 parmetros Usuario e Senha do tipo BSTR*. Quando a aplicao cliente se conectar ao servidor de aplicao, ela vai passar para o mtodo Login da nossa interface o Usuario e a Senha para conexo.

Clique no boto Add, mais abaixo, para adicionar o outro parmetro, o tipo BSTR * que ns digitamos a mesma coisa que uma string do tipo WideString. adotado esse nome genrico para que se tenha uma interface para que clientes de qualquer linguagem possam acessar tambm. Na coluna Modifier, indicamos se o parmetro criado de entrada, sada ou se ele retorna valores, esse ltimo usado para criarmos uma function e etc. Crie um mtodo para Logout do sistema somente com o parmetro Usuario. Deve ficar como mostrado abaixo:

Mini-tutorial: Aplicao Multi-camadas

Pronto! Ns criamos os mtodos com os respectivos parmetros, ento vamos implementar o mtodo Login e o Logout. Salve sua aplicao e v para Remote DataModule, l que fica a declarao dos mtodos para implementao. Procure na Unit a declarao do mtodo, observe que o Delphi cria a assinatura da procedure. Se tivssemos criado um parmetro e em Modifier tivssemos escolhido o tipo RetVal, retornar valores seria uma function. Observe que junto com a assinatura ele tambm gera a implementao, basta ento codificarmos no espao reservado.

Mini-tutorial: Aplicao Multi-camadas Quando o cliente for fazer o Login na nossa aplicao, ele vai passar junto com a solicitao de conexo o Usuario e Senha. Com esses valores em mos, voc poderia, por exemplo, fazer uma consulta no banco e verificar se o usurio e senha digitados tm permisso para acessar o sistema ou outra validao que queira fazer. Ns s vamos adicionar o usurio logado no sistema no ListBox que est no formulrio principal do nosso servidor, e limitar a quantidade de usurios que acessa nosso sistema, negando assim o acesso se estiver no limite. Quando o usurio sair do sistema, o mesmo emitir um Logout para removermos o usurio da lista. Digite o cdigo abaixo para a implementao da rotina de Login: if (Form1.lstUsuarios.Items.Count > 5) then Raise Exception.Create('Limite de usurio excedido'); Form1.Inserir(Usuario); Ou seja, estamos verificando se est no limite, seno estiver, ele adiciona o usurio no ListBox usando a procedure que ns criamos no formulrio principal, caso esteja no limite, ele emite uma exceo (raise) bloqueando assim o acesso ao servidor. Digite o cdigo abaixo para a implementao da rotina de Logout. Form1.Remover(Usuario); Ou seja, estamos removendo o usurio do ListBox usando a procedure que ns criamos no formulrio principal. Pronto! Agora nosso servidor j est pronto, basta compilarmos e rodarmos o programa para que seja gerada um identificao (GUID) no registro Windows, atravs dessa identificao que nosso cliente tem informaes de nosso servidor. Depois que voc rodar o sistema, clique no menu Iniciar e escolha a opo Executar, digite RegEdit em executar para abrir o registro do Windows. Ao abrir o registro do Windows, clique no menu Editar e escolha a opo Localizar, procure por "Server". Conforme for pressionando a tecla F3 para localizar as ocorrncias de Server, vo aparecendo vrias opes que tem Server no meio, mas preste ateno que a chave localizada ter um valor e os dados desse valor devem estar Server Object, isso indica que o servidor que ns criamos em Dephi. atravs dessa chave que temos informaes sobre o servidor. Concluso Vimos em poucos e, relativamente, simples passos como podemos criar um servidor de aplicao e trabalhar com a tecnologia n-tier (multi-camadas). Dessa forma, conseguimos melhorar muito a qualidade, velocidade e controle de nossas aplicaes, visto que isso tambm depende de como a rede foi implementada e de como o programador faz consultas ao banco de dados, note que no nosso exemplo usamos: select * from clientes

Mini-tutorial: Aplicao Multi-camadas O que no nem um pouco recomendvel, visto que gera trfego na rede e pode tornar a aplicao e a rede lenta, o correto sempre selecionarmos os dados com algum filtro para trazer o menor nmero de registros possvel, pois nunca necessrio apresentar ou selecionar todos os registros do banco. Sempre especifique o nome dos campos que quer que aparea, mesmo que queira todos os campos da tabela. Como se trata de um exemplo, no precisamos entrar em maiores detalhes de performance. Resumidamente, precisamos de um Remote DataModule e nele colocamos o SQLDataSet apontando para a conexo (SQLConnection) com a base de dados, que aconselhvel estar em um DataModule, e o DataSetProvider apontando para o SQLDataSet. Na prxima parte, desenvolveremos a aplicao cliente que se comunicar com esse servidor. Espero que esse artigo tenha ajudado a muitos. At a prxima. Nota: Serializar - Podemos dizer que a capacidade de transformar o que est em memria para um formato que possa ser lido, por exemplo, formato de texto e a partir desse formato voltar para memria quando necessrio. Clique aqui para fazer o download dos arquivos. Por Robert Gaffo programador Delphi e instrutor de programao em Delphi e outras linguagens como Visual Basic, C/C++ e Java. Leciona aulas de conceitos de Banco de Dados, SQL Server, Oracle, Interbase/Firebird e MySql e d treinamentos In Company. Trabalha com Delphi em aplicaes desktop e multi-camadas.