Intra Web

April 13, 2018 | Author: 2007229048 | Category: World Wide Web, Technology, Server (Computing), Library (Computing), Internet
Share Embed Donate


Short Description

Download Intra Web...

Description

março 2011

março 2011

índice Banco de Dados

Delphi

Editorial

04

Para quem trabalha com desenvolvimento de sistemas comerciais, o banco de dados utilizado no sistema é parte fundamentall...

05

Intraweb no Delphi XE - Primeiros Passos

Autor: Antonio Spitaleri

Banco de Dados

Delphi Crie um preeview customizado e imprima registros selecionados em um DBGrid

Apresentando o novo Interbase XE parte 2

Autor:Luciano Pimenta

Autor: Felipe Santos

16

25

10

Instalando e configurando o SQL Server 2008 Express Edition with Tools Autor:Thiago Cavalheiro Montebugnoli

Dicas - Dicas Delphi

28

Legenda Iniciante Intermediário Avançado março 2011

03

Bem-vindo

P

ara quem trabalha com desenvolvimento de sistemas comerciais, o banco de dados utilizado no sistema é parte fundamental do processo. A escolha do banco deve ser feita levando-se em conta quais recursos o banco oferece em confronto com as necessidades do sistema.

Para ajuda-los na escolha de um banco de dados e também para mantêlos atualizados sobre as novidades dessa área, temos esse mês dois artigos sobre bancos de dados: No primeiro, nosso colaborador, Thiago Montebugnoli, nos traz como instalar, configurar e começar a usar o Sql Server Express 2008 no artigo: “Instalando e configurando o Sql Server Express Edition 2008 with Tools”. No segundo artigo, Felipe Santos prossegue nos mostrando as novidades do Interbase XE, no artigo: “Apresentando o novo Interbase XE – parte 2”. Para quem gosta de se aventurar pelo universo da programação Web, trago esse mês, no artigo: “IntraWeb XE – Primeiros Passos”, as principais novidades do framework Intraweb no Delphi XE e também como podemos iniciar no desenvolvimento com Intraweb criando uma aplicação simples com o mesmo. Para finalizar, Luciano Pimenta nos mostra como podemos personalizar e agregar recursos aos previews dos principais geradores de relatório utilizados com o Delphi no artigo: “Crie um preview personalizado e imprima registros selecionados em um DBGrid”.

Av. Profº Celso Ferreira da Silva, 190 Jd. Europa - Avaré - SP - CEP 18.707-150 Informações: (14) 3732-1529 Suporte: (14) 3733-1588

Internet

http://www.theclub.com.br Cadastro: [email protected] Suporte: [email protected] Informações: [email protected] Skype Cadastro: theclub_cadastro Skype Suporte: theclub_linha1 theclub_linha2 theclub_linha3

www.twitter.com/theclubbr Copyright The Club Megazine 2009 Diretor Técnico Marcos César Silva Diagramação e Arte Vitor M. Rodrigues Revisão Tassiane Fileto Colunistas Antonio Spitaleri Neto Bruno Alcarás Felipe Santos Luciano Pimenta Thiago Cavalheiro Montebugnoli Impressão e acabamento:

É isso. Boa leitura a todos e até o próximo mês!

GRIL - Gráfica e Editora Taquarituba-SP - Tel. (14) 3762-1345

Reprodução A utilização, reprodução, apropriação, armazenamento em banco de dados, sob qualquer forma ou meio, de textos, fotos e outras criações intelectuais em cada publicação da revista “The Club Megazine” são terminantemente proibidos sem autorização escrita dos titulares dos direitos autorais.

Antonio Spitaleri Neto - Editor Chefe [email protected] 04

março 2011

Delphi é marca registrada da Borland International, as demais marcas citadas são registradas pelos seus respectivos proprietários.

Delphi

Int raw e b Delphi XE

no

Primeiros Passos Quem trabalha com desenvolvimento Delphi está quase sempre envolvido em programas Desktop, que rodam em máquina local. O acesso a banco de dados, embora possa ser feito de forma remota, não torna a aplicação algo “online”, ou seja, acessada comumente pelos usuários de uma rede em uma interface única. O desenvolvedor Delphi, quando vê seu projeto aumentar em termos de recursos, começa a vislumbrar a possibilidade de colocá-lo para rodar “online”, seja em rede local ou até mesmo internet. Nessas situações, vem a dúvida: Como fazer isso? Como converter minha aplicação para que ela se torne “online”?

vamente para trabalhar em ambiente Web, como Java e PHP. Estas linguagens possuem recursos específicos para o ambiente da internet. - No caso de um sistema já pronto, utilizar as linguagens acima descritas seria inviável, já que a conversão seria mais complexa que um projeto desenvolvido do “zero”. - Desenvolver do “zero” com uma linguagem para ambiente Web então é a solução? É uma hipótese, porém para quem trabalha com Delphi já há alguns anos, o aprendizado de uma nova linguagem implica em um gasto de tempo que deverá ser investido nesse aprendizado. No ambiente concorrente do mercado de software, nem sempre o investimento de tempo em uma nova linguagem pode ser viável.

- Como proceder então? Para a solução dessa questão, precisamos atentar inicialmente para alguns tópicos: - Existem linguagens que foram criadas nati-

Embora pouco divulgado e até mesmo utilizado pela comunidade Delphi, o Delphi possui um recurso para desenvolvimento de aplicações

conhecido como Intraweb. A tecnologia Intraweb existe há bastante tempo integrado ao Delphi e permite o desenvolvimento de aplicações para rodar em ambiente Web. E o melhor: O desenvolvimento de uma aplicação Intraweb é idêntico ao de uma aplicação Desktop Delphi. Nenhum aprendizado extra de linguagem é necessário. Com Intraweb desenvolvemos nossa aplicação utilizando todos os recursos que normalmente utilizamos em aplicações Desktop, com a ressalva que os componentes visuais temos de utilizar os componentes específicos para Intraweb presentes no Delphi. No Delphi XE, a tecnologia IntraWeb segue presente nos permitindo criar aplicações para Web de forma fácil. Veremos algumas questões relacionadas ao IntraWeb na sequencia:

-Conexão a banco de dados:

março 2011

05

O Intraweb suporta todas as formas de conexão existentes no Delphi. Ou seja, não precisamos alterar nossa forma de trabalho em relação a conexão com bancos de dados para trabalhar em Intraweb.

-Acesso de múltiplos usuários à aplicação: O Intraweb em Delphi XE possui em seu framework todas as rotinas para realizar o controle de vários usuários em ambiente Web. O desenvolvedor não precisa realizar codificação extra para controlar múltiplos acessos, pois todo o controle está “embutido” no Intraweb.

-Estilos e JavaScript: Com Intraweb podemos utilizar CSS para aplicar estilos de formatação a nossas páginas, conseguindo um visual mais profissional e ganhando em agilidade, já que com CSS necessitamos definir o arquivo com as configurações de estilo apenas uma vez. Quaisquer alterações que precisarem ser feitas em relação ao visual das páginas quando fazemos uso de CSS são realizadas no arquivo de configuração CSS e automaticamente se aplicarão a todas as páginas que fizerem uso de um mesmo arquivo CSS. Além do CSS para definir estilos, podemos também incorporar funções JavaScript às nossas aplicações Intraweb. Com JavaScript, trazemos parte da codificação da página para o lado cliente, ganhando em agilidade nas requisições e em alguns eventos disparados pelo usuário.

necessitarmos rodar nossa aplicação em ambiente Web e não tivermos acesso aos recursos de outras linguagens. Nesse artigo estaremos iniciando no desenvolvimento IntraWeb, criando uma aplicação simples que irá exibir dados provenientes de um banco de dados Firebird no browser.

Criando a aplicação: Inicie o Delphi XE. Selecione o menu File – New – Other. Será exibida a seguinte tela: Veja a figura 1. Na TreeView do lado esquerdo selecione VCL for the Web, no lado direito, selecione VCL for the Web Application Wizard. Será exibida a tela a seguir:

março 2011

ISAPI Extension: Gera uma DLL no padrão ISAPI. Dessa forma temos uma aplicação que rodará em espaço compartilhado de memória, ocupando assim menos memória. Porém algumas versões de servidores não possuem boa compatibilidade com esse tipo de aplicação. Para nosso exemplo escolheremos StandAlone Application. - Options: Aqui definimos se queremos que nossa aplicação Intraweb gerencie conexões ao banco de dados utilizando pooling. Deixaremos marcada essa opção em nosso exemplo.

Veja a figura 2. Nessa tela temos as opções principais para a criação de nossa aplicação Intraweb: - Application Type:

O Delphi possui um servidor web interno para a execução via IDE dos projetos Intraweb. Ou seja, em ambiente de desenvolvimento, não é necessário colocar nossa aplicação em um servidor Web como Apache ou IIS para testar se tudo está correto. Basta executar a aplicação da mesma forma como fazemos com as aplicações Desktop e o servidor Web de teste integrado será iniciado para que possamos ver o resultado de nossa aplicação no browser.

06

StandAlone Application: Essa forma de aplicação gera um executável (.exe) Delphi. Possui maior “peso” em memória, pois roda em espaço próprio de memória, porém a compatibilidade e posterior configuração em servidores Web como o IIS e Apache é mais “tranquila”.

Mãos à obra!

- Ambiente de testes integrado:

Intraweb é uma boa alternativa para quando

Aqui escolhemos o tipo de aplicação que desejamos, temos as opções:

Figura 1

Em Project Name e Project Directory definimos nome e caminho onde a aplicação será salva respectivamente. Clique em OK. Serão criados os formulários e a

estrutura básica de nossa aplicação Intraweb. Três units com seus respectivos formulários foram criadas: - Unit1: Essa unit é igual à unit e seu formulário correspondente em uma aplicação Desktop. Será a página principal de nosso projeto. É esse formulário que irá aparecer no Browser do usuário quando ele executar o projeto. Claro que iremos alterar o nome desse formulário, para que fique clara qual a função dele no projeto. No exemplo, irei alterar seu nome para MainForm. -DataModuleUnit: Assim como nas aplicações Desktop, o Datamodule é o formulário não visual que contém os componentes de conexão com o banco de dados. Como será o único em nosso exemplo, não iremos alterar seu nome. -UserSessionUnit: O UserSession é o formulário e unit onde colocaremos variáveis e funções que serão exclusivas por instância para cada usuário. Um exemplo prático dessa funcionalidade será a criação do DataModule, que será feita no UserSession e irá garantir que cada usuário tenha sua conexão com o banco independente dos demais. Com o UserSession, a administração de usuários no IntraWeb é bastante tranquila e não exige codificação complexa.

Figura 2

No MainForm faremos o layout da aplicação como aparecerá para o usuário. Esse layout deverá ficar como na figura a seguir: Veja a figura 3. Veja que temos uma IWLabel da aba IWStandard com o caption: “Employees List” e um IWDbGrid da aba IWData.

Criando a conexão com o banco de dados Acesse no Delphi o menu View – DataExplorer. Clique com o botão direito sobre o driver Firebird e selecione “Add New Connection”. Configure a tela que segue:

Figura 3

Com a conexão criada, clique com o botão direito sobre a mesma no DataExplorer e selecione “Modify Connection”. Será apresentada a tela a seguir: Veja a figura 5. Em DataBase Name coloque o caminho do arquivo de banco de dados. Para este exemplo, estou fazendo uso do banco de dados Employee março 2011

07

que acompanha a instalação do Firebird. UserName e Password não necessitam de alterações salvo os casos em que a senha do SYSDBA no servidor Firebird houver sido alterada. Clique em Ok para salvar a conexão. No DataModule da aplicação, coloque um componente SqlConnection da aba DBExpress e altere sua propriedade ConnectionName para EMPLOYEE, que foi a conexão que criamos a pouco. Insira ainda no DataModule um componente SqlDataSet e configure sua propriedade SqlConnection para o SqlConnection inserido anteriormente. Em sua propriedade CommandText coloque: “SELECT * FROM EMPLOYEE”. Insira um componente DataSetProvider da aba DataAccess e sete sua propriedade DataSet para o SqlDataSet recém-criado. Para finalizar a construção do DataModule, insira um componente ClientDataSet e altere sua propriedade ProviderName para o DataSetProvider existente no DataModule.

UserSession Abra a unit do UserSession. Nessa unit, a principal codificação a fazer é a sobrescrita de seu construtor para que juntamente com o UserSession seja criada uma instância do DataModule. Como mencionado anteriormente, o UserSession representa objetos, variáveis e funções exclusivas da instância de usuário. A criação do DataModule vinculado ao UserSession garante que teremos a separação da conexão por usuário. Veja a codificação da unit do UserSession já com a criação do DataModule:

unit UserSessionUnit; {

This is a DataModule where you can add components or declare fields that are specific to ONE user. Instead of creating global variables, it is better to use this

08

março 2011

Figura 5

datamodule. You can then access the it using UserSession. } interface uses IWUserSessionBase, SysUtils, Classes,DataModuleUnit; type TIWUserSession = class(TIWUserSessionBase) private { Private declarations } public { Public declarations } constructor Create( AOwner:TComponent);overri de; end; var

DM:TDataModule1;

implementation {$R *.dfm} { TIWUserSession } // Sobrescrita do construtor do UserSession constructor

TIWUserSession. Create(AOwner: TComponent); begin inherited; DM:=TDataModule1. Create(Self); end; end.

Abra o design do UserSession e insira nele um componente DataSource. Ligue este DataSource ao ClientDataSet existente no DataModule. Volte ao formulário principal e ligue o IWDBGrid ao DataSource que inserimos no UserSession. Não se esqueça de adicionar na uses do formulário principal a unit do UserSession. Pressione F9 para executar o projeto. Será exibida a tela do servidor de testes IntraWeb:

Nessa tela pressione novemente F9 para ver o projeto em execução no Browser padrão da máquina. Veja nosso exemplo em execução: Veja a imagem 7.

Conclusão Nesse artigo mostrei a criação e configuração de um projeto Intraweb. Como pode ser visto, Intraweb oferece ao desenvolvedor a possibilidade de criação de aplicativos “on-line” de forma fácil e com todas as características de uma aplicação Desktop. Em artigos posteriores estarei mostrando os demais recursos do Intraweb no Delphi XE, incluindo o uso de JavaScript e a integração com DataSnap.

Então até a próxima e aproveitem os recursos do Delphi XE!

Figura 7

Sobre o autor Antonio Spitaleri Neto Consultor Técnico The Club.

[email protected]

março 2011

09

Instalando e Configurando o SQL Server 2008 Express Edition With Tools Uma breve introdução Estarei utilizando o Windows Seven Ultimate 32 Bits com todas as atualizações críticas instaladas para este artigo. É importante ressaltar que esta versão do SQL Server é gratuita e altamente recomendada para aplicações de pequeno e médio porte, abaixo algumas características do mesmo: - É um sistema de gerenciamento de dados avançado e confiável; - Oferece um conjunto rico de recursos para desenvolvimento; - Proteção aos dados e um alto desempenho para clientes de aplicativos incorporados e aplicativos da Web;

Neste artigo iremos acompanhar sua instalação junto com o seu gerenciador de Banco de Dados.

Realizando o download Abaixo estão os programas necessários em caso da utilização do Windows Xp Service Pack 3. Passo 1: Faça o download e instale o Microsoft Net Framework 3.5 SP1. http://go.microsoft.com/fwlink/?LinkId=120550 Passo 2: Faça o download e instale o Windows Installer 4.5. http://go.microsoft.com/fwlink/?LinkId=123422 Passo 3: Faça o download e instale o Windows PowerShell 1.0. http://support.microsoft.com/kb/926139

- Implantação fácil; - Custo zero e com liberdade de distribuí-lo junto com os aplicativos desenvolvidos; - Suporta 1 CPU (com suporte a Multi-Core);

Caso utilize o Windows Seven Ultimate com todas as atualizações críticas instaladas ignore esta etapa. Agora faremos o download do Banco de Dados junto com seu gerenciador SQL Server Management Studio Express, importante ressaltar que em nosso caso baixaremos a versão 32 Bits, segue abaixo o link:

- 1GB de RAM e com bases de dados até 4GB; - Com suporte a rede.

10

março 2011

http://www.microsoft.com/downloads/details.aspx?FamilyID=7522A683-4CB2-454E-B908-E805E9BD4E28&displayLang=pt-br

Requisitos Necessários • Sistemas Operacionais Suportados: Windows Seven, Windows Server 2003, Windows Server 2008, Windows Server 2008 R2, Windows Vista, Windows XP • Os sistemas de 32 bits - Computador com processador Intel ou compatível com 1 GHz ou processador mais rápido. • Os sistemas de 64 bits – Computador com Processador de 1,4 GHz ou mais rápido. • Mínimo de 512 MB de RAM (2 GB ou mais é recomendado). • 2,2 GB de espaço disponível em disco rígido Figura 01: Central de Instalação do SQL Server.

Realizando a Instalação Depois de baixado iremos instalar o mesmo, veremos como é simples a instalação junto com sua configuração. Execute o arquivo SQLEXPRWT_ x86_PTB.exe e veremos a tela conforme a Figura 01. Veja a figura 1. Nesta tela escolheremos a opção Instalação e em seguida o primeiro item, como poderemos ver na Figura 02. Veja a figura 2. Esta opção indica para uma instalação de uma nova instancia do SQL Server, sendo a mesma que iremos utilizar em nosso artigo. A próxima etapa poderá ver na Figura 03. Veja a imagem 3.

Figura 02: Opção Nova Instalação SQL Server.

Verificamos que não encontramos nenhum problema em nosso Sistema Operacional, portanto continuemos com a instalação. Clique no botão Ok e prosseguimos com a tela seguinte, Figura 04. Veja a imagem 4. Como estamos trabalhando com a versão gratuita do SQL Server, não precisamos informar nenhuma chave. Em seguida clique em Avançar. Figura 05. Veja a imagem 5. É importante dar uma lida nos termos de Licença para uso, em seguida clique em “Aceito os termos de licença” e prosseguiremos com a instalação clicando no botão Avançar. Em seguida verificaremos os Arquivos de Suporte à instalação, no meu caso apareceram dois alertas, como podemos ver na imagem 06 abaixo:

Figura 03: Regras de Suporte à Instalação. março 2011

11

Veja a imagem 6. O primeiro diz respeito à segurança de Aplicativo do Microsoft .NET, que poderemos resolver facilmente clicando em Status no item Aviso e Baixando o arquivo solicitado, e o outro alerta está dizendo que o Firewall do Windows está habilitado (Mais tarde iremos criar exceções para permitir sua conexão em rede). Continuando, clique em avançar. Na tela abaixo iremos selecionar todos os recursos, mas neste artigo estaremos abordando apenas o Serviço do SQL Server e de seu gerenciador de Banco de Dados. Em artigos futuros poderemos abordar outros recursos do mesmo. Confiram a Imagem 07 abaixo. Veja a imagem 7. Por Padrão o SQL Server é instalado no diretório C:\ Arquivos de Programas, Clique em avançar para continuarmos a instalação.

Figura 04: Instalação do SQL Server.

Na tela seguinte iremos utilizar as configurações padrões, no caso do SQL Server a instancia será criada com o mesmo nome “SQLExpress”, esta etapa define o nome pelo qual seu servidor SQL irá responder. Veja a imagem 08 para melhores detalhes. Veja a imagem 8. Já no próximo passo o instalador faz a análise do espaço em disco, no nosso caso o teste foi positivo e passamos assim para outra fase da instalação que seria a parte para configuração do Servidor. Vejamos na imagem seguinte. Veja a imagem 9. Deixemos as configurações padrões, alterando apenas o Nome da Conta para AUTORIDADE NT\SISTEMA que estaremos apenas utilizando em uma máquina como exemplo. É importante informar que em casos onde o seu SQL Server utilizar recursos de rede será necessário utilizar uma conta de domínio.

Figura 05: Termos de Licença.

O próximo passo é muito importante, seria onde definiremos a senha para acessar o banco de dados, escolha a opção “Modo Misto”, que possibilita autenticação do SQL Server e do Windows, em seguida defina uma senha e especifique os administradores do mesmo. No nosso caso clicaremos no botão “Adicionar usuário Atual” para adicionar o usuário que está sendo utilizado no momento. As abas “Diretório de Dados” e “FileStream” deixaremos definidas como padrões. Em seguida clique em avançar para darmos continuidade com a instalação, veja Figura 10. Veja a imagem 10 A próxima tela da instalação diz respeito aos relatórios de Erro e Uso, eu sempre deixo marcadas estas opções para a fim de aprimorar futuras versões do SQL Server. Não é obrigatório deixar checado estas opções. Veja a imagem 11. 12

Figura 06: Regras de suporte à instalação. março 2011

A Figura 11 representa todas as regras para determinar se o processo de instalação será executado com sucesso, no nosso caso todas as regras foram definidas corretamente. Clique em Avançar e na próxima tela aparecerá uma árvore com os recursos do SQL Server 2008 a ser instalado, clique em avançar novamente para procedermos com a instalação. A instalação concluirá em pouco tempo e apresentará uma tela parecida com a Figura 12. Prontinho, a instalação do SQL Server 2008 com sua Ferramenta Management Studio foi executada facilmente e sem nenhum segredo. Veja a imagem 12.

Configurando o SQL Server para Trabalhar em rede

Figura 07: Seleção de Recursos.

Por padrão o SQL Server 2008 vem com a opção para se conectar em rede desabilitada por motivos de segurança de acesso, fazendo com que não aceite conexões vindas de outras estações de uma rede, portanto ao instalá-lo conseguiremos criar uma conexão apenas na estação onde o mesmo foi instalado. Para habilitar estas opções devemos seguir alguns passos, vejamos a seguir. O SQL Server Configuration Manager é o utilitário responsável por gerenciar os serviços relacionados às instâncias locais do SQL Server e os protocolos de conexões permitidos. Podemos encontrá-lo no item do menu “Ferramentas de Configurações”. Em seguida observaremos algumas configurações interessantes, conforme ilustra a Figura 13.

Figura 08: Escolhendo a Instância SQLExpress.

Figura 13: SQL Server Configuration Manager.

O SQL Server Configuration Manager gerencia três características. - Serviços do SQL Server: É responsável por todos os serviços relacionados ao Banco de Dados, permitindo Iniciar, Pausar ou Reiniciar o mesmo. Podemos também configurar várias propriedades destes serviços. No nosso exemplo deixaremos o serviço SQL Server e o Navegador do SQL Server iniciado. É recomendável deixar estes serviços para iniciar automaticamente. Figura 9: Configuração do Servidor. março 2011

13

- Configuração de Rede do SQL Server: Esta opção permite ao Administrador configurar os protocolos de rede que o SQL Server irá aceitar, no nosso caso habilitaremos o protocolo TCP/IP. - Configuração do SQL Native Client 10.0: Define a ordem dos protocolos utilizados pelos clientes que acessam o SQL Server e a criação de Alias de conexões. O SQL Express suporta os seguintes protocolos de rede: Veja a tabela 1. Voltando ao assunto, para habilitar o protocolo TCP/IP, clique em Configurações de Rede/ Protocolos para SQL Express e com o botão direito escolha Propriedades. Na aba Protocolo deixe Sim para a propriedade Habilitado. Veja Figura 14.

Figura 10: Configurações do Mecanismo de Banco de Dados.

Figura 14: Propriedades TCP/IP.

Na aba endereços IP, no item IPAll altere o mesmo para porta 1433, isto fará com que esta porta servirá para todos os IPs configurados em seu computador. Caso precise configurar uma porta para apenas um IP específico, localize o IP desejado (IP1, IP2, IP3 ...) e siga o mesmo procedimento. Ver Figura 15.

Figura 15: Endereços IP. 14

Figura 11: Regras de Instalação.

Figura 12: Instalação Concluída. março 2011

Faça a mesma configuração para Configuração do SQL Native Client 10.0. Não esqueça que sempre quando é feita uma alteração na configuração do Banco de Dados é necessário reiniciar os serviços relacionados. Importante: Crie exceções no Firewall para permitir a conexão remota do SQL Server, para quem não sabe, basta entrar no Painel de Controle e no item Firewall do Windows adicione duas portas, a 1433 como TCP e outra como UDP e a 1434 como TCP e UDP. Veja na Figura 17 o resultado de nossas configurações.

Protocolo de rede

Descrição

Padrão

Memória Compartilhada

Permite conectar a uma instância do SQL Server Express rodando no mesmo computador.

Habilitado

TCP/IP

Permite que outras estações se conectem ao SQL Server Express por es- Desabilitado pecificar o nome do servidor e o nome da instância (default SQLExpress) ou o endereço IP e o nome da instância.

Pipes Nomeados

Permite que outras estações se conectem ao SQL Server Express por Desabilitado suportar vários protocolos de rede, incluindo NetBEUI, TCP/IP e IPX/SPX. Ele seleciona o protocolo de rede automaticamente baseado na configuração do cliente.

VIA

Protocolo específico para redes de sistema. Nesta rede, os dados trafegam Desabilitado em alta velocidade e são utilizadas para a comunicação entre servidores e/ou clusters.

Tabela 1

Veja a imagem 16

Utilizando o SQL Server Management Studio Para realizar os testes abra o SQL Server Management e coloque o IP ou o nome do servidor e em seguida o nome da instância do SQL Server, no meu caso o IP onde o Banco de Dados está instalado é o 192.168.0.157 e o nome da instância é a SQLExpress. Escolha o tipo de Autenticação do SQL Server seguido de seu usuário e senha cadastrado quando fizemos a instalação do mesmo. A Figura 18 ilustra este procedimento. Pronto, estamos trabalhando com o Banco de Dados em rede.

Figura 16: Configurações no Firewall do Windows.

poderosos para manipulação e armazenamento de dados de uma forma rápida e segura. Nos próximos artigos procurarei abordar outros assuntos relacionados ao SQL Server a fim de poder compartilhar meu conhecimento com os senhores. Vou ficando por aqui e até o mês que vem.

Fonte de Informações http://www.microsoft.com/ Figura 17: Conectar ao Servidor.

Conclusão Vimos neste artigo à instalação e configuração deste poderoso Banco de Dados utilizado por muitas pequenas e médias empresas. Foram apresentadas algumas características e funcionalidades com intuito de trazer uma gama de informações úteis aos senhores associados. Apesar de ser uma versão gratuita não deixa de fornecer recursos

Sobre o autor Thiago Cavalheiro Montebugnoli Thiago Cavalheiro Montebugnoli é tecnólogo, formado pela Faculdade de Tecnologia de Botucatu – SP (FATEC) foi consultor técnico do The Club, já desenvolveu softwares utilizando a plataforma .NET, Delphi junto com Banco de Dados SQL Server e Firebird. Atualmente trabalha no Centro de Processamento de Dados da Prefeitura Municipal de Itaí-SP. Possui as seguintes certificações: MCP - Microsoft Certified Professional, MCTS - Microsoft Certified Technology Specialist, MCAD - Microsoft Certified Application Developer e MCSD - Microsoft Certified Solution Developer.

[email protected]

março 2011

15

Crie um preeview customizado e imprima registros selecionados em um DBGrid Vou mostrar nesse artigo, algumas dicas de geradores de relatórios presentes no Delphi. Veremos dicas de Rave Reports, Quick Report e Report Builder. Primeiramente, vamos customizar um preeview dos geradores de relatórios, que na sua versão original possui várias opções: navegação entre as páginas, impressão, configuração de páginas, entre muitas outras. Mas muitos desenvolvedores sentem falta de algumas funcionalidades que não estão presentes em alguns, como exportação (PDF, HTML, DOC, TXT etc), pesquisa de textos entre outras. Veremos ainda nesse artigo, como imprimir somente os itens selecionados em um DBGrid, demanda muito pedida pelos clientes.

Preparando o ambiente

geradores que possuo estão disponíveis apenas nessa versão. Mas, tenho certeza que você pode usar qualquer versão recente do Delphi ou dos geradores de relatórios. Algumas opções podem não estar presentes em todos os previews, como por exemplo, a exportação, onde para o Quick Report temos apenas para TXT, CSV e HTML, enquanto o Rave Reports tem as opções para PDF, HTML, RTF e TXT. Já no Report Builder a exportação para TXT e PDF, e também pode ser feita em mais opções usando componentes de terceiro.

por mostrar as opções de exportação no Salvar da barra de ferramentas, onde configuramos a propriedade DropDownMenu apontando para o PopupMenu. Adicione um QRPreview da paleta QReport e altere a propriedade Align para alClient para que o controle ocupe todo o espaço do formulário. Na Figura 1 temos os botões com suas respectivas imagens, bem como todo o layout do formulário de preview.

Preview no Quick Report Vamos criar um projeto no Delphi e salvar o mesmo em um diretório de sua preferência. Crie um novo formulário e dê o nome de “frmPreview” e salve como “ufrmPreview.pas”. No preview adicione uma Toolbar e uma StatusBar. Na barra, adicione 10 botões para as principais funcionalidades. Figura 1. Layout do preview

Neste artigo vou usar o Delphi 2010, pois os 16

março 2011

Adicione um PopupMenu que será responsável

Fique a vontade para mudar o layout e colocálo de sua preferência.

Dica: Você pode, e eu acredito que deve, usar um ActionList para concentrar seu código e propriedades em botões e menus, e trabalhar por exemplo, com permissões, sendo mais fácil de desabilitar/habilitar botões e menus.

Após o layout pronto, vamos ao código. Para os botões de navegação e de zoom temos o código da Listagem 1. Listagem 1. Botões de navegação e zoom do relatório do Quick Report

Primeiro QRPreview1.PageNumber := 1; Anterior QRPreview1.PageNumber := QRPreview1.PageNumber - 1; Próximo QRPreview1.PageNumber := QRPreview1.PageNumber + 1; Último QRPreview1.PageNumber := QRPreview1.QRPrinter. PageCount; Mais Zoom QRPreview1.Zoom := QRPreview1.Zoom + 10; Menos Zoom QRPreview1.Zoom := QRPreview1.Zoom - 10;

usamos o código da Listagem 2.

Listagem 2. Exportando para HTML e TXT HTML QRPreview1.QRPrinter.Expor tToFilter(TQRGHTMLDocument Filter.Create( ‘exportacao.html’)); TXT QRPreview1.QRPrinter.Expor tToFilter(TQRAsciiExportFi lter.Create( ‘exportacao.txt’));

Veja que é bem simples, onde ainda temos a possibilidade de exportar para CSV (simplesmente trocando o parâmetro para TQRCommaSeparatedFilter). No código, temos a exportação com o nome do arquivo, para melhorar, coloque um SaveDialog e dê a opção do usuário escolher o local onde o arquivo será salvo.

Mostrando o relatório no preview

QRPrinter := TQRPrinter(Sender); frmPreview.ShowModal;

No OnPreview instanciamos o formulário e repassamos para a propriedade QrPrinter do QRPreview, o relatório. Para chamar o relatório, use o seguinte código:

QuickReport2 := TQuickReport2. Create(self); try QuickReport2. PreviewModal; finally QuickReport2.Free; end;

Note que precisamos chamar o método PreviewModal no lugar o Preview. Execute o projeto e veja como na Figura 2 o preview do Quick Report. Veja a figura 2.

Para finalizar, precisamos exibir o relatório do Quick Report no preview criado. Para isso, abra o relatório e no evento OnPreview do mesmo e adicione o seguinte código:

uses QRPrntr, ufrmPreview; ... frmPreview := TfrmPreview. Create(Application); frmPreview.QRPreview1.

Ainda precisamos coloca o seguinte código no evento OnClose do formulário do preview para liberar o mesmo da memória, assim não teremos mensagem de erro quando tentar chamar o relatório pela segunda vez:

Action := caFree; frmPreview := nil;

Acredito que o código é simples e de fácil entendimento. Para imprimir o relatório, o código é mais simples ainda, onde precisamos apenas chamar QRPrinter.Print do QRPreview:

QRPreview1.QRPrinter. Print;

Agora vamos as opções de exportação, incluindo no formulário os componentes QRTextFilter e QRHTMLFilter. Para exportar, simplesmente

Figura 2. Relatório do Quick Report no preview março 2011

17

Nota: a versão do Quick Report que acompanha o Delphi em versões anteriores possui poucas funcionalidades no preeview. Versões profissionais, já possuem funcionalidades a mais em seu preeview, como veremos mais adiante neste artigo.

Preview no Rave Reports Para o Rave Reports o formulário de preview pode ter os mesmos botões, mas para a exportação teremos duas opções a mais: PDF e DOC. Então crie um novo formulário, adicione os mesmos componentes, apenas trocando o QRPreview por RvRenderPreview e os componentes de exportação: RvRenderPDF, RvRenderHTML, RvRenderRTF e RvRenderText. O RvRenderPreview mostra o relatório, utilizando um ScrollBox, portanto adicione um ao formulário (altere a propriedade Align para alClient) e faça a vinculação através da propriedade ScrollBox do RvRenderPreview. Para os botões de navegação e zoom, use o código da Listagem 3. Listagem 3. Botões de navegação e zoom do relatório do Rave

Primeiro RvRenderPreview1. RenderPage(1); Anterior RvRenderPreview1. PrevPage; Próximo RvRenderPreview1. NextPage; Último RvRenderPreview1. RenderPage (RvRenderPreview1. LastPage); Mais Zoom RvRenderPreview1.ZoomIn; Menos Zoom RvRenderPreview1. ZoomOut;

A diferença em relação ao Quick Report esta nos nomes dos métodos, pois a funcionalidade é a 18

março 2011

mesma. Para a exportação, adicione um RvNDRWriter ao formulário e digite o código da Listagem 4 nos respectivos botões, responsável pela exportação do relatório. Listagem 4. Exportando relatórios no Rave Reports

HTML RvRenderHTML1. PrintRender(RvNDRWriter1. Stream, ‘arquivo.html’); DOC RvRenderRTF1. PrintRender(RvNDRWriter1. Stream, ‘arquivo.rtf’); PDF RvRenderPDF1. PrintRender(RvNDRWriter1. Stream, ‘arquivo.pdf’); TXT RvRenderText1. PrintRender(RvNDRWriter1. Stream, ‘arquivo.txt’);

Também podemos dar a opção para o usuário escolher o nome do arquivo e diretório. Para impressão do relatório precisamos adicionar um RvRenderPrinter e um RvNDRWriter ao formulário e adicionar o seguinte código no botão de imprimir:

RvRenderPrinter1. Render(RvNDRWriter1. Stream);

Para visualizar o relatório do Rave no preview, vamos adicionar o código da Listagem 5, que subscreve o construtor do formulário:

begin inherited Create(AOWner); RvNDRWriter1.Stream := Relatorio; RvRenderPreview1. Render(RvNDRWriter1. Stream); end;

O código, recebe como parâmetro um TMemoryStream que será repassado para a propriedade Stream do RvNRDWrite. Após, o RvRenderPreview mostra o relatório chamando o Render, passando como parâmetro o stream do RvNDRWriter. Para finalizar, precisamos criar um relatório no Rave Reports. Após criar o mesmo, no formulário para chamar o relatório, adicione um RvProject (vinculado ao arquivo de projeto RAV) e um RvNDRWriter, vinculando a propriedade Engine do RvProject com o RvNDRWriter1. Após, use o código da Listagem 6 para abrir o formulário de preview com o relatório. Listagem 6. Chamando o preview para o Rave Reports

var stream: TMemoryStream; begin stream := TMemoryStream. Create; RvNDRWriter1.StreamMode := smUser; RvNDRWriter1.Stream := stream;

Listagem 5. Código para exibir o relatório

RvProject1. ExecuteReport(‘Report1’); frmPreview := TfrmPreview.Create(Self, stream);

constructor Create(AOWner: TComponent; Relatorio: TMemoryStream); reintroduce; ... constructor TfrmPreview. Create(AOWner: TComponent; Relatorio: TMemoryStream);

try frmPreview.ShowModal; finally frmPreview.Release; frmPreview := nil; end; end;

No código anterior, criamos uma variável do tipo TMemoryStream que preenche a propriedade Stream do RvNDRWriter e será passada como parâmetro no construtor do formulário do preview. Ao rodar a aplicação, temos o relatório do Rave no nosso preview (Figura 3) com as opções de exportação. Veja a figura 3.

Preview no Report Builder Novamente, o formulário de preview para o Report Builder pode ter os mesmos botões, onde modificaremos apenas alguns componentes. Você pode baixar uma versão trial do Report Builder no endereço www.digital-metaphors.com/ download. Neste exemplo, usaremos a versão Enterprise 12.03 para Delphi 2010, mas temos suporte para praticamente todas as versões do Delphi. Após baixar, instale e crie um novo projeto no Delphi, onde podemos verificar os componentes adicionados na paleta RBuilder (Figura 4).

Figura 3. Exibindo relatório do Rave no preview

Primeiro ppViewer1.FirstPage Anterior ppViewer1.PriorPage; Próximo ppViewer1.NextPage; Último ppViewer1.LastPage; Mais Zoom ppViewer1.ZoomPercentage := ppViewer1. ZoomPercentage + 10; Menos Zoom ppViewer1.ZoomPercentage := ppViewer1. ZoomPercentage - 10;

TComponent; aReport; out appReport: TppReport); reintroduce; ... constructor TfrmPreview. Create(AOWner: TComponent; out appReport: TppReport); begin inherited Create(AOWner); aReport := appReport; ppViewer1.Report := appReport; appReport. PrintToDevices; end;

Para imprimir o relatório, precisamos simplesmente usar o seguinte código:

O código preenche uma variável declarada na seção private do formulário, que será usada na exportação, e repassa o ppReport passado como parâmetro, para o ppViewer. A seguir, chamamos o PrintToDevices para mostrar o relatório.

ppViewer1.Print;

Figura 4. Componentes do Report Builder instalados no Delphi

No formulário de preview, adicione um ppViewer e um ppDesigner. Altere a propriedade Align para alClient do ppViewer. Novamente para os botões de navegação e zoom temos o código da Listagem 7. Listagem 7. Botões de navegação e zoom do relatório do Report Builder

Para visualizar o relatório, vamos novamente subscrever o Create do formulário, usando o código da Listagem 8. Listagem 8. Código para abrir o relatório no Report Builder

uses ppReport; ... constructor Create(AOWner:

Para a exportação, vamos usar o código da Listagem 9 onde temos a opção para texto e PDF. Listagem 9. Exportação para o Report Builder

Arquivo Texto with aReport do begin AllowPrintToFile := True; DeviceType :=

março 2011

19

dtTextFile; TextFileName := ‘arquivo.txt’; Print; end; PDF with aReport do begin AllowPrintToFile := True; DeviceType := dtPDF; TextFileName := ‘arquivo.pdf’; Print; end;

O Report Builder apresenta uma tela de impressão (Figura 5), pois usamos a propriedade AllowPrintToFile configurada como True. Isso facilita a vida do usuário, pois ele pode configurar nome e diretório para o arquivo de exportação. Veja a figura 5. Existe um componente de terceiro (TExtraDevice) que exporta relatórios para Excel, HTML, RTF, entre outras. Para finalizar, precisamos criar um relatório no Report Builder. Após criar o mesmo, no formulário para chamar o relatório, use o código da Listagem 10.

Figura 5. Tela de impressão do Report Builder

Execute o projeto e veja na Figura 6 como deve ficar o projeto onde temos o arquivo de exportação no formato PDF.

jeto necessita do reaproveitamento dos mesmos, senão teremos uma quantidade muito grande de arquivos onde os dados apresentados podem ser os mesmos.

Veja a figura 6.

Imprimindo registros selecionados A grande utilização de relatórios em um pro-

Um exemplo: um relatório onde constam parcelas das vendas do seu cliente. Ele precisa verificar em situações diferentes as parcelas pagas, não pagas, vencidas, há vencer etc. se você imaginou fazer

Listagem 10. Chamando o preview do Report Builder

frmPreview := TfrmPreview. Create(Self, ppReport1); try frmPreview.ShowModal; finally frmPreview.Free; end;

No código, o formulário de preview recebe como parâmetro um ppReport, componente responsável pela criação do relatório. Os relatórios do Report Builder podem ser gerados como arquivos externos (com a extensão RTM), então é possível adaptar o preview para carregar os arquivos externos, passando como parâmetro o nome do mesmo. Figura 6. Exibindo e exportando relatórios do Report Builder 20

março 2011

um relatório apenas e filtrar os dados no banco de acordo com a necessidade, esta “meio” certo. Mas sua consulta vai mudar de acordo com a opção desejada e assim, terá consultas ao banco desnecessárias. O que fazer? Simples, vamos fazer um relatório apenas, retornando todas as parcelas (claro, usando outro filtro, como por exemplo, um período de datas) e filtrando os dados de acordo com a opção. Ficou curioso como fazer? Então vamos aprender isso e muito mais neste artigo.

Figura 7. Relatório no Quick Report

Filtrando parcelas Primeiramente, faremos o exemplo citado anteriormente, no Quick Report. Usei aqui um banco de dados criado por mim, que estará disponível para download. Nossa consulta retornará as parcelas de acordo com o período, independente do campo PAGO, que indica se a mesma esta paga ou não. Nossas opções de filtragem serão: Pagas (PAGO = ‘T’), Não Pagas (PAGO = ‘F’), Vencidas (parcelas não pagas até a data atual), há vencer (parcelas não pagas acima da data atual).

:DATAFIM and PA.STATUS = ‘A’ order by PA.DATA_ VENCIMENTO, CO.NR_ CONTRATO, PA.NR_PARCELA

Configure os parâmetros no componente. Nossa consulta esta pronta, então precisamos criar o relatório. Crie um relatório no Quick Report com a consulta, usando o layout da Figura 7. Veja a figura 7.

A consulta pelo período vai se basear pelo campo DATA_LANCAMENTO. No Delphi, crie um novo projeto (ou utilize o que estamos usando), e crie a consulta ao banco de dados, que terá o comando SQL da Listagem 11.

Para testar o relatório, vamos criar um novo formulário e adicionar os controles, conforme a Figura 8.

Listagem 11. Comando SQL da consulta select PA.ID_PARCELA, CO.NR_ CONTRATO, CL.CLIENTE, PA.NR_PARCELA, PA.DATA_VENCIMENTO, PA.VALOR_PARCELA, PA.PAGO from PARCELAS PA inner join CLIENTES CL on (PA.ID_CLIENTE = CL.ID_ CLIENTE) inner join CONTRATO CO on (PA.ID_CONTRATO = CO.ID_CONTRATO) where PA.DATA_LANCAMENTO between :DATAINI and

Figura 8. Formulário de filtragem de dados

No Data Module, vamos criar uma procedure que irá filtrar o nosso ClientDataSet que retorna os dados da consulta. Uso o código da Listagem 12. Listagem 12. Procedure para filtrar os dados

procedure TDM. Filtrar(dtInicio, dtFim: TDateTime); begin cdsConsulta.Close; cdsConsulta.Params[0]. AsDate := dtInicio; cdsConsulta.Params[1]. AsDate := dtFim; cdsConsulta.Open; end;

Voltando ao formulário de filtros, adicione o código da Listagem 13 para o botão Relatório. Adicione no uses a unit do Data Module e relatório. Listagem 13. Chamada ao relatório

//verifica se escolheu um item if RadioGroup1.ItemIndex = -1 then MessageDlg(‘Escolha uma opção de Filtro’, mtError, [mbok], 0) else begin //filtra a consulta DM.Filtrar(dtInicial. Date, dtFinal.Date); try frmRelatorioConsulta := TfrmRelatorioConsulta. Create(nil); frmRelatorioConsulta. QuickRep1.Preview;

março 2011

21

finally frmRelatorioConsulta. Free; end; end;

Nota: dtInicial e dtFinal são controles DateTimePicker colocados no formulário.

Caso deseje testar, coloque o Data Module como primeiro formulário a ser criado, a seguir o formulário de filtragem. Até o momento, nossos dados estarão apenas sendo filtrado pela consulta principal (Listagem 11). Para que possamos implementar a filtragem de acordo com as opções, adicione uma variável pública no formulário do relatório chamada “iIndex”, do tipo integer. Passaremos para esse variável a opção escolhida no RadioGroup.

2: PrintBand := (QuickRep1.DataSet. FieldByName(‘PAGO’). AsString = ‘F’) and (QuickRep1.DataSet. FieldByName(‘DATA_ VENCIMENTO’).AsDateTime < Date); 3: PrintBand := (QuickRep1.DataSet. FieldByName(‘PAGO’). AsString = ‘F’) and (QuickRep1.DataSet. FieldByName(‘DATA_ VENCIMENTO’).AsDateTime > Date); end;

Veja como é simples filtrarmos os dados, basta configurar corretamente o parâmetro, usando o valor dos campos que temos vinculados ao relatório. Neste exemplo, usei a propriedade DataSource do relatório, mas poderíamos utilizar diretamente o controle do Data Module, por exemplo.

Faça os testes para as várias opções de filtragem (Figura 9). Veja a figura 9.

Rave Reports Para o Rave, vamos usar a mesma consulta. Primeiramente, crie um relatório no Rave (vamos colocar os componentes no Data Module). O layout do mesmo deve se parecer com a Figura 10. Veja a figura 10. Para a consulta ser mostrada no relatório, devemos adicionar um RvDataSetConnection e ligar sua propriedade DataSet com o cdsConsulta. Faça a ligação do controle com o relatório (DataViews) para exibir os dados.

Nota: Caso exista alguma dúvida em relação a conexão de dados em relatórios do Rave, sugiro uma pesquisa no site da Nevrona (fabricante do Rave) ou na internet

Na chamada ao relatório, modifique o código para repassar o valor do RadioGroup para a variável: frmRelatorioConsulta. iIndex := RadioGroup1. ItemIndex;

Agora a parte principal do nosso exemplo, onde vamos filtrar os dados da consulta, de acordo com a opção escolhida. Toda a mágica esta no evento BeforedPrint da banda Detail. Nela temos um parâmetro chamado PrintBand do tipo boolean, que indica se o item que esta sendo “impresso”, deve ser “impresso”. Assim, com o valor que temos da variável (iIndex), podemos filtrar os dados. No referido evento, utilize o código da Listagem 14. Listagem 14. Filtrando os dados case iIndex of 0: PrintBand := (QuickRep1.DataSet. FieldByName(‘PAGO’). AsString = ‘T’); 1: PrintBand := (QuickRep1.DataSet. FieldByName(‘PAGO’). AsString = ‘F’); 22

março 2011

Figura 9. Opções de filtragem do relatório, sem mudar a consulta ao banco

sobre o assunto. Após configurar o relatório, modifique a chamada ao relatório do Quick, no formulário de filtragem com o seguinte código:

DM.iIndex := RadioGroup1. ItemIndex; DM.Filtrar(dtInicial.Date, dtFinal.Date); DM.RvProject1.Execute;

Veja que temos uma variável pública no Data Module que recebe o valor do RadioGroup. Por que fazemos isso? Por que o responsável por filtrar os dados esta no Data Module, o RvDataSetConnection. No evento ValidateRow do controle, vamos fazer algo semelhante ao exemplo anterior. Veja o código na Listagem 15. Listagem 15. Filtrando os dados para o Rave Reports case iIndex of 0: ValidRow := cdsConsultaPAGO.AsString = ‘T’; 1: ValidRow := cdsConsultaPAGO.AsString = ‘F’; 2: ValidRow := (cdsConsultaPAGO.AsString = ‘F’) and (cdsConsultaDATA_ VENCIMENTO.AsDateTime < Date); 3: ValidRow := (cdsConsultaPAGO.AsString = ‘F’) and (cdsConsultaDATA_ VENCIMENTO.AsDateTime > Date); end;

Figura 10. Relatório no Rave

relatório os itens selecionados. O exemplo continua bem simples, usaremos praticamente a mesma técnica anterior, com apenas uma modificação em seu código. Crie uma consulta (pode se usada a mesma) e mostre-a em um DBGrid. Altere as seguintes propriedades do DBGrid: Options>dgRowSelection = True Options> dgAlwaysRowSelection = True Options>dgMultiSelect = True

Crie um novo relatório no Quick Report, usando a consulta anterior. No mesmo evento do exemplo anterior, vamos repassar para o parâmetro PrintBand apenas os registros selecionados no Grid, usando o seguinte código (adicione no uses do relatório a unit do formulário):

PrintBand := frmSelecionar. DBGrid1.SelectedRows. CurrentRowSelected;

Estamos indicando assim, que queremos

Código bastante semelhante ao do exemplo do Quick Report, ficando a diferença que acessamos diretamente o Field no ClientDataSet. Faça os testes e verifique as filtragens (Figura 11). Veja a figura 11.

Imprimindo registros selecionados em um DBGrid Esse exemplo é bastante interessante. Imagine que você possa dar ao seu usuário a possibilidade de escolher itens em um DBGrid e imprimir em um

Figura 11. Aplicando o exemplo de filtragem no Rave março 2011

23

imprimir apenas os registros que esta marcados no DBGrid. Para o teste, rode a aplicação, marque alguns itens no DBGrid (utilizando a tecla CRTL) e chame o relatório (Figura 12). Veja a figura 12. Para o exemplo em Rave, a idéia é a mesma, então crie um novo relatório e no código para filtrar os registros selecionados do DBGrid, use o seguinte código:

ValidRow := frmSelecionar. DBGrid1.SelectedRows. CurrentRowSelected;

Neste exemplo didático, usamos a unit de um formulário no Data Module, o que não é correto. Em uma aplicação real, você pode passar como parâmetro, usar variáveis etc. Veja na Figura 13 o relatório em execução no Rave.

Figura 12. Imprimindo apenas os registros selecionados

Veja a figura 13.

Conclusão Vimos neste artigo como criar um preview para os geradores de relatórios mais usados pelos desenvolvedores Delphi. Algumas funcionalidades a mais podem ser implementadas para alguns geradores, como navegar para uma determinada página informada pelo usuário, formulário de impressão, onde o usuário indica a quantidade de cópias etc. Lembrando que não usamos o StatusBar onde podemos colocar o total de páginas, nome do relatório, entre outras informações. Fica a motivação para você implementar muitas funcionalidades legais no preview. Se você quiser disponibilizar suas alterações para a comunidade, envie para mim que publicarei no meu site para que todos possam aprender. Vimos também como é simples de filtrar dados em relatórios do Rave ou Quick, sem a necessidade de realizarmos várias consultas ao banco de dados, ganhando assim, agilidade e performance a aplicação. Também podemos deixar o usuário escolher os registros de uma consulta e imprimir o mesmo, adicionando assim valor ao seu projeto. Um grande abraço a todos e sucesso em seus projetos!

24

março 2011

Figura 13. Imprimindo os registros selecionados no Rave

Sobre o autor Luciano Pimenta É Técnico em Processamento de Dados, desenvolvedor Delphi/C# para aplicações Web com ASP.NET e Windows com Win32 e Windows Forms. Palestrante da 4ª edição da Borland Conference (BorCon). Autor de mais de 60 artigos e de mais de 300 vídeos aulas publicadas em revistas e sites especializados. É consultor da FP2 Tecnologia (www.fp2.com.br) onde ministra cursos de programação e banco de dados. É desenvolvedor da Paradigma Web Bussiness em Florianópolis-SC.

www.lucianopimenta.net

A P R E S E N TA N D O O NOVO INTERBASE XE PARTE 2

Olá pessoal, Voltamos com a segunda parte da apresentação do novo InterBase XE. Quero antes aproveitar essa introdução do artigo para exaltar o sucesso dessa nova versão do InterBase. A apresentação durante a Delphi Conference 2010 foi um sucesso e a procura pelo produto está fantástica. Isso realmente mostra que o novo InterBase XE está se tornando um marco na já brilhante história desse nosso banco de dados. Em breve o material da apresentação estará disponível no site da Embarcadero (http://edn.embarcadero.com). Vale a pena conferir. Pois bem, nessa edição vamos dar continuidade na apresentação do produto. No artigo anterior nós falamos sobre o suporte à plataforma 64 bits, sobre a ampliação da capacidade de gerenciamento de memória, sobre o suporte à tecnologia de Cloud Computing e sobre o aperfeiçoamento na segurança do produto através do Strong Encryption Password. Agora vamos mostrar em detalhes

outro recurso muito legal do novo InterBase XE, uma melhoria no suporte à linguagem SQL: o suporte ao comando DML EXECUTE STATEMENT. Apesar de já suportado por outros bancos de dados há um bom tempo, esse comando disponibilizado no InterBase veio em boa hora. O EXECUTE STATEMENT permite a nós desenvolvedores ampliar e explorar mais ainda os recursos de programação nativa no banco, incrementando nossas Stored Procedures e facilitando nossa vida em muitas situações. Detalhando:

O COMANDO EXECUTE STATEMENT O comando DML Execute Statement permite a chamada de outro comando DML ou DDL dentro de um código de uma Stored Procedure. Esse recurso é muito útil, pois podemos condicionar a execução de um determinado comando SQL dentro de nossa programação procedural. Particularmente penso que sua execução se faz bem mais interessante,

principalmente pela possibilidade de manipular estruturas de banco de dados dentro de uma procedure. Veremos um exemplo dessa situação mais adiante. O comando Execute Statement pode ser executado em três condições distintas: • Quando nenhuma linha de resposta é retornada do comando; • Retornando uma única linha de resposta do comando; • Retornando múltiplas linhas de resposta do comando. Em cada uma das situações veremos combinações e exemplos de aplicação do comando. Algumas considerações sobre o uso do Execute Statement: 1. O comando Execute Statement só pode ser utilizado dentro de Stored Procedures; 2. É preciso que tanto o Servidor quando os Clientes estejam atualizados com o novo março 2011

25

InterBase XE. Se o servidor for InterBase XE e os clientes estiverem utilizando uma versão antiga da DLL cliente GDS32.DLL, o comando poderá retornar erro; 3. É importante ressaltar que para rodar essa Stored Procedure adequadamente, nossos bancos de dados devem estar compatíveis com a versão InterBase XE (ODS 15.0). Além disso, a interface SQL utilizada, seja o IBConsole, IBExpert ou qualquer outra, também deve estar compatível com o InterBase XE. Até o momento, a última versão do IBExpert, por exemplo, não estava totalmente compatível. Ao tentar criar a Stored Procedure acima ocorre um erro: Parsin Error. Porém o a Stored Procedure é criada normalmente e seu conteúdo também funciona. Utilizando o IBConsole atualizado com a última versão, o problema não ocorre.

LINHA DE RETORNO É comum a situação onde precisamos enviar para nossos clientes um script de atualização da estrutura do banco de dados. Criamos tabelas, alteramos campos, criamos índices, enfim. O normal nessa situação é prepararmos um script contendo todas as alterações necessárias e enviamos para nossos clientes. Legal. Mas certamente você já deve ter encontrado a situação onde o cliente vai rodar esse script e retorna erro, pois a estrutura que desejamos criar já existe no banco de dados ou queremos dropar algo que não existe mais na base do cliente. Agora com o Execute Statement podemos criar uma procedure que verifique antes a existência da estrutura que desejamos alterar/ incluir/excluir e então executamos o comando desejado. Vamos ver um exemplo onde queremos incluir uma nova coluna em determinada tabela, mas queremos antes verificar se essa coluna já existe ou não:

Imagem 1 – Mensagem de erro quando executamos o comando Execute Statement via IBExpert.

4. A performance do comando executado pelo Execute Statement afetará diretamente a execução da própria procedure associada. Assim devemos ter a atenção para que esse comando não penalize a execução do restante da procedure que venha a ser executado após o Execute Statement; 5. Quando executávamos comandos DML, como um Select, Update ou Delete, dentro da Stored Procedure, o InterBase gravava o plano de pesquisa e execução do DML ao compilarmos a procedure. Assim corríamos o risco, por exemplo, de uma query executada por uma procedure não ter uma performance tão interessante, pois essa query poderia ter associado um índice de busca não adequado quando a procedure foi compilada. Esse problema não acontece com o comando Execute Statement. Ele identifica o melhor índice de busca à cada execução, tornando o processo mais limpo e eficiente; 6. Ao compilar uma procedure que contém um Execute Statement, caso o comando executado pelo Execute Statement viole alguma Constraint definida, essa violação não será validada. A Exception de erro só será apresentada no momento da execução do Execute Statement.

EXECUTE STATEMENT SEM NENHUMA 26

março 2011

SET TERM ^ ; CREATE PROCEDURE SP_ VALIDA_DDL ( v_table varchar(67) character set none, v_column varchar(67) character set none, v_type varchar(16) character set none) as declare variable norows integer; declare variable qry varchar(200); begin Select count(*) from rdb$relation_fields r where r.rdb$relation_ name= upper(:v_table) and r.rdb$field_name = upper(:v_column) into :norows; if (norows = 0) then begin QRY = ‘ALTER TABLE ‘ || :V_TABLE || ‘ ADD ‘ || :V_COLUMN || ‘ ‘ || :V_TYPE ; EXECUTE STATEMENT QRY; end end^ SET TERM ; ^

Nesse exemplo criamos uma Stored Procedure Chamada SP_VALIDA_DDL com três parâmetros de entrada: 1.

O nome da tabela que desejamos alte-

rar 2. O nome da coluna que desejamos acrescentar 3. O tipo da nova coluna que desejamos acrescentar. E o texto da procedure é bem simples. Primeiramente verificamos se a coluna informada existe na tabela informada. Para isso executamos uma query na tabela RDB$RELATION_FIELDS, que armazena todos os relacionamentos entre campos e tabelas. Caso a consulte não retorne qualquer resultado (norows = 0), significa que a coluna não existe na tabela. Agora podemos montar um comando DDL para criar a coluna. Esse passo é indicado logo abaixo, quando a variável QRY recebe o comando DDL da criação do campo informado na tabela informada, conforme o datatype informado. E por fim, executamos o comando EXECUTE STATEMENT QRY, fazendo rodar o comando DDL passado através da variável QRY. Um exemplo de chamada da Stored Procedure acima pode ser:

EXECUTE SP_VALIDA_DDL(‘T_ ESTADO’,’SIGLA’,’CHAR(2)’);

Nesse exemplo estamos tentando criar uma nova coluna SIGLA na tabela T_ESTADO tipo CHAR(2). Usando a técnica do Execute Statement, essa coluna será criada somente se a mesma já não existir na tabela referenciada, não retornando erro quando ela já existir.

EXECUTE STATEMENT COM UMA ÚNICA LINHA DE RETORNO Outra situação interessante para o uso do comando Execute Statement é quando precisamos extrair uma determinada informação, como por exemplo, o último código sequencial de um campo chave de uma determinada tabela, mas justamente

não sabemos ao certo o nome da tabela. Essa decisão pode vir no momento de execução. Vejamos o exemplo abaixo:

SET TERM ^ ; CREATE PROCEDURE SP_MAXCOD ( TABLE_NAME VARCHAR(50), FIELD_NAME VARCHAR(50)) RETURNS ( MAXNO INTEGER) AS DECLARE VARIABLE QRY VARCHAR(200); BEGIN QRY = ‘SELECT MAX(‘ || :FIELD_NAME || ‘) FROM || ‘ :TABLE_NAME ; EXECUTE STATEMENT QRY INTO :MAXNO; SUSPEND; END^ SET TERM ; ^

No exemplo acima, criamos uma Stored Procedure chamada SP_MAXCOD que recebe como parâmetros de entrada o nome de uma tabela e o nome de uma coluna, retornando como resultado o valor máximo encontrado na coluna informada para a tabela informada. Podemos assim utilizar essa informação para identificar o próximo valor para utilizarmos no campo ou como parte de um cálculo de uma validação, enfim, chamar essa Stored Procedure como parte de outras Stored Procedures ou Triggers e ter de maneira dinâmica a informação. Um exemplo de chamada da Stored Procedure acima pode ser:

EXECUTE SP_MAXCOD(‘T_ FUNCIONARIO’,’COD_FUNC’);

maior valor do campo COD_CLIENTE encontrado na tabela T_CLIENTE. E assim por diante.

EXECUTE STATEMENT COM MÚLTIPLAS LINHAS DE RETORNO Mais uma possibilidade de uso do comando Execute Statement. É comum encontrarmos bancos de dados com tabelas distintas para clientes do tipo Pessoa Física e Jurídica. Ou mesmo tabelas separadas para Clientes e Fornecedores. Pois bem, utilizando o recurso do Execute Statement, podemos criar uma procedure que nos retorne informações relativas a clientes, mas informando em tempo de execução, sobre qual tabela queremos as informações:

SET TERM ^ ; CREATE PROCEDURE SP_DADOS_ CLIENTE ( TABLE_NAME VARCHAR(50) CHARACTER SET NONE) RETURNS ( COD_CLIENTE INTEGER, NOME_RAZAO VARCHAR(50), CPF_CNPJ VARCHAR(14), ENDERECO VARCHAR(60), TELEFONE VARCHAR(12) ) AS DECLARE VARIABLE QRY VARCHAR(200); BEGIN QRY = ‘SELECT COD_CLIENTE, RAZNOME, CPFCNPJ, END, TEL FROM ‘ || :TABLE_NAME ; FOR EXECUTE STATEMENT QRY INTO :COD_CLIENTE, :NOME_RAZAO, :CPF_CNPJ, :ENDERECO, :TELEFONE; DO SUSPEND; END^ SET TERM ; ^

Nesse exemplo a procedure retornará o maior valor do campo COD_FUNC encontrado na tabela T_FUNCIONARIO.

EXECUTE SP_MAXCOD(‘T_ CLIENTE’,’COD_CLIENTE’);

Já nesse exemplo a procedure retornará o

No exemplo acima criamos uma Stored Procedure chamada SP_DADOS_CLIENTE que nos retornará alguns campos comuns encontrados em tabelas de clientes – Código do cliente, Razão Social, CPF ou CNPJ, Endereço, Telefone, enfim. Poderíamos muito bem executar diretamente a query de Select para obter essas informações.

Mas utilizando o recurso do Execute Statement, podemos informar como parâmetro de entrada na Stored Procedure, sobre qual tabela iremos rodar a query (indicado pelo parâmetro TABLE_NAME). Esse recurso nos da a liberdade de, por exemplo, trabalhar como parte de outra Stored Procedure que, dependendo de determinada situação encontrada, solicite informações de uma tabela ou de outra, da tabela de Clientes ou da tabela de Fornecedores, baseado em critérios e condições analisadas. Exemplos de chamada da Stored Procedure:

EXECUTE SP_DADOS_ CLIENTE(‘T_CLIENTE’);

Nesse exemplo a procedure retornará os dados (Código do cliente, Razão Social, CPF ou CNPJ, Endereço e Telefone) a partir da tabela T_CLIENTE.

EXECUTE SP_DADOS_ CLIENTE(‘T_FORNECEDOR’);

Nesse outro exemplo a procedure retornará mesmos campos, mas agora a partir da tabela T_FORNECEDORES.

(…) AS DECLARE VARIABLE TIPO_ CLIENTE CHAR(1); BEGIN (…) IF (TIPO_CLIENTE = ‘C’) THEN FOR SELECT * FROM SP_ DADOS_CLIENTE(‘T_CLIENTE’) INTO :COD_CLIENTE, :NOME_ RAZAO, :CPF_CNPJ, :ENDERECO, :TELEFONE; DO SUSPEND; END IF (TIPO_CLIENTE = ‘F’) THEN FOR SELECT * FROM SP_DADOS_CLIENTE(‘T_ FORNECEDOR’) INTO :COD_CLIENTE, :NOME_ RAZAO, :CPF_CNPJ,

março 2011

27

:ENDERECO, :TELEFONE; DO SUSPEND; END (…) END^

No exemplo acima, podemos chamar a Stored Procedure SP_DADOS_CLIENTE a partir de outra Stored Procedure qualquer. Quando a variável TIPO_CLIENTE for igual à “C”, então passamos a tabela T_CLIENTE como parâmetro para a chamada do Execute Statement. Já quando a variável TIPO_CLIENTE for igual à “F”, passamos a tabela T_FORNECEDOR como parâmetro para a chamada do Execute Statement.

novidade, incrementando o uso e tratamento em Stored Procedures e Triggers. O novo comando DML Execute Statement vem como que coroar o lançamento do InterBase XE. Mostra a preocupação da Embarcadero em desenvolver o produto e torná-lo cada vez mais atrativo ao desenvolvedor. Afinal, somos nós desenvolvedores que avaliamos, utilizamos e propagamos o produto no mercado. Fica aqui novamente o convite para testarmos o produto, sempre lembrando que nós desenvolvedores temos direito de uso de uma versão gratuita do InterBase XE – a Developer Edition. Podemos baixar tanto a versão 62 bits, quanto a 32 bits. Basta entrar, se cadastrar e baixar o produto através do

site da Embarcadero através do link abaixo. Essa edição Developer nos permite utilizar e explorar todos esses novos: http://www.embarcadero. com/products/interbase. Fiquem ligados também no canal de notícias do InterBase, através da comunidade InterBase no Embarcadero Developer Network em português: http://edn.embarcadero. com/br/interbase. Em breve com mais novidades do InterBase aqui na The Club Megazine.

Referência: InterBase XE Language Reference Guide – Capitulo 3.

Sobre o autor CONCLUSÃO

Felipe Santos

Os exemplos e situações que passamos são apenas algumas situações possíveis de se trabalhar com o recurso do Execute Statement. Dá-nos uma ideia do potencial de uso do comando. Para quem utiliza somente o InterBase ou mesmo outros bancos de dados que também suporte esse recurso padrão SQL, agora pode explorar a fundo essa

28

março 2011

Felipe Santos é especialista em InterBase. Trabalha com o InterBase desde 2001. atuando como consultor e instrutor do produto em todo Brasil. Especialista em ambientes críticos. Atua e trabalha com os maiores clientes do InterBase no Brasil. Participante ativo na comunidade, com diversos artigos publicados. Participante do grupo de beta testers mundial do produto. Palestrante em eventos como IB Tour, Borcon Conference, CodeRage Latin América, Delphi Developers Day, Linux Day, entre outros. Atualmente trabalhando na área técnica do InterBase na Presence Tecnologia – agente oficial especializado do produto no Brasil.

[email protected]

Dicas DELPHI

if(EditNames[i]=EditName)then Result:=EditTexts[i]; end;

Limpar Edits e Retornar valores apagados

Em uma de nossas últimas edições, publicamos uma dica para limpar todos os edits de um formulário e depois retornar os valores apagados. Os códigos a seguir são uma nova abordagem dessa dica, utilizando ao invés de eventos procedures genéricas, que no caso estarão contidas em uma unit à parte de qualquer projeto. Com essa abordagem, as procedures passam a não depender de nenhum formulário nem mesmo de quantas edits existem nesse formulário.

Veja que na função EditTextByName temos a utilização dos arrays EditNames e EditTexts. Esses arrays foram declarados na interface e receberão respectivamente os nomes das edits do formulário a ser limpo e os textos das edits do mesmo formulário. O preenchimento desses arrays é feito pela procedure FillArrays. A procedure FillArrays possui em seu corpo a função EditsCount, que é a responsável por retornar para a função FillArrays a quantidade de edits existentes no Formulário. Segue o código da procedure FillArrays e dentro dela a função EditsCount:

A unit que iremos criar para esse exemplo recebe o nome de Funcoes. Na seção interface, que é a seção da unit que será exportada para o projeto que fará uso da mesma, iremos declarar o seguinte:

procedure FillArrays(Form:TForm); function EditsCount:Integer; var i, iCount:integer; begin iCount:=0;

uses Sysutils,Windows,Forms,StdCtrls; procedure CleanEdits(Cleaner:Boolean;Form: TForm);

for i:=0 to Form.ComponentCount-1 do if(Form.Components[i] is TEdit) then

var

Inc(iCount);

EditTexts:array of string; EditNames:array of string;

Na sequência, na seção implementation colocaremos o código das procedures de “apoio” a procedure CleanEdits. Começaremos pela função EditTextByName. Essa função irá retornar o texto que deverá ser recolocado em uma determinada edit quando ela for preenchida com seu valor de antes da limpeza. Veja o código:

function EditTextByName(EditName:string):s tring; var i:integer; begin Result:=’’; for i:=0 to VarArrayHighBound(EditNames,1)do

Result:=iCount; end; var i, j:integer; begin SetLength(EditTexts,EditsCount); SetLength(EditNames,EditsCount); j:=0; for i:=0 to Form.ComponentCount-1 do if(Form.Components[i] is TEdit)then begin EditTexts[j]:=TEdit(Form. Components[i]).Text; EditNames[j]:=TEdit(Form. Components[i]).Name; Inc(j); end; end;

março 2011

29

Por fim iremos a codificação da procedure que será vista pelos projetos que utilizarão essa unit: A procedure CleanEdits, que declaramos na interface.

tipo boolean. Essa variável será utilizada para o controle do limpar – desfazer das edits. Essa variável deverá ter o valor True inicial.

A procedure CleanEdits tanto fará a limpeza das edits como a posterior “reversão” dessa limpeza, que é o preenchimento das edits com os valores que as mesmas continham antes da limpeza. O controle da tarefa, se é limpeza ou “reversão” é feita pelo parâmetro Cleaner. Quando esse parâmetro está true, será realizada a limpeza das edits. Quando estiver false, será realizada a “reversão” da limpeza.

Monte o layout da aplicação de testes com algumas edits e um botão limpar. Um exemplo de layout pode ser visto na figura a seguir:

Segue o código:

procedure CleanEdits(Cleaner:Boolean;Form: TForm); var i:integer; begin case Cleaner of True: begin FillArrays(Form); for i:=0 to Form.ComponentCount-1 do if(Form.Components[i] is TEdit)then TEdit(Form.Components[i]). Clear; end; False: for i:=0 to Form.ComponentCount-1 do if(Form.Components[i] is TEdit)then TEdit(Form.Components[i]). Text:=EditTextByName(TEdit(Form. Components[i]).Name); end; end;

No evento Onclick do botão limpar iremos fazer uso da procedure CleanEdits, além de um controle do limpar – desfazer. Segue o código:

procedure TForm1.Button1Click(Sender: TObject); begin CleanEdits(Cleaner,Self); Cleaner:=not Cleaner; if(Cleaner)then Button1.Caption:=’Limpar’ else Button1.Caption:=’Desfazer’; end;

Com a procedure CleanEdits concluímos a codificação da unit Funcoes. Vamos agora testar sua funcionalidade. Inicie um novo projeto no Delphi e salve-o em um diretório de sua preferência. Coloque a unit Funcoes nesse mesmo diretório. Acesse no Delphi o menu Project – Add to Project e inclua no projeto a unit Funcoes. Na unit do formulário da aplicação, inclua no uses a unit Funcoes. Declare na seção var da unit do formulário principal a variável Cleaner, do 30

março 2011

Anuncie conosco

e um Anuncie na revista e ganh site do The Club banner publicitário no

to: Solicite um orçamen

Skype: theclub_cadastro lub.com.br E-mail: cadastro@thec Fone: (14) 3732-1529

março 2011

março 2011

View more...

Comments

Copyright ©2017 KUPDF Inc.
SUPPORT KUPDF