Atenção: por essa edição ser muito antiga não há arquivo pdf para download desta revista. os artigos disponíveis somente em doc.
Acesso ao InterBase e Firebird
Otimize seu projeto client/server: performance, tráfego de dados, segredos e técnicas avançadas
Mesmo com a crescente utilização de sistemas N-Tier (multicamadas) e a popularização da Internet para sistemas Web, o desenvolvimento de aplicações client/server continua sendo um dos projetos mais comuns em Delphi para empresas de pequeno/médio porte. Acredito que muitos de vocês
desenvolvedores já possuem pelo menos uma aplicação desse tipo em produção,de forma que mostraremos neste artigo algumas dicas para utilização em aplicações client/server, acessando o banco de dados InterBase ou Firebird através de dbExpress (você pode usar o Delphi 6,7 ou 2005).
Falaremos sobre chaves-primárias, chaves-estrangeiras, índices, triggers, stored procedures, consultas parametrizadas (essenciais para esse tipo de aplicação), joins, subselects, otimização de tráfego de dados na rede e ajustes de configuração no IB/FB para aumentar
a performance. Também aproveitaremos para mostrar algumas técnicas e segredos de utilização dos componentes ActionList, ClientDataSet e DataSetProvider.
Para este exemplo, vamos criar uma aplicação client/server típica, propositalmente já com algumas falhas. Em cima dela, a seguir, aplicaremos várias otimizações, indicando técnicas avançadas e
cuidados necessários. Se você está apenas começando no mundo duas camadas, vindo de uma solução desktop (Paradox, DBF etc.), também encontrará dicas essenciais neste artigo.
Criando a aplicação de exemplo
Crie uma aplicação VCL no Delphi, adicione ao projeto um DataModule (dê o nome de "DM") e coloque um SQLConnection, um SQLDataSet (paleta dbExpress}, um DataSetProvider e um ClientDataSet (paleta Data Access). Configure o acesso dbExpress ao banco Employee.fdb (FB) ou Employee.gdb (IB),dando um duplo clique no SQLConnection e clicando em "+" para adicionar uma conexão. Aponte o caminho do banco no parâmetro Database (Figura 1).
Nota: os arquivos citados anteriormente são distribuídos juntamente com a instalação do IB/FB.
Aponte a propriedade SQLConnection do SQLDataSet para SQLConnection 1 e ajuste sua propriedade CommandText para "select * from Employee"Aponte o DotaSerdo DataSetProvider para
Figura 1. Criando a conexão dbExpress
SQLDataSetI eProviderNamedo ClientDataSet para DataSetProvider 1. Seu DataModule deve estar semelhante ao da Figura 2.
Dê um duplo clique no SQLDataSet e adicione os campos TFields. Ative o ClientDataSet, dê um duplo clique nele e adicione também os Tfields. Selecione todos os campos e arraste-os para o formulário.
Para facilitar, neste exemplo, construímos a interface de usuário apenas com os campos principais.
No formulário da aplicação, adicione um ImageList, um ActionList e alguns BitBtns. Inclua no ImageListal gumas imagens e faça a ligação ao ActionList (propriedade Images). Dê um duplo clique no ActionList, aperte CtrI+Ins e adicione as ações já pré-defínidas da categoria DataSete que serão usadas no exemplo (basicamente as de navegação, exclusão, gravação e Appiy). Ajuste o Captíon, Imageindex e Hint de cada ação, a seu gosto.
Para cada botão, aponte a propriedade Action para uma ação adicionada anteriormente. Note que, com isso, não precisaremos digitar nenhuma linha de código, como por exemplo, chamar os métodos
do ClientDataSet - Append, Delete, AppIyUpdates etc. Tudo é feito visualmente, graças às ações pré-definidas do ActionList.
Figura 2. DataModule da aplicação client/server
Seu formulário nesse momento deve estar semelhante ao mostrado na Figura 3,que é muito semelhante a uma aplicação client/server típica. Rode a aplicação, navegue pêlos registros, altere, inclua ou exclua os registros para ver se está tudo funcionando corretamente, antes de começarmos as otimizações.
Figura 3. Uma aplicação client/server típica
Observe que o ActionLis se encarrega de habilitar/desabilitar os botões conforme a necessidade (por exemplo, desabilitar o botão de gravação se o DataSet não estiver em modo de edição). Nem mesmo
é preciso apontar as Actions para o DataSource/DataSet, o ActionList se encarrega de detectar isso automaticamente.
Consultas parametrizadas
Se sua aplicação client/server possui uma boa velocidade na obtenção e atualização de dados, então podemos dizer que ela tem performance.Se você aumentar o número de usuários conectados
e o tempo de resposta nas estações clientes continuar o mesmo, sua aplicação tem escalabilidade. No entanto, não é simples obter a melhor performance e escalabilidade sem conhecer e usar boas
técnicas de desenvolvimento client/server e SQL
Começaremos pelo básico. Não poderíamos falar em otimização client/server sem falar de parametrização de consultas.O erro mais comum em desenvolvimento client/server: "select * from tabela". Com o dbExpress, isso faz com que todos os dados da tabela sejam trazidos de uma única vez para a cache local da aplicação, o que pode fazer a abertura de uma tabela levar minutos para responder. O desenvolvedor então usava Locate e Filtros para manipular os dados localmente, após obtidos do SGBD. Para que trazer milhares de registros para a cache da aplicação, se o seu usuário vai consul-
tar/atualizar apenas um ou dois? Pergunte ao usuário antes o que ele quer ver!
Em nosso exemplo, traremos somente um registro por vez da tabela Employee. Altere a instrução SQL do dstEmployee {CommandText} para:
select EMP_NO, FIRST_NAME, LAST_NAME.DEPT_NO
from EMPLOYEE where EMP_NO=:EMP_NO
Criamos um parâmetro (Emp_No), que deve ser configurado na propriedade Params do dstEmployee como tendo o Param Type = ptlnput (Figura 4). Dê um dique de direita no ClientDataSete escolha
FetchParams, para que possamos passar o valor para o parâmetro diretamente nesse componente.Observe que agora colocamos no select somente os campos que devem ser retornados para exibição em tela, dispensando o "*". Já temos as duas primeiras otimizações.
Não são mais necessários os botões de navegação, então você pode excluí-los. Ao desenvolver aplicações client/server, geralmente não usaremos métodos desse tipo (fírst,next etc.), além de métodos
...
Confira outros conteúdos:
Perguntas frequentes
Nossos casos de sucesso
Eu sabia pouquíssimas coisas de programação antes de começar a estudar com vocês, fui me especializando em várias áreas e ferramentas que tinham na plataforma, e com essa bagagem consegui um estágio logo no início do meu primeiro período na faculdade.
Estudo aqui na Dev desde o meio do ano passado!
Nesse período a Dev me ajudou a crescer muito aqui no trampo.
Fui o primeiro desenvolvedor contratado pela minha
empresa. Hoje eu lidero um time de desenvolvimento!
Minha meta é continuar estudando e praticando para ser um
Full-Stack Dev!
Economizei 3 meses para assinar a plataforma e sendo sincero valeu muito a pena, pois a plataforma é bem intuitiva e muuuuito didática a metodologia de ensino. Sinto que estou EVOLUINDO a cada dia. Muito obrigado!
Nossa! Plataforma maravilhosa. To amando o curso de desenvolvimento front-end, tinha coisas que eu ainda não tinha visto. A didática é do jeito que qualquer pessoa consegue aprender. Sério, to apaixonado, adorando demais.
Adquiri o curso de vocês e logo percebi que são os melhores do Brasil. É um passo a passo incrível. Só não aprende quem não quer. Foi o melhor investimento da minha vida!
Foi um dos melhores investimentos que já fiz na vida e tenho aprendido bastante com a plataforma. Vocês estão fazendo parte da minha jornada nesse mundo da programação, irei assinar meu contrato como programador graças a plataforma.
Wanderson Oliveira
Comprei a assinatura tem uma semana, aprendi mais do que 4 meses estudando outros cursos. Exercícios práticos que não tem como não aprender, estão de parabéns!
Obrigado DevMedia, nunca presenciei uma plataforma de ensino tão presente na vida acadêmica de seus alunos, parabéns!
Eduardo Dorneles
Aprendi React na plataforma da DevMedia há cerca de 1 ano e meio... Hoje estou há 1 ano empregado trabalhando 100% com React!
Adauto Junior
Já fiz alguns cursos na área e nenhum é tão bom quanto o de vocês. Estou aprendendo muito, muito obrigado por existirem. Estão de parabéns... Espero um dia conseguir um emprego na área.