Escolar Documentos
Profissional Documentos
Cultura Documentos
Asp3 PDF
Asp3 PDF
CRIANDO SITES
DINÂMICOS COM
ASP 3.0
Júlio Battisti
I
Criando Sites Dinâmicos com ASP 3.0
Todos os originais de livros enviados para avaliação pela Editora serão destruídos,
caso não sejam aprovados. Não será feita sua devolução em nenhuma hipótese.
Os conceitos emitidos nesta obra são de inteira responsabilidade do Autor.
E-mail:
editora@axcel.com.br
Visite nossa Home Page
http://www.axcel.com.br
II
Sumário
Créditos
Produção
Alexandre Ramires
Carlos Alberto Sá Ferreira
Revisão
Vanessa Garcia
Arte e Diagramação
Ingo Bertelli
Supervisor de Produção
Carlos Alberto Sá Ferreira
Capa
Ingo Bertelli
Editora de Produção
Gisella Narcisi
Editor Responsável
Ricardo Reinprecht
III
Criando Sites Dinâmicos com ASP 3.0
Agradecimentos
Embora este seja o meu segundo livro, a emoção e a satisfação de concluir mais esse trabalho
é talvez até maior do que no lançamento do primeiro. Foram meses de trabalho árduo,
escrevendo capítulos entre uma viagem e outra. Felizmente conseguimos concluir esse livro
no tempo estimado. E o principal é que saiu conforme o planejado. Penso que esse livro pode
ajudar bastante aqueles que querem aprender a tecnologia ASP, e até mesmo programadores
mais experientes.
No entanto, um trabalho como este não pode ser realizado sem que várias pessoas contribuam,
formando uma verdadeira equipe. Devo citar e agradecer, mais uma vez, a paciência, o amor, a
dedicação e o apoio de minha esposa Lu, diante de mais este desafio. Sei que não foi fácil ficar ao
meu lado, um final de semana após o outro, apenas escutando o barulho das teclas do computador.
Sem o seu apoio e compreensão, tudo seria muito mais difícil, para não dizer impossível. Prometo
que o próximo trabalho terá somente umas 200 páginas.
Gostaria também de agradecer o amor e apoio da minha mãe – Dona Lucy. Pessoa que sempre
me incentivou, apoiou, acreditou no meu trabalho e fez despertar em mim o amor pelos
livros. Mãe, mais uma vez agradeço por tudo o que fizestes e continuas fazendo por mim.
Agradeço mais do que tudo, o amor que sempre me deste, fazendo com que eu crescesse com
a certeza de estar sendo amado e querido.
Também quero agradecer a equipe da Axcel Books, pela sua paciência em corrigir e revisar
mais este trabalho, sempre com sugestões para a melhoria do mesmo, de tal forma que o
amigo leitor possa obter uma obra de qualidade.
Devo citar ainda minhas irmãs: Rose, Lacy e Sandra que sempre renovam minhas forças com
seus elogios sinceros e verdadeiros. Os momentos que passamos juntos, embora poucos, são
verdadeiros e profundos. Uma simples conversa, um almoço, um passeio; são momentos de
parada e reflexão. Momentos que nos mostram o quanto a vida vale a pena. Espero podermos
passar mais tempo juntos.
IV
Sumário
Sobre o Autor
Júlio Battisti é profissional certificado da Microsoft, tendo sido aprovado em 16 Exames da
Microsoft, com os quais obteve certificações como: MCP, MCP+I, MCSE, MCSE+I e MCDBA.
É Gerente de rede na Secretaria da Receita Federal, e conhece a tecnologia ASP desde sua
primeira versão. Também é autor de artigos de informática e trabalha com o desenvolvimento
e administração de Web sites. Autor do livro: “Série Curso Básico & Rápido Microsoft Windows
2000 Server”, publicado pela Editora Axcel Books. Atua como instrutor de cursos de
informática na Secretaria da Receita Federal, em outros cursos particulares e também para
turmas em Universidades.
V
Criando Sites Dinâmicos com ASP 3.0
VI
Sumário
Sumário
Introdução ........................................................................................................................................ 1
Sites Dinâmicos com ASP 3.0 ......................................................................................................... 1
Equipamento e Software Necessário ............................................................................................... 3
Instalando e Testando o IIS 5.0 ........................................................................................................ 4
Novidades e Melhorias do IIS 5.0 .................................................................................................. 10
Administração e Serviços .............................................................................................................. 11
Desenvolvimento de Aplicações Internet/Intranet ................................................................. 12
É Hora de Começar ......................................................................................................................... 13
Visão Geral dos Capítulos do Livro ........................................................................................ 13
Então, “Mãos à obra” ............................................................................................................... 14
Capítulo 1 – Uma Introdução à Tecnologia ASP ......................................................................... 15
Era uma Vez uma Internet com Conteúdo Estático ....................................................................... 16
Um Começo Quase sem Querer .............................................................................................. 16
Uma Visão Geral da Internet e de Seus Elementos ................................................................ 17
Conteúdo Dinâmico na Internet .................................................................................................... 19
A Era do Comércio Eletrônico ....................................................................................................... 23
Aplicações Para a Web ................................................................................................................... 29
A Complexidade de Gerenciamento do Modelo
Cliente/Servidor e Aplicações em Duas Camadas .................................................................. 29
Aplicações em Duas Camadas ................................................................................................ 30
Aplicações em Três Camadas ................................................................................................. 31
Aplicações em Quatro Camadas ............................................................................................. 33
Questões a Considerarmos nos Modelos em Três ou Mais Camadas .................................... 34
O que é ASP? .................................................................................................................................. 35
Preparando o Servidor Para Acompanhar os Exemplos ................................................................ 37
Criando a Estrutura de Pastas e Subpastas ............................................................................. 37
Tornando a Pasta Livro Parte dos Servidor IIS ....................................................................... 38
Alguns Exemplos Práticos ...................................................................................................... 44
O Tradicional “Hello World” ................................................................................................... 44
Um Exemplo de Página Dinâmica .......................................................................................... 48
Capítulo 2 – Uma Introdução ao VBScript .................................................................................. 53
Introdução ...................................................................................................................................... 54
O que é VBScript ............................................................................................................................ 54
Uma Revisão Rápida de HTML...................................................................................................... 56
Estrutura Básica de uma Página HTML .................................................................................. 56
Tags Para a Criação de Formulários HTML ............................................................................. 60
Criando o Formulário – a tag <FORM> </FORM> ....................................................... 60
Criando uma Caixa de Texto – a Tag <INPUT TYPE=“TEXT”> ................................... 62
Criando uma Caixa de Texto Para a Digitação
de Senhas – a tag <INPUT TYPE=“PASSWORD”> ....................................................... 64
Criando um “Check Box” – a tag <INPUT TYPE=“CHECKBOX”> ............................... 66
VII
Criando Sites Dinâmicos com ASP 3.0
VIII
Sumário
IX
Criando Sites Dinâmicos com ASP 3.0
X
Sumário
XI
Criando Sites Dinâmicos com ASP 3.0
XII
Sumário
XIII
Criando Sites Dinâmicos com ASP 3.0
XIV
Sumário
XV
Criando Sites Dinâmicos com ASP 3.0
XVI
Sumário
XVII
Introdução – Sites Dinâmicos com ASP 3.0
Introdução
Sites Dinâmicos
com ASP 3.0
1
Criando Sites Dinâmicos com ASP 3.0
Neste livro vamos abordar diversos assuntos relacionados com a criação de sites dinâmicos.
Desta forma, o leitor terá condições de aprofundar os seus conhecimentos em conteúdos de
grande importância para a criação de aplicativos para a Web. Iremos apresentar, juntamente
com conceitos teóricos, um grande número de exemplos e aplicações práticas em detalhes,
para que o leitor tenha condições de entender com clareza os assuntos abordados.
Desenvolver um site, que contenha essas características, não é uma tarefa simples. Exige o
uso de diversas tecnologias e ferramentas de apoio, além, é claro, de profissionais competentes
e adequadamente treinados.
Com a utilização da tecnologia ASP 3.0 – Active Server Pages – podemos obter bons resultados
na criação de sites com este nível de complexidade. Ao estudar os capítulos deste livro, o
leitor aprenderá a utilizar essa tecnologia. O aprendizado de ASP é simples, principalmente
para quem já conhece o Visual Basic ou o Visual Basic for Applications (linguagem de desenvol-
vimento para o Microsoft Office). Em várias situações, o código é bastante semelhante.
A tecnologia está disponível através da utilização do Internet Information Services 5.0, como
servidor Web, o qual pode ser instalado juntamente com o Windows 2000 Server. Podemos
notar uma mudança no nome do servidor Web da Microsoft. A versão anterior era denominada
Internet Information Server 4.0 – IIS 4.0; e a nova, Internet Information Services 5.0 – IIS 5.0.
2
Introdução – Sites Dinâmicos com ASP 3.0
Observe que o Server foi substituído por Services. No tópico sobre as novidades do IIS 5.0,
irei explicar o que significa, na prática, esta mudança.
Durante a instalação do Windows 2000 Server, podemos optar por instalar, ou não, o Internet
Information Services 5.0. Ao longo deste livro estarei utilizando a abreviatura IIS 5.0 (para
manter coerência com o padrão utilizado pela Microsoft no Resource Kit do Windows 2000
Server), ao fazer referência ao Internet Information Services 5.0. Caso não tenhamos instalado
o IIS 5.0 na instalação do Windows 2000 Server, podemos adicioná-lo quando for necessário.
Para isso, utilizamos o ícone Adicionar ou remover programas, no Painel de controle. No
próximo tópico desta introdução, veremos como instalar o IIS 5.0.
É importante salientar que o IIS 5.0, somente está disponível no Windows 2000 Server. Isso
significa que não é possível você continuar utilizando o Windows NT Server 4.0 (com o qual
está disponível o IIS 4, através da instalação do Option Pack 4.0) e apenas fazer o upgrade do
IIS 4.0 para o IIS 5.0. Também é importante destacar que as novas características do ASP 3.0,
somente estão disponíveis no IIS 5.0. Em outro tópico desta introdução estarei abordando
essas novas características.
Se o equipamento vai ser utilizado como um servidor Web na Internet, vários são os aspectos
a serem considerados, tais como:
➥ Aplicações implementadas e recursos de hardware necessários, como memória, disco
e processador.
➥ Número estimado de acessos simultâneos e diários, sendo esta uma das estimativas
mais difíceis de se obter, uma vez que o sucesso de um site pode ser determinado por
um número muito grande de fatores, nem todos de fácil mensuração.
➥ Grau de segurança necessário desejável. Neste caso, entram questões como criptografia,
uso de certificados digitais, criação de VPN – Virtual Private Networks (Redes Privadas
Virtuais) –, procedimentos de recuperação de falha, plano de contingência, etc.
➥ Percentual de “folga” desejado para recursos tais como: memória, processador, disco. Ao
projetar um site, é bastante comum utilizar hardware que atenda as necessidades atuais
com uma certa folga, para que seja possível suportar crescimentos maiores do que os
3
Criando Sites Dinâmicos com ASP 3.0
Para maiores informações sobre como planejar a capacidade de hardware para um servidor
Web com o IIS 5.0, consulte o capítulo “Capacity Planning” do livro “Internet Information
Services Resource Guide”, parte integrante do Windows 2000 Server Resource Kit.
Como equipamento para ser utilizado em casa, ou em um laboratório de teste na sua empresa,
aconselho a seguinte configuração:
➥ Processador Pentium 200 ou superior.
➥ 64 MB de RAM, sendo 128 MB, altamente recomendável.
➥ 2 GB de disco rígido.
Com menos de 64 MB de RAM, o Windows 2000 Server não pode ser instalado. Sendo detectada
memória inferior a 64 MB durante o processo de instalação, o mesmo será suspenso.
Além do Windows 2000 Server e do IIS 5.0, também precisaremos ter os seguintes programas
e serviços instalados, para que possamos acompanhar os exemplos deste livro:
➥ Internet Explorer 4.x (ou superior) ou Netscape Navigator 4.x.
➥ Microsoft Transaction Services (vem junto com o Windows 2000 Server).
➥ Microsoft Index Services (vem junto com o Windows 2000 Server).
Em cada um dos capítulos, estaremos apresentando vários exemplos práticos. Através destes
exemplos, você poderá entender melhor a aplicação dos conceitos teóricos apresentados. Em
muitas situações, a melhor maneira de entender um determinado assunto, é através da
utilização do mesmo para resolução de um problema prático do dia-a-dia. Muitos dos exemplos
apresentados, podem ser facilmente adaptados para uso em aplicações que você esteja
desenvolvendo. Situações como acesso a banco de dados através de páginas Web, indexação
e pesquisa de conteúdos, implementação de mecanismos de segurança, etc., são comuns a
maioria das aplicações Web atuais. Agora vamos aprender a instalar o IIS 5.0.
4
Introdução – Sites Dinâmicos com ASP 3.0
5
Criando Sites Dinâmicos com ASP 3.0
Se esta opção estiver marcada, o IIS 5.0 já está instalado. Neste caso clique no botão Cancelar.
Depois é só fechar a janela Adicionar ou remover programas e o Painel de controle.
Se esta opção estiver desmarcada, significa que o IIS 5.0 ainda não foi instalado. Marque esta
opção para instalar este serviço.
Observe que ao marcar a opção, o botão Detalhes é habilitado. O IIS 5.0 é formado por uma
série de componentes e funcionalidades. Existe um servidor de páginas (servidor HTTP), um
servidor de FTP, um servidor de notícias (NNTP), etc.
Ao instalarmos o IIS 5.0, podemos escolher um ou mais dos seus componentes, dependendo
das necessidades do nosso site. Não é necessários que todos os componentes do IIS 5.0 sejam
instalados. Por exemplo, se o serviço de cópia de arquivos não for necessário, não temos
porque instalar o serviço de FTP.
6
Introdução – Sites Dinâmicos com ASP 3.0
DICA
Instale somente os serviços realmente necessários. Não é uma boa idéia instalar todos os serviços
disponíveis, já que somente alguns serão utilizados. Quanto mais serviços instalados, maiores
as possibilidades de ataque e quebra da segurança do site, por parte de um hacker.
7
Criando Sites Dinâmicos com ASP 3.0
8
Introdução – Sites Dinâmicos com ASP 3.0
17. Caso o Windows 2000 Server não encontre os arquivos necessários à instalação no
disco rígido, você será solicitado a inserir o CD de instalação do Windows, conforme
indicado pela Figura 1.7.
18. Insira o CD e dê um clique em OK. O Windows 2000 Server inicia o processo de cópia
dos arquivos.
19. Após finalizada a cópia dos arquivos, o Assistente emite uma mensagem dizendo que
o processo foi concluído com sucesso.
20. Dê um clique no botão Concluir para encerrar o Assistente.
21. Você estará de volta à janela Adicionar ou remover programas. Dê um clique no botão
Fechar para sair desta janela.
22. Você estará de volta ao Painel de controle. Feche o Painel de controle.
23. Agora o IIS 5.0 está instalado e pronto para funcionar.
IMPORTANTE
Caso você não tenha acesso a um computador com o Windows 2000 Server não tem problema.
Você pode acompanhar a maioria dos exemplos deste livro, utilizando o Windows 2000 Profes-
sional. A maneira de instalar o IIS 5.0 é exatamente a mesma, quer seja no Windows 2000
Server, ou no Windows 2000 Professional. Para os exemplos mais simples, até mesmo o Per-
sonal Web Server, que acompanha o Windows 98, pode ser utilizado. Porém no Personal Web
Server, não existem os conceitos de Transação e segurança disponíveis no IIS 5.0.
Agora que já temos o IIS 5.0 instalado, vamos testar se o mesmo está funcionando corretamente.
9
Criando Sites Dinâmicos com ASP 3.0
Esta é a página inicial padrão do IIS 5.0 logo após a instalação. Isto comprova que o IIS 5.0 foi
instalado com sucesso.
3. Feche o Internet Explorer.
No próximo tópico, irei apresentar as melhorias do IIS 5.0, em relação a versão anterior, IIS
4.0, dentre as quais destaca-se a versão 3.0 do ASP – Active Server Pages 3.0, com a qual
estaremos trabalhando neste livro.
10
Introdução – Sites Dinâmicos com ASP 3.0
Administração e Serviços
Os novos recursos do IIS 5.0 aumentaram a sua estabilidade e segurança. Novos assistentes
foram introduzidos para facilitar as tarefas mais comuns de administração e segurança. Eis
algumas das novidades:
➥ Reinicialização de download: Agora o serviço de FTP é capaz de reinicializar um down-
load que tenha sido interrompido, a partir do ponto em que a interrupção ocorreu, isso
evita que tenhamos que começar do zero. Característica de grande utilidade, principal-
mente para arquivos grandes, uma vez que a velocidade da Internet ainda não é
nenhuma maravilha.
➥ Compactação HTTP: Toda a informação, enviada via HTTP, pode ser compactada. Para
arquivos de texto (arquivos com código HTML, por exemplo), o ganho é considerável
– na maioria dos casos, acima de 70 %. Podemos utilizar compactação também com
arquivos de imagens (.jpg, .gif), ou qualquer outro tipo de arquivo transmitido via
HTTP. O browser deve ser capaz de descompactar a informação (Internet Explorer e o
Netscape Navigator em versão 4.x, dentre outros).
➥ Assistentes de segurança: Novos assistentes facilitam a execução de tarefas relacionadas
com a segurança. Por exemplo, o Assistente de Permissões (Permissions Wizard) facilita
a tarefa de atribuir permissões de acesso de arquivo. Esta era uma tarefa complicada
em versões anteriores, uma vez que a permissão efetiva, depende da combinação entre
as permissões estabelecidas no Sistema Operacional (permissões NTFS) e as do IIS.
Temos também um assistente para gerenciar Certificados.
➥ Contabilidade de processos (Process Accounting): Modificações introduzidas no ker-
nel do Windows 2000 Server, permitem um controle bastante refinado nos processos
que estão rodando. Com isso, pode ser determinado o quanto de processador cada site
virtual está consumindo (lembrando que o IIS admite diversos sites em um único
servidor). Com isso é possível determinar se um dos sites está consumindo, despropor-
cionalmente, tempo do processador. Por exemplo, pode ser que uma página ASP mal
implementada, esteja elevando a carga no processador. Esta característica também pode
ser utilizada por provedores de conteúdo, os quais hospedam sites de outras empresas,
como um parâmetro para a cobrança do serviço de hospedagem do site.
➥ Melhor administração através do browser: Administrar o IIS 5.0, remotamente, através
do browser ficou bem mais fácil. Além disso, a maioria das tarefas podem ser executadas
através dele, o que não era possível em versões anteriores. O administrador também
pode criar “Contas Administrativas” (conhecidas como Operadores), com permissões
11
Criando Sites Dinâmicos com ASP 3.0
limitadas a determinadas tarefas, por exemplo, criar diretórios virtuais. Com isso é
possível distribuir a administração do IIS entre diversos Administradores.
➥ Web Distributed Authoring and Versioning (WebDAV): Permite que o autor de páginas, possa
remotamente editar, mover ou eliminar arquivos. Também é possível editar as propriedades
de arquivos e diretórios, remotamente, através de uma conecção HTTP. Com WebDAV, o
autor está utilizando o HTTP como um protocolo de compartilhamento de arquivo.
➥ Autenticação Digest: Aumenta a segurança e a confiabilidade da autenticação dos usuários.
Com a Autenticação Digest, é feito um hash das informações de senha antes da transmissão.
Informações ligadas à sessão e a hora do sistema são adicionadas ao hash. Com isso, mesmo
que a senha seja interceptada, não poderá ser decifrada. Os demais tipos de autenticação
continuam existindo: HTTP Basic, Windows NT Challenge/Response e NTLM authentica-
tion (conhecida como “integrated Windows authentication”).
São muitas as novidades do IIS 5.0 e uma das melhores fontes para conhecê-las é o livro
Internet Information Services Resource Guide (em Inglês), o qual, conforme descrito
anteriormente, faz parte do Windows 2000 Server – Resource Kit.
12
Introdução – Sites Dinâmicos com ASP 3.0
É Hora de Começar
Bem, já estamos com o IIS instalado e funcionando, conhecemos as novidades desta versão e
estamos ansiosos para começar a trabalhar com páginas ASP, em sua versão 3.0. Pois é
exatamente o que estaremos fazendo deste ponto em diante. Você aprenderá a utilizar os
principais recursos do ASP 3.0, podendo criar páginas e aplicações para Web, com diversos
recursos e funcionalidades.
Abaixo apresento uma pequena descrição do conteúdo de cada capítulo deste livro. Caso
você esteja iniciando os estudos sobre ASP, aconselho que leia os capítulos na seqüência
apresentada. Caso já trabalhe com ASP, sinta-se a vontade para ler os capítulos na ordem que
julgar mais adequada. Cada capítulo apresenta exemplos completos, os quais ilustram os
conceitos teóricos apresentados.
13
Criando Sites Dinâmicos com ASP 3.0
drivers ODBC, até métodos mais atuais, como a utilização de ADO (ActiveX Data Ob-
jects) e OLE-DB Providers.
➥ Capítulo 6: Neste capítulo trataremos de aspectos avançados de conexão de páginas ASP
com bancos de dados. Veremos como implementar pesquisas avançadas, efetuar
atualizações e alterações em bancos de dados. Analisaremos algumas situações usuais do
dia-a-dia. Também serão abordados aspectos ligados à segurança no acesso às informações.
➥ Capítulo 7: Abordaremos a conexão de páginas ASP com banco de dados. Vamos realizar
um estudo completo do objeto Command e aprender a utilizá-lo para enviar parâmetros
para consultas Parametrizadas do Microsoft Access.
➥ Capítulo 8: Veremos os conceitos de sessão e estado da conexão. Será apresentado o
conceito de aplicação Web. Aprenderemos, em detalhes, a utilizar os objetos Applica-
tion e Session. Também aprenderemos sobre a função e como utilizar o arquivo global.asa.
➥ Capítulo 9: Trataremos de aspectos de segurança envolvendo páginas ASP.
➥ Capítulo 10: Estudaremos diversos componentes que já vem junto com o IIS e fornecem
funcionalidades adicionais, bastante úteis na criação de aplicações Web.
➥ Capítulo 11: Neste capítulo faremos um estudo completo sobre um dos objetos mais
complexos do ASP: FileSystemObject. Estudaremos todos os seus métodos, bem como
os objetos derivados: Drive, Folder e File.
➥ Capítulo 12: Neste capítulo apresentaremos o objeto ASP Error. Também aprenderemos
sobre o conceito de Transações, além de aprendermos a utilizar a diretiva #include e
as diretivas @.
➥ Apêndice A: Teremos uma listagem dos comandos e funções mais utilizados na
linguagem VBScript, que poderá ser usada como uma referência.
Sem a menor sombra de dúvidas, a facilidade no aprendizado, aliada aos recursos oferecidos,
é que tornaram a tecnologia de páginas ASP largamente difundida e utilizada. Quem já
programa em Visual Basic, ou Visual Basic for Applications, ficará absolutamente à vontade
para aprender a tecnologia ASP.
14
Capítulo 1 – Uma Introdução à Tecnologia ASP
Capítulo 1
Uma Introdução à
Tecnologia ASP
15
Criando Sites Dinâmicos com ASP 3.0
A Internet faz parte da vida de um número cada vez maior de pessoas. Fazer compras, sem
sair de casa; receber, diretamente no seu computador, as últimas notícias; comprar e vender
ações; procurar emprego pela rede. Todos são exemplos de facilidades oferecidas pelo uso da
Internet. Talvez seja mais simples enunciar o que não é possível de se fazer pela rede, do que
listar todas suas possibilidades. Mas nem sempre foi assim. Para chegar ao nível que nos
encontramos hoje, com a disponibilização dos mais variados serviços via Internet, muita
evolução ocorreu. Desde os tempos de conteúdo meramente informativo, até a possibilidade
de escutar rádio e fazer compras pela rede, muitas tecnologias novas surgiram. E o ritmo de
evolução não pára, pelo contrário, parece acelerar cada vez mais.
Neste capítulo veremos um pouco sobre esta evolução da Internet. Passaremos pelas diversas
fases, desde a criação de sites com conteúdo estático, até os aplicativos de n-camadas atuais.
Também veremos como a tecnologia ASP, contribui para a criação de sites dinâmicos. Com
isso você verá em que situações é indicada a utilização de páginas ASP.
16
Capítulo 1 – Uma Introdução à Tecnologia ASP
passaram a fazer uso da Internet para fins comerciais. Desde então a rede expandiu-se
enormemente, atingindo, hoje, milhões de pessoas em todo o mundo.
A popularização definitiva da rede veio com a criação de uma interface gráfica. Com a criação
da linguagem HTML, servidores HTTP, e programas para acessar as páginas HTML
armazenadas nos servidores (também conhecidos como browser ou navegadores), a Internet
tornou-se mais popular do que nunca. Este foi o momento do surgimento da WWW – World
Wide Web. Talvez a melhor tradução para World Wide Web seja: “Teia de Alcance Mundial”.
Esta é a idéia que temos de Internet. Uma rede (teia) que conecta computadores do mundo
inteiro (alcance mundial), proporcionando a troca de informações e uma infinidade de serviços
e facilidades para as empresas e para o cidadão comum.
Com certeza, os criadores da ARPANET, e depois da Internet, não imaginavam uma expansão
e popularização tão rápida da rede. Hoje, vemos anúncios de sites na televisão, durante o
Telejornal e na transmissão de partidas de futebol. A maioria dos jornais possui um caderno
de informática, quase totalmente dedicado a assuntos relacionados com a Internet. Vemos
reportagens sobre a rede em todas as revistas, e não somente nas especializadas em Informática,
que agora dedicam quase a totalidade de suas matérias a assuntos da Internet. Enfim, a Internet
já faz parte do nosso dia-a-dia; veio para ficar e facilitar a nossa vida.
Agora vamos conhecer um pouco mais sobre a Internet e os diversos elementos que a compõem.
Internet
Usuário
Servidor Web
Usuário doméstico conectado à Páginas HTML estáticas
Internet através da linha telefônica.
17
Criando Sites Dinâmicos com ASP 3.0
Antes de continuar com as explicações, considere o diagrama indicado na Figura 1.1. Nesta
figura, temos representados os elementos mais comuns da Internet, conforme descrito a seguir.
➥ Usuário: Representamos um usuário residencial. Normalmente este tipo de usuário faz
a conexão através da linha telefônica comum. Para isso é preciso a utilização de um
provedor de acesso, que fornece a conexão com a Internet. O usuário utiliza um programa
conhecido como navegador (browser), para acessar o conteúdo da Internet. Os dois
navegadores mais conhecidos são o Internet Explorer da Microsoft, e o Netscape Naviga-
tor da Netscape. Quando o usuário acessa um determinado conteúdo, dizemos que ele
está acessando um site (também encontramos o uso da palavra “página”, ao invés de
site). Por exemplo, quando o usuário acessa o endereço http://www.microsoft.com/brasil,
dizemos que ele está acessando a página, ou o site, da Microsoft Brasil. Quando o usuário
acessa o endereço http://wwww.microsoft.com/vbasic, dizemos que o usuário está
acessando a página do Visual Basic, no site da Microsoft. Durante este livro, estarei
utilizando a palavra página, significando que o usuário está acessando um determinado
conteúdo na Internet, ou na Intranet da empresa.
➥ Internet: Pelo fato de ser formada por um grande número de equipamentos – servidores,
hubs, switch, linhas de comunicação, satélites, etc. –, representamos a Internet como
uma nuvem. Esta é a representação que você encontrará na maioria dos livros.
➥ O servidor Web: Neste caso é o servidor que contém a informação solicitada pelo usuário.
Por exemplo, ao digitar www.axcel.com.br, no campo endereço do navegador, o usuário
está solicitando que seja carregado o conteúdo da página inicial do site da Editora
Axcel Books. Observe que o servidor também está conectado à Internet, isto é, faz
parte da Internet. As páginas armazenadas no servidor são desenvolvidas utilizando-
se a linguagem HTML – Hypertext Markup Language. Você pode encontrar muita
informação sobre HTML na própria Internet. O órgão responsável pela padronização
da linguagem HTML é o w3. No site www.w3.org, você pode encontrar um grande
volume de informações sobre HTML.
Uma vez criada a página (através da utilização do HTML), a mesma não é modificada. Cada
vez que o usuário se conectar à página, verá o mesmo conteúdo. A única maneira de alterar o
conteúdo, é alterando o código HTML. Com isso, da próxima vez que o usuário se conectar à
página, verá a nova versão da mesma. Porém esta metodologia de modificação de páginas é
trabalhosa e pouco produtiva. Imagine que você esteja publicando um catálogo de produtos,
com informações diversas sobre vários produtos, tais como: código do produto, descrição e
18
Capítulo 1 – Uma Introdução à Tecnologia ASP
preço. Uma das maneiras de criar este catálogo é através da utilização do código HTML, para
criar na página uma tabela com informações sobre os diversos produtos. Porém cada vez que
houver uma modificação em um dos produtos, você terá que editar a página e salvar a nova
versão da mesma. Convenhamos que é um processo bastante trabalhoso.
Embora trabalhoso, era assim que funcionavam os primeiros sites, no início da era WWW. O
conteúdo era estático, ou seja, alterações nas páginas, implicavam em alterações, diretamente
no código HTML das mesmas. Imagine o trabalho para a manutenção de grandes sites, com
diversas áreas de informações, onde o número de páginas pode facilmente chegar na casa dos
milhares. Com isso a evolução para a criação de conteúdo mais dinâmico, foi um processo
natural e necessário.
Pelo diagrama, podemos ver que o usuário tem possibilidade de enviar informações para a Internet,
e não apenas receber. Isto possibilitou o desenvolvimento de uma série de serviços, impossíveis de
serem desenvolvidos apenas com a utilização de páginas criadas com HTML.
19
Criando Sites Dinâmicos com ASP 3.0
Dentre as várias alternativas que surgiram para a geração de conteúdo dinâmico, podemos
citar a tecnologia de Active Server Pages, a qual faz parte do servidor Web IIS (Internet
Information Services), da Microsoft. Podemos criar uma página ASP, capaz de receber os
dados enviados por um formulário e armazenar estes dados em um banco de dados, por
exemplo o Microsoft Access ou o Microsoft SQL Server. Aprenderemos a criar este tipo de
página ASP, no Capítulo 4. Agora veremos apenas alguns exemplos simples da utilização de
ASP, sem conexão com bancos de dados.
Com a conexão de páginas com bancos de dados, uma série de possibilidades foram abertas,
como por exemplo:
➥ Criação de páginas para pesquisa em banco de dados.
➥ Cadastro de usuários que acessam o site, bem como a entrega de conteúdo
personalizado, de acordo com as preferências do usuário. Por exemplo, ao entrar no
site, o usuário informa um nome e senha, com os quais foi previamente cadastrado.
Com isso é aberta uma página com opções e conteúdo personalizados, de acordo com
preferências especificadas pelo usuário.
➥ Desenvolvimento de aplicações residentes em servidores Web e acessíveis através
do navegador. Devemos observar que estas aplicações ainda eram limitadas e não
possuíam todas as funcionalidades das aplicações convencionais, desenvolvidas para
o ambiente Windows.
Apesar das suas limitações, um novo panorama desenhava-se na Internet com a possibilidade
da criação de sites mais dinâmicos, através da conexão com bancos de dados. Apenas para
exemplificar o funcionamento de uma pesquisa em banco de dados, através da Internet,
observe a Figura 1.3.
20
Capítulo 1 – Uma Introdução à Tecnologia ASP
Vamos analisar os passos executados, desde o momento que o usuário preenche o critério de
pesquisa, até o momento em que o resultado da consulta é retornado:
➥ O usuário acessa a página onde temos um formulário para a digitação de um ou mais
critérios de pesquisa. Por exemplo, pode ser uma consulta a uma base dos CEP’s de
todo o Brasil. O usuário poderia digitar o nome da Cidade, selecionar um Estado e
digitar o nome, ou parte do nome, da Rua, conforme indicado pela Figura 1.4.
➥ Após preencher o(s) critério(s) de pesquisa, o usuário clica em um botão Enviar ou
Pesquisar. Os dados digitados no formulário são enviados para o servidor.
➥ Um script CGI, ou uma página ASP, no servidor, recebe os dados enviados pelo usuário.
Com estes dados, é montado um comando (normalmente uma String SQL – Structured
Query Language), o qual vai efetuar a consulta no banco de dados. Após montado o
comando, o mesmo é enviado para o servidor de Banco de Dados (que pode ser uma
máquina separada, ou pode estar instalado no próprio servidor Web).
➥ O servidor de Banco de Dados recebe o comando de pesquisa, localiza um ou mais
registros que atendam o(s) critério(s) de pesquisa e retorna o resultado para o script
CGI, ou para a página ASP.
➥ Com o resultado retornado pelo servidor de Banco de Dados, o script CGI, ou a página
ASP, monta uma página HTML, normalmente no formato de uma tabela, e envia esta
página HTML de volta para o navegador do cliente, conforme indicado na Figura 1.5.
Caso não seja encontrado nenhum registro que atenda o(s) critério(s) especificado(s), é
retornada uma página com uma mensagem de que não foi encontrado nenhum registro.
21
Criando Sites Dinâmicos com ASP 3.0
22
Capítulo 1 – Uma Introdução à Tecnologia ASP
Além das novas complexidades, novas questões ainda precisavam ser resolvidas (sendo que
algumas ainda hoje não estão completamente solucionadas). Por exemplo, para vender pela
Internet, as questões de segurança precisavam ser bem resolvidas. Quem arriscaria a colocar
o número do cartão de crédito em um site de Comércio Eletrônico, sem a garantia de que o
mesmo seja seguro?
Além disso, existe a necessidade de troca de informações entre as diversas empresas, via
Web. Por exemplo, quando você vai fazer uma compra pela Internet, você digita o número do
seu cartão de crédito. Antes de finalizar o pedido, a empresa que está vendendo precisa verificar,
junto a operadora do cartão, se o número fornecido é válido, se não é um cartão vencido, se não
é um cartão que foi roubado, etc. Todas estas informações precisam ser verificadas rapidamente,
em tempo real. O usuário não está a fim de aguardar muito tempo em frente ao computador.
Note que um número grande de fatores começa a surgir, principalmente com o início do
Comércio Eletrônico. Para resolver tantos problemas, a simples conexão de páginas com bancos
de dados, embora necessária, não era mais suficiente.
No próximo item veremos um pouco mais sobre esta nova geração de sites Web, os quais
fazem uso de diversas tecnologias. Lembrando que a cada dia novidades estão surgindo.
Grande parte do orçamento de informática das empresas está direcionada para atividades ligadas
ao Comércio Eletrônico. Novas tecnologias surgem todos os dias, prometendo facilitar a criação
de sites para essas e outras atividades relacionadas. Neste tópico veremos quais as tecnologias
necessárias para criação destes sites, bem como as complexidades envolvidas.
23
Criando Sites Dinâmicos com ASP 3.0
Hoje, um dos grandes desafios é conhecer o cliente, saber identificar seus hábitos e armazenar
o maior número de informações sobre ele, tal como o histórico de compras e pesquisas
realizadas no catálogo de produtos. De posse destas informações, o site deve ser capaz de
fazer ofertas personalizadas para o cliente. Posso citar o meu caso como exemplo. Há tempos
que compro livros importados em um determinado site. Ao acessar o site, após me identificar,
aparece um link: “Sugestões para o Júlio”. Vejam que até o link já vem personalizado; isso
atrai o cliente. É como entrar no mercadinho da esquina e o seu Manoel ir dizendo: “Olá seu
Júlio, aquele queijo colonial que o Sr. gosta, chegou.” Ao clicar no link de sugestões, recebo
uma listagem de livros. O mais interessante é que, nesta listagem, realmente estão os livros
nos quais estou interessado. Que milagre é este? Não é milagre nenhum. Desde a primeira
compra, o site vem armazenando informações sobre as pesquisas que faço no catálogo de
livros e sobre o que efetivamente compro. Com isso, foi possível identificar minhas preferências
e elaborar uma lista de sugestões personalizada. Quanto maior a quantidade de informações,
mais precisa será esta lista de sugestões.
Vejam que os sites de Comércio Eletrônico estão tentando fazer o que o seu Manoel do
mercadinho da esquina faz há muitos anos. Estão tentando dar um tratamento personalizado
para os seus clientes, com o objetivo de mantê-los satisfeitos. Clientes satisfeitos significam
vendas e lucros para a empresa.
24
Capítulo 1 – Uma Introdução à Tecnologia ASP
Vejam que os dados precisam ser obtidos e armazenados em um banco de dados. Depois, a
segurança dos dados precisa ser garantida. Já pensou se alguém consegue invadir o site de
uma empresa e obter uma listagem de números de cartões de crédito? Seria péssimo para a
imagem e para as vendas desta empresa. Além da segurança, novas aplicações estão sendo
construídas para fazer uso destes dados, com o objetivo não só de melhorar as vendas, mas
também de melhorar as relações com os clientes. Não basta que a empresa seja capaz de
vender; para sobreviver ela precisa continuar vendendo para o cliente. Para continuar
vendendo, isto é, para fidelizar o cliente, a área de atendimento é de fundamental importância.
Se você compra, por exemplo, um CD e o mesmo é entregue fora do prazo, você reclama. Se
sua reclamação não for satisfatoriamente atendida, você deixará de comprar desta empresa e
irá procurar outra. Afinal na Internet, o concorrente está a um clique de mouse.
Um dos assuntos mais discutidos no momento é representado pela sigla CRM – Customer
Relationship Management. Traduzindo teríamos: Gerenciamento das Relações com o Cliente.
CRM representa um conjunto de soluções – de hardware e software –, capazes de melhorar a
relação das empresas com os clientes, principalmente no atendimento às questões do cliente,
quer seja suporte técnico, dúvidas sobre novos produtos, etc.
Quem já não ligou para uma central de atendimento e teve que contar a mesma história uma
dezena de vezes. Você liga alguém atende. Você descreve o seu problema, a pessoa diz que não
é com ela e passa para um outro setor. Um novo atendente e a mesma história; você é passado
para um outro setor. Depois da décima transferência (considerando que você seja uma pessoa
paciente, senão após a terceira você já desligaria o telefone), você desliga irritado, sem ter
solucionado o problema. Muito provavelmente, esta empresa acaba de perder mais um cliente.
Clientes não são raros, raras sãs as empresas que conseguem fidelizá-lo de forma eficiente.
Melhorar o atendimento ao cliente, ou de uma maneira mais genérica, a relação dos clientes
com a empresa, é o objetivo do CRM. Ao ligar para uma central de atendimento, a pessoa
identifica-se através do seu código de cliente, o sistema de CRM busca em uma base de
dados consolidada todas as informações sobre o cliente. Então, ele descreve o problema,
que é inserido no sistema. Caso o atendente não seja capaz de solucioná-lo, a chamada é
transferida diretamente para a pessoa capaz de solucionar o problema. O cliente não precisa
repetir toda a história porque toda a descrição do problema também está acessível à pessoa
que irá atendê-lo (os dados foram passados pelo sistema de CRM, quando da transferência
do chamado). O cliente é atendido, soluciona o seu problema e fica satisfeito. Cliente
satisfeito continua comprando.
25
Criando Sites Dinâmicos com ASP 3.0
A descrição do parágrafo anterior representa uma situação ideal; é claro que os sistemas de
CRM ainda não são perfeitos. Porém novas técnicas estão sendo introduzidas, através da
possibilidade de atendimentos via Internet, acessando o site da empresa. Com a melhoria dos
sistemas de telecomunicações, poderemos tornar realidade um atendimento de alta qualidade
e conclusivo, através da Internet. Por exemplo, o cliente está pesquisando o catálogo de
produtos. Na página com os dados do produto, existe um link “Outras dúvidas”. Ao clicar
neste link, o cliente entra numa seção de bate-papo com um atendente da empresa. O cliente
pode colocar as suas dúvidas, que serão respondidas em tempo real. Tendo as dúvidas
solucionadas, há maior probabilidade de ser feito um pedido. Além disso as dúvidas do
cliente podem ser armazenadas no banco de dados. Quando uma determinada dúvida começar
aparecer com certa freqüência, os dados que a solucionam podem ser disponibilizados no
catálogo. Assim, os próximos clientes que tiverem a mesma dúvida, não precisarão entrar em
contato com o atendimento. Vejam que novamente estamos em um processo de aquisição de
informações, através do próprio site, e utilização destas informações para melhorar a qualidade
dos serviços e produtos oferecidos.
Concessionárias Fornecedores
Servidor Servidor
Servidor Servidor
Servidor Servidor
Temos uma rede de concessionárias que prestam serviços de manutenção para uma
determinada marca de automóveis. O objetivo é ter um controle automatizado de estoque.
Cada peça catalogada possui um nível mínimo de unidades em estoque. Quando este nível é
atingido, o banco de dados deve lançar um pedido para este item automaticamente. O
funcionamento do sistema é descrito a seguir.
26
Capítulo 1 – Uma Introdução à Tecnologia ASP
O cliente vai na concessionária para comprar uma determinada peça. O atendente efetua a
venda e o estoque é atualizado. Se a peça atingir o nível mínimo, previamente estabelecido,
um pedido será automaticamente gerado. Este pedido contém informações sobre a
concessionária, bem como sobre as peças que estão sendo encomendadas.
Observe que, neste caso, existe uma troca de informações entre as concessionárias e os
fornecedores. Para que possa haver esta troca de informações, os sistemas das duas
empresas devem ser capazes de trocar dados em um formato comum, efetuando negócios
através da Internet.
Vamos introduzir algumas questões que complicam um pouco mais a infra-estrutura necessária
para a realização do B2B. Por exemplo, ao invés de comprar uma determinada peça sempre do
mesmo fornecedor, o sistema deve ser capaz de enviar o pedido para vários fornecedores, e
selecionar aquele que fizer a melhor oferta, tanto em termos de preço quanto de prazo de
entrega. Neste caso, a concessionária lança o pedido no seu site e aguarda as propostas dos
fornecedores. Após recebidas as respostas, uma delas é selecionada. Este parece ser um sistema
de leilão ao contrário, ou seja, o comprador anuncia que está precisando de um determinado
produto, e os fornecedores esforçam-se para fazer a melhor proposta. Esta forma de fazer compras
é conhecida como e-procurement. Em determinados casos, a lista de propostas está disponível
para todos os fornecedores, isto é, se um fornecedor A fez uma proposta e, depois, ao consultar
a lista, viu que um fornecedor B fez uma melhor do que a sua, ele pode alterar a sua proposta,
dentro do período de tempo estipulado pelo comprador, no nosso caso, a concessionária.
Vejam que mesmo no sistema de B2B, a lógica tem sido revertida em favor do cliente, isto é,
os fornecedores é que disputam o cliente, através de boas ofertas, preços competitivos e
prazos adequados de entrega.
Porém a criação de sistemas deste tipo é uma tarefa complexa. A todo o momento temos
acesso a informações de bancos de dados, questões de segurança no acesso a essas informações,
além de uma lógica bastante complicada. Em diversos pontos do processo podemos fazer uso
da tecnologia ASP, para criar soluções bem interessantes. O uso de páginas ASP, em conjunto
com outras tecnologias, possibilita a criação de soluções complexas como as exemplificadas
neste capítulo.
27
Criando Sites Dinâmicos com ASP 3.0
Vamos inserir mais alguns detalhes no nosso exemplo. Pode ser que além de fazer o pedido,
uma vez aprovada a compra, a concessionária deva fazer o pagamento do mesmo, por meio
de uma transação on-line. O pagamento pode ser feito, por exemplo, através de uma
transferência da conta corrente da concessionária para a conta corrente do fornecedor. Neste
ponto, precisamos introduzir o conceito de transação, o qual será bastante detalhado no
Capítulo 12, Conceitos Avançados: Transações e o Microsoft Transaction Services.
Uma transação, de maneira bastante simples, é um conjunto de ações que deve acontecer
como um todo, ou seja, todas as ações contidas na transação têm que ser finalizadas com
sucesso, ou nenhuma delas deve ser realizada. Caso uma das ações, contida na transação,
falhe, as que ainda estiverem pendentes devem ser canceladas; e as ações já realizadas devem
ser revertidas. Com isso garantimos que a transação acontece como um todo, ou que nenhuma
das suas ações são realizadas.
Início da Transação
Ação 1: Debita o valor da conta corrente da concessionária.
Ação 2: Credita o valor na conta corrente do fornecedor.
Final da Transação
Poderíamos entrar em níveis cada vez mais profundos, sobre os aspectos tecnológicos
necessários à realização do Comércio Eletrônico. Porém estas questões fogem ao escopo deste
livro (quem sabe em um trabalho futuro...). Neste livro estaremos aprendendo a utilizar a
tecnologia ASP para abordar alguns destes aspectos, através de exemplos práticos e
detalhadamente explicados.
28
Capítulo 1 – Uma Introdução à Tecnologia ASP
Conforme pode ser visto na Figura 1.7, temos servidores para arquivos, banco de dados e
outras funções, tais como: Servidores de impressão, servidores Web, etc. Tipicamente estas
redes são formadas por servidores, que são equipamentos com um maior poder de
processamento e armazenamento do que os Clientes, os quais, na maioria dos casos, são
microcomputadores ligados em rede.
29
Criando Sites Dinâmicos com ASP 3.0
Banco de Dados
No modelo em duas camadas, temos um programa que é instalado no cliente, e que faz acesso
a um banco de dados residente no servidor de Banco de Dados. Na maioria dos casos, a
máquina do cliente é um PC rodando Windows, e a aplicação cliente é desenvolvida utilizando-
se um dos ambientes conhecidos, conforme citado anteriormente. Sendo a aplicação Cliente,
um programa para Windows (na grande maioria dos casos), a mesma deve ser instalada em
cada um dos computadores da rede, que farão uso da aplicação. É o processo de instalação
normal, para qualquer aplicação Windows. No modelo em duas camadas, a aplicação Cliente
é responsável pelas seguintes funções:
➥ Apresentação: O código que gera a interface visível do programa faz parte da aplicação
Cliente. Todos os formulários, menus e demais elementos visuais, estão contidos no
código da aplicação Cliente. Caso sejam necessárias alterações na interface do programa,
faz-se necessária a geração de uma nova versão do programa, e todos os computadores
que possuem a versão anterior, devem receber a nova versão, para que o usuário possa
ter acesso as alterações da interface. Aí que começam a surgir os problemas no modelo
em duas camadas: uma simples alteração de interface é suficiente para gerar a
necessidade de atualizar a aplicação, em centenas ou milhares de computadores. O
gerenciamento desta tarefa é algo extremamente complexo.
30
Capítulo 1 – Uma Introdução à Tecnologia ASP
➥ Lógica do Negócio: As regras que definem a maneira como os dados serão acessados e
processados, são conhecidas como “Lógica do Negócio”. Fazem parte da Lógica do Negócio
desde funções simples de validação da entrada de dados, como o cálculo do dígito
verificador de um CPF, até funções mais complexas, como descontos escalonados para
os maiores clientes, de acordo com o volume da compra. Questões relativas à legislação
fiscal e escrita contábil também fazem parte da Lógica do Negócio. Por exemplo, um
programa para gerência de Recursos Humanos, desenvolvido para a legislação dos EUA,
não pode ser utilizado, sem modificações, por uma empresa brasileira. Isso acontece
porque a legislação dos EUA é diferente da legislação brasileira. Em síntese, as regras
para o sistema de Recursos Humanos são diferentes. Alterações nas regras do negócio
são bastante freqüentes em função das constantes mudanças na legislação do nosso
país. Com isso, faz-se necessária a geração de uma nova versão do programa cada vez
que uma determinada regra muda, ou quando regras forem sendo acrescentadas ou
retiradas. Desta forma, todos os computadores que possuem a versão anterior devem
receber a nova versão, para que o usuário possa ter acesso às alterações. Aqui temos
mais um problema do modelo em duas camadas: qualquer alteração nas regras do negócio
é suficiente para gerar a necessidade de atualizar a aplicação em centenas ou milhares
de computadores. O gerenciamento desta tarefa é algo extremamente complexo.
A outra camada, vem a ser o banco de dados, o qual fica armazenado em servidor da rede.
Uma aplicação desenvolvida em Visual Basic, a qual acessa um banco de dados em um servidor
Microsoft SQL Server, é um típico exemplo de uma aplicação em duas camadas.
Em busca de soluções para os problemas do modelo em duas camadas, é que surge a proposta
do modelo em três camadas, conforme analisaremos a seguir.
31
Criando Sites Dinâmicos com ASP 3.0
Todo o acesso do cliente ao banco de dados é feito de acordo com as regras contidas no servidor
de Aplicações. O cliente não tem acesso ao banco de dados, sem antes passar pelo servidor de
Aplicações. Com isso as três camadas são as seguintes:
➥ Apresentação: Continua no programa instalado no cliente. Alterações na interface do
programa geram a necessidade de atualizar a aplicação em todos os computadores,
onde a mesma está sendo utilizada. Porém, cabe ressaltar que alterações na interface
são menos freqüentes do que alterações nas regras do negócio.
➥ Lógica: São as regras do negócio, as quais determinam de que maneira os dados serão
utilizados. Esta camada foi deslocada para o servidor de aplicações. Desta maneira,
quando uma regra do negócio for alterada, basta atualizá-la no servidor de aplicações.
Após a atualização, todos os usuários passarão a ter acesso a nova versão, sem que seja
necessário reinstalar o programa em cada um dos computadores da rede. Vejam que ao
centralizar as regras do negócio em um servidor de Aplicações, estamos facilitando a
tarefa de manter a aplicação atualizada.
➥ Dados: Nesta camada temos o servidor de Banco de Dados, no qual reside toda a
informação necessária para o funcionamento da aplicação. Cabe ressaltar que os dados
somente são acessados através do servidor de Aplicação, e não diretamente pela
aplicação Cliente.
Com a introdução da camada de Lógica, resolvemos o problema de termos que atualizar a aplicação
em centenas ou milhares de computadores, cada vez que uma regra do negócio fosse alterada.
Porém continuamos com o problema de atualização da aplicação, cada vez que sejam necessárias
mudanças na interface. Por isso que surgiram os modelos de n-camadas. No próximo tópico,
iremos falar um pouco sobre o modelo em quatro camadas. No Capítulo 12, Conceitos Avançados:
Transações e o Microsoft Transaction Services, estaremos falando sobre camadas adicionais.
32
Capítulo 1 – Uma Introdução à Tecnologia ASP
Para acessar a aplicação, o cliente acessa o endereço da aplicação, utilizando o seu navegador.
Por exemplo http://www.empresa-abc.com/sistemas/cadastro.asp. Todo o acesso do cliente
ao banco de dados é feito de acordo com as regras contidas no servidor de Aplicações. O
cliente não tem acesso ao banco de dados, sem antes passar pelo servidor de Aplicações. Com
isso as quatro camadas são as seguintes:
➥ Cliente: Neste caso o cliente é o navegador utilizado pelo usuário, quer seja o Internet
Explorer, quer seja o Netscape Navigator, ou outro navegador qualquer.
➥ Apresentação: Passa para o servidor Web. A interface pode ser composta de páginas
HTML, ASP, ou qualquer outra tecnologia capaz de gerar conteúdo para o navegador.
Com isso alterações na interface da aplicação são feitas diretamente no servidor Web, e,
portanto, estas alterações estarão, automaticamente, disponíveis para todos os clientes.
Com isso não existe a necessidade de reinstalar a aplicação em todos os computadores
da rede. Fica muito mais fácil garantir que todos estão tendo acesso à versão mais
33
Criando Sites Dinâmicos com ASP 3.0
atualizada da aplicação. A única coisa que o cliente precisa ter instalado na sua máquina,
é o navegador. O acesso ao banco de dados é feito através do servidor de Aplicações.
➥ Lógica: São as regras do negócio, as quais determinam de que maneira os dados serão
utilizados. Esta camada está no servidor de Aplicações. Desta maneira, quando uma regra do
negócio for alterada, basta atualizá-la no servidor de Aplicações. Após a atualização, todos
os usuários passarão a ter acesso à nova versão, sem que seja necessário reinstalar o programa
em cada um dos computadores da rede. Vejam que, ao centralizar as regras do negócio em
um servidor de Aplicações, estamos facilitando a tarefa de manter a aplicação atualizada.
➥ Dados: Nesta camada temos o servidor de banco de dados, no qual reside toda a
informação necessária para o funcionamento da aplicação.
Com o deslocamento da camada de apresentação para um servidor Web, resolvemos o problema
de termos que atualizar a aplicação em centenas ou milhares de computadores, cada vez que
uma regra do negócio for alterada. Neste ponto a atualização das aplicações é uma tarefa mais
gerenciável, muito diferente do que acontecia no caso do modelo em duas camadas.
Para fazer o dimensionamento dos servidores, precisamos conhecer o número de usuários que
irão acessar a aplicação, o nível de exigência de cada usuário e os recursos necessários pelos
softwares do servidor, entre outros fatores. Para determinar o nível de recursos necessários em
cada um dos servidores, você precisa fazer um estudo bem detalhado, de tal forma que o servidor
não fique subdimensionado. Quando o servidor não está corretamente dimensionado, a tendência
é que o acesso a aplicação fique bastante lento, causando insatisfação entre os usuários.
34
Capítulo 1 – Uma Introdução à Tecnologia ASP
Neste modelo de desenvolvimento para a Web, em três ou mais camadas, existem diversos
pontos nos quais podemos utilizar a tecnologia ASP. Ao desenvolver a interface da aplicação,
pode-se combinar código HTML com código ASP. Utilizando ASP, podemos desenvolver
páginas que acessam o banco de dados, através do servidor de Aplicações. Questões como
autenticação de usuários, determinação do nível de acesso e segurança da aplicação podem
ser desenvolvidas com a utilização de ASP.
Para que você possa utilizar a tecnologia ASP da melhor maneira, com o objetivo de atender
às necessidades da sua aplicação, é importante que você conheça o modelo de desenvolvimento
para a Web, bem como a utilização de ASP, para a criação das aplicações. No decorrer deste
livro, estaremos abordando diversos tópicos relacionados à criação de aplicações Web.
O que é ASP?
Definir exatamente o que é ASP é uma tarefa que pode gerar controvérsias. Eu, particularmente,
gosto de definir ASP, como sendo: “Uma tecnologia que permite a criação de páginas dinâmicas,
nas quais além de código HTML, temos código ASP. É justamente este código, que fornece a
funcionalidade, que torna os sites dinâmicos, possibilitando a criação de aplicações Web”.
Não defino ASP como uma linguagem de Script porque, para a criação de páginas ASP, podemos
utilizar diferentes linguagens, tais como VBScript e Java Script. Neste livro, estaremos
utilizando o VBScript. Teremos os Capítulos 2 e 3 dedicados à linguagem VBScript.
Melhor do que definições formais, é entender como funciona uma página ASP. Vamos nos
basear na Figura 1.11.
Internet
35
Criando Sites Dinâmicos com ASP 3.0
O servidor Web, no nosso caso o IIS da Microsoft, reconhece que a página solicitada é uma
página ASP, pela extensão da página. As páginas ASP devem ter a extensão .asp. Se criarmos
uma página ASP e a salvarmos com a extensão .htm ou .html, o IIS simplesmente ignora o
código ASP. A criação de páginas ASP está ligada à utilização do IIS. Não podemos, por
exemplo, criar páginas ASP e disponibilizá-las utilizando outros servidores Web, como o
Netscape Web Server ou o Apache. Já existem empresas trabalhando para disponibilizar a
tecnologia ASP para alguns servidores Web, rodando no sistema operacional Unix ou Linux.
Em contrapartida, o servidor precisa ser o IIS da Microsoft. Outros servidores ainda não
possuem um Interpretador ASP, o que inviabiliza a utilização de páginas ASP nos mesmos.
Outra questão importante a considerar é o fato de uma página ASP ser interpretada no servidor.
Isto significa que você não pode criar uma página ASP e testá-la localmente, simplesmente
abrindo-a no navegador. Se você criar uma página ASP, salvá-la no seu disco rígido local e
tentar abri-la no navegador, todo o código ASP será ignorado, uma vez que não existe o
Interpretador ASP. Para poder testar as suas páginas ASP, você terá que salvá-las em um
servidor Web, que esteja rodando o IIS.
Para acompanhar os exemplos deste livro, aconselho que você utilize o Windows 2000 Server
ou o Windows 2000 Professional, com o IIS 5.0 instalado. Caso você não disponha de um
computador, com um destes dois sistemas instalados, você pode utilizar o Windows 98 com
36
Capítulo 1 – Uma Introdução à Tecnologia ASP
o Personal Web Server instalado. Porém, com o Personal Web Server, alguns dos exemplos
deste livro, principalmente os que utilizam as novas características do ASP 3.0, não irão
funcionar corretamente.
Na Introdução, você aprendeu a instalar o IIS 5.0. No próximo item, aprenderemos a criar um
diretório no servidor do IIS e salvar nossas páginas neste local, para depois podermos testá-
las. Sugiro que você também crie este diretório para salvar nossos exemplos. Iremos criar um
diretório para cada capítulo do livro, de tal forma que os exemplos possam ficar melhor
organizados.
IMPORTANTE
Para os exemplos deste livro, estou utilizando um servidor com o Windows 2000 Server. O
nome do servidor é www.groza.com. Se você estiver utilizando um servidor com um nome
diferente, substitua www.groza.com, pelo nome do servidor que você estiver utilizando, sempre
que o mesmo aparecer nos nossos exemplos.
IMPORTANTE
Estou utilizando o drive C:. Você pode utilizar qualquer um dos drives disponíveis no seu
computador.
Agora vamos fazer com que a pasta livro (e conseqüentemente, todas as suas subpastas)
passe a fazer parte do servidor IIS www.groza.com.
37
Criando Sites Dinâmicos com ASP 3.0
38
Capítulo 1 – Uma Introdução à Tecnologia ASP
5. Dê um clique no sinal de +, ao lado da opção Site da Web padrão, para expandir esta
opção. As opções que aparecem são as pastas que já fazem parte do site.
6. Dê um clique com o botão direito do mouse sobre Site da Web padrão. No menu que
surge, aponte para Novo. Nas opções que surgem, dê um clique na opção Pasta virtual,
conforme indicado pela Figura 1.15.
39
Criando Sites Dinâmicos com ASP 3.0
Figura 1.15: Criando uma nova pasta virtual, no servidor IIS 5.0.
40
Capítulo 1 – Uma Introdução à Tecnologia ASP
41
Criando Sites Dinâmicos com ASP 3.0
Uma vez criado o diretório virtual livro, o qual está associado à pasta C:\livro, como posso
acessar o conteúdo que for colocado dentro da pasta C:\livro, ou em uma das suas subpastas?
42
Capítulo 1 – Uma Introdução à Tecnologia ASP
A resposta para a questão acima é bastante simples, basta que entendamos como são formados
os endereços em um servidor como o IIS. No nosso exemplo, o endereço do servidor é
www.groza.com. Ao digitarmos este endereço, estamos acessando a página principal do
servidor. Vamos supor que dentro do diretório livro fosse colocada uma página chamada
index.asp. Como faríamos para acessar esta página, através do navegador? O endereço da
página em questão, seria o seguinte: www.groza.com/livro/index.asp.
www.groza.com/livro/index.asp
Observe que primeiro vem o nome do servidor, depois o nome do diretório virtual e, finalmente,
o nome da página a ser acessada.
Como é que fica o endereço, quando eu quero acessar uma página que está dentro de uma
subpasta da pasta livro?
Seguindo o mesmo raciocínio anterior, fica fácil responder a esta pergunta. Vamos supor que você
queira acessar uma página chamada cep.asp, que está na subpasta Capitulo1, a qual está na pasta
livro. Como fica o endereço para acessar esta página? A Figura 1.21, responde esta questão.
www.groza.com/livro/Capitulo1/cep.asp
43
Criando Sites Dinâmicos com ASP 3.0
Com isso, podemos ver que existe uma lógica bem definida para a formação dos endereços.
Apenas para confirmar, vamos dar mais alguns exemplos de formação de endereços. Considere
os casos abaixo indicados:
➥ Qual o endereço de uma página chamada teste.htm, gravada no diretório Capitulo6?
Resposta: www.groza.com/livro/Capitulo6/teste.htm.
➥ Qual o endereço de uma página chamada cadastro.asp, gravada no diretório Capitulo10?
Resposta: www.groza.com/livro/Capitulo10/cadastro.asp.
É importante que você entenda bem a maneira como o servidor IIS constrói os endereços de acesso
para as páginas gravadas em seus diretórios virtuais. Observe que o diretório virtual, é simplesmente
um nome que nos leva até o diretório real, gravado no disco. Podemos criar diversos diretórios
virtuais, em um único servidor IIS. Em um trabalho futuro, estarei escrevendo sobre o IIS 5.0.
IMPORTANTE
Você pode criar a estrutura sugerida neste tópico para acompanhar os exemplos deste livro.
Você também pode optar pela criação de uma estrutura diferente, neste caso, lembre-se de
utilizar a estrutura correta quando estiver acompanhando os nossos exemplos.
NOTA
As listagens de código deste livro, apresentam numeração de linhas. Porém, ao criar o código,
não devem ser digitados os números das linhas. Os números são utilizados, apenas para
facilitar a explicação dos códigos de exemplo.
44
Capítulo 1 – Uma Introdução à Tecnologia ASP
IMPORTANTE
Não digite o número das linhas. A numeração apenas aparece na listagem, para servir como
referência na hora de explicarmos o código ASP.
Salve este documento na subpasta Capitulo1, da pasta livro. Salve o arquivo com o nome de
exemplo1.asp. Se você também estiver utilizando o Bloco de notas, é importante digitar a
extensão .asp, pois caso contrário o Bloco de notas, colocará a extensão .txt.
Antes de explicarmos o código da Listagem 1.1, vamos testá-lo. Para testar o código faça o seguinte:
1. Abra o Internet Explorer.
2. No campo endereço digite o seguinte: www.groza.com/livro/Capitulo1/exemplo1.asp
3. Tecle Enter.
Se não foram cometidos erros na hora da digitação da Listagem 1.1, o Internet Explorer mostra
o resultado da página exemplo1.asp, conforme indicado na Figura 1.22.
45
Criando Sites Dinâmicos com ASP 3.0
Nas linhas de 1 até 5, temos o código HTML normal para qualquer página. De interessante
apenas a tag <TITLE> </TITLE>, que define o título que será exibido na Barra de títulos do
Internet Explorer, quando você acessa a página. Isso pode ser comprovado na Figura 1.22,
onde vemos a frase: “Minha primeira página ASP!! – Microsoft Internet Explorer”, na Barra
de títulos.
A partir da linha 6 é que temos novidades. Observe, na linha 6, a utilização de <%. Esta
combinação de sinais, indica o início de um trecho com código ASP, ou seja, código que deve
ser interpretado pelo servidor IIS.
Na linha 13, a combinação de sinais %>, indica o final do trecho de código ASP, iniciado na
linha 6.
46
Capítulo 1 – Uma Introdução à Tecnologia ASP
IMPORTANTE
Todo trecho de código ASP, inicia com um <% e deve ser finalizado com um %>. Podemos
ter mais do que um trecho de código ASP, dentro de um mesmo documento. Com isso podemos
ir mesclando trechos de código HTML, com trechos de código ASP. Essa possibilidade nos dá
uma grande flexibilidade na hora de construir aplicações para a Web. Sempre que for necessário
algum tipo de processamento em uma página, podemos inserir código ASP para fazer o
processamento desejado, e depois retornar o resultado no formato HTML.
As linhas 14 e 15 são tag’s HTML, que aparecem no final de uma página. A tag </BODY> é
o fechamento da tag <BODY>, e a tag </HTML> é o fechamento da tag <HTML>. Para
maiores detalhes sobre a linguagem HTML, consulte o livro HTML 4 Curso Básico & Rápido,
da editora Axcel Books.
Conforme descrito anteriormente, o código ASP é processado pelo IIS, e o resultado deste
processamento é retornado para o navegador do cliente no formato HTML. Podemos facilmente
comprovar isto.
47
Criando Sites Dinâmicos com ASP 3.0
4. Observe que o código retornado para o cliente, é código HTML puro, sem nenhum
sinal do código ASP. Isso impede com que o usuário possa ter acesso ao código dos
aplicativos desenvolvidos em ASP. Além disso qualquer navegador pode ser utilizado
para acessar uma página ASP, uma vez que o que é, efetivamente, enviado para o
cliente é código HTML.
5. Feche a janela indicada na Figura 1.23.
Nesse exemplo, criamos a nossa primeira página ASP. Onde aprendemos alguns detalhes
importantes e confirmamos outros, anteriormente apresentados. Apenas para revisar, vamos
enunciar os principais tópicos abordados:
➥ Uma página pode conter um ou mais trechos com código ASP.
➥ Cada trecho de código ASP, inicia com <% e termina com %>.
➥ Uma página ASP é identificada pela sua extensão, que deve ser .asp, caso contrário o
código ASP será ignorado pelo servidor IIS.
➥ O código ASP é processado pelo servidor IIS, e o resultado desse processamento é que
é retornado para o navegador do cliente, no formato de código HTML. Você pode,
facilmente, comprovar este fato, selecionando a opção Código fonte, do menu Exibir,
do Internet Explorer.
➥ Pelo fato do resultado do processamento de uma página ASP ser código HTML, qualquer
navegador está habilitado para acessar páginas ASP, e não somente o Internet Explorer.
Para encerrarmos este capítulo, vamos a mais um exemplo prático. Na página exemplo1.asp,
não temos nenhuma vantagem em utilizar código ASP. Poderíamos utilizar código HTML,
que obteríamos o mesmo resultado, sem maiores problemas.
No próximo exemplo, veremos como a utilização de ASP pode facilitar a criação de páginas
dinâmicas e aplicativos para a Web. Por enquanto não se preocupe em entender todos os
comandos do ASP e do VBScript. Teremos todo este livro para aprendê-los. O objetivo do
próximo exemplo é salientar a natureza dinâmica do ASP na geração de páginas.
NOTA DO AUTOR
Estou utilizando Boqueirão do Leão, como exemplo, porque é a minha terra natal. Claro que
pouca gente conhece, pois é uma cidade pequena. Mas sempre que o tempo permite, volto
para rever familiares e amigos.
48
Capítulo 1 – Uma Introdução à Tecnologia ASP
Poderíamos criar esta página utilizando HTML, porém todos os dias, no final do dia, teríamos
que editar a página para alterar a data, uma vez que a mesma não será atualizada
automaticamente. Utilizando código ASP, podemos fazer com que a página acesse a data do
servidor IIS e exiba a data sempre atualizada, na página ASP. Com isso, cada vez que a página
for acessada pelo usuário, o código ASP irá determinar a data do servidor e enviar uma página
com a data atualizada. Este é um exemplo, bastante simples, de uma página dinâmica; pois a
data é dinamicamente determinada pelo código ASP.
6 <%
7 data_atual=Date()
8 mes_atual=Month(data_atual)
49
Criando Sites Dinâmicos com ASP 3.0
26 Case 9
27 mes_desc=“Setembro”
28 Case 10
29 mes_desc=“Outubro”
30 Case 11
31 mes_desc=“Novembro”
32 Case 12
33 mes_desc=“Dezembro”
34 End Select
36 %>
38 </BODY>
39 </HTML>
IMPORTANTE
Não digite o número das linhas. A numeração apenas aparece na listagem para servir como
referência na hora de explicarmos o código ASP. Esta orientação é válida para todas as listagens
que aparecerem neste livro.
Salve este documento na subpasta Capitulo1, da pasta livro. Salve o arquivo com o nome de
exemplo2.asp. Lembre-se de digitar a extensão .asp, pois caso contrário o Bloco de notas,
colocará a extensão .txt.
Antes de explicarmos o código da Listagem 1.2, vamos testá-lo. Para testar o código faça o seguinte:
1. Abra o Internet Explorer.
2. No campo endereço digite: www.groza.com/livro/Capitulo1/exemplo2.asp.
3. Tecle Enter.
4. Se não foram cometidos erros na hora da digitação da Listagem 1.2, o Internet Explorer
mostra o resultado da página exemplo2.asp, conforme indicado na Figura 1.24.
50
Capítulo 1 – Uma Introdução à Tecnologia ASP
A partir da linha 6 é que temos o código ASP, conforme indicado pelo sinal <%. Na linha 7,
utilizamos a função Date( ), para atribuir a data do sistema à variável data_atual. Na linha
8, utilizamos a função Month para extrair apenas o mês da data atual, e atribuir este valor
a variável mes_atual. A função Month, retorna um número inteiro entre 1 e 12, o qual
indica o mês do ano; 1=Janeiro, 2=Fevereiro, 3=Março e assim por diante. Por isso, das
linhas 9 até 34, utilizamos o laço de controle Select Case ... End Select para definir a variável
mes_desc, com base no valor retornado pela variável mes_atual. Veremos o laço de controle
Select Case ... End Select, em detalhes, no Capítulo 2.
Finalmente, na linha 35, utilizo o comando Response.Write, para retornar a data no formato
desejado. Observe que, com o comando Response.Write, posso retornar diversos valores, quer
sejam valores fixos de texto, colocados entre aspas (como no exemplo “Boqueirão do Leão,”),
quer sejam valores obtidos de variáveis, como no caso mes_desc. Para juntar as várias partes
que devem ser retornadas, utilizamos o operador &.
Conforme descrito anteriormente, o código ASP é processado pelo IIS e o resultado deste
processamento é retornado para o navegador do cliente no formato HTML. Podemos facilmente
comprovar isto.
51
Criando Sites Dinâmicos com ASP 3.0
Comprovando, mais uma vez, que o que retorna é somente o código HTML.
1. Se você não estiver com a página exemplo2.asp aberta, abra-a conforme descrito no
exemplo anterior.
2. No menu Exibir, clique na opção Código fonte.
3. Será exibida uma janela, conforme indicado pela Figura 1.25.
4. Observe que o código retornado para o cliente, é código HTML puro, sem nenhum sinal
do código ASP. Não vemos as funções utilizadas, nem mesmo o laço de controle Select
Case. O que retorna é o resultado do comando Response.Write. Isso impede que o usuário
possa ter acesso ao código dos aplicativos desenvolvidos em ASP. Além disso, como já
disse anteriormente, qualquer navegador pode ser utilizado para acessar uma página
ASP, uma vez que o que é, efetivamente, enviado para o cliente é código HTML.
5. Feche a janela indicada na Figura 1.25.
Veja que, neste exemplo, temos uma página em que o conteúdo é gerado dinamicamente, a
partir da hora do servidor. Você pode testar este comportamento dinâmico da página,
facilmente. Altere a data do servidor. Carregue novamente a página exemplo2.asp. Observe
que a mesma já exibe a nova data. Altere novamente a data do servidor e pressione F5 para
atualizar a página exemplo2.asp. Isso é geração dinâmica de conteúdo, embora até o momento
seja um conteúdo bastante simples. Nos próximos capítulos avançaremos um pouco mais.
Agora que já entendemos os diversos aspectos envolvidos com a criação de páginas ASP,
estamos aptos a aprender um pouco mais sobre a linguagem VBScript, que estaremos utilizando
neste livro. Isso será assunto para os Capítulos 2 e 3.
52
Capítulo 2 – Uma Introdução ao VBScript
Capítulo 2
Uma Introdução
ao VBScript
53
Criando Sites Dinâmicos com ASP 3.0
Introdução
Neste capítulo aprenderemos o básico a respeito de VBScript. Veremos exatamente o que é
VBScript, e onde utilizá-lo. Aprenderemos que é possível executar código VBScript, tanto no
navegador do cliente, quanto no servidor Web. Depois apresentaremos os aspectos básicos da
linguagem, tais como a declaração de variáveis, operadores e laços de controle. À medida em
que os conceitos forem sendo apresentados, iremos trabalhando com exemplos práticos, para
que os conceitos possam ser melhor entendidos. Também aprenderemos a criar sub-rotinas e
funções. Na parte final do capítulo, desenvolveremos alguns exemplos práticos de utilização
de VBScript, na criação de páginas. Ao completar este capítulo, você terá uma noção básica
de VBScript, e será capaz de criar soluções simples utilizando esta linguagem.
NOTA
Os exemplos apresentados nas listagens deste capítulo, podem ser criados utilizando-se um
redator de texto, como o Bloco de notas, e salvando os arquivos com a extensão .htm. Depois é
só abrir os mesmos no Internet Explorer e testar. Os números das linhas que aparecem nas
listagens, não devem ser digitados. Os mesmos foram incluídos, nas respectivas listagens,
apenas para facilitar o acompanhamento das explicações de cada exemplo.
O que é VBScript
VBScript é uma linguagem de criação de scripts, a qual é derivada do Visual Basic (VB) e do
VBA (Visual Basic for Applications). O Visual Basic é o ambiente de desenvolvimento gráfico
mais utilizado para o desenvolvimento de aplicações para o ambiente Windows. Como o
nome sugere, a programação em Visual Basic é baseada na linguagem de programação Basic.
O VBA é derivado do Visual Basic (de certa forma, podemos dizer que é um subconjunto do
VB), e é a linguagem utilizada para automatizar tarefas nos aplicativos do Microsoft Office.
Por exemplo, quando você precisa criar código para automatizar alguma tarefa no Microsoft
Excel ou no Microsoft Access, você está utilizando o VBA.
Se você já conhece VB ou VBA irá sentir-se bastante à vontade com VBScript. Muitos dos
comandos básicos, como estruturas de controle, declarações de variáveis, operadores e
funções, são idênticos. Na verdade alguns artigos definem VBScript como sendo um
subconjunto do VB.
54
Capítulo 2 – Uma Introdução ao VBScript
➥ O código é escrito juntamente com uma página HTML. A página é enviada para o
navegador, o qual interpreta e executa o código VBScript, uma linha por vez. O suporte
à VBScript é nativo no Internet Explorer, já no Netscape Navigator o suporte à VBScript
se dá através da instalação de um plug-in.
NOTA
Um plug-in é um programa que estende a funcionalidade de um navegador. No nosso exemplo
estamos falando de um plug-in que permite que o Netscape Navigator interprete e execute
código VBScript.
No próximo item faremos uma revisão rápida os principais elementos de uma página HTML.
Como o código VBScript que roda no cliente é “escrito” dentro da própria página HTML, é
importante que saibamos identificar seus principais elementos. Além disso, conforme veremos
a partir do Capítulo 4, uma página ASP mistura as tags HTML com elementos de código ASP.
Por isso é importante que saibamos reconhecer os principais elementos de uma página HTML.
Para maiores informações sobre HTML, consulte o livro HTML 4 Curso Básico & Rápido, da
editora Axcel Books.
55
Criando Sites Dinâmicos com ASP 3.0
8 </BODY>
9 </HTML>
IMPORTANTE
Cabe novamente ressaltar, que os números de linha, não fazem parte do código HTML. Apenas
foram colocados na listagem para facilitar a explicação da mesma. Esta recomendação é válida
para todas as listagens apresentadas neste livro. Com isso, se você for digitar esta listagem,
não digite o número das linhas. Este fato pode ser comprovado pela Figura 2.1.
56
Capítulo 2 – Uma Introdução ao VBScript
As maioria das tags HTML são formadas por pares. Conforme podemos ver na Listagem 2.1,
todo documento HTML, começa com a tag <HTML> e termina com uma tag </HTML>
(linhas 1 e 9, respectivamente).
Logo após a tag <HTML>, temos a tag <HEAD>. Dentro das tags <HEAD> e </HEAD>
podemos colocar diversas informações, muitas vezes chamadas de Metainformação. Contida
nesta seção do documento está a informação a respeito do próprio documento, como por
exemplo: qual o programa utilizado para gerar o documento, nome do autor, data de criação,
etc. As informações contidas nesta seção do documento, são utilizadas, muitas vezes, pelos
mecanismos de pesquisa da Internet, como o Altavista (www.altavista.digital.com) e o Yahoo
(www.yahoo.com). Uma tag especial, que podemos utilizar é a tag <TITLE> </TITLE>. O
texto colocado dentro desta tag, será exibido na Barra de títulos do navegador. Este fato pode
ser comprovado pela Figura 2.1.
Observe o título que aparece na Barra de títulos da Figura 2.1. Logo após o título, no caso do
Internet Explorer, aparece a expressão: Microsoft Internet Explorer.
57
Criando Sites Dinâmicos com ASP 3.0
Após o par de tags <HEAD> </HEAD>, temos a tag <BODY>. A partir da tag <BODY>, na
linha 6, é que começa a parte do documento que será exibida pelo navegador. Tudo o que
estiver entre o par de chaves <BODY> </BODY> é conteúdo que deve ser exibido pelo
navegador. Neste nosso exemplo, muito simples, temos apenas um parágrafo de texto sendo
exibido. A tag que define uma parágrafo de texto é <P> </P>, conforme indicado na linha 7.
Cada tag do HTML pode conter um ou mais atributos. Um atributo modifica a maneira como
o navegador exibe o conteúdo da página. Por exemplo, na Listagem 2.2, estamos utilizando o
atributo color da tag <FONT>, para modificar as características da fonte do texto a ser exibido.
Neste caso, na linha 7, o atributo color é definido para o valor navy, o qual equivale a uma
fonte de cor azul marinho. Observe que a tag <FONT> </FONT> é utilizada dentro da tag
de parágrafo, para modificar as características da fonte deste parágrafo. Também utilizamos a
tag <B></B>, para fazer com que o texto fosse exibido em negrito. Ao visualizar este
documento, no navegador, o texto “Uma Página HTML muito simples !!!” será exibido em
negrito e com fonte de cor azul marinho.
Um estudo mais detalhado sobre as tags da linguagem HTML foge ao escopo deste livro.
Novamente indico o livro HTML 4 Curso Básico & Rápido, da editora Axcel Books, para
maiores informações sobre a linguagem HTML. Apenas como um exemplo de uma página
mais completa, considere a Listagem 2.3, onde utilizamos as tags para criação de tabelas.
<TABLE> e </TABLE>, para criar a tabela; <TR> e </TR> para criar novas linhas; <TD>
e </TD>, para criar as células dentro de uma linha da tabela.
58
Capítulo 2 – Uma Introdução ao VBScript
9 <TR>
10 <TD align=middle>Ano de Produção</TD>
11 <TD align=middle>Produção em Toneladas</TD>
12 </TR>
13 <TR>
14 <TD align=middle>1996</TD>
15 <TD align=middle>23450</TD>
16 </TR>
17 <TR>
18 <TD align=middle>1997</TD>
19 <TD align=middle>32456</TD>
20 </TR>
21 <TR>
22 <TD align=middle>1998</TD>
23 <TD align=middle>33000</TD>
24 </TR>
25 <TR>
26 <TD align=middle>1999</TD>
27 <TD align=middle>32560</TD>
28 </TR>
29 </TABLE>
31 </BODY>
32 </HTML>
59
Criando Sites Dinâmicos com ASP 3.0
No próximo item estudaremos algumas tags ligadas a criação de formulários com HTML.
Estudaremos estas tags em maiores detalhes, pois estaremos utilizando-as em diversos
exemplos deste livro.
60
Capítulo 2 – Uma Introdução ao VBScript
7 <P>Cadastro de Clientes:<BR>
8 Preencha os campos e clique no botão Enviar Dados.</P>
9 <P>
10 <FORM action=“” id=FORM1 method=post name=FORM1><BR>
11 </FORM>
12 </BODY>
13 </HTML>
O atributo mais importante da tag <FORM> é o action. No atributo action, devemos informar
o endereço de uma página ASP, um script CGI, ou qualquer outro elemento capaz de processar
os dados digitados em um formulário. O usuário preenche os campos do formulário, e, ao
clicar no botão Enviar, é chamada a página ou programa indicados no atributo action, o qual
é responsável por processar as informações do formulário.
Na Listagem 2.5, temos um exemplo em que uma página ASP é responsável por processar os
dados enviados pelo formulário.
61
Criando Sites Dinâmicos com ASP 3.0
11 </FORM>
12 </BODY>
13 </HTML>
Banco de
Dados
O usuário preenche os dados do formulário A página ASP, no servidor, recebe os dados enviados pelo
e clica no botão Enviar. A página ASP, formulário e armazena os dados em um banco de dados,
especificada na tag action é chamada. como o Microsoft SQL Server, ou Microsoft Access.
Figura 2.3: A Página ASP armazena os dados digitados no formulário, em um banco de dados.
Neste caso, a página ASP recebe os dados do formulário preenchido pelo cliente, processa esses
dados, e os armazena em um banco de dados. O servidor de Banco de Dados pode ser o mesmo
servidor Web, ou um equipamento separado. Após armazenar os dados no banco de dados, a
página ASP envia código HTML puro, de volta para o cliente. Normalmente a página HTML, que
retorna para o cliente, apresenta uma mensagem dizendo que os dados foram enviados com
sucesso, ou, no caso de erros, apresenta uma mensagem de erro, com a possível causa do problema.
A partir do Capítulo 4, estaremos aprendendo a criar páginas ASP para tratar com formulários
e armazenar os dados enviados em bancos de dados, bem como para fazer pesquisas em
banco de dados.
62
Capítulo 2 – Uma Introdução ao VBScript
Atributo Descrição
TYPE Indica o tipo do campo, no caso de campos para digitar ou
exibir informação, utilizamos TEXT.
SIZE Determina o tamanho do campo que será exibido no
navegador.
MAXSIZE Tamanho máximo de caracteres do campo. MAXSIZE pode
ser maior do que SIZE. Neste caso o navegador rola o
conteúdo do campo, quando o mesmo atingir o número de
caracteres definido por SIZE.
NAME É o nome associado ao campo, o qual será utilizado pela
página ASP, para fazer referência a este campo.
VALUE É o valor padrão do campo. Por exemplo, para um campo
Cidade, podemos definir o atributo VALUE como São Paulo.
Neste caso, ao carregar o formulário no navegador, o campo
Cidade, já vem com o valor São Paulo. Caso seja necessário, o
usuário pode modificar este valor.
ID Utilizado por linguagens de script, como o VBScript.
Na Listagem 2.6, temos um exemplo de criação de um formulário com dois campos para
entrada de texto. Um para o nome, outro para o endereço.
63
Criando Sites Dinâmicos com ASP 3.0
11 </FORM>
12 </BODY>
13 </HTML>
Nas linhas 9 e 10, temos o código HTML, que cria os dois campos do formulário. A Figura
2.4 mostra este formulário, sendo visualizado no Internet Explorer, com os dados digitados
pelo usuário.
Atributo Descrição
TYPE Indica o tipo do campo, no caso de campos para digitar
senhas, utilizamos PASSWORD.
64
Capítulo 2 – Uma Introdução ao VBScript
Atributo Descrição
SIZE Determina o tamanho do campo que será exibido no
navegador.
MAXSIZE Tamanho máximo de caracteres do campo. MAXSIZE
pode ser maior do que SIZE. Neste caso o navegador
rola o conteúdo do campo, quando o mesmo atingir o
número de caracteres definido por SIZE.
NAME É o nome associado ao campo, o qual será utilizado pela
página ASP, para fazer referência ao campo.
VALUE É o valor padrão do campo. Normalmente é deixado em
branco.
ID Utilizado por linguagens de script, como o VBScript.
12 </FORM>
13 </BODY>
14 </HTML>
Na linha 11, temos o código HTML, que cria o campo para a digitação de senha. A Figura 2.5,
mostra este formulário, sendo visualizado no Internet Explorer, já com os dados digitados
pelo usuário.
65
Criando Sites Dinâmicos com ASP 3.0
Atributo Descrição
TYPE Indica o tipo do campo, neste caso, utilizamos
CHECKBOX.
CHECKED Indica se o Check Box está, inicialmente, marcado ou não.
NAME É o nome associado ao campo, o qual será utilizado pela
página ASP, para fazer referência a este campo.
ID Utilizado por linguagens de script, como o VBScript.
VALUE É o valor de retorno do campo, caso o Check Box seja marcado.
66
Capítulo 2 – Uma Introdução ao VBScript
17 </FORM>
18 </BODY>
19 </HTML>
Nas linhas de 13 a 16, temos o código HTML que cria os diversos Check Box. Quando o
usuário seleciona um determinado Check Box, o valor do atributo value é associado com o
Check Box, que, por sua vez, pode ser armazenado em um campo de uma tabela do banco de
dados, pela página ASP, responsável pelo processamento dos dados do formulário. A Figura
2.6 mostra este formulário, sendo visualizado no Internet Explorer, onde o usuário digitou
dados nos campos e marcou alguns dos Check Box disponíveis. Observe que mais do que um
Check Box pode ser marcado.
67
Criando Sites Dinâmicos com ASP 3.0
Atributo Descrição
TYPE Indica o tipo do campo, neste caso, utilizamos RADIO.
NAME É o nome associado a todos os Radio Buttons que fazem
parte do mesmo grupo, o qual será utilizado pela página
ASP, para fazer referência ao campo.
68
Capítulo 2 – Uma Introdução ao VBScript
Atributo Descrição
ID Utilizado por linguagens de script, como o VBScript.
VALUE É o valor de retorno do campo, caso o Radio Button seja
marcado.
18 <P>
19 <INPUT id=cartao name=cartao type=“radio” value=“Visa”>Visa
20 <INPUT id=cartao name=cartao type=“radio” value=“Master Card”>Master Card
21 <INPUT id=cartao name=cartao type=“radio” value=“Outros”>Outros
22 </P>
23 </FORM>
24 </BODY>
25 </HTML>
69
Criando Sites Dinâmicos com ASP 3.0
Nas linhas de 19 a 21, temos o código HTML que cria os diversos Radio Buttons. Quando o
usuário seleciona um dos Radio Buttons, o valor do atributo value é associado com o grupo
de Radio Buttons, que, por sua vez, pode ser armazenado em um campo de uma tabela do
banco de dados, pela página ASP responsável pelo processamento dos dados do formulário.
A Figura 2.7 mostra este formulário, sendo visualizado no Internet Explorer, onde o usuário
digitou dados nos campos e marcou uma das opções disponíveis para o cartão de crédito.
Nunca é demais lembrar que o usuário somente conseguirá marcar uma das opções.
70
Capítulo 2 – Uma Introdução ao VBScript
Atributo Descrição
NAME É o nome associado ao campo, o qual será utilizado pela página
ASP, para fazer referência ao campo.
ID Utilizado por linguagens de script, como o VBScript.
WRAP Determina se o texto deve trocar automaticamente de linha,
quando for atingido o tamanho limite do campo. O valor padrão
para este campo é SOFT.
18 <P>
19 <INPUT id=cartao name=cartao type=“radio” value=“Visa”>Visa
20 <INPUT id=cartao name=cartao type=“radio” value=“Master Card”>Master Card
71
Criando Sites Dinâmicos com ASP 3.0
24 </FORM>
25 </BODY>
26 </HTML>
Na linha 23, temos o código HTML, que cria o campo para a digitação do texto, para as
críticas e sugestões. A Figura 2.8 mostra este formulário, sendo visualizado no Internet Explorer,
com as críticas e sugestões digitadas pelo usuário.
72
Capítulo 2 – Uma Introdução ao VBScript
lista de valores, dentre os quais o usuário pode clicar selecionando uma ou mais opções. Cada
opção (definida pela tag <OPTION></OPTION>) possui um valor que é exibido na lista, e um
valor associado, caso esta opção seja selecionada. Este valor associado é que será armazenado
no banco de dados, pela página ASP. Veja os principais atributos da tag <SELECT></SELECT>.
Atributo Descrição
NAME É o nome associado à lista, o qual será utilizado pela
página ASP, para fazer referência ao campo.
ID Utilizado por linguagens de script, como o VBScript.
MULTIPLE Pode ser True ou False. Caso seja True, permite que sejam
selecionados múltiplo itens.
Na Listagem 2.11, temos um exemplo de um formulário com a criação de uma lista bairro,
com três valores possíveis.
73
Criando Sites Dinâmicos com ASP 3.0
Nas linhas 13 a 17, temos o código HTML que cria a Caixa de combinação. Na primeira opção
<OPTION selected value=CENTRO>CENTRO</OPTION>, a palavra “selected”, indica que
esta opção deve estar selecionada por padrão. A Figura 2.9 mostra este formulário, com a
opção DORES sendo selecionada na Caixa de combinação bairros.
74
Capítulo 2 – Uma Introdução ao VBScript
Atributo Descrição
TYPE Deve ser definido como Submit.
NAME Utilizado por linguagens de script, como o VBScript.
ID Utilizado por linguagens de script, como o VBScript.
VALUE É o texto que será exibido no botão.
Embora não seja de uso obrigatório, é bastante comum termos um botão do tipo Reset. Ao
clicar neste botão, todos os campos do formulário são apagados. O projetista da aplicação
Web é quem irá definir a necessidade, ou não, da utilização de um botão do tipo Reset. Na
Tabela 2.8, temos os atributos para um botão do tipo Reset.
Atributo Descrição
TYPE Deve ser definido como Reset.
NAME Utilizado por linguagens de script, como o VBScript.
ID Utilizado por linguagens de script, como o VBScript.
VALUE É o texto que será exibido no botão.
Listagem 2.12 – O formulário completo, com os botões do tipo Submit e Reset já incluídos.
1 <HTML>
2 <HEAD>
75
Criando Sites Dinâmicos com ASP 3.0
12 <P>Selecione o bairro:
18 </P>
19 <P>Certificações:
25 <P>
26 <INPUT id=cartao name=cartao type=“radio” value=“Visa”>Visa
27 <INPUT id=cartao name=cartao type=“radio” value=“Master Card”>Master Card
28 <INPUT id=cartao name=cartao type=“radio” value=“Outros”>Outros
29 </P>
31 <P>
32 <INPUT id=“Enviar” name=“Enviar” type=“submit” value=“Enviar dados”>
76
Capítulo 2 – Uma Introdução ao VBScript
35 </FORM>
36 </BODY>
37 </HTML>
Nas linhas 32 e 33, temos o código HTML que cria os botões “Enviar dados” e “Limpar dados”,
respectivamente. A Figura 2.10, mostra o nosso formulário de exemplo, já completo.
Com isso concluímos a nossa revisão, sobre HTML. Esta revisão fez-se necessária, pois, ao
longo de todo livro, estaremos utilizando formulários HTML, em conjunto com páginas ASP.
No restante deste capítulo, e no seguinte, estarei apresentando os fundamentos do VBScript.
77
Criando Sites Dinâmicos com ASP 3.0
Estaremos utilizando variáveis ao longo de todo livro. Este é um conceito existente em todas as
linguagens de programação, como por exemplo em Visual Basic, C, C++, e assim por diante.
NOTA
Observe a utilização do atributo LANGUAGE. Este atributo define qual a linguagem de script
que será utilizada. Além do VBScript, poderíamos utilizar o JavaScript. Neste livro, estaremos
utilizando VBScript.
NOTA
A utilização de <!— , no início do código, e de —>, no final do código, não é obrigatória. Estas
são as tags para comentários em páginas HTML. No entanto, é recomendável que se utilize
estas tags. Os navegadores mais antigos, tais como Internet Explorer 1.0, não reconhecem
VBScript; se não utilizarmos as tags de comentário, o código VBScript será exibido como se
78
Capítulo 2 – Uma Introdução ao VBScript
fosse texto, o que não é desejável. Com a utilização das tags de comentário, garantimos que os
navegadores que não “entendem” VBScript, simplesmente ignorem o código.
Nas linhas 8 e 9, é que temos o código VBScript, propriamente dito. Não se preocupe com o
código, neste momento. Neste e no próximo capítulo, veremos detalhes sobre a utilização de
funções, tais como Date( ) e MsgBox. Ao abrir esta página no Internet Explorer, será aberta
uma janela, na qual é exibida a data do sistema, conforme indicado na Figura 2.11.
79
Criando Sites Dinâmicos com ASP 3.0
Dim x
Dim nome
Dim teste
O formato geral para o comando Dim é: Dim nome_da_variável. Também podemos declarar
mais do que uma variável, com um único comando Dim. Para isto, basta separar as variáveis,
com vírgula, conforme exemplificado a seguir:
Dim x,y,z
Dim nome
Dim teste1,teste2
IMPORTANTE
Observe que definimos o “tipo” de cada variável. O tipo define quais dados podem ser
armazenados em uma variável. Por exemplo, variáveis que armazenam valores numéricos, não
devem aceitar caracteres de texto. Variáveis que armazenam datas, não devem aceitar datas
inválidas, como por exemplo 30/02/2000. Toda variável no VBScript é do tipo Variant, isto significa
que a variável pode ser de qualquer tipo. O que define o tipo da variável é o valor que está
armazenado no momento. Existem funções de conversão de tipo, conforme veremos mais adiante.
Também podemos utilizar variáveis que não foram, explicitamente, declaradas com o comando
Dim. Com isso, a variável é criada na memória, no momento da sua utilização.
80
Capítulo 2 – Uma Introdução ao VBScript
15 </BODY>
16 </HTML>
Ao abrir esta página no Internet Explorer, será aberta uma janela, conforme indicado na
Figura 2.12.
Podemos fazer com que seja obrigatória a declaração de todas as variáveis. Para isso, basta
utilizar o comando Option Explicit. Este comando deve ser inserido, bem no início do bloco
de script, antes de qualquer procedimento. Veremos mais sobre procedimentos, no próximo
capítulo. Caso você utilize este comando, variáveis não declaradas, serão simplesmente
ignoradas, não sendo gerada nenhuma mensagem de erro. Porém os valores que dependem
das variáveis não declaradas, não serão corretamente calculados.
81
Criando Sites Dinâmicos com ASP 3.0
Ao abrir esta página no Internet Explorer, não será exibida a janela indicada na Figura 2.12;
isto porque as variáveis a, b e c não foram declaradas. Uma vez que a declaração tornou-se
obrigatória, com a adição do comando Option Explicit, as variáveis simplesmente não existem.
O Internet Explorer exibirá somente o texto “Exemplo de utilização de variáveis”, conforme
indicado pela Figura 2.13.
O tipo Variant é formado de pequenas unidades, chamadas subtipos. Cada subtipo, identifica
de que maneira os dados são armazenados em uma variável do tipo Variant. Por exemplo,
variáveis do subtipo Integer são armazenadas de uma maneira diferente de variáveis do subtipo
Long. Na Tabela 2.9, temos uma descrição dos principais subtipos.
Subtipo Descrição
Empty O valor é zero para variáveis numéricas ou uma string de
tamanho zero (“ ”), para variáveis de texto.
Null A variável não contém dados válidos.
Boolean Contém variáveis que somente podem assumir dois
valores: Verdadeiro ou Falso (True ou False).
Byte Valor inteiro, na faixa de 0 até 255.
Integer Valor inteiro, na faixa de -32768 até 32767.
Currency Valores na faixa de –923.337.203.685.447,5808 até
922.337.203.685.447,5807
82
Capítulo 2 – Uma Introdução ao VBScript
Subtipo Descrição
Long Valor inteiro, na faixa de –2.147.483.648 até
2.147.483.647.
Date(Time) É um número que representa a data entre 01 de Janeiro
do ano 100, até 31 de Dezembro de 9999 (olha o bug do
ano 10000 chegando).
String Texto de tamanho variável, pode conter,
aproximadamente, dois bilhões de caracteres.
Object Pode conter um objeto qualquer, como um Controle
ActiveX, ou um Objeto COM+.
Error Pode conter um número de erro.
83
Criando Sites Dinâmicos com ASP 3.0
12 a=25
13 b=3
14 som=a+b
15 subtr=a-b
16 divis=a/b
17 mult=a*b
18 intdivs=a\b
19 expo=a^b
20 modul= a mod b
84
Capítulo 2 – Uma Introdução ao VBScript
27 —>
28 </SCRIPT>
30 </BODY>
31 </HTML>
Neste exemplo, nas linhas de 14 a 20, utilizamos os operadores aritméticos, para realizar
uma série de operações com os valores atribuídos às variáveis “a” e “b”. Depois, da linha 22
até a 26, utilizamos a função MsgBox, para exibir os resultados obtidos. O uso da função
MsgBox merece alguns comentários. Primeiro, utilizamos a função MsgBox para exibir
mensagens em uma pequena janela, chamada de janela pop-up. Podemos exibir texto e também
valores de variáveis. Quando temos que exibir diversos componentes, como um pouco de
texto, em seguida o valor de uma variável, depois mais texto, e assim por diante, devemos
utilizar o operador de concatenação &. Este operador permite que as diversas partes sejam
exibidas como uma única mensagem. Considere o exemplo da linha 22:
22 MsgBox “Os números são: ” & a & “ e ” & b & Chr(13)
Neste exemplo, primeiro, é exibido o texto “Os números são: ”, logo em seguida o valor da
variável a. Observe que as duas partes são concatenadas com o operador &. Depois concatenamos
o valor da variável b, e finalmente utilizamos a função Chr(13). A função Chr(número) envia o
caractere correspondente ao número digitado entre parênteses. Este número é o número do
caractere no padrão ASCII (American Standard Caracter Interchange Information). No código
ASCII, cada caractere possui um número associado; o número 13, é associado ao <ENTER>.
Com isso, estamos enviando um <ENTER> para a caixa de mensagem, o que equivale a uma
troca de linha. Portanto, utilizamos o Chr(13) para simular um <ENTER>, de tal maneira que
os dados não saiam todos “emendados”, na mesma linha. Ao abrir a página da Listagem 2.16,
no Internet Explorer, o código da linha 22, produz a mensagem da Figura 2.14.
Ao clicar em OK, uma nova mensagem é exibida, devido a função MsgBox da linha 23. O
código da linha 23, produz a mensagem da Figura 2.15.
85
Criando Sites Dinâmicos com ASP 3.0
Ao clicar em OK, uma nova mensagem é exibida, devido a função MsgBox da linha 24. O
código da linha 24, produz a mensagem da Figura 2.16.
Ao clicar em OK, uma nova mensagem é exibida, devido a função MsgBox da linha 25. O
código da linha 25, produz a mensagem da Figura 2.17.
Ao clicar em OK, uma nova mensagem é exibida, devido a função MsgBox da linha 26. O
código da linha 26, produz a mensagem da Figura 2.18.
86
Capítulo 2 – Uma Introdução ao VBScript
Com o uso de operadores, podemos realizar uma série de operações sobre as variáveis existentes
no script.
Conforme podemos ver, a estrutura If Then Else é bastante simples. Fazemos um teste no
início da estrutura. Se o valor do teste for verdadeiro, executamos os comandos na seqüência,
caso contrário, executamos os comandos após o Else. Note que utilizamos o operador de
comparação “maior do que >”, no caso x>y, estamos testando se x é maior do que y. Observe
que no exemplo acima, não serão executados comandos, caso x seja igual a y. Podemos utilizar
laços If Then Else mais complexos, como os do exemplo:
If x>y Then
‘ Comandos a serem executados quando x for maior do que y
ElseIf x=y Then
‘ Comandos a serem executados quando x for igual a y
Else
‘ Comandos a serem executados quando x for menor do que y
End If
87
Criando Sites Dinâmicos com ASP 3.0
Na Tabela 2.11, temos uma descrição dos operadores que podemos utilizar.
8 Option Explicit
9 Dim x,y,z,k
10 x=12
11 y=15
12 z=20
13 k=15
14 If x<y Then
15 MsgBox “x é menor do que y.”
16 Else
88
Capítulo 2 – Uma Introdução ao VBScript
19 If y<x Then
20 MsgBox “y é menor do que x”
21 Else
22 MsgBox “y é maior do que x”
23 End If
24 If y<=k Then
25 MsgBox “y é menor ou igual a k”
26 Else
27 MsgBox “y é maior do que k”
28 End If
29 If x<>z Then
30 MsgBox “x e z são diferentes”
31 End If
32 —>
33 </SCRIPT>
O código das linhas 14 até 18 produz a mensagem indicada na Figura 2.19, pois x é menor
do que y.
89
Criando Sites Dinâmicos com ASP 3.0
Ao clicar em OK, uma nova mensagem é exibida, devido a função MsgBox da linha 22. Como
o teste y<x é falso, não é executada a linha 20, mas sim a linha 22. O código da linha 22
produz a mensagem da Figura 2.20.
Ao clicar em OK, uma nova mensagem é exibida, devido a função MsgBox da linha 25. Como
o teste y<=k é verdadeiro (pois os valores de y e de k são iguais), é executada a linha 25. O
código da linha 25 produz a mensagem da Figura 2.21.
Ao clicar em OK, uma nova mensagem é exibida, devido a função MsgBox da linha 30. Como o
teste x<>z é verdadeiro, é executada a linha 30, este código produz a mensagem da Figura 2.22.
90
Capítulo 2 – Uma Introdução ao VBScript
Comparação Resultado
Entre duas variáveis com valores numéricos. Comparação normal.
Entre duas variáveis com valores de texto. É efetuada uma comparação entre
valores de texto. Por exemplo Xuxa
é maior do que Abel.
Uma das variáveis possui um valor numérico O valor numérico é sempre considerado
e a outra possui texto. menor do que o texto.
Uma das variáveis possui um valor numérico Efetua uma comparação numérica, sem
e a outra esta vazia, atribuindo 0, para a valor.
variável vazia.
Uma das variáveis possui um valor de texto Efetua uma comparação de texto, sem
e a outra esta vazia, atribuindo texto de valor.
comprimento zero (“ ”), para a variável vazia.
As duas variáveis possuem um valor vazio. Ambas são consideradas iguais.
91
Criando Sites Dinâmicos com ASP 3.0
NOTA
Um procedimento é um bloco de código que pode ser chamado em qualquer ponto do script.
Ao chamarmos um procedimento, a execução é deslocada para dentro do procedimento. Após
concluído o procedimento, a execução segue com a linha seguinte à que chamou o procedimento.
Veremos maiores detalhes sobre procedimentos e funções no final deste capítulo.
Vamos analisar o exemplo da Listagem 2.18, para entendermos melhor este conceito de escopo
de uma variável. Neste exemplo, também estaremos introduzindo um conceito muito
importante, o conceito de evento e procedimentos que executam código em resposta a eventos.
8 Sub analisar_onclick
9 Call proc1
10 End Sub
11 —>
12 </SCRIPT>
13 </HEAD>
14 <BODY>
15 <SCRIPT LANGUAGE=vbscript>
16 <!—
17 ‘ As variáveis declaradas abaixo
18 ‘ Serão visíveis em todo o script
92
Capítulo 2 – Uma Introdução ao VBScript
19 Dim x, y
20 x=10
21 y=20
26 Sub proc1()
27 Dim a, b
28 a=5
29 b=7
30 MsgBox “x= ” & x & “ y= ” & y & “ a= ” & a & “ b= ” & b
31 End Sub
37 aux1=a+b
38 MsgBox “aux1= ” & aux1
39 —>
40 </SCRIPT>
44 </BODY>
45 </HTML>
93
Criando Sites Dinâmicos com ASP 3.0
➥ Ao carregar esta página no Internet Explorer, serão executadas as linhas 37 e 38, pois
todo código, que não estiver dentro de um procedimento, é automaticamente executado
quando a página é carregada. Este código exibe o valor da variável aux1. Porém,
conforme podemos notar na Figura 2.24, o valor exibido é zero (e não 12 que seria a
soma de a=5 com b=7). Isto acontece porque as variáveis “a” e “b” foram definidas
dentro do procedimento proc1, e somente existem quando o procedimento proc1 for
chamado. Neste caso, como não existem os valores, a variável aux1 fica com o seu
valor inicial de quando foi declarada, que por padrão do VBScript é zero.
➥ Qualquer coisa que o usuário faça em uma página é considerado um evento. Por
exemplo, quando o usuário clica no botão analisar, é gerado o evento analisar_onclick.
Podemos escrever código VBScript para qualquer evento, definido no modelo de eventos
do Internet Explorer. No nosso exemplo, nas linhas de 8 a 10, definimos código em
94
Capítulo 2 – Uma Introdução ao VBScript
resposta ao evento onclick, do botão analisar. Quando o usuário clicar no botão analisar,
este evento é gerado e o código da linha 9 é executado. Este código chama o
procedimento proc1. Dentro do procedimento proc1, são definidas as variáveis a e b
(linhas 27 a 29). Depois é utilizado o comando MsgBox para exibir os valores das
variáveis x, y, a e b. Como as variáveis x e y foram declaradas em nível de script, isto é,
fora de qualquer procedimento, as mesmas são acessíveis em qualquer ponto do script.
Com isso a mensagem exibe os valores corretamente, conforme indicado na Figura
2.25. Veremos maiores detalhes sobre eventos e procedimentos no Capítulo 4.
➥ Todas as linhas que iniciam com um apóstrofe (‘) são comentários. Linhas de comentários
servem para documentar nossos scripts, facilitando a interpretação dos mesmos.
Com esse exemplo foi possível verificar, na prática, o conceito de escopo (algumas vezes
chamado de visibilidade) das variáveis. No próximo item, trataremos das estruturas e laços
de controle, que são elementos muito importantes na criação de scripts.
Estruturas de Decisão
Em um primeiro grupo, temos as chamadas estruturas de decisão. São estruturas que realizam
um teste lógico, e executam determinados comandos quando o teste resultar verdadeiro, ou
um conjunto diferente de comandos, quando o teste resultar falso. Agora passaremos a analisar
as estruturas de decisão, disponíveis no VBScript.
95
Criando Sites Dinâmicos com ASP 3.0
A Estrutura If...Then
A estrutura If...Then é uma das estruturas de decisão mais conhecidas. Toda linguagem
implementa esta estrutura. É utilizada para executar determinados comandos, caso uma
condição seja verdadeira. A forma geral desta estrutura é a seguinte:
If condição Then
Comandos a serem executados, caso a condição seja verdadeira.
End If
Uma condição é testada; caso a condição seja verdadeira, um ou mais comandos podem ser
executados. Considere o exemplo da Listagem 2.19.
4 x=10
5 y=15
6 If x<y Then
7 MsgBox “x é menor do que y”
8 End If
9 —>
10 </SCRIPT>
Neste exemplo, a mensagem “x é menor do que y”, será exibida, uma vez que o teste x<y é
verdadeiro, conforme podemos constatar pelos valores atribuídos às variáveis x e y.
A Estrutura If...Then...Else
A estrutura If...Then...Else, acrescenta mais uma possibilidade à estrutura If...Then. É utilizada
para executar determinados comandos, caso uma condição seja verdadeira, ou um conjunto
diferente de comandos, caso a condição seja falsa. A forma geral desta estrutura é a seguinte:
If condição Then
Comandos a serem executados, caso a condição seja verdadeira.
Else
Comandos a serem executados, caso a condição seja falsa.
End If
96
Capítulo 2 – Uma Introdução ao VBScript
4 x=15
5 y=10
6 If x<y Then
7 MsgBox “x é menor do que y”
8 Else
9 MsgBox “x é maior do que y”
10 End If
11 —>
12 </SCRIPT>
Neste exemplo, a mensagem “x é maior do que y” será exibida, uma vez que o teste x<y é
falso, conforme podemos constatar pelos valores atribuídos às variáveis x e y.
A Estrutura If...Then...ElseIf...Else
A estrutura If...Then...ElseIf...Else nos dá um poder maior, para testarmos diversas possibilida-
des. É utilizada quando precisamos realizar mais do que um teste lógico. Neste caso, para cada
novo teste que se faça necessário, utilizamos um ElseIf. A forma geral desta estrutura é a seguinte:
If condição Then
Comandos a serem executados, caso a condição seja verdadeira.
ElseIf condição 2
Comandos a serem executados, caso a condição2 seja verdadeira.
ElseIf condição 3
Comandos a serem executados, caso a condição3 seja verdadeira.
...
ElseIf condição n
Comandos a serem executados, caso a condição n seja verdadeira.
Else
Comandos a serem executados, caso nenhuma das condições anteriores seja
verdadeira.
End If
97
Criando Sites Dinâmicos com ASP 3.0
25 —>
26 </SCRIPT>
Neste exemplo, a mensagem “x é maior dos números” será exibida, uma vez que todos os testes
falham (pois x é o maior número). Será executado o comando da linha 23, logo abaixo do Else.
98
Capítulo 2 – Uma Introdução ao VBScript
Os teste vão sendo feitos. Quando o teste de um dos ElseIf for verdadeiro, os comandos abaixo
do ElseIf verdadeiro, serão executados e o laço será encerrado. Em resumo, quando um dos
ElseIf apresentar um teste verdadeiros, os comandos relacionados serão executados, e os demais
não serão avaliados, seguindo a execução para o primeiro comando, após o End If.
A Estrutura Select...Case
Quando precisamos realizar uma série de testes, é mais eficiente utilizarmos uma estrutura
Select...Case, do que utilizarmos uma série de testes utilizando a estrutura If...Then...ElseIf.
5 Select Case x
6 Case 2
7 MsgBox “x vale 2 !”
8 Case 4
9 MsgBox “x vale 4 !”
10 Case 6
11 MsgBox “x vale 6 !”
12 Case 8
13 MsgBox “x vale 8 !”
14 Case 10
15 MsgBox “x vale 10 !”
16 Case Else
17 MsgBox “x não é um número par, menor do que 12 ”
18 End Select
19 —>
20 </SCRIPT>
A estrutura Select Case x vai testar o valor de x. Em cada um dos Case, o valor de x está sendo
testado. Quando for encontrado um valor coincidente com o de x, os comandos abaixo deste
Case serão executados. No nosso exemplo, o comando MsgBox “x vale 10 !”, abaixo de Case
10, será executado. O comando abaixo do Case Else somente será executado, se todos os
testes anteriores falharem.
99
Criando Sites Dinâmicos com ASP 3.0
O uso da estrutura Select...Case torna o código mais eficiente e de mais fácil leitura.
Estruturas de Repetição
Em determinadas situações, precisamos repetir um ou mais comandos, um número específico
de vezes, ou até que uma determinada condição torne-se verdadeira ou falsa. Para isso,
utilizamos as chamadas estruturas de repetição, ou laços. A partir de agora, estaremos
analisando as estruturas de repetição disponíveis.
A Estrutura For...Next
Utilizamos o laço For...Next para repetir um segmento de código, um número determinado de
vezes. Utilizamos esta estrutura, quando já sabemos o número de vezes que uma determinada
seção de código deve ser repetida. Neste tipo de estrutura, normalmente, utilizamos uma
variável como contador. Este contador varia de um valor inicial até um valor final. O formato
geral desta estrutura é o seguinte:
For contador=inicio to fim incremento
Comando1
Comando2
...
Comandon
Next
No início a variável contador tem o valor definido para um determinado valor. Em cada
passagem do laço, a variável contador é incrementada pelo valor definido em incremento.
Caso não seja definido o incremento, será utilizado o padrão 1.
3 Dim x
4 x=10
5 Soma=0
6 ‘ Faz a soma dos dez primeiros números maiores do que zero
7 For i=1 to x
8 Soma = Soma +i
100
Capítulo 2 – Uma Introdução ao VBScript
9 Next
10 MsgBox “Valor da Soma = ” & Soma
11 —>
12 </SCRIPT>
Neste exemplo, a variável i inicia com o valor 1. Em cada passo, o valor de i é acrescentado à
variável Soma. Como o incremento não foi definido, será utilizado o padrão que é 1. Com
isso, ao final do laço For...Next, a variável Soma terá armazenado o valor da soma dos dez
primeiros números inteiros, conforme indicado pela Figura 2.26.
Poderíamos utilizar um valor de incremento diferente de 1, por exemplo, para obter a soma
somente dos números ímpares, menores do que 10. Considere o exemplo da Listagem 2.24.
6 ‘ Faz a soma dos cinco primeiros números ímpares maiores do que zero
101
Criando Sites Dinâmicos com ASP 3.0
A Estrutura Do...Loop
Esta estrutura pode ser utilizada para repetir um trecho de código, enquanto uma determinada
condição for verdadeira, ou até que uma determinada condição torne-se verdadeira. Podemos
utilizar dois operadores condicionais diferentes: While ou Until. Os operadores While ou
Until, podem ser utilizados de duas maneiras diferentes: no início ou no final do laço. Com
isso temos quatro situações distintas; vamos analisar cada uma delas a partir de agora.
Nesta estrutura, enquanto a condição for verdadeira, o código dentro do laço é executado.
Quando a condição tornar-se falsa, o primeiro comando após o final do laço será executado.
Neste caso, se a condição for falsa já na primeira vez, o laço não será executado nenhuma vez.
IMPORTANTE
O código dentro do laço deve ser capaz de alterar a condição para Falso, quando for necessário,
pois caso contrário a condição será sempre verdadeira, e os comandos dentro do laço ficarão
em execução infinitamente, ou até o programa travar. A criação de laços infinitos, devido a
erros de programação, é uma causa comum de travamentos.
102
Capítulo 2 – Uma Introdução ao VBScript
3 Dim x
4 x=10
5 Contador=1
6 Soma=0
Observe que dentro do laço, vamos incrementando o valor da variável Contador, uma unidade
para cada passagem do laço. Com isso, quando o valor de Contador, atingir 11, o teste do
início do laço torna-se falso, e o laço é encerrado.
103
Criando Sites Dinâmicos com ASP 3.0
final, e continuará sendo executado, enquanto a condição for verdadeira. O formato geral,
neste caso é o seguinte:
Do
‘Comando1
‘Comando2
...
Comandon
Loop While condição
Nesta estrutura, enquanto a condição for verdadeira, o código dentro do laço é executado.
Quando a condição tornar-se falsa, o primeiro comando após o final do laço será executado.
Neste caso, se a condição for falsa já na primeira vez, o laço será executado uma única vez.
IMPORTANTE
O código dentro do laço deve ser capaz de alterar a condição para Falso, quando for necessário,
pois caso contrário a condição será sempre verdadeira, e os comandos dentro do laço ficarão
em execução, infinitamente, ou até o programa travar. A criação de laços infinitos, devido a
erros de programação, é uma causa comum de travamentos.
Listagem 2.26 – Um exemplo simples da estrutura de laço Do... Loop While Condição.
1 <SCRIPT LANGUAGE=“vbscript”>
2 <!—
3 Dim x
4 x=10
6 Contador=1
6 Soma=0
104
Capítulo 2 – Uma Introdução ao VBScript
Vamos modificar um pouco o nosso exemplo. Considere o exemplo mostrado na Listagem 2.27.
Listagem 2.27 – Outro exemplo simples da estrutura de laço Do... Loop While Condição.
1 <SCRIPT LANGUAGE=“vbscript”>
2 <!—
3 Dim x
4 x=10
7 Contador=11
6 Soma=0
9 Do
10 Soma = Soma + Contador
11 Contador = Contador + 1
12 Loop While Contador <= x
13 MsgBox “Valor da Soma = ” & Soma
14 —>
15 </SCRIPT>
Muito simples. A condição Contador < x é falsa, pois x=10 e Contador=12 (lembre que o
Contador foi incrementado de uma unidade na linha 11, antes do teste ser realizado). Neste
caso, o laço será executado uma única vez, pois o teste de condição está no final do laço.
Quando o laço é executado, a linha 10 atribui o valor 11 para a variável Soma. Com isso, o
valor exibido para a variável Soma, será 11, conforme indicado na Figura 2.30.
105
Criando Sites Dinâmicos com ASP 3.0
Nesta estrutura, enquanto a condição for falsa, o código dentro do laço é executado. Quando a
condição tornar-se verdadeira, o primeiro comando após o final do laço será executado. Neste
caso, se a condição for verdadeira, já na primeira vez, o laço não será executado nenhuma vez.
IMPORTANTE
O código dentro do laço deve ser capaz de tornar a condição Verdadeira, quando for necessário,
pois caso contrário a condição será sempre Falsa, e os comandos dentro do laço ficarão em
execução, infinitamente, ou até o programa travar. A criação de laços infinitos, devido a erros
de programação, é uma causa comum de travamentos.
3 Dim x
4 x=10
8 Contador=1
106
Capítulo 2 – Uma Introdução ao VBScript
6 Soma=0
Observe que, dentro do laço, vamos incrementando o valor da variável Contador, uma unidade
para cada passagem do laço. Com isso, quando o valor de Contador atingir 11, o teste do
início do laço torna-se Verdadeiro, e o laço é encerrado.
107
Criando Sites Dinâmicos com ASP 3.0
Nesta estrutura, enquanto a condição for Falsa, o código dentro do laço é executado. Quando a
condição tornar-se Verdadeira, o primeiro comando após o final do laço será executado. Neste
caso, se a condição for Verdadeira, já na primeira vez, o laço será executado uma única vez.
IMPORTANTE
O código dentro do laço deve ser capaz de tornar a condição Verdadeira, quando for necessário,
pois caso contrário a condição será sempre Falsa, e os comandos dentro do laço ficarão em
execução, infinitamente, ou até o programa travar. A criação de laços infinitos, devido a erros
de programação, é uma causa comum de travamentos.
Listagem 2.29 – Um exemplo simples da estrutura de laço Do... Loop Until Condição.
1 <SCRIPT LANGUAGE=“vbscript”>
2 <!—
3 Dim x
4 x=10
9 Contador=1
6 Soma=0
108
Capítulo 2 – Uma Introdução ao VBScript
Vamos modificar um pouco o nosso exemplo. Considere o que é mostrado na Listagem 2.30.
Listagem 2.30 – Outro exemplo simples da estrutura de laço Do... Loop Until Condição.
1 <SCRIPT LANGUAGE=“vbscript”>
2 <!—
3 Dim x
4 x=10
10 Contador=11
6 Soma=0
9 Do
10 Soma = Soma + Contador
11 Contador = Contador + 1
12 Loop Until Contador >= x
Muito simples. A condição Contador >= x é verdadeira, pois x=10 e Contador=12 (lembre
que o Contador foi incrementado de uma unidade, na linha 11, na primeira passagem do
laço). Neste caso, o laço será executado uma única vez, pois o teste de condição está ao final.
Quando o laço é executado, a linha 10 atribui o valor 11 para a variável Soma. Com isso, o
valor exibido para a variável Soma, será 11, indicado na Figura 2.33.
109
Criando Sites Dinâmicos com ASP 3.0
Conclusão
Neste capítulo apresentamos diversos conceitos importantes, os quais serão utilizados ao
longo de todo livro.
Primeiro, definimos o que é VBScript e fizemos uma revisão de HTML, principalmente das
tags para a criação de formulários com HTML.
110
Capítulo 3 – Funções, Procedimentos e Eventos com VBScript
Capítulo 3
Funções, Procedimentos
e Eventos com VBScript
111
Criando Sites Dinâmicos com ASP 3.0
Neste capítulo, veremos uma série de aspectos que vão além do básico do VBScript. Iniciaremos
falando um pouco mais sobre tipos de dados e funções para conversão de tipos. Este tópico é de
grande importância, principalmente quando criamos páginas que efetuam cálculos.
Depois passaremos a analisar uma série de funções internas do VBScript. São funções que
fazem parte do VBScript, como por exemplo a função Date( ), que retorna a data do sistema.
Na seqüência, aprenderemos a criar nossas próprias funções e sub-rotinas. Aprenderemos as
diferenças entre uma sub-rotina e uma função, e quando utilizar uma ou outra.
Então, mãos à obra. É hora de aprendermos um pouco mais sobre VBScript, para, a partir do
Capítulo 4, começarmos a tratar de ASP 3.0, utilizando os conhecimentos apresentados nestes
capítulos iniciais.
NOTA
Os exemplos apresentados nas listagens deste capítulo podem ser criados utilizando-se um
redator de texto, como o Bloco de notas, e salvando os arquivos com a extensão .htm. Depois é
só abrir os mesmos no Internet Explorer e testar. Os números das linhas, que aparecem nas
listagens, não devem ser digitados. Os mesmos foram incluídos, apenas para facilitar o
acompanhamento das explicações de cada exemplo.
112
Capítulo 3 – Funções, Procedimentos e Eventos com VBScript
A Função IsArray
Um Array é um tipo especial de variável, a qual pode armazenar diversos valores em uma
única variável. De uma forma simples, um Array é um conjunto. Cada valor armazenado no
Array é um elemento do conjunto. Por exemplo, poderíamos criar um Array para armazenar
os nomes dos meses do ano. Com isso teríamos um Array de 12 elementos.
O 19 significa que temos 20 elementos (sempre um a mais do que o número que aparece na
declaração), isto é, do elemento 0, indicado por produtos(0), até o elemento 20, indicado por
produtos(19).
7 <SCRIPT LANGUAGE=“vbscript”>
8 <!—
13 Dim Dias(6)
113
Criando Sites Dinâmicos com ASP 3.0
15 Dias(0)= “Segunda-feira”
16 Dias(1)= “Terça-feira”
17 Dias(2)= “Quarta-feira”
18 Dias(3)= “Quinta-feira”
19 Dias(4)= “Sexta-feira”
20 Dias(5)= “Sábado”
21 Dias(6)= “Domingo”
25 For i=0 to 6
26 mensagem = mensagem & “Dia: ” & i+1 & “ ” & Dias(i)& Chr(13)
27 Next
28 ‘Utilizamos uma MsgBox, para exibir a mensagem
29 ‘com o conteúdo do Array Dias.
30 MsgBox mensagem
31 —>
32 </SCRIPT>
33 </BODY>
34 </HTML>
Ao carregar este exemplo, no Internet Explorer, será exibida a janela mostrada na Figura 3.1.
114
Capítulo 3 – Funções, Procedimentos e Eventos com VBScript
Utilizamos a função IsArray, para determinar se uma variável do tipo Variant (lembre que
todas as variáveis do VBScript são do tipo Variant) está armazenando um Array.
A função IsArray retorna verdadeiro se a variável for um Array, e falso em caso contrário.
A Função VarType
Podemos utilizar a função VarType para determinar o subtipo de uma variável. Como todas as
variáveis são do tipo Variant, o subtipo pode ser utilizado para determinar o tipo de dado
armazenado na variável. Passamos, para a função, o nome de uma variável ou expressão. A
função retorna um número inteiro que indica o subtipo da variável.
ou
VarType(expressão)
Valor Descrição
0 Vazio (não inicializado)
115
Criando Sites Dinâmicos com ASP 3.0
Valor Descrição
1 Nulo (dados não válidos)
2 Inteiro
3 Inteiro longo
4 Número de precisão simples
5 Número de precisão dupla
6 Monetário
7 Data
8 Texto
9 Objeto de automação
10 Erro
11 Boleano
12 Variant (somente é utilizado com Arrays de variantes)
13 Objeto para acesso a dados
17 Byte
8192 Array
7 <SCRIPT LANGUAGE=“vbscript”>
8 <!—
9 Dim x,y,z
116
Capítulo 3 – Funções, Procedimentos e Eventos com VBScript
10 Dim a, b
11 Dim c(20)
12 x=12
13 y=23.456
14 y=123456789
15 a=“Este é um valor de texto!”
24 MsgBox mensagem
25 —>
26 </SCRIPT>
27 </BODY>
28 </HTML>
Ao carregar este exemplo no Internet Explorer, obteremos o resultado indicado na Figura 3.3.
117
Criando Sites Dinâmicos com ASP 3.0
Observe, principalmente, no tipo da variável z, o qual retornou 0. Isto significa que a variável
z está vazia, ou seja, não foi inicializada. Este resultado está coerente com a Tabela 3.1. Também
podemos salientar o retorno para a variável b, o qual retornou 7, indicando que o valor
armazenado nesta variável é do tipo Data. Portanto, também está coerente com a Tabela 3.1,
uma vez que usamos a função Date( ), para armazenar a data do sistema, na variável b.
Finalmente observe o valor de retorno para a variável c, o qual retornou 8192, indicando que
a variável c é um Array. Este resultado está coerente com a Tabela 3.1, e com a declaração da
linha 11 – Dim c(20), a qual declarou a variável c como sendo um Array.
Muitas são as aplicações práticas para a função VarType, dentre as quais podemos destacar a
validação dos dados digitados em um formulário.
A Função IsDate
A função IsDate recebe uma variável ou expressão como argumento, e determina se a variável
ou expressão é uma data válida, ou pode ser convertida para uma data válida. Caso o argumento
passado seja uma data válida, a função retorna Verdadeiro, caso contrário, retorna Falso.
Podemos utilizar esta função, por exemplo, para verificar se o usuário digitou uma data válida,
em um campo de um formulário.
ou
IsDate(expressão)
118
Capítulo 3 – Funções, Procedimentos e Eventos com VBScript
12 window.dataen.focus
13 End If
14 End Sub
15 —>
16 </SCRIPT>
17 </HEAD>
18 <BODY>
19 <P>Exemplo de uso da função IsDate</P>
20 <P>Digite a data de encerramento:
21 <INPUT id=“dataen” maxLength=10 name=“dataen” > (dd/mm/aaaa)
22 </P>
23 <P>Clique no botão para verificar se a data é válida:
24 <INPUT id=“verifica” name=“verifica” type=button value=“Verificar data”></P>
25 </BODY>
26 </HTML>
A Figura 3.4 mostra este documento aberto no Internet Explorer, onde o usuário digitou uma
data inválida, no nosso exemplo, o usuário digitou 30/02/2000.
119
Criando Sites Dinâmicos com ASP 3.0
Após digitar a data, o usuário clica no botão “Verificar data”, para testar se a data é válida.
Esta ação do usuário, gera o evento onclik deste botão. Observe que das linhas 6 a 13, definimos
um procedimento que responde ao evento onclick do botão verifica. O que define que este
procedimento atua em resposta ao evento onclick, do botão verifica, é o nome do procedimento:
Sub verifica_onclick
Esta definição faz parte do modelo de objetos e eventos do Internet Explorer, a qual
analisaremos em maiores detalhes mais adiante, ainda neste capítulo.
Caso a data não seja válida, emitimos uma mensagem avisando – linha 10. Na linha 11, voltamos
a utilizar o modelo de objetos do Internet Explorer. A expressão window.dataen.value significa:
o valor do campo dataen, da janela atual do navegador. Com este comando, estamos “apagando”
a data digitada pelo usuário. Na linha 12, utilizamos o método focus, para posicionar o cursor
de volta no campo dataen. Com isso, quando o usuário clicar em OK, na janela da mensagem de
data inválida, o campo dataen será apagado (linha 11) e o cursor posicionado no campo (linha
12), para que o usuário possa digitar uma nova data, conforme indicado na Figura 3.6.
120
Capítulo 3 – Funções, Procedimentos e Eventos com VBScript
A Função IsEmpty
A função IsEmpty recebe uma variável ou expressão como argumento, e determina se, em
algum momento, foi atribuído algum valor para a variável ou expressão. Caso tenha sido
atribuído algum valor, a função retorna Verdadeiro, caso contrário, retorna Falso. Podemos
utilizar esta função, por exemplo, para verificar se um campo de digitação obrigatória, como
por exemplo o nome, não foi deixado em branco.
ou
IsEmpty(expressão)
4 <SCRIPT LANGUAGE=“vbscript”>
5 <!—
6 ‘ Vamos declarar uma variável x que nunca
7 ‘ será utilizada no nosso script
8 Dim a, b, c
9 Dim x
10 a=10
11 b=23
12 c=a+b
13 If IsEmpty(x) Then
14 MsgBox “A variável x não foi utilizada!”
15 End If
16 —>
17 </SCRIPT>
18 </HEAD>
121
Criando Sites Dinâmicos com ASP 3.0
19 <BODY>
24 </BODY>
25 </HTML>
Ao abrir este documento, no Internet Explorer, você recebe a mensagem indicada na Figura 3.7.
A Função IsNull
A função IsNull recebe uma variável ou expressão como argumento, e determina se, em
algum momento, foi atribuído o valor Null para a variável ou expressão. Se tiver sido atribuído
o valor Null, a função retorna Verdadeiro, caso contrário, retorna Falso. Para atribuirmos Null
para uma variável, utilizamos a seguinte sintaxe:
NomeDaVariável = Null
IMPORTANTE
Uma variável com valor Null, não é a mesma coisa que uma variável com valor zero, ou uma
variável de texto com tamanho zero. Quando é atribuído o valor Null para a variável, a mesma
continua existindo na memória, porém sem nenhum valor definido.
ou
IsNull(expressão)
122
Capítulo 3 – Funções, Procedimentos e Eventos com VBScript
4 <SCRIPT LANGUAGE=“vbscript”>
5 <!—
6 ‘ Vamos declarar uma variável x, e atribuir
7 ‘ Null para a mesma.
8 Dim x
9 x = Null
10 If IsNull(x) Then
11 MsgBox “A variável x é Nula!”
12 End If
13 —>
14 </SCRIPT>
15 </HEAD>
16 <BODY>
18 </BODY>
19 </HTML>
Ao abrir este documento, no Internet Explorer, você recebe a mensagem indicada na Figura 3.8.
123
Criando Sites Dinâmicos com ASP 3.0
A Função IsNumeric
A função IsNumeric recebe uma variável ou expressão como argumento, e determina se o
valor atribuído à variável ou expressão é numérico, ou pode ser convertido para numérico.
Se o valor for numérico, ou puder ser convertido, a função retorna Verdadeiro, caso contrário,
retorna Falso.
ou
IsNumeric(expressão)
4 <SCRIPT LANGUAGE=“vbscript”>
5 <!—
6 Dim x,y,z
7 x=123
10 y= “Riachuelo - 80”
124
Capítulo 3 – Funções, Procedimentos e Eventos com VBScript
11 z = Date()
16 —>
17 </SCRIPT>
18 </HEAD>
19 <BODY>
21 </BODY>
22 </HTML>
Ao abrir este documento, no Internet Explorer, você recebe a mensagem indicada na Figura 3.9.
Cabe salientar a utilização da função Date( ), para capturar a data do sistema, e atribuir esta data
à variável z. Observe que esta data não foi considerada um valor numérico para a função IsNumeric.
A Função IsObject
A função IsObject recebe uma variável como argumento, e determina se o valor atribuído à
variável é um objeto ActiveX. Se for, a função retorna Verdadeiro, caso contrário, retorna Falso.
Para exemplificarmos esta função, faremos uso de uma página ASP, e iremos utilizar um dos
objetos do ASP. Falaremos mais sobre os objetos do ASP no Capítulo 4.
125
Criando Sites Dinâmicos com ASP 3.0
ou
IsObject(expressão)
5 <BODY>
7 <%
9 If IsObject(tiponav) Then
10 Response.Write “A variável tiponav é um objeto”
11 Else
12 Response.Write “A variável tiponav não é um objeto.”
13 End If
14 %>
15 </BODY>
16 </HTML>
IMPORTANTE
Como este é um arquivo .asp, o mesmo não pode ser aberto localmente no Internet Explorer.
Toda página .asp é interpretada no servidor, e o resultado do processamento, na forma de
HTML puro, é devolvido para o navegador. Para testar um arquivo .asp, o mesmo precisa ser
salvo no servidor IIS e acessado utilizando-se o endereço para a página .asp.
Ao abrir este documento, no Internet Explorer, obtemos o resultado indicado na Figura 3.10.
126
Capítulo 3 – Funções, Procedimentos e Eventos com VBScript
Observe no campo endereço, que estamos acessando a página .asp, em um servidor, e não
localmente, conforme indicado pelo endereço: http://servidor/Chap3/IsObject.asp.
Função Cbool
A função Cbool converte uma variável ou resultado de uma expressão para o subtipo Boolean.
Qualquer número, com exceção do zero, é automaticamente convertido para Verdadeira. O
valor zero é sempre convertido para Falso. O argumento desta função não pode ser texto, caso
contrário será gerado um erro em tempo de execução.
127
Criando Sites Dinâmicos com ASP 3.0
A expressão 10>25 é avaliada, como a expressão é falsa, a função Cbool retorna Falso. Já no segundo
uso da função Cbool, foi passado o parâmetro 3 para a função. Qualquer valor diferente de zero
(com exceção de texto) a função interpreta como Verdadeiro, o que é comprovado pela Figura 3.11.
Função CByte
A função CByte converte uma variável ou resultado de um expressão para o subtipo Byte. O
valor a ser convertido, deve estar na faixa aceitável para o tipo byte, que vai de 0 a 255. Caso
o número esteja fora desta faixa, será gerada uma mensagem de erro; e, se o argumento desta
função for texto também será gerada uma mensagem de erro, em tempo de execução.
A expressão 10+34 é calculada, e o resultado (44), é convertido para o tipo Byte. A linha de
código abaixo, irá gerar uma mensagem de erro, em tempo de execução, pois o valor a ser
convertido para byte, está fora da faixa de 0 a 255.
MsgBox CByte(100+200)
128
Capítulo 3 – Funções, Procedimentos e Eventos com VBScript
Função CCur
A função CCur converte uma variável, ou resultado de um expressão, para o subtipo Currency.
O argumento desta função não pode ser Texto, caso contrário será gerado um erro.
Se passarmos um argumento de texto para a função CCur será gerado um erro de execução,
conforme indicado na Figura 3.14.
Figura 3.14: Erro gerado ao passar um texto como argumento para CCur.
129
Criando Sites Dinâmicos com ASP 3.0
Função CDate
A função CDate converte uma variável ou resultado de um expressão para o subtipo Date. O
argumento desta função deve estar em um formato que seja aceitável para datas, caso contrário
será gerada uma mensagem de erro, em tempo de execução.
A linha de código abaixo irá gerar uma mensagem de erro, em tempo de execução, conforme
indicado na Figura 3.16.
MsgBox CDate(“31/02/1980”)
Figura 3.16: Erro gerado ao passar um argumento com uma data inválida.
130
Capítulo 3 – Funções, Procedimentos e Eventos com VBScript
Função CDbl
A função CDbl converte uma variável ou resultado de um expressão para o subtipo Double. O
argumento desta função não pode ser do tipo texto, caso contrário será gerada uma mensagem
de erro, em tempo de execução.
A linha de código abaixo irá gerar uma mensagem de erro, em tempo de execução, conforme
indicado na Figura 3.18.
MsgBox CDbl(“Teste”)
Figura 3.18: Erro gerado ao passar um argumento de tipo inválido para a função Cdbl.
131
Criando Sites Dinâmicos com ASP 3.0
Função CInt
A função CInt converte uma variável ou resultado de um expressão para o subtipo Integer. O
argumento desta função não pode ser do tipo texto, caso contrário será gerada uma mensagem
de erro, em tempo de execução.
A linha de código abaixo irá gerar uma mensagem de erro, em tempo de execução, conforme
indicado na Figura 3.20.
MsgBox CInt(“Teste”)
Figura 3.20: Erro gerado ao passar um argumento de tipo inválido para a função CInt.
132
Capítulo 3 – Funções, Procedimentos e Eventos com VBScript
Função CLng
A função CLng converte uma variável ou resultado de um expressão para o subtipo Long. O
argumento desta função não pode ser do tipo texto, caso contrário será gerada uma mensagem
de erro, em tempo de execução. O argumento também não pode estar fora da faixa admitida
pelo subtipo Long, caso contrário será gerada uma mensagem de erro, em tempo de execução.
A linha de código abaixo irá gerar uma mensagem de erro, em tempo de execução, conforme
indicado na Figura 3.22.
MsgBox CLng(“Teste”)
Figura 3.22: Erro gerado ao passar um argumento de tipo inválido para a função CLng.
133
Criando Sites Dinâmicos com ASP 3.0
Função CSng
A função CSng converte uma variável ou resultado de um expressão para o subtipo Single. O
argumento desta função não pode ser do tipo texto, caso contrário será gerada uma mensagem
de erro, em tempo de execução. O argumento também não pode estar fora da faixa admitida
pelo subtipo Single, caso contrário será gerada uma mensagem de erro, em tempo de execução.
A linha de código abaixo, irá gerar uma mensagem de erro, em tempo de execução, conforme
indicado na Figura 3.24.
MsgBox CSng(“Teste”)
Figura 3.24: Erro gerado ao passar um argumento de tipo inválido para a função CSng.
134
Capítulo 3 – Funções, Procedimentos e Eventos com VBScript
Função CStr
A função CStr converte uma variável ou resultado de um expressão para o subtipo String.
135
Criando Sites Dinâmicos com ASP 3.0
Com isso, terminamos a nossa apresentação sobre as principais funções para a conversão de
tipos de dados. No próximo item, estaremos analisando mais algumas funções do VBScript,
para operações com dados do tipo String e do tipo Data/Hora.
Para uma referência completa sobre todas as funções do VBScript, você pode consultar o
seguinte endereço: http://msdn.microsoft.com/scripting.
Função Asc
A função Asc retorna o valor numérico do código ASCII, para a primeira letra de uma String.
Considere o exemplo:
Asc(“Ainda chovia”)
Este exemplo de uso da função retorna o valor 65, o qual é o código ASCII para a letra A
maiúscula. Caso fosse a letra a minúscula, o código retornado seria 97.
Função Chr
A função Chr(número), recebe um número como parâmetro, e retorna o caractere ASCII,
correspondente. Considere o exemplo:
Chr(65)
136
Capítulo 3 – Funções, Procedimentos e Eventos com VBScript
NOTA
Até agora, utilizamos a função Chr em alguns exemplos. Utilizamos o Chr(13) para simular
um ENTER, o que faz uma quebra de linha, nas mensagens montadas com o MsgBox.
Função Len
Esta função determina o tamanho da String que foi passada como parâmetro para a função.
Considere o exemplo:
MsgBox Len(“Este é um exemplo de uso da função Len!!”)
Este exemplo de uso da função, retorna 41, conforme indicado na Figura 3.27.
Função LCase
Esta função converte para minúsculas a String que foi passada como parâmetro para a função.
Considere o exemplo:
MsgBox Lcase(“ESTE É UM EXEMPLO DE USO DA FUNÇÃO LCASE”)
Este exemplo de uso da função converte, o parâmetro passado, para letras minúsculas,
conforme indicado na Figura 3.28.
137
Criando Sites Dinâmicos com ASP 3.0
Função UCase
Esta função converte para maiúsculas a String que foi passada como parâmetro para a função.
Considere o exemplo:
MsgBox Ucase(“este é um exemplo do uso da função ucase!!”)
Este exemplo de uso da função converte, o parâmetro passado, para letras maiúsculas, conforme
indicado na Figura 3.29.
Função Left
Esta função retorna um número especificado de caracteres, a partir do início (Left – Esquerda)
de uma String. É importante salientar que espaços em branco também devem ser considerados.
Considere o exemplo:
MsgBox Left(“Júlio Cesar Fabris Battisti”,5)
Este exemplo de uso da função, retorna as cinco primeiras letras da String passada, neste
caso, retornará Júlio.
Função Right
Esta função retorna um número especificado de caracteres, a partir do final (Right – Direita)
de uma String. É importante salientar que espaços em branco também devem ser considerados.
138
Capítulo 3 – Funções, Procedimentos e Eventos com VBScript
Considere o exemplo:
MsgBox Right(“Júlio Cesar Fabris Battisti”,6)
Este exemplo de uso da função, retorna as seis últimas letras da String passada, neste caso,
retornará ttisti.
Função Mid
Esta função retorna um número especificado de caracteres, a partir de uma posição especificada
dentro da String. É importante salientar que espaços em branco também devem ser
considerados.
Este exemplo de uso da função, retorna, a partir da posição 7, cinco caracteres, neste caso,
retornará Cesar.
Mid(“SANTA MARIA”,3,7)
irá retornar NTA MAR. Observe que o espaço em branco também é considerado.
Um detalhe interessante, é que podemos utilizar o retorno de uma função, como parâmetro
para outra função. Considere o seguinte exemplo:
LCase(Mid(“SANTA MARIA”,3,7))
139
Criando Sites Dinâmicos com ASP 3.0
A função Mid retira os caracteres NTA MAR, os quais são passados como parâmetros para a
função LCase, a qual converte os caracteres para minúsculos.
Função String
Esta função retorna um determinado caractere, um número especificado de vezes.
Considere o exemplo:
MsgBox String(35,“*”)
Função Date
Retorna a data corrente do sistema. Não precisamos passar parâmetros para esta função.
Considere o exemplo abaixo:
MsgBox “Data do Sistema: ” & Date( )
140
Capítulo 3 – Funções, Procedimentos e Eventos com VBScript
Função Time
Retorna a hora corrente do sistema. Não precisamos passar parâmetros para esta função.
Considere o exemplo abaixo:
MsgBox “Hora do Sistema: ” & Time( )
Função Day
Recebe como parâmetro uma data, e retorna um número entre 1 e 31, indicando o dia do mês.
O formato geral é o seguinte:
Day(data)
A função Date( ) captura a data do sistema e passa como parâmetro para a função Day, que,
por sua vez, retorna apenas o dia do mês.
141
Criando Sites Dinâmicos com ASP 3.0
Função Month
Recebe como parâmetro uma data, e retorna um número entre 1 e 12, indicando o mês do
ano. O formato geral é o seguinte:
Month(data)
A função Date( ) captura a data do sistema e passa como parâmetro para a função Month, que,
por sua vez, retorna apenas o mês do ano.
Função Now
Retorna a hora e a data corrente do sistema. Não precisamos passar parâmetros para esta
função. Considere o exemplo abaixo:
MsgBox “Data e Hora do Sistema: ” & Now( )
142
Capítulo 3 – Funções, Procedimentos e Eventos com VBScript
Função MonthName
Recebe como parâmetro um número, indicativo do mês do ano (1 – Janeiro, 2 – Fevereiro, e assim
por diante), e um segundo parâmetro que pode ser Verdadeiro ou Falso. Se o segundo parâmetro
for Verdadeiro, o nome do mês será exibido abreviadamente. O formato geral é o seguinte:
MonthName(número_do_mês, abreviar)
A função Date( ) captura a data do sistema e passa como parâmetro para a função Month. A
função Month retorna o número do mês retornado pela data. Este número é passado como
primeiro parâmetro para a função MonthName. O segundo parâmetro é definido em Falso, o
que significa que é para exibir o nome do mês por extenso, isto é, não abreviado.
Função Hour
Recebe como parâmetro uma hora, e retorna um número entre 0 e 23, indicando o hora do
dia. O formato geral é o seguinte:
Hour(horário)
143
Criando Sites Dinâmicos com ASP 3.0
A função Time( ) captura a hora do sistema e passa como parâmetro para a função Hour, que,
por sua vez, retorna apenas a hora do dia.
A função DateDiff
Esta função pode ser utilizada para determinar o número de intervalos (em dias, trimestres,
semestres, anos, etc.), entre duas datas. A sintaxe desta função é o seguinte:
DateDiff(intervalo, data1, data2)
O parâmetro intervalo é uma String que diz que tipo de intervalo vamos calcular. Por exemplo,
é este parâmetro que define se queremos calcular o número de dias, ou o número de meses
entre duas datas. Na Tabela 3.2, temos os valores possíveis para o parâmetro intervalo.
Valor Descrição
yyyy Anos
q Trimestres
m Meses
y Dias do ano (o mesmo que dias)
d Dias
w Semanas
ww Semanas do ano (o mesmo que semanas)
144
Capítulo 3 – Funções, Procedimentos e Eventos com VBScript
Valor Descrição
h Horas
n Minutos
s Segundos
A Função DateAdd
Esta função pode ser utilizada para determinar uma data futura, com base em uma data
fornecida, o tipo de período a ser acrescentado (dias, meses, anos, etc.), e o número de períodos
a serem acrescentados. A sintaxe desta função é a seguinte:
145
Criando Sites Dinâmicos com ASP 3.0
O parâmetro intervalo é uma String que diz que tipo de intervalo vamos acrescentar. Por
exemplo, é este parâmetro que define se queremos acrescentar um número especificado de
dias, meses, anos, etc. Na Tabela 3.3, temos os valores possíveis para o parâmetro intervalo.
Valor Descrição
yyyy Anos
q Trimestres
m Meses
y Dias do ano (o mesmo que dias)
d Dias
w Semanas
ww Semanas do ano (o mesmo que semanas)
h Horas
n Minutos
s Segundos
A título de exemplo, vamos calcular a data em que tivemos um período de 1.000 meses, após
o descobrimento do Brasil. Para isso, utilizaríamos o seguinte comando:
MsgBox “Mil meses após o descobrimento foi em: ” & DateAdd(“m”,1000,“22/04/1500”)
Vamos modificar um pouco o nosso exemplo, e calcular em que data teremos passado um
milhão de dias após o descobrimento.
146
Capítulo 3 – Funções, Procedimentos e Eventos com VBScript
Função Year
Recebe como parâmetro uma data, e retorna um número indicativo do ano. O formato geral é
o seguinte:
Year(data)
A função Date( ) captura a data do sistema e passa como parâmetro para a função Year, a qual
por sua vez, retorna apenas o ano.
Função WeekDay
Recebe como parâmetros uma data, e um parâmetro opcional, que indica qual o primeiro dia da
semana. Se este parâmetro for omitido, o primeiro dia da semana será considerado domingo. O
valor para o primeiro dia da semana é numérico: 1 – domingo, 2 – segunda-feira, e assim por diante.
WeekDay(data, prim_dia_semana.)
147
Criando Sites Dinâmicos com ASP 3.0
O valor 6 indica que foi uma sexta-feira, o que confere com o calendário.
Poderíamos determinar que o primeiro dia da semana é a segunda-feira (2). Com isso o nosso
exemplo, ficaria assim:
MsgBox “Dia da semana: ” & WeekDay(“31/12/1999”,2)
O valor 5 indica que foi uma sexta-feira, pois agora a segunda-feira passou a ser o dia 1, a
terça-feira o dia 2, e assim por diante. Novamente confere com o calendário.
Função WeekDayName
Recebe como parâmetro um número, indicativo do dia da semana, e um segundo parâmetro
que pode ser Verdadeiro ou Falso. Se o segundo parâmetro for Verdadeiro, o nome do dia da
semana será exibido abreviadamente. O formato geral é o seguinte:
WeekDayName(número_do_dia, abreviar)
148
Capítulo 3 – Funções, Procedimentos e Eventos com VBScript
Na Tabela 3.4, temos a descrição das principais funções matemáticas, disponíveis no VBScript.
Função Descrição
Abs(n) Retorna o valor absoluto (sem sinal) do número n.
Atn(n) Retorna o valor do arco, cuja tangente é o número n. O
número n deve ser fornecido em radianos.
Cos(n) Retorna o coseno do número n. O número n deve ser
fornecido em radianos.
Exp(n) Retorna o número e (logaritmo neperiano e=2,7183),
elevado no número n.
Log(n) Retorna o logaritmo natural de um número n.
Rnd(n) Retorna um número aleatório entre 0 e 1.
Sgn(n) Retorna um número inteiro, indicando o sinal do
número n. Retorna –1 para números negativos e 1 para
números positivos.
149
Criando Sites Dinâmicos com ASP 3.0
Função Descrição
Sin(n) Retorna o seno do número n. O número n deve ser
fornecido em radianos.
Sqr(n) Retorna a raiz quadrada do número n.
Tan(n) Retorna a tangente do número n. O número n deve ser
fornecido em radianos.
NOTA
Para converter graus para radianos, multiplique o valor em graus por π (3.14), e divida o
resultado por 180.
Na Tabela 3.5, temos alguns exemplos de utilização das funções matemáticas do VBScript.
Com isso, encerramos a apresentação das principais funções do VBScript. Para uma referência
completa, você pode consultar o site http://msdn.microsoft.com/scripting, ou os CD’s da
assinatura do MSDN (Microsoft Developer Network). Junto com o Visual Studio 6.0 é fornecida
uma cópia do MSDN.
150
Capítulo 3 – Funções, Procedimentos e Eventos com VBScript
Para resolver estes problemas, poderíamos criar uma função ou sub-rotina que faz os cálculos
de depreciação. Depois, em cada local onde precisamos fazer os cálculos, é só chamar a
função (ou sub-rotina), para fazer os cálculos. Quando fosse necessária a alteração da
metodologia de cálculo, era só alterar a função (ou sub-rotina) e pronto! Os novos cálculos
passarão a ser feitos com base na nova metodologia. Isto poupa esforço, reduz o número de
linhas do script, facilita a manutenção do mesmo, além de reduzir a possibilidade de erros.
Agora é chegada a hora de aprendermos a criar funções e sub-rotinas.
NOTA
Um termo que pode aparecer é “procedimento”. Um procedimento é um grupo de instruções
que pode ser chamado pelo nome atribuído a ele. Neste contexto, funções e sub-rotinas são
tipos de procedimentos.
Uma sub-rotina pode, ou não, conter argumentos. Caso sejam necessários argumentos, os
mesmos serão passados quando a Sub-rotina for chamada, e devem ser passados, na mesma
ordem em que foram definidos.
DICA
Quando você criar Sub-rotinas, procure utilizar nomes que descrevam a função que ela tem.
Com isso você torna o entendimento do código mais fácil para quem for utilizá-lo.
Neste caso, declaramos uma Sub-rotina chamada Calcula_imposto, a qual espera receber três
parâmetros: salario, desconto e extras. Os parâmetros devem ser fornecidos nesta ordem,
para que a Sub-rotina funcione corretamente.
ou
Call Calcula_imposto(1500,23,125)
Também poderíamos declarar uma Sub-rotina sem parâmetros. Neste caso posso simplesmente
não utilizar os parênteses após o nome da Sub-rotina, ou utilizar um par de parênteses, sem
nada dentro, conforme indicado abaixo:
Sub Nome_da_Sub-rotina
Comando1
Comando2
...
Comandon
End Sub
ou
152
Capítulo 3 – Funções, Procedimentos e Eventos com VBScript
Sub Nome_da_Sub-rotina( )
Comando1
Comando2
...
Comandon
End Sub
Por exemplo, poderíamos criar uma Sub-rotina que exibe uma caixa de mensagem com a data
do sistema e a hora, no formato indicado na Figura 3.46.
Poderíamos criar todos os comandos necessários, para exibir a hora e a data neste formato, cada
vez que a exibição fosse necessária. Porém é mais prático criar uma Sub-rotina que faz este trabalho.
Cada vez que precisarmos exibir a data e a hora neste formato, é só chamarmos a Sub-rotina.
Na Listagem 3.8, temos o código da Sub-rotina exibe_data_hora, a qual faz a exibição da data
e da hora, no formato proposto pela Figura 3.46.
2 mes_atual=Month(Date())
3 mes_nome=MonthName(mes_atual,False)
153
Criando Sites Dinâmicos com ASP 3.0
7 hora_atual = Hour(Time())
8 minuto_atual = Minute(Time())
9 segundo_atual = Second(Time())
10 mensagem = mensagem & “Hora atual: ” & hora_atual & chr(13)
11 mensagem = mensagem & “Minuto atual: ” & minuto_atual & chr(13)
12 mensagem = mensagem & “Segundo atual: ” & segundo_atual
13 MsgBox mensagem
14 End Sub
Agora, cada vez que for necessário exibir a data e a hora nos formatos do exemplo, basta
chamar a Sub-rotina exibe_data_hora, utilizando um dos seguintes comandos:
Call exibe_data_hora
ou
exibe_data_hora
154
Capítulo 3 – Funções, Procedimentos e Eventos com VBScript
Uma Função pode, ou não, conter argumentos. Caso sejam necessários argumentos, os mesmos
serão passados quando a Função for chamada, e devem ser passados, na mesma ordem em
que foram definidos.
DICA
Quando você criar Função, procure utilizar nomes que descrevam os objetivos da Função.
Com isso você torna o entendimento do código mais fácil para quem for utilizá-lo.
Neste caso, declaramos uma Função chamada Converte_para_dolar, a qual espera receber
dois parâmetros: um valor em real e a cotação do dólar.
Uma vez criada a Função, devemos chamá-la, em um comando de atribuição, isto é, o valor retornado
pela função, deve ser atribuído a uma variável, ou exibido através de um comando como MsgBox.
No exemplo abaixo, estamos atribuindo o valor de retorno da função, à variável valor_dolar.
valor_dolar = Converte_para_dolar (1500,1.81)
Também poderíamos exibir o valor retornado pela função, utilizando o comando MsgBox,
conforme indicado a seguir:
MsgBox “Valor em dólar: ” & Converte_para_dolar (1500,1.81)
Observe que os parâmetros são passados dentro dos parênteses, e na mesma ordem definida
quando da criação da função.
Também poderíamos declarar uma Função, sem parâmetros. Neste caso posso simplesmente
não utilizar os parênteses após o nome da Função, ou utilizar um par de parênteses, sem nada
dentro, conforme indicado a seguir:
Function Nome_da_Função
Comando1
Comando2
...
Comandon
End Function
155
Criando Sites Dinâmicos com ASP 3.0
ou
Function Nome_da_Função( )
Comando1
Comando2
...
Comandon
End Function
Por exemplo, vamos criar uma Função que converte um valor de um ângulo de graus para
radianos. Depois a utilizaremos dentro de um laço For...Next, para exibir o valor em radianos,
para os ângulos de 0 a 20 graus.
Na Listagem 3.9, temos o exemplo de um script onde foi criada a função CRad, que converte
um valor em graus para radianos. Depois utilizamos um laço For para exibir, através de uma
caixa de mensagem, os valores em radianos, para os ângulos de 0 a 20 graus.
4 </HEAD>
5 <BODY>
6 <SCRIPT LANGUAGE=“vbscript”>
7 <!—
9 Function CRad(valor_graus)
10 CRad = (valor_graus*3.14)/180
11 End Function
12 For i=0 to 20
13 mensagem = mensagem & “Angulo: ” & i & “Valor em Radianos: ” &
FormatNumber(CRad(i),5)& Chr(13)
14 Next
15 MsgBox mensagem
156
Capítulo 3 – Funções, Procedimentos e Eventos com VBScript
16 —>
17 </SCRIPT>
19 </BODY>
20 </HTML>
Observe que, dentro da Função, atribuímos à variável CRad um determinado valor. É isso
que caracteriza uma Função. Dentro de seu código, devemos atribuir a uma variável que
tenha o mesmo nome da Função, um determinado valor. Este valor é que será o valor de
retorno da Função.
Também cabe salientar o uso da função FormatNumber, dentro do laço For. Essa função é
utilizada para formatar a maneira como um número é exibido. Neste caso, utilizamos a função
FormatNumber, para limitar o número de casas decimais, a cinco casas depois da vírgula.
Em cada passada do laço For...Next chamamos a função CRad, para fazer a conversão de
graus para radianos. O valor retornado pela função CRad, é passado para a função
FormatNumber, para ser formatado com apenas cinco casas decimais.
OBSERVAÇÃO
A linha 13 está sendo exibida em duas linhas, por questões de espaço. Quando for criar este
script, todo o conteúdo da linha 13, deve ser digitado em uma única linha.
Um evento é uma ação realizada pelo usuário em uma página. Por exemplo, quando o usuário
clica com o mouse, em um botão de comando, é gerado o evento onclick deste botão. Para
cada evento, existe uma Sub-rotina associada, para a qual podemos criar código em resposta
ao evento. Por exemplo, quando o usuário clica em um botão de comando, podemos colocar
código no evento onclick deste botão, que valida os dados digitados pelo usuário. Caso algum
dado esteja com problemas, uma mensagem de erro é exibida, solicitando que o usuário
corrija os dados com problema.
No Modelo de Objetos do Internet Explorer, temos quatro objetos que podem responder a eventos:
157
Criando Sites Dinâmicos com ASP 3.0
➥ Window.
➥ Document.
➥ Form.
➥ Element.
Para criar procedimentos que respondam a eventos utilizamos o seguinte formato:
<SCRIPT ID=clientEventHandlersVBS LANGUAGE=vbscript>
<!—
Sub NomeDoObjeto_NomeDoEvento
Comando1
Comando2
...
Comandon
End Sub
—>
</SCRIPT>
O nome da Sub-rotina é que define a qual evento a mesma irá responder. O padrão para o
nome da Sub-rotina é: NomeDoObjeto_NomeDoEvento.
3 <TITLE>Exemplo de eventos.</TITLE>
6 Sub Window_onload
7 MsgBox “A página está sendo carregada!!”
8 End Sub
9 —>
158
Capítulo 3 – Funções, Procedimentos e Eventos com VBScript
10 </SCRIPT>
11 </HEAD>
12 <BODY>
14 </BODY>
15 </HTML>
Ao ser carregada esta página, o evento Onload do objeto Window é disparado, e o código da
Sub-rotina Window_onload é executado. Com isso é exibida uma caixa de mensagem, conforme
indicado na Figura 3.47.
Evento Descrição
Onbeforeunload Ocorre quando a janela está para ser fechada.
Onblur Ocorre quando a janela perde o foco.
Onerror Ocorre quando um erro é gerado na janela.
Onfocus Ocorre quando a janela recebe o foco.
Onhelp Ocorre quando é pressionada a tecla F1.
159
Criando Sites Dinâmicos com ASP 3.0
Evento Descrição
Onload Ocorre quando a janela está sendo carregada.
Onresize Ocorre quando a janela é redimensionada.
Onscroll Ocorre quando o usuário rola através do
conteúdo da janela.
Onunload Ocorre quando a janela é fechada.
6 Sub Window_onload
7 MsgBox “A página está sendo carregada!!”
8 End Sub
9 Sub Window_onhelp
10 MsgBox “Você pressionou a tecla F1!!”
11 End Sub
12 Sub Window_onunload
13 MsgBox “Você está fechando este documento!!!”
14 End Sub
15 —>
16 </SCRIPT>
17 </HEAD>
18 <BODY>
20 </BODY>
21 </HTML>
160
Capítulo 3 – Funções, Procedimentos e Eventos com VBScript
NOTA
Ao pressionar F1, será exibida a mensagem indicada na Figura 3.48, e logo em seguida será
aberta uma janela com a Ajuda do Internet Explorer, conforme indicado na Figura 3.49, uma
vez que F1 é a tecla padrão de Ajuda no Windows.
O objeto Document representa todo o conteúdo existente dentro do objeto Window. Existem
diversos eventos disponíveis para o objeto Document, conforme descrito na Tabela 3.7.
161
Criando Sites Dinâmicos com ASP 3.0
Evento Descrição
Onafterupdate Ocorre após os dados terem sido enviados para o servidor
Web. Por exemplo, quando a página possui um formulário, no
qual o usuário preenche os campos e depois clica no botão
Enviar, enviando os dados para o servidor Web. Este, na
verdade, é um evento que ocorre no objeto Form, mas como
o objeto Form está contido no objeto Document, o objeto
Documento também é capaz de responder a este evento.
Onbeforeupdate Ocorre antes que os dados tenham sido enviados para o
servidor Web. Por exemplo, quando a página possui um
formulário, no qual o usuário preenche os campos e
depois clica no botão Enviar, enviando os dados para o
servidor Web. Este, na verdade, é um evento que ocorre
no objeto Form, mas como o objeto Form está contido no
objeto Document, o objeto Document também é capaz de
responder a este evento.
Onclick Ocorre cada vez que o usuário clica no documento.
Ondblclick Ocorre quando o usuário dá um clique duplo no
documento.
Ondragstart Ocorre quando o usuário começa a arrastar algum
elemento no documento.
Onhelp Ocorre quando o usuário pressiona a tecla F1.
OnKeyDown Ocorre quando uma tecla é pressionada, com exceção de
algumas teclas especiais, como Alt, por exemplo.
OnKeyPress Ocorre quando qualquer tecla é pressionada, inclusive as
teclas especiais.
OnKeyUp Ocorre quando uma tecla, que estava pressionada, é liberada.
Onmousedown Ocorre quando um botão do mouse é pressionado.
Onmousemove Ocorre quando o mouse é movimentado sobre o documento.
Onmouseup Ocorre quando um botão, que estava pressionado, é liberado.
Onselectstart Ocorre quando um elemento do documento é selecionado.
162
Capítulo 3 – Funções, Procedimentos e Eventos com VBScript
Agora vamos listar os principais eventos do objeto Form. O objeto Form é criado com a tag
<FORM> </FORM>. Podemos ter mais do que um objeto Form em um documento, desde
que os mesmos possuam nomes diferentes. Existem diversos eventos disponíveis para o objeto
Form, conforme descrito na Tabela 3.8.
Evento Descrição
Onafterupdate Ocorre após os dados terem sido enviados para o servidor
Web. Por exemplo, quando a página possui um formulário,
no qual o usuário preenche os campos e depois clica no
botão Enviar, enviando os dados para o servidor Web.
Onbeforeupdate Ocorre antes que os dados tenham sido enviados para o
servidor Web. Por exemplo, quando a página possui um
formulário, no qual o usuário preenche os campos e
depois clica no botão Enviar, enviando os dados para o
servidor Web.
Onclick Ocorre cada vez que o usuário clica no formulário.
Ondblclick Ocorre quando o usuário dá um clique duplo no formulário.
Ondragstart Ocorre quando o usuário começa a arrastar algum
elemento no formulário.
Onhelp Ocorre quando o usuário pressiona a tecla F1.
OnKeyDown Ocorre quando uma tecla é pressionada, com exceção de
algumas teclas especiais, como Alt, por exemplo.
OnKeyPress Ocorre quando qualquer tecla é pressionada, inclusive as
teclas especiais.
OnKeyUp Ocorre quando uma tecla, que estava pressionada, é liberada.
Onmousedown Ocorre quando um botão do mouse é pressionado.
Onmousemove Ocorre quando o mouse é movimentado sobre o
formulário.
Onmouseout Ocorre quando o usuário move o mouse para fora da área
do formulário.
Onmouseover Ocorre quando o mouse é movimentado sobre o
formulário.
163
Criando Sites Dinâmicos com ASP 3.0
Evento Descrição
Onmouseup Ocorre quando um botão, que estava pressionado, é
liberado.
Onselectstart Ocorre quando um elemento do formulário é selecionado.
Onsubmit Ocorre quando o usuário clica no botão Enviar do formulário.
Onreset Ocorre quando o usuário clica no botão Reset do formulário.
Agora vamos listar os principais eventos do objeto Element. O objeto Element, representa
qualquer controle ou elemento visível que possa ser colocado em uma página. Podemos ter
mais do que um objeto Element em um documento, sendo que cada objeto é identificado pelo
seu nome. Não podemos ter dois elementos com o mesmo nome. Existem diversos eventos
disponíveis para o objeto Element, conforme descrito na Tabela 3.9.
Evento Descrição
Onafterupdate Ocorre após os dados terem sido enviados para o servidor
Web. Por exemplo, quando a página possui um formulário,
no qual o usuário preenche os campos e depois clica no
botão Enviar, enviando os dados para o servidor Web.
Onbeforeupdate Ocorre antes que os dados tenham sido enviados para o
servidor Web. Por exemplo, quando a página possui um
formulário, no qual o usuário preenche os campos e
depois clica no botão Enviar, enviando os dados para o
servidor Web.
Onblur Ocorre quando o elemento perde o foco.
Onchange Ocorre quando os dados do elemento são alterados. Por
exemplo, quando alteramos o valor de um campo de
texto, em um formulário.
Onclick Ocorre cada vez que o usuário clica no elemento.
Ondblclick Ocorre quando o usuário dá um clique duplo no elemento.
Ondragstart Ocorre quando o usuário começa a arrastar um elemento
pela primeira vez.
164
Capítulo 3 – Funções, Procedimentos e Eventos com VBScript
Evento Descrição
Onfocus Ocorre quando o elemento recebe o foco.
Onhelp Ocorre quando o usuário pressiona a tecla F1.
OnKeyDown Ocorre quando uma tecla é pressionada, com exceção de
algumas teclas especiais, como Alt, por exemplo.
OnKeyPress Ocorre quando qualquer tecla é pressionada, inclusive
as teclas especiais.
OnKeyUp Ocorre quando uma tecla, que estava pressionada, é liberada.
Onmousedown Ocorre quando um botão do mouse é pressionado.
Onmousemove Ocorre quando o mouse é movimentado sobre o formulário.
Onmouseout Ocorre quando o usuário move o mouse para fora da área
do formulário.
Onmouseover Ocorre quando o mouse é movimentado sobre o formulário.
Onmouseup Ocorre quando um botão, que estava pressionado, é liberado.
Onresize Ocorre quando o elemento é redimensionado.
Onselectstart Ocorre quando um elemento é selecionado.
Onsubmit Ocorre quando o usuário clica no botão Enviar do formulário.
Onselect Ocorre quando o usuário termina de selecionar os dados de
um controle de entrada, como uma caixa de texto, por exemplo.
Apenas para exemplificar a utilização de eventos, vamos criar uma página onde temos uma
caixa de seleção. Nesta caixa de seleção temos três opções: Axcel Books, Developers Magazine
e Microsoft. Quando o usuário seleciona uma destas opções, o Internet Explorer,
automaticamente, carrega a página relacionada.
Para tornar esta lista dinâmica, utilizamos o modelo de eventos e código VBScript, conforme
indicado na Listagem 3.12.
165
Criando Sites Dinâmicos com ASP 3.0
6 Sub navega_onchange
7 window.navigate window.navega.value
8 End Sub
9 —>
10 </SCRIPT>
11 </HEAD>
12 <BODY>
166
Capítulo 3 – Funções, Procedimentos e Eventos com VBScript
22 </BODY>
23 </HTML>
Para tornar a lista dinâmica, utilizamos o evento onchange, do controle Navega. O controle
navega é uma caixa de combinação. Para maiores informações sobre criação de formulário
com HTML, consulte o Capítulo 2. Utilizamos o evento navega_onchange, o qual acontece
toda vez que um elemento da lista for selecionado.
Vejam que com uma única linha de código, tornamos a lista dinâmica. A linha de código foi
a seguinte:
window.navigate window.navega.value
A primeira parte utiliza o método Navigate do objeto Window. Este método é utilizado para
carregar uma página no Internet Explorer. O método Navigate espera receber um único
parâmetro, que é o endereço da página que deve ser carregada. Este parâmetro é obtido a
partir da propriedade value do controle Navega. Cada opção da caixa de combinação possui
um valor associado. Por exemplo, quando o usuário seleciona Microsoft, a propriedade value
é definida como http://www.microsoft.com, e este parâmetro é passado para o método
window.navigate, fazendo com que seja carregada a página da Microsoft. Este é o comportamen-
to desejado para a nossa página, ou seja, quando uma opção é selecionada, a página associada
a ela, deve ser carregada no Internet Explorer.
IMPORTANTE
Estamos utilizando o modelo de objetos e de eventos do Internet Explorer. O Nestcape Navigator
possui um modelo de objetos diferente do modelo do Internet Explorer. Por isso, scripts
desenvolvidos para o modelo do Internet Explorer, podem não funcionar corretamente no Netscape.
Conclusão
Neste capítulo, abordamos diversos tópicos importantes do VBScript. Iniciamos pelas funções
para determinação do subtipo de uma variável, bem como funções para conversão de subtipos.
Depois passamos a tratar de outras funções, tais como as para tratamento de texto, data e hora
e funções matemáticas. Estas funções são utilizadas na criação de aplicações práticas e são
de grande ajuda.
167
Criando Sites Dinâmicos com ASP 3.0
168
Capítulo 4 – A Tecnologia ASP e o Modelo de Objetos do ASP 3.0
Capítulo 4
A Tecnologia ASP e o Modelo
de Objetos do ASP 3.0
169
Criando Sites Dinâmicos com ASP 3.0
Introdução
Vamos iniciar, a partir deste capítulo, a nossa jornada rumo a aprendizagem da tecnologia de
Active Server Pages – ASP 3.0. Passaremos ao aprendizado de uma série de conceitos importantes,
os quais são utilizados na construção de páginas dinâmicas e aplicativos para a Web.
Iniciaremos o capítulo com uma apresentação detalhada sobre a tecnologia ASP, para que
possam ser solucionadas quaisquer dúvidas, que por ventura o leitor ainda tenha a respeito
do que é exatamente esta tecnologia e do que é necessário para utilizá-la.
Feitas as devidas apresentações, passaremos a estudar alguns objetos do ASP 3.0, sempre
ilustrando os conceitos apresentados com exemplos práticos e de fácil assimilação. Nos
exemplos procuro ilustrar a forma de utilização de cada um dos objetos, de modo que os
mesmos possam ser facilmente, adaptados para uso nas aplicações que se esteja desenvolvendo.
NOTA
Os objetos, que não forem tratados neste capítulo, serão vistos nos demais capítulos deste livro.
Finalizaremos o capítulo com alguns exemplos mais elaborados, onde procuro apresentar
diversas utilizações práticas para os objetos da tecnologia ASP 3.0.
Vamos às respostas.
170
Capítulo 4 – A Tecnologia ASP e o Modelo de Objetos do ASP 3.0
o servidor identifica a página como sendo uma página ASP, devido a extensão .asp.
Uma vez identificada, a página ASP é “processada” pelo servidor Web (que pode ser o IIS ou o
Personal Web Server). O servidor, após identificar a página ASP, passa a mesma para uma DLL
chamada ASP.DLL. O código contido nesta DLL analisa toda a página ASP, linha por linha, em
busca de linhas de código ASP, o qual é executado. Após executado todo o código existente na
página, o resultado, no formato de uma página HTML simples, é enviado para o navegador do
cliente. Este processo é detalhado na Figura 4.1 e explicado em seguida.
1) www.abc.com.br/page1.asp
Cliente
171
Criando Sites Dinâmicos com ASP 3.0
2. O servidor identifica que o pedido é para uma página que contém código ASP, pois a
extensão da página é .asp. No exemplo da Figura 4.1 um dos clientes solicita a página
page1.asp e o outro a página page2.asp.
3. Uma vez identificada como uma página ASP, o servidor Web passa o processamento da
página para o interpretador ASP (que no caso é a DLL ASP.DLL, normalmente instalada
no diretório winnt\System32\inetsrv, o qual é o diretório de instalação do IIS).
4. O interpretador passa linha por linha da página ASP. Sempre que for encontrado código
ASP, o mesmo é interpretado e executado.
5. Após todo o código ter sido executado, o resultado do processamento é enviado para o
navegador do cliente, no formato de uma página HTML padrão. É importante detalhar
bastante este ponto, pois existem muitas confusões e interpretações errôneas a respeito
do mesmo. Vamos fazer isso no próximo item.
Com isso podemos responder a pergunta do item: como e onde uma página ASP é processada?
Uma página ASP é processada no servidor Web (IIS ou Personal Web Server) pelo interpretador
ASP (ASP.DLL). O interpretador percorre a página, linha por linha, interpretando e executando
todo o código existente na página.
Agora vamos detalhar um pouco mais sobre o que a página ASP retorna para o navegador
do cliente.
172
Capítulo 4 – A Tecnologia ASP e o Modelo de Objetos do ASP 3.0
7 <%
8 Response.Write “Toda página ASP é interpretada <BR>”
9 Response.Write “e executada no servidor WEB !!!<BR>”
10 Response.Write “O resultado que retorna para o navegador<BR>”
11 Response.Write “do cliente, é código HTML padrão.”
12 %>
13 </BODY>
14 </HTML>
Ao acessar esta página ASP, o servidor Web interpreta e executa todo o código existente. No
nosso exemplo, o código ASP inicia na linha 7 e termina na linha 12. Relembrando o que
vimos no Capítulo 1: toda seção de código ASP inicia com <% e termina com %>.
O resultado, gerado pela página ASP, é código HTML padrão, o qual é enviado para o navegador
do cliente. A Figura 4.2, mostra a página list4-1.asp sendo acessada no Internet Explorer.
173
Criando Sites Dinâmicos com ASP 3.0
Apenas para esclarecer,vamos ver qual o código ASP que gerou a seguinte linha de código HTML:
Toda página ASP é interpretada <BR>
Esta linha de código HTML é resultado da execução da seguinte linha de código ASP:
Response.Write “Toda página ASP é interpretada <BR>”
Outro detalhe interessante a ser observado é que temos código HTML fora da seção de código
ASP. Na listagem 4.1, a linha 6 <H1>EXEMPLO DE PÁGINA ASP</H1> é código HTML.
Neste caso estamos utilizando a tag <H1> para criar o cabeçalho do documento, conforme
indicado na Figura 4.2. Este código HTML, que não é gerado por comandos ASP, é enviado
diretamente para o navegador do cliente, quando a página ASP é acessada.
174
Capítulo 4 – A Tecnologia ASP e o Modelo de Objetos do ASP 3.0
Veja que a possibilidade de alternar trechos de código HTML, com trechos de código ASP,
dentro de uma mesma página ASP, nos dá uma grande flexibilidade. As partes da página que
não apresentam natureza dinâmica, podem ser criadas simplesmente utilizando código HTML.
Outras partes que necessitam ser dinamicamente criadas, quer seja através da realização de
cálculos ou através do acesso a campos de uma tabela de um banco de dados, podem ser
criadas utilizando código ASP. Além disso podemos ter várias seções de código ASP dentro
de uma mesma página. Para iniciar uma seção utilizo <% e para finalizar a seção utilizo %>.
Posso colocar código HTML entre as diversas seções de código ASP. Com isso vou criando a
página utilizando HTML nos pontos estáticos e ASP nos pontos que precisam ser dinâmicos.
Também existem ferramentas gráficas que facilitam a criação de aplicações para a Web,
utilizando a tecnologia ASP. Uma ferramenta, desenvolvida pela própria Microsoft, é o
Microsoft Visual Interdev, o qual está, atualmente, na sua versão 6.0.
Como descrito anteriormente, uma página ASP é interpretada e executada no servidor Web.
Como servidor Web devemos utilizar o IIS – Internet Information Services 5.0 (o qual faz
parte do Windows 2000 Server), ou o Personal Web Server, para Windows 95 ou Windows 98.
Não existe, por exemplo, um interpretador ASP para o servidor Web Apache, ou para o Domino
da Lotus. Para maiores informações sobre os servidores Web que suportam ASP, consulte a
Introdução deste livro.
Podemos acessar páginas ASP utilizando qualquer navegador disponível (Internet Explorer,
Netscape Navigator, Mosaic, etc.). Isto é possível pelo fato de que uma página ASP é interpreta-
da e executada no servidor Web, retornando apenas código HTML padrão. Qualquer navegador
é capaz de exibir o conteúdo do código HTML de retorno. Com isso a utilização de páginas
ASP independe do navegador do cliente, o que passa a ser uma preocupação a menos para
quem desenvolve as páginas.
O fato de uma página ASP ser interpretada e executada no servidor Web traz inúmeras
vantagens, conforme já descrevemos, porém traz a desvantagem de não poder ser testada
localmente. Isto significa que você não pode simplesmente gravar uma página ASP em uma
pasta do seu computador e tentar acessá-la através do seu navegador. Fazendo isso, todo o
código ASP será, simplesmente, ignorado. Para que uma página ASP seja processada
175
Criando Sites Dinâmicos com ASP 3.0
corretamente, a mesma precisa estar armazenada em um servidor como o IIS, onde existe o
interpretador ASP. A página deve ser acessada utilizando-se o protocolo HTTP, isto é, ou você
digita o endereço da página, como por exemplo http://www.abc.com.br/page1.asp, ou clica
em um link que aponta para a página ASP gravada no servidor Web.
Uma das novidades da tecnologia ASP 3.0 é que podemos ter páginas com a extensão .asp,
sem que as mesmas contenham código ASP. Por exemplo, posso ter uma página .asp que
contém apenas código HTML. Quando esta página é solicitada, o servidor Web passa a
solicitação para o interpretador ASP (ASP.DLL). A primeira coisa que o interpretador faz é
verificar se existe algum código a ser interpretado e executado. Caso não exista código ASP, a
página é enviada de volta para o IIS, o qual retorna a página para o navegador do cliente. Com
este procedimento o interpretador não precisa passar a página, linha por linha. Isto torna a
execução das páginas bem mais rápida.
Neste item faremos uma apresentação genérica sobre o Modelo de Objetos do ASP 3.0, bem
como uma breve descrição de cada objeto. Nos demais itens deste capítulo estaremos tratando,
em detalhes, de cada um destes objetos. Estudaremos os objetos através de exemplos práticos
de utilização dos mesmos.
176
Capítulo 4 – A Tecnologia ASP e o Modelo de Objetos do ASP 3.0
Chamamos um método de um objeto para que o mesmo realize uma determinada ação. De
maneira geral, sem nos preocuparmos em sermos precisos em relação à teoria de Orientação
a Objetos, poderíamos dizer que: “Um método é um comportamento ou ação realizada por
um objeto”. Por exemplo, quando utilizamos o método Write do objeto Response
(Response.Write), o comportamento esperado é que o método Write envie o texto fornecido
entre aspas, para o servidor Web, que por sua vez envia para o navegador do cliente.
Conforme pode ser constatado pela Listagem 4.1, para chamarmos um método de um objeto,
utilizamos a seguinte sintaxe:
Nome_do_objeto.Nome_do_método parâmetros
Método
Objeto Parâmetro
177
Criando Sites Dinâmicos com ASP 3.0
Uma propriedade de um objeto define uma característica ou atributo do mesmo. Por exemplo,
temos a propriedade ScriptTimeout, a qual define o tempo máximo em que o código ASP
pode ficar sendo executado em uma página, antes que o servidor cancele a execução e retorne
uma mensagem de erro. O valor padrão é de 90 segundos. O exemplo seguinte define esta
propriedade para 5 minutos (300 segundos):
Server.ScriptTimeout = 300
Observe que as propriedades de um objeto são chamadas da mesma maneira que os métodos,
isto é:
Nome_do_objeto.Nome_da_propriedade = valor
Uma coleção contém um ou mais valores, os quais podem ser acessados pelo código ASP. Por
exemplo, a coleção Form, do objeto Request, contém os nomes e valores de todos os controles de
um formulário cujos dados foram passados para processamento da página ASP. Lembre que isto
é feito através do atributo Action da tag FORM, além disso o atributo Method deve ser definido
em POST. Para maiores detalhes sobre os atributos Action e Method, consulte o Capítulo 2.
Um evento é uma determinada ação que acontece, e para a qual podemos escrever código
ASP em resposta. Por exemplo, o objeto Session contém um evento OnStart, que ocorre quando
um usuário estabelece uma sessão com uma página ASP antes que uma requisição do usuário
178
Capítulo 4 – A Tecnologia ASP e o Modelo de Objetos do ASP 3.0
seja executada. Podemos utilizar este evento para iniciar variáveis ou rodar qualquer outro
código que seja necessário. Você já deve ter entrado em um site onde é necessário preencher
um formulário de cadastramento. Da próxima vez que você entra no site, você recebe uma
mensagem dizendo “Bem vindo Fulano de tal!”. Como é que o site sabe que é você, ou pelo
menos o seu computador, que está entrando no site? A página utiliza o evento Session.OnStart
para ler informações que foram gravadas no seu computador, normalmente na forma de um
Cookie e determinar quem está acessando a página.
Na Figura 4.5, temos uma visão geral de todos os Objetos, seus métodos, coleções, eventos e
propriedades. No restante deste capítulo, estaremos aprendendo a utilizar os objetos Response
e Request. Os demais objetos serão vistos ao longo do livro.
O Objeto Request
Com o objeto Request podemos ter acesso a diversas informações fornecidas pelo cliente ao
acessar uma página ASP, ou ao preencher dados em um formulário e enviá-los. Podemos ter
acesso a informações a respeito do navegador que o cliente está utilizando, quais os Cookies
gravados no computador do usuário, qual Certificado Digital o usuário está utilizando e muitas
outras informações importantes.
179
Criando Sites Dinâmicos com ASP 3.0
13 <P>Cartão Crédito:
14 <INPUT id=cartao name=cartao type=radio value=“Visa”>Visa
15 <INPUT id=cartao name=cartao type=radio value=“Master Card”>Master Card
16 <INPUT id=cartao name=cartao type=radio value=“Outros”>Outros</P>
17 <P>
18 <INPUT id=enviar name=enviar type=submit value=Enviar>
19 <INPUT id=limpar name=limpar type=reset value=Reset>
20 </P>
21 </FORM>
22 </BODY>
23 </HTML>
Observe que cada campo possui as propriedades “id” e “name” iguais. Definimos estas duas
propriedades para de manter a padronização. Para os objetos do ASP, o que é realmente utilizado
é a propriedade name, a qual identifica cada um dos campos de um formulário.
Observe que o atributo method do formulário, na linha 8, foi definido como post. Quando
utilizamos o método post, os dados digitados no formulário são enviados em uma conexão
separada, fazendo com que os mesmos não fiquem visíveis na linha de endereço do navegador.
180
Capítulo 4 – A Tecnologia ASP e o Modelo de Objetos do ASP 3.0
Além disso o método post permite que mais informações sejam enviadas, do que se
estivéssemos utilizando o método get. Falaremos um pouco mais sobre as diferenças entre os
métodos post e get, no próximo item.
O atributo action do formulário, na linha 8, foi definido como list4-2.asp. Isto significa que a
página ASP list4-2.asp é que vai processar os dados enviados pelo formulário. Neste caso
digitamos somente o nome da página porque a página HTML, que contém o formulário, e a
página ASP, que irá processar os dados digitados no formulário, estão na mesma pasta do
servidor Web. Poderia acontecer da página ASP estar, inclusive, em um outro servidor. Neste
caso devemos digitar o endereço completo da página ASP, como por exemplo:
<FORM action=“http://www.abc.com.br/Capitulo4/list4-2.asp” method=“post”>
Ao clicar no botão Enviar, os dados digitados no formulário são passados para a página list4-
2.asp. Precisamos de uma maneira de acessar estes dados. A coleção que nos permite ter
acesso a estes dados é a coleção Form do objeto Request.
181
Criando Sites Dinâmicos com ASP 3.0
IMPORTANTE
A coleção Form somente é utilizada quando o atributo method do formulário é definido como
post. Quando o método for definido como get, conforme veremos mais adiante, devemos utilizar
a coleção QueryString, ao invés da coleção Form.
Na Listagem 4.3, temos um exemplo para a página list4-2.asp, a qual simplesmente informa
ao usuário quais os valores que ele digitou em cada um dos campos. Para isso, utilizamos a
coleção Form do objeto Request.
5 <BODY>
6 <h2> Você digitou os seguintes dados !!</h2>
7 <P>Nome:
8 <%
9 =Request.Form(“nome”)
10 %>
11 </P>
12 <p>Rua:
13 <%
14 =Request.Form(“rua”)
15 %>
16 </p>
17 <p>Cidade:
182
Capítulo 4 – A Tecnologia ASP e o Modelo de Objetos do ASP 3.0
18 <%
19 =Request.Form(“cidade”)
20 %>
21 </p>
22 <p>E-mail:
23 <%
24 =Request.Form(“email”)
25 %>
26 </p>
27 <p>Cartão de Crédito:
28 <%
29 =Request.Form(“cartao”)
30 %>
31 </p>
33 </BODY>
34 </HTML>
Observe que vamos alternando trechos de código HTML com trechos de código ASP. Vamos
analisar o seguinte trecho de código:
7 <P>Nome:
8 <%
9 =Request.Form(“nome”)
10 %>
11 </P>
Na linha 7, é aberta uma tag de parágrafo <P>. Dentro deste parágrafo é colocado o texto
Nome:. Na linha 8 é aberto um trecho de código ASP, e utilizo a coleção Form do objeto
Request para ter acesso ao valor digitado no campo nome. No nosso exemplo, a linha 9
simplesmente retorna o texto digitado no campo nome do formulário. Este nome é colocado
logo após Nome:. Finalmente na linha 11 é fechado o parágrafo. O resultado deste trecho de
código que retorna para o usuário é o seguinte (supondo que no campo nome tenha sido
digitado Júlio Cesar Fabris Battisti):
<P>Nome: Júlio Cesar Fabris Battisti</P>
Na Figura 4.7, temos o retorno da página list4-2.asp, para os dados de exemplo indicados na
Figura 4.6.
183
Criando Sites Dinâmicos com ASP 3.0
Observe que, com o uso da coleção Form, podemos ter acesso a todos os campos do formulário.
A maneira como a página list4-2.asp foi construída irá funcionar bem, porém poderemos ter
alguns problemas. Por exemplo, vamos supor que por algum motivo, o nome de um dos
campos do formulário precise ser alterado. Caso isso aconteça, precisaríamos alterar a página
ASP, pois a coleção Form, utiliza a propriedade name do campo, para ter acesso ao conteúdo
do mesmo.
Podemos contornar esta dificuldade utilizando uma estrutura de controle que permite percorrer
todos os itens de uma coleção. Percorreremos os itens da coleção Form capturando o nome do
campo e o valor do mesmo. Com isso se o nome de algum campo mudar, a mudança será
detectada cada vez que a página ASP for chamada, pois o nome do campo não estará fixado
dentro do próprio arquivo ASP, como ocorre na Listagem 4.3.
A estrutura de controle que permite percorrer todos os elementos de uma coleção possui a
seguinte estrutura:
For Each membro In Nome_da_Coleção
Comando1
184
Capítulo 4 – A Tecnologia ASP e o Modelo de Objetos do ASP 3.0
Comando2
...
Comandon
Next
Com a estrutura For Each...Next, conseguimos percorrer todos os membros de uma coleção.
Considere o seguinte exemplo:
<%
For Each Item in Request.Form
=Item
Next
%>
Neste caso estaremos listando todos os nomes dos campos do formulário, através da utilização
da estrutura For Each...Next.
Agora vamos utilizar a estrutura For Each...Next para rescrever a nossa página ASP de uma
maneira mais genérica, conforme indicado na Listagem 4.4.
7 <%
8 For Each Item in Request.Form %>
9 <P>
10 <%=Item%>
11 :
12 <%=Request.Form(Item)%>
13 </P>
14 <% Next %>
185
Criando Sites Dinâmicos com ASP 3.0
Esta página produz o mesmo resultado que a página ASP da Listagem 4.3, porém vejam como
o código é bem menor. Além disso este código funciona sempre, mesmo que o nome de
algum dos campos do formulário seja alterado. Para testar este código basta salvar esta listagem
com o nome de list4-2-2.asp e alterar a página list4-2.htm. No atributo action da tag <FORM>
troque action=“list4-2.asp” por action=“list4-2-2.asp”.
Também é interessante notar que fomos alternando trechos de código HTML com código
ASP. Por exemplo, as linhas 7 e 8 são código ASP, onde é iniciado o laço For Each...Next. Na
linha 9 abrimos uma tag de parágrafo. Na linha 10 é exibido o nome do campo, através da
utilização de <% = Item%>. Na linha 11 colocamos o sinal : que vai ficar entre o nome do
campo e o valor digitado no campo. Na linha 12 é exibido o valor digitado no campo do
formulário, cujo atributo nome foi exibido pela linha 10. A linha 13 fecha a tag de parágrafo
e, finalmente, a linha 14 encerra o laço For Each...Next. Observe que o laço foi aberto em uma
seção de código e fechado em outra, o que nos dá uma grande flexibilidade.
186
Capítulo 4 – A Tecnologia ASP e o Modelo de Objetos do ASP 3.0
13 <P>Cartão Crédito:
14 <INPUT id=cartao name=cartao type=radio value=“Visa”>Visa
15 <INPUT id=cartao name=cartao type=radio value=“Master Card”>Master Card
16 <INPUT id=cartao name=cartao type=radio value=“Outros”>Outros</P>
17 <P>
18 <INPUT id=enviar name=enviar type=submit value=Enviar>
19 <INPUT id=limpar name=limpar type=reset value=Reset>
20 </P>
21 </FORM>
22 </BODY>
23 </HTML>
187
Criando Sites Dinâmicos com ASP 3.0
Para criar o arquivo formget.asp, basta pegar o código da Listagem 4.4 e trocar Request.Form
por Request.QueryString. Com isso teremos o código da Listagem 4.6.
7 <%
8 For Each Item in Request.QueryString %>
9 <P>
10 <%=Item%>
11 :
12 <%=Request.QueryString(Item)%>
13 </P>
14 <% Next %>
Esta página fornece o retorno indicado na Figura 4.9. Observe que o resultado é praticamente
o mesmo da Figura 4.7, porém com a diferença de que os dados foram passados através do
endereço de chamada da página.
Observe que os dados foram passados dentro da própria URL. Caracteres especiais, como o u
com acento agudo, são substituídos. Observe que o nome Júlio foi substituído por J%FAlio,
ou seja, o ú foi substituído por %FA. Também podemos observar que todo espaço em branco
foi substituído pelo sinal +, e assim por diante. Neste caso a coleção QueryString sabe tratar
estes caracteres especiais e exibi-los corretamente, conforme indicado pela Figura 4.9.
O método get possui limitações quanto a quantidade de informações que o mesmo pode
passar para o servidor. Esta limitação está em torno de 1.000 caracteres, conforme definição
188
Capítulo 4 – A Tecnologia ASP e o Modelo de Objetos do ASP 3.0
do protocolo HTTP. Além disso, toda a informação passada será visível na URL, o que em
muitas situações não é desejado.
É por isso que hoje, na maioria dos casos, utilizamos o método post, que não tem as mesmas
limitações do método get. Algumas aplicações antigas, com alguns scripts CGI, podem ter
sido desenvolvidos para usar o método get, neste caso os mesmos não funcionarão com o
método post. No restante deste livro, estaremos utilizando o método post.
189
Criando Sites Dinâmicos com ASP 3.0
13 <P>Cartão Crédito:
14 <INPUT id=cartao name=cartao type=radio value=“Visa”>Visa
15 <INPUT id=cartao name=cartao type=radio value=“Master Card”>Master Card
16 <INPUT id=cartao name=cartao type=radio value=“Outros”>Outros</P>
17 <P>
18 <INPUT id=enviar name=enviar type=submit value=Enviar>
19 <INPUT id=limpar name=limpar type=reset value=Reset>
20 </P>
21 <P>
22 <INPUT id=estado name=estado type=checkbox value=SP>SP
23 <INPUT id=estado name=estado type=checkbox value=RJ>RJ
24 <INPUT id=estado name=estado type=checkbox value=RS>RS
25 <INPUT id=estado name=estado type=checkbox value=SC>SC
26 <INPUT id=estado name=estado type=checkbox value=PR>PR
27 </P>
21 </FORM>
22 </BODY>
23 </HTML>
190
Capítulo 4 – A Tecnologia ASP e o Modelo de Objetos do ASP 3.0
Ao clicar no botão Enviar receberemos os resultados indicados na Figura 4.11. Observe que a
nossa página ASP formget.asp já processou corretamente os resultados.
Um detalhe que devemos observar é que os valores associados a cada um dos Check Box
marcados é o valor do atributo value. Se este atributo não tiver sido definido, será exibido On
para cada um dos Check Box marcados. Observe, na Listagem 4.7, que o atributo name é o
mesmo para todos os Check Box do grupo. É justamente isto que caracteriza um grupo de
Check Box, todos possuem o mesmo valor para a propriedade name.
191
Criando Sites Dinâmicos com ASP 3.0
Quando a página ASP recebe os dados, ela recebe os valores selecionados, todos no nome do
grupo. Por exemplo o seguinte código:
<% =Request.QueryString(“estado”)%>
produziria uma saída com o valor dos Check Box selecionados. Caso mais do que um Check Box
tenha sido selecionado, os valores serão exibidos separados por vírgula, conforme indicado abaixo:
SP, RS, PR
Com isso dizemos que o elemento estado, da coleção QueryString, possui valores múltiplos.
Existem situações em que pode ser necessário acessar um destes valores individualmente.
Isto é possível, pois cada um dos valores possui uma propriedade de índice associada. O
primeiro valor selecionado possui índice 1, o segundo possui índice 2 e assim por diante.
192
Capítulo 4 – A Tecnologia ASP e o Modelo de Objetos do ASP 3.0
IMPORTANTE
No caso de um grupo de Check Box, os índices não são associados à ordem com que os Check
Box são apresentados no formulário, mas sim em relação a quantos são selecionados. Se
tivermos 2 Check Box selecionados, somente teremos o índice 1 e o índice 2. O índice 1 é ligado
ao primeiro Check Box selecionado que aparece no formulário. O índice 2 é ligado ao próximo
Check Box do grupo que aparecer selecionado, e assim por diante.
Caso quiséssemos acessar somente o valor do primeiro Check Box selecionado, utilizaríamos
o seguinte código:
<% =Request.QueryString(“estado”)(1) %>
Observe a utilização do índice (1) após o nome do campo. Com isso estou pedindo para que
seja retornado apenas o valor do primeiro Check Box selecionado. Este código retornaria
somente SP, no nosso exemplo.
NOTA
Estas mesmas considerações são válidas para elementos do tipo Caixa de seleção e Caixa de
combinação.
Nome Descrição
ALL_HTTP Retorna todos os cabeçalhos HTTP enviados pelo cliente.
ALL_RAW Captura todos os cabeçalhos, da maneira como foram
enviados pelo cliente.
193
Criando Sites Dinâmicos com ASP 3.0
Nome Descrição
AUTH_TYPE Retorna o tipo de autenticação utilizado pelo servidor
Web.
AUTH_USER Retorna o nome do usuário autenticado no servidor Web.
CERT_COOKIE Retorna um identificador único, ligado ao certificado
do cliente.
CERT_FLAGS Mostra se o certificado do cliente é válido.
PATH_INFO Retorna informações sobre o caminho relativo à
página que está sendo exibida.
PATH_TRANSLATED Retorna informações sobre o caminho físico (por
exemplo: c:\inetpu\wwroot\page1.asp), relativo à
página que está sendo exibida.
QUERY_STRING Retorna os valores de um formulário passados através
do método get.
REMOTE_ADDR Retorna o endereço IP da máquina do cliente.
REMOTE_HOST Retorna o nome da máquina do cliente.
REQUEST_METHOD Retorna o método utilizado para a requisição da
página: post ou get.
SERVER_PORT Retorna a porta TCP na qual a requisição foi feita. Por
padrão, o servidor Web atende requisições na porta 80.
SERVER_PROTOCOL Retorna a versão e o nome do protocolo de requisição,
por exemplo HTTP 1.1.
SERVER_SOFTWARE Retorna o nome e a versão do servidor HTTP.
URL Retorna a porção básica da URL.
Na Listagem 4.8, utilizamos o laço For Each...Next, para exibir todos os valores contidos na
coleção ServerVariables.
194
Capítulo 4 – A Tecnologia ASP e o Modelo de Objetos do ASP 3.0
5 <BODY>
6 <TABLE border=2>
7 <%For Each Variavel in Request.ServerVariables %>
8 <TR>
9 <TD>
10 <% =Variavel %>
11 =</TD>
12 <TD>
13 <% =Request.ServerVariables(Variavel) %>
14 </TD></TR>
15 <%Next%>
16 </BODY>
17 </HTML>
Com este código simples conseguimos exibir todo o conteúdo da coleção ServerVariables.
Observe, na Listagem 4.8, que utilizamos algumas tags HTML para a construção de tabelas.
Estas tags foram utilizadas apenas para melhorar a aparência do documento resultante. Para
cada variável exibimos o nome da variável (linha 10) e o valor contido na variável (linha 13).
Na linha 14, utilizamos  . Este é um caractere especial para o HTML e é utilizado para
que o navegador do cliente exiba as células da tabela, mesmo quando estas estiverem vazias.
O Internet Explorer não exibe os contornos de uma célula, caso não exista nenhum conteúdo
na mesma, o que torna o resultado final pouco elegante. Na Figura 4.12, podemos ver a parte
final do resultado do processamento do documento variables.asp.
195
Criando Sites Dinâmicos com ASP 3.0
Um pequeno exemplo prático: vamos supor que você deseja construir uma página que somente
deve ser acessada por pessoas de uma determinada rede. Os computadores da Internet utilizam
um protocolo chamado TCP/IP. Todo computador que faz parte da rede deve possuir um
número IP, e não podem existir dois computadores com o mesmo número IP. O número IP é
um número no seguinte formato:
10.200.120.135
162.233.140.72
São quatro números separados por um ponto. O valor máximo de cada número é 249, ou seja,
não posso ter um endereço IP 10.300.210.143. O 300 é um valor inválido em termos de número
IP. Parte do número IP identifica a rede a qual pertence o computador e outra parte identifica
o número do computador dentro da rede. Esta fora do escopo deste livro uma discussão mais
ampla sobre o protocolo TCP/IP, mas existem excelentes fontes de referência na Internet.
Você pode começar pelos sites da CISCO (www.cisco.com) e 3COM (www.3com.com).
Vamos supor que somente devem acessar a nossa página computadores cujo endereço IP
começa com 10.204.123 (que é exatamente o número da rede que utilizo em minha casa),
sendo que o quarto número não importa. Neste caso estamos admitindo que os três primeiros
números identificam a rede (10.204.123) e o último número identifica o computador dentro
da rede. Neste caso, quero construir uma página que somente permita acesso a computadores
da rede 10.204.123. Vamos ver como se faz isto?
Depois utilizaremos funções do VBScript para capturar apenas a parte do endereço da rede
(três primeiros números), e comparo este valor com o valor 10.204.123.
Caso o valor esteja OK, o acesso ao restante da página é liberado, caso contrário o usuário será
direcionado para um outra página, a qual contém uma mensagem dizendo que o mesmo não
tem permissão para acessar a página desejada.
196
Capítulo 4 – A Tecnologia ASP e o Modelo de Objetos do ASP 3.0
3 <HEAD>
4 </HEAD>
5 <BODY>
6 <%
7 ‘Captura o número IP do computador do Cliente
8 Dim ip_cliente
9 Dim num_rede
10 ip_cliente=Request.ServerVariables(“REMOTE_ADDR”)
14 num_rede=Left(ip_cliente,10)
17 If num_rede=“10.204.123" Then
26 %>
27 </BODY>
28 </HTML>
Ao acessar esta página de um computador que faz parte da rede 10.204.123, receberemos a
página indicada na Figura 4.13.
197
Criando Sites Dinâmicos com ASP 3.0
Ao acessar esta página de um computador que não faz parte da rede 10.204.123, receberemos
a mensagem de erro indicada na Figura 4.14.
Figura 4.14: Usuários fora da rede 10.204.123 não têm permissão de acesso.
198
Capítulo 4 – A Tecnologia ASP e o Modelo de Objetos do ASP 3.0
NOTA
Na linha 24 utilizamos o método Redirect do objeto Response (Response.Redirect) para
redirecionar o usuário para uma outra página (erro.htm), caso o mesmo não fizesse parte da
rede 10.204.123. Falaremos mais sobre o objetos Response e seus métodos ainda neste capítulo.
7 <%
8 Response.Cookies(“TESTE_COOKIE”)(“Nome”)= “Júlio Battisti”
9 Response.Cookies(“TESTE_COOKIE”)(“Cidade”)= “Boqueirão do Leão”
10 Response.Cookies(“TESTE_COOKIE”)(“Data”)= Date()
11 %>
12 </BODY>
13 </HTML>
A página da Listagem 4.10 cria um Cookie chamado TESTE_COOKIE. Dentro deste Cookie
são gravados três campos ou chaves, conforme indicado na Tabela 4.2.
199
Criando Sites Dinâmicos com ASP 3.0
Campo/Chave Valor
Nome Júlio Battisti
Cidade Boqueirão do Leão
Data 3/7/1999
Para acessar as informações do Cookie, podemos utilizar a coleção Cookies do objeto Request,
conforme indicado na Listagem 4.11.
200
Capítulo 4 – A Tecnologia ASP e o Modelo de Objetos do ASP 3.0
5 <BODY>
6 <B><FONT COLOR=BLUE> Seja bem vindo:
7 <%Response.Write Request.Cookies (“TESTE_COOKIE”)(“Nome”)& “<br>”%>
8 </FONT></B>
9 <%
10 Response.Write “Valores presentes em Cookies” & “<br>”
11 Response.Write Request.Cookies (“TESTE_COOKIE”)(“Nome”)& “<br>”
12 Response.Write Request.Cookies (“TESTE_COOKIE”)(“Cidade”)& “<br>”
13 Response.Write Request.Cookies (“TESTE_COOKIE”)(“Data”)& “<br>”
14 %>
15 <P> </P>
16 </BODY>
17 </HTML>
acessa o valor da chave nome, do Cookie TESTE_COOKIE. Este valor é retornado para o
navegador do cliente pelo método Write do objeto Response.
201
Criando Sites Dinâmicos com ASP 3.0
Também podemos utilizar a estrutura For Each...Next para percorrer todos os valores de um
determinado Cookie, exibindo o nome das chaves e o valor associado à cada chave, conforme
indicado na Listagem 4.12.
Listagem 4.12 – Utilizando a estrutura For Each...Next, para acessar as chaves do Cookie
TESTE_COOKIE – forCookie.asp.
1 <%@ Language=VBScript %>
2 <HTML>
3 <HEAD>
4 </HEAD>
5 <BODY>
202
Capítulo 4 – A Tecnologia ASP e o Modelo de Objetos do ASP 3.0
Quando o usuário acessa uma determinada página, o navegador envia informações sobre seu
Certificado Digital, caso possua um. Para acessar as informações sobre o Certificado Digital
do Cliente, podemos utilizar a coleção ClientCertificate do objeto Request.
Onde temos:
➥ Chave: É o nome do campo do certificado a ser acessado. Por exemplo, o campo
ValidForm retorna a data a partir da qual o certificado é válido; o campo ValidUntil,
determina a data de expiração do Certificado; e assim por diante. A código da linha
abaixo irá exibir a data de expiração do Certificado do cliente:
Response.Write “Seu Certificado expira em: ”
Response.Write Request.ClientCertificate(“ValidUntil”)
203
Criando Sites Dinâmicos com ASP 3.0
7 <%
8 Response.Write Request.TotalBytes
9 %>
10 <H2> Você digitou os seguintes dados !!</H2>
11 <%
12 For Each Item in Request.Form %>
13 <P>
14 <%=Item%>
15 =
16 <%=Request.Form(Item)%>
17 </P>
18 <% Next %>
19 <P><A href=“list4-2.htm”>Clique aqui para voltar ao formulário</A></P>
20 </BODY>
21 </HTML>
O código da linha 8 informa quantos bytes foram enviados pelo navegador do cliente.
O exemplo abaixo coloca os 100 primeiros bytes enviados pelo cliente, na variável 100_bytes:
100_bytes = Request.BinaryRead(100)
204
Capítulo 4 – A Tecnologia ASP e o Modelo de Objetos do ASP 3.0
5 <BODY>
8 <%
9 Dim vinte_bytes
10 vinte_bytes=Request.BinaryRead(20)
11 ‘ Esta linha irá gerar um erro.
12 Nome=Request.Form(“Nome”)
13 %>
14 </BODY>
15 </HTML>
Ao tentarmos acessar esta página, receberemos a mensagem de erro indicada na Figura 4.18.
Com isso, encerramos o estudo do objeto Request. Vimos todos as coleções, propriedades e
métodos do objeto Request, lembrando que o mesmo não possui nenhum evento. Com a
utilização do objeto Request, podemos ter acesso a diversas informações enviadas pelo cliente,
como por exemplo, informações enviadas através do preenchimento de um formulário.
205
Criando Sites Dinâmicos com ASP 3.0
O Objeto Response
Utilizamos o objeto Response para retornar o resultado do processamento de uma página ASP,
para o navegador do cliente. Conforme descrito anteriormente, o resultado retornado é código
HTML puro. Podemos utilizar o objeto Response para montar uma página de retorno, por
exemplo, com os resultados de uma pesquisa em um banco de dados. Nos exemplos do final
deste capítulo, teremos uma introdução ao acesso à bancos de dados, através de páginas ASP.
Também podemos utilizar o objeto Response para gravar Cookies no computador do cliente.
Outro detalhe importante que devemos conhecer é quando o navegador envia para o servidor,
um Cookie gravado no cliente. Cada Cookie está associado com um determinado domínio.
Por exemplo, a primeira vez que você acessa o site http://www.abc.com, vamos supor que seja
gravado um Cookie no seu computador. Toda vez que você acessar uma página no domínio
www.abc.com, as informações contidas neste Cookie serão enviadas para o site, mesmo que
a página que esteja sendo acessada não utilize estas informações. Quando você acessa, por
206
Capítulo 4 – A Tecnologia ASP e o Modelo de Objetos do ASP 3.0
A página que cria o Cookie também pode determinar a qual domínio o mesmo está relacionado,
podendo inclusive precisar que o Cookie somente esteja relacionado com uma determinada
área do site. Por exemplo, posso determinar que o Cookie somente seja enviado para o servidor
quando forem acessadas páginas da seguinte área: http://www.abc.com/cadastro. Também
podemos definir uma data de expiração para o Cookie. Vamos estudar estas possibilidades
através de exemplos práticos.
6 <B>
7 <P>Esta página cria um Cookie associado ao domínio
8 http://servidor. Toda vez que uma página do domínio
9 http://servidor for acessada, as informações contidas
10 neste Cookie serão enviadas.
11 </B>
12 </P>
13 <%
14 ‘ Cria um Cookie chamado Cliente
207
Criando Sites Dinâmicos com ASP 3.0
Conforme descrito anteriormente, podemos definir o domínio, ou uma área do site, ao qual o
Cookie está associado, bem como a data para expiração. Para isso utilizamos os comandos
abaixo indicados.
208
Capítulo 4 – A Tecnologia ASP e o Modelo de Objetos do ASP 3.0
Assim, estou dizendo que o Cookie somente deve ser enviado quando o usuário acessar páginas
que estão dentro do seguinte endereço: http://servidor/cadastro, como por exemplo: http://
servidor/cadastro/index.asp ou http://servidor/cadastro/carros.asp. Se você quiser que o Cookie
seja enviado para qualquer página do site, utilize o seguinte comando:
Response.Cookies(“Cliente”).path=“/”
Neste exemplo, estou definindo a data de expiração do Cookie para 31 de Dezembro de 2000.
Se não for definida uma data de expiração para o Cookie, o mesmo será eliminado quando o
usuário fechar o navegador.
IMPORTANTE
Em versões anteriores do ASP, o código para criar Cookies deveria ser colocado no cabeçalho
do documento, antes da tag <BODY>. Isso era necessário, porque o Cookie deveria ser criado,
antes que qualquer conteúdo fosse enviado para o navegador do cliente. Isso porque, nas
versões anteriores do ASP, o conteúdo ia sendo enviado para o cliente à medida em que a
página era processada. No ASP 3.0, o conteúdo somente é enviado quando toda a página foi
processada com sucesso, ou quando for utilizado o comando Response.Flush. Este
comportamento pode ser controlado através da habilitação ou não de “buffer” para a página,
conforme veremos mais adiante neste capítulo.
209
Criando Sites Dinâmicos com ASP 3.0
29 <%
30 For Each Chave in Request.Cookies(“Cliente”)
31 Response.Write Chave & “: ”
32 Response.Write Request.Cookies(“Cliente”)(Chave) & “<BR>”
33 Next
34 %>
35 </BODY>
36 </HTML>
O Cookie Cliente2 é um Cookie com múltiplos valores, isto é, temos armazenado diversos
campos de informação, tais como: Nome, Endereço, Email, etc. Também podemos ter os
chamados Cookies simples, os quais contém um único valor. O seguinte código cria um
Cookie simples:
Response.Cookies(“Cliente”)=“Júlio Battisti”
Nós podemos utilizar o atributo HasKeys, para determinar se um Cookie possui um único
valor ou possui múltiplos valores. Considere a seguinte linha de código:
Response.Write Response.Cookies(“Cliente2”).HasKeys
210
Capítulo 4 – A Tecnologia ASP e o Modelo de Objetos do ASP 3.0
Caso o Cookie Cliente2 possua múltiplos valores, esta linha de código retorna Verdadeiro,
caso contrário retorna Falso.
211
Criando Sites Dinâmicos com ASP 3.0
Esta propriedade deve ser definida antes que qualquer conteúdo tenha sido enviado para o
navegador do cliente. O código da Listagem 4.17 mostra onde é o local mais indicado para
definirmos esta propriedade.
Observe que devemos utilizar as expressões em inglês: True, para Verdadeiro, e False, para
Falso. Também não devemos esquecer que, por padrão, no ASP 3.0, esta propriedade é definida
como True. Em situações onde devemos efetuar algum processamento, tais como cálculos ou
pesquisas em banco de dados, antes de enviar a página para o navegador do cliente é
interessante mantermos a propriedade Buffer em seu valor padrão True. Em situações onde
não sejam necessários processamentos deste tipo, podemos desabilitar o Buffer definindo
esta propriedade como False.
212
Capítulo 4 – A Tecnologia ASP e o Modelo de Objetos do ASP 3.0
com rapidez e eficiência aos navegadores. Na próxima vez que alguém for acessar esta página,
e a mesma estiver no Cache, não existe necessidade de carregar novamente a página da Internet.
A cópia que está no Cache é enviada para o navegador do cliente. O uso de Cache no servidor
Proxy agiliza o acesso, principalmente, às páginas mais utilizadas.
Por padrão, o ASP instrui servidores Proxy a não armazenarem a própria página ASP em cache
(embora imagens, mapas de imagens, miniaplicativos e outros itens aos quais a página faz
referência sejam armazenados em Cache). Você pode permitir o armazenamento de determinadas
páginas em Cache usando a propriedade Response.CacheControl. Com o uso da propriedade
CacheControl podemos definir se uma página ASP deve ou não ser mantida no Cache do servidor
Proxy. Este controle nos é oferecido devido à natureza dinâmica das páginas ASP, as quais
mudam constantemente. Caso uma página tenha sido colocada no Cache do servidor Proxy, o
usuário corre o risco de estar recebendo uma versão desatualizada da página.
Esta propriedade deve ser definida antes que qualquer conteúdo tenha sido enviado para o
navegador do cliente. O código da Listagem 4.18 mostra onde é o local mais indicado para
definirmos esta propriedade.
213
Criando Sites Dinâmicos com ASP 3.0
basta observar as diferenças entre uma página desenvolvida para o idioma Português e outra
para ser exibida no idioma Chinês ou Japonês.
Esta propriedade deve ser definida antes que qualquer conteúdo tenha sido enviado para o
navegador do cliente. O código da Listagem 4.19 mostra onde é o local mais indicado para
definirmos esta propriedade.
IMPORTANTE
Todas as propriedades que alteram alguma característica do cabeçalho do documento devem
ser definidas antes que qualquer conteúdo visível seja enviado para o navegador do cliente.
Por isso, o local mais indicado para definir estas propriedades é antes da abertura da tag
<BODY>, que é onde realmente começa o conteúdo que comporá a página a ser enviada.
Esta propriedade deve ser definida antes que qualquer conteúdo tenha sido enviado para o
navegador do cliente. O código da Listagem 4.20 mostra onde é o local mais indicado para
definirmos esta propriedade.
214
Capítulo 4 – A Tecnologia ASP e o Modelo de Objetos do ASP 3.0
Quando a página .asp chama Response.Expires, o IIS cria um cabeçalho HTTP indicando a
hora no servidor. Se a hora do sistema do cliente é anterior à hora do sistema do servidor
(caso o cliente ou servidor não tenham uma configuração de hora precisa ou haja diferenças
de fuso horário) a configuração do parâmetro como 0 não terá o efeito de expirar a página
imediatamente. Você pode usar a propriedade Response.ExpiresAbsolute (veja próximo item)
para obter a expiração imediata de uma página. Além disso, pode usar um número negativo
para a propriedade Expires. Por exemplo:
<% Response.Expires = -1 %>
NOTA
Se existirem várias chamadas para Response.Expires em uma única página, o servidor usará
o período de tempo mais curto.
Esta propriedade deve ser definida antes que qualquer conteúdo tenha sido enviado para o
navegador do cliente. O código da Listagem 4.21 mostra onde é o local mais indicado para
definirmos esta propriedade.
215
Criando Sites Dinâmicos com ASP 3.0
Neste exemplo estou definindo em um dia (1.440 minutos) o tempo de expiração para a
página. Para forçar uma nova requisição para o servidor Web, a cada solicitação da página,
podemos utilizar o seguinte código:
<% Response.Expires = 0 %>
Com isso a página expira imediatamente. Na próxima requisição do cliente, a página será
novamente carregada a partir do servidor. Isto garante que sempre a última versão da página
será enviada do servidor Web para o navegador do cliente.
NOTA
Se essa propriedade for definida mais de uma vez em uma página, a data ou hora de expiração
mais próxima à atual será usada. Se tentarmos definir a data de expiração como uma data
que já passou, a data e hora atuais serão utilizadas como de expiração.
Esta propriedade deve ser definida antes que qualquer conteúdo tenha sido enviado para o
navegador do cliente. O código da Listagem 4.22 mostra onde é o local mais indicado para
definirmos esta propriedade.
216
Capítulo 4 – A Tecnologia ASP e o Modelo de Objetos do ASP 3.0
NOTA
Observe que a data e a hora devem estar entre os caracteres #.
IMPORTANTE
Essa propriedade permite que você tenha um maior controle sobre as circunstâncias nas quais
o cliente pode ter se desconectado do servidor. Por exemplo, se um longo período de tempo tiver
decorrido entre o momento de uma solicitação do cliente e o momento em que o servidor
respondeu, talvez seja benéfico garantir que o cliente ainda esteja conectado antes de continuar
a processar o script.
Esta propriedade retorna True (Verdadeiro) ou False (Falso). Se o cliente continua conectado
a propriedade retorna True, caso contrário retorna False.
217
Criando Sites Dinâmicos com ASP 3.0
5 <BODY>
7 <P>Exemplo de utilização da propriedade IsClientConnected.</P>
14 </BODY>
15 </HTML>
IMPORTANTE
A propriedade PICS insere qualquer seqüência de caracteres no cabeçalho, independente dela
representar ou não um rótulo PICS válido.
Exemplo:
<% Response.PICS(“(PICS-1.1 <http://www.rsac.org/ratingv01.html> labels on ” &
chr(34) & “1997.01.05T08:15-0500” & chr(34) & “ until” & chr(34) & “1999.12.31T23:59-
0000” & chr(34) & “ ratings (v 0 s 0 l 0 n 0))”) %>
218
Capítulo 4 – A Tecnologia ASP e o Modelo de Objetos do ASP 3.0
NOTA
Para maiores informações sobre a Classificação de Conteúdo consulte os sites www.rsac.org ou
os www.w3.org, ou o livro “Internet Explorer 5.0 – Resource Kit”.
Exemplo:
<% Response.Status = “410 Unauthorized” %>
ou
<% Response.Status = “404 Not Found” %>
Com isso encerramos o estudo das propriedades do objeto Response. Agora passaremos ao
estudo dos métodos do objeto Response.
219
Criando Sites Dinâmicos com ASP 3.0
determinada ação. Por exemplo, já utilizamos inúmeras vezes o método Write do objeto Response.
Este método é utilizado para enviar conteúdo do servidor Web para o navegador do cliente.
NOTA
Este método é pouco utilizado, se outro método Response fornecer a funcionalidade necessária,
é recomendável que você o utilize.
Como o protocolo HTTP requer que os cabeçalhos sejam enviados antes do conteúdo, em
geral, você deve modificar todos os cabeçalhos enviados antes que seu script ASP gere alguma
saída. No IIS 4.0, isso significava que era necessário chamar AddHeader no script antes que
alguma saída (como aquela gerada pelo código HTML ou pelo método Write) fosse enviada ao
cliente, normalmente antes da tag <BODY>. No IIS 5.0, com ASP 3.0, o Buffer é ativado por
padrão, conforme descrito anteriormente. Portanto, você pode chamar o método AddHeader
em qualquer ponto do script, desde que o Buffer não tenha sido desativado
(Response.Buffer=False) e que ele preceda todas as chamadas para Flush.
220
Capítulo 4 – A Tecnologia ASP e o Modelo de Objetos do ASP 3.0
gerar estatísticas de acesso. No IIS 5.0 podemos configurar quais tipos de informação devem
ser gravadas no Log. Além disso, temos o método AppendToLog, o qual adiciona uma seqüência
de caracteres ao final da entrada de Log do servidor Web. Você pode chamá-lo várias vezes
em uma seção do script. Cada vez que o método é chamado, ele anexa a seqüência de caracteres
especificada à entrada existente.
10 </BODY>
11 </HTML>
Este exemplo adiciona os textos “Início da página” e “Final da página” ao Log do IIS.
221
Criando Sites Dinâmicos com ASP 3.0
Onde dados_enviar pode ser um objeto que contém, por exemplo, um trecho de vídeo no
formato .avi.
ou
Response.Clear( )
IMPORTANTE
Esse método causará um erro de tempo de execução se Response.Buffer não tiver sido definido
para True, isto é, se não houver conteúdo no Buffer, a chamada ao método Response.Clear
causará um erro.
O código da Listagem 4.26 mostra um exemplo de utilização deste método quando o Buffer
está desabilitado, isto irá gerar a mensagem de erro indicada na Figura 4.21. Este erro é causado
por termos desabilitado o Buffer (Response.Buffer=False) e mesmo assim tentar utilizar o
método Response.Clear.
222
Capítulo 4 – A Tecnologia ASP e o Modelo de Objetos do ASP 3.0
ou
Response.End( )
Comentários
Se Response.Buffer tiver sido definido para True (o que é o padrão no ASP 3.0), a chamada de
Response.End liberará o Buffer. Se você não deseja que a saída retorne para o usuário, deve
chamar primeiro Response.Clear, conforme indicado no exemplo abaixo:
<%
Response.Clear
Response.End
%>
223
Criando Sites Dinâmicos com ASP 3.0
ou
Response.Flush( )
O código da Listagem 4.27 mostra um exemplo de utilização deste método quando o Buffer
está desabilitado, isto irá gerar a mensagem de erro indicada na Figura 4.22. Este erro é causado
por termos desabilitado o Buffer (Response.Buffer=False) e depois de desabilitá-lo tentamos
utilizar o método Response.Flush.
224
Capítulo 4 – A Tecnologia ASP e o Modelo de Objetos do ASP 3.0
6 <BODY>
7 <P>A próxima linha irá gerar um erro.</P>
9 </BODY>
10 </HTML>
Como exemplo, vamos supor que o usuário preencheu um formulário onde existe um campo
chamado Destino. Este campo pode ter um dos seguintes valores:
➥ Brasil
➥ Canadá
➥ EUA
➥ Europa
➥ Outros
Com base no valor selecionado neste campo, você deseja enviar o usuário para uma página
personalizada para cada caso. Na listagem 4.28 temos um exemplo de código que soluciona o
problema proposto.
225
Criando Sites Dinâmicos com ASP 3.0
11 Response.Redirect “http://www.abc.com/brasil”
12 Case “Canadá”
13 Response.Redirect “http://www.abc.com/canada”
14 Case “EUA”
15 Response.Redirect “http://www.abc.com/eua”
16 Case “Europa”
17 Response.Redirect “http://www.abc.com/europa”
18 Case “Outros”
19 Response.Redirect “http://www.abc.com/outros”
20 End Select
21 %>
22 </BODY>
23 </HTML>
O seguinte exemplo envia texto para a saída HTML, que é enviada para o cliente:
Response.Write “Bem vindos à tecnologia de Páginas Dinâmicas.”
No próximo exemplo, além do texto, enviamos uma tag HTML de quebra de linha:
Response.Write “Utilização do método Write <BR>”
O texto “Utilização do método Write” é exibido e a tag <BR> é reconhecida como sendo uma
tag HTML que orienta o navegador a fazer uma quebra de linha.
Com certeza este é o método que mais utilizaremos ao longo deste livro.
226
Capítulo 4 – A Tecnologia ASP e o Modelo de Objetos do ASP 3.0
NOTA
Na prática os valores preenchidos no formulário deveriam ser armazenados em um banco de
dados como o Microsoft SQL Server 7.0 ou o Microsoft Access 2000. Como ainda não aprendemos
a trabalhar com banco de dados, vamos apenas validar os dados digitados. Caso o usuário
tenha digitado todos os dados corretamente, apenas informaremos que os dados foram digitados
com sucesso e exibiremos os valores. No próximo capítulo estaremos tratando sobre a conexão
de páginas ASP com bancos de dados.
Na Listagem 4.29 temos o formulário que o usuário deverá preencher. Neste formulário, são
de preenchimento obrigatório os seguintes campos:
➥ Nome
➥ Rua
➥ Cidade
➥ Bairro
➥ email
➥ CPF
227
Criando Sites Dinâmicos com ASP 3.0
Ao visualizarmos este formulário no Internet Explorer, obtemos o resultado mostrado na Figura 4.23.
Observe, na linha 8, que o atributo action, da tag FORM é definido como exemplo-1.asp.
Agora precisamos criar a página exemplo-1.asp, a qual vai processar os dados digitados no
formulário quando o usuário clicar no botão Enviar. A página exemplo-1.asp deve verificar se
todos os campos obrigatórios foram digitados. Em caso afirmativo a página informará os
valores digitados pelo usuário, caso contrário, o formulário será enviado de volta, indicando
quais os campos obrigatórios que não foram preenchidos. Além disso ao enviar o formulário
de volta para o usuário, os valores digitados pelo usuário serão preservados, evitando que
seja preciso digitar todos os campos novamente.
228
Capítulo 4 – A Tecnologia ASP e o Modelo de Objetos do ASP 3.0
Existem diversas maneiras e algoritmos diferentes para solucionar este problema. Na Listagem
4.30 apresentamos uma solução para o problema proposto.
6 <%
7 ‘ Inicia a verificação para saber se todos
8 ‘ os campos obrigatórios foram preenchidos.
10 nome = Request.Form(“nome”)
11 rua = Request.Form(“rua”)
12 cidade = Request.Form(“cidade”)
229
Criando Sites Dinâmicos com ASP 3.0
13 email = Request.Form(“email”)
14 cpf = Request.Form(“CPF”)
18 If (nome=“”)Then
19 mensagem_nome=“Preencha o campo Nome:”
20 faltou_dado=“Sim”
21 faltou_nome=“Sim”
22 End If
23 If (rua=“”)Then
24 mensagem_rua=“Preencha o campo Rua:”
25 faltou_dado=“Sim”
26 faltou_rua=“Sim”
27 End If
28 If (cidade=“”)Then
29 mensagem_cidade=“Preencha o campo Cidade:”
30 faltou_dado=“Sim”
31 faltou_cidade=“Sim”
32 End If
33 If (email=“”)Then
34 mensagem_email=“Preencha o campo email:”
35 faltou_dado=“Sim”
36 faltou_email=“Sim”
37 End If
38 If (cpf=“”)Then
39 mensagem_cpf=“Preencha o campo CPF:”
40 faltou_dado=“Sim”
41 faltou_cpf=“Sim”
42 End If
45 If faltou_dado<>“Sim” Then
230
Capítulo 4 – A Tecnologia ASP e o Modelo de Objetos do ASP 3.0
69 If faltou_nome=“Sim” Then
70 Response.Write “O campo Nome deve ser preenchido. <BR>”
71 End If
72 If faltou_rua=“Sim” Then
73 Response.Write “O campo Rua deve ser preenchido. <BR>”
74 End If
75 If faltou_cidade=“Sim” Then
76 Response.Write “O campo Cidade deve ser preenchido. <BR>”
77 End If
78 If faltou_email=“Sim” Then
79 Response.Write “O campo email deve ser preenchido. <BR>”
231
Criando Sites Dinâmicos com ASP 3.0
80 End If
81 If faltou_cpf=“Sim” Then
82 Response.Write “O campo CPF deve ser preenchido. <BR>”
83 End If
89 <% Response.Write “Caso queira alterar algum dado, digite no formulário abaixo.”
90 If faltou_nome=“Sim” Then
91 Response.Write “<P>Nome: <INPUT id=nome maxLength=50 name=nome
size=50>(*)</P>”
92 Else
93 Response.Write “<P>Nome: <INPUT id=nome maxLength=50 name=nome
size=50 value=” & Chr(34)& Request.Form(“nome”) & Chr(34) & “>(*)</P>”
94 End If
95 If faltou_rua=“Sim” Then
96 Response.Write “<P>Rua: <INPUT id=rua maxLength=35 name=rua size=35>
(*)</P>”
97 Else
98 Response.Write “<P>Rua: <INPUT id=rua maxLength=35 name=rua size=35
value=” & Chr(34)& Request.Form(“rua”) & Chr(34) & “>(*)</P>”
99 End If
232
Capítulo 4 – A Tecnologia ASP e o Modelo de Objetos do ASP 3.0
233
Criando Sites Dinâmicos com ASP 3.0
136 %>
137 </FORM>
138 </BODY>
139 </HTML>
devem ser digitadas em uma única linha. A linha aparece dividida por questões de espaço
para exibição, quando for digitar esta linha, digite-a como uma linha única.
➥ O exemplo foi desenvolvido de maneira que o código fosse de fácil compreensão, além
disso foram inseridas diversas linhas de comentário para facilitar o acompanhamento
do exemplo proposto. Cabe lembrar que, para criarmos uma linha de comentário,
devemos iniciar a mesma com o sinal de apóstrofe.
➥ Observe o seguinte fragmento de código:
18 If (nome=“”)Then
19 mensagem_nome=“Preencha o campo Nome:”
20 faltou_dado=“Sim”
21 faltou_nome=“Sim”
22 End If
Neste fragmento, estamos testando se o campo obrigatório “nome” foi preenchido. Caso o
mesmo não tenha sido preenchido, definimos a variável faltou_dado como sendo igual a
234
Capítulo 4 – A Tecnologia ASP e o Modelo de Objetos do ASP 3.0
Sim. Também definimos a variável faltou_nome como sendo igual a Sim. Este procedimento
é repetido para os demais campos obrigatórios. Desta forma, qualquer campo obrigatório que
esteja faltando, irá definir a variável faltou_dado como sendo igual a Sim. Estas variáveis
serão utilizadas mais adiante para informar quais campos obrigatórios estão faltando, e caso
nenhum esteja faltando, para informar os valores digitados pelo usuário.
➥ Observe o seguinte fragmento de código:
45 If faltou_dado<>“Sim” Then
46 Response.Write “<P>Você digitou os seguintes dados !</P>”
47 Response.Write “<HR>”
48 For Each Dado in Request.Form %>
49 <P>
50 <% =Dado %>
51 =
52 <%=Request.Form(Dado)%>
53 </P>
54 <%Next
55 End If
Neste caso, se o campo nome não foi digitado, envio a seguinte mensagem: “O campo Nome
deve ser preenchido.”
➥ A partir da linha 90:
90 If faltou_nome=“Sim” Then
verifico um a um os campos obrigatórios para ver qual ou quais estão faltando. Caso o campo
esteja faltando, emito uma mensagem dizendo que o mesmo deve ser digitado, caso contrário
crio o campo do formulário e defino o seu valor conforme digitado pelo usuário. Observe o
fragmento de código abaixo:
90 If faltou_nome=“Sim” Then
91 Response.Write “<P>Nome: <INPUT id=nome maxLength=50 name=nome
size=50>(*)</P>”
92 Else
235
Criando Sites Dinâmicos com ASP 3.0
Primeiro (linha 90), testamos se o nome não foi digitado. Em caso afirmativo criamos o campo
nome, em branco. Isto é feito pela linha 91:
91 Response.Write “<P>Nome: <INPUT id=nome maxLength=50 name=nome
size=50>(*)</P>”
E este é justamente o código HTML que cria o campo nome e define os seus atributos. Veja
que estamos utilizando Response.Write para recriar o formulário HTML original.
Caso o campo tenha sido preenchido, criamos o campo novamente com o cuidado de já preenchê-
lo com o valor digitado previamente pelo usuário. Isto é feito pelo código abaixo:
93 Response.Write “<P>Nome: <INPUT id=nome maxLength=50 name=nome
size=50 value=” & Chr(34)& Request.Form(“nome”) & Chr(34) & “>(*)</P>”
Veja que esta instrução Response.Write é um pouco mais complexa. A instrução é formada
por diversas partes, sendo que cada parte é concatenada pelo operador &. Na primeira parte
é enviado o texto:
“<P>Nome: <INPUT id=nome maxLength=50 name=nome size=50 value=
A segunda parte Chr(34) envia um sinal de aspas (“). Depois do sinal de aspas, usamos
Request.Form(“nome”) para capturar o nome digitado pelo usuário. Vamos supor que o usuário
tenha digitado José da Silva no campo nome. Neste ponto, o nosso comando estaria assim:
“<P>Nome: <INPUT id=nome maxLength=50 name=nome size=50 value=“José da Silva
Depois enviamos mais um sinal de aspas, Chr(34), e a parte final “>(*)</P>”. Com isso o
código enviado por este comando é o seguinte:
“<P>Nome: <INPUT id=nome maxLength=50 name=nome size=50 value=”José da Silva”>(*)</P>
que é justamente o código HTML necessário para criar o campo Nome e definir o seu valor
conforme o valor digitado pelo usuário. Um detalhe importante a salientar é a utilização do
Chr(34) antes e depois do nome do usuário. Precisamos envolver o nome digitado entre aspas,
pois caso contrário o nome seria truncado no primeiro espaço em branco. Se o usuário digitasse
José da Silva, sem as aspas seria retornado apenas José. Tudo o que vier depois do primeiro espaço
em branco será ignorado, por isso que utilizamos uma sinal de aspas antes e outro depois.
Veja que com a utilização de código ASP vamos recriando o formulário original. Além disso
mesclamos diversos trechos de código ASP com HTML. Perceba que dentro do código ASP podemos
utilizar todos os recursos da linguagem VBScript, ou seja, as possibilidades são variadas.
236
Capítulo 4 – A Tecnologia ASP e o Modelo de Objetos do ASP 3.0
Agora vamos a alguns exemplos de utilização da nossa aplicação. Na figura 4.24, temos um
exemplo onde o formulário original foi aberto no Internet Explorer e o usuário preencheu
todos os campos, isto é, não deixou de preencher nenhum campo obrigatório.
Ao clicar no botão Enviar os dados são enviados para a página exemplo-1.asp. Como todos os
campos obrigatórios foram preenchidos, a página simplesmente exibe os valores digitados
pelo usuário, conforme mostrado na Figura 4.25.
237
Criando Sites Dinâmicos com ASP 3.0
Além de informar os valores digitados, a página retorna o formulário com os dados digitados
pelo usuário. Caso o usuário queira alterar algum valor digitado é só fazer as alterações
necessárias e clicar no botão Enviar. O formulário aparece abaixo da informação dos valores
digitados, mais no final da página, conforme indicado na Figura 4.26.
Vamos testar uma outra situação do nosso aplicativo. Suponhamos que o usuário deixe de preencher
um dos campos obrigatórios. No exemplo da Figura 4.27, o usuário não preenche o campo Cidade.
238
Capítulo 4 – A Tecnologia ASP e o Modelo de Objetos do ASP 3.0
Neste caso, ao clicar no botão Enviar, o usuário recebe uma página contendo uma mensagem
que avisa que o campo Cidade é de preenchimento obrigatório, e contendo o formulário
somente com o campo Cidade em branco para que o mesmo seja preenchido, conforme
indicado pela Figura 4.28.
239
Criando Sites Dinâmicos com ASP 3.0
O frete é único para o pedido, independente do número de itens. O imposto será calculado
sobre o total da Nota, sem contar o valor do frete, isto é, sobre o valor total das mercadorias.
O nosso pedido permitirá a entrada de até três produtos. Também faremos uso de tabelas para
facilitar o layout da página.
6 <P><B>FORMULÁRIO DE PEDIDOS:</B></P>
11 <TR>
12 <TD>Descrição</TD>
13 <TD>Pr. Unit.</TD>
14 <TD>Quant.</TD>
15 <TD>Subtotal</TD>
16 </TR>
17 <TR>
18 <TD><INPUT id=prod1 name=prod1></TD>
19 <TD><INPUT id=unit1 name=unit1 style=“HEIGHT: 22px; WIDTH: 37px”></TD>
240
Capítulo 4 – A Tecnologia ASP e o Modelo de Objetos do ASP 3.0
23 <TR>
24 <TD><INPUT id=prod2 name=prod2></TD>
25 <TD><INPUT id=unit2 name=unit2 style=“HEIGHT: 22px; WIDTH: 37px”></TD>
26 <TD><INPUT id=quant2 name=quant2 style=“HEIGHT: 22px; WIDTH: 37px”></TD>
27 <TD><INPUT id=valor2 name=valor2 style=“HEIGHT: 22px; WIDTH: 51px”></TD>
28 </TR>
29 <TR>
30 <TD><INPUT id=prod3 name=prod3></TD>
31 <TD><INPUT id=unit3 name=unit3 style=“HEIGHT: 22px; WIDTH: 37px”></TD>
32 <TD><INPUT id=quant3 name=quant3 style=“HEIGHT: 22px; WIDTH: 37px”></TD>
33 <TD><INPUT id=valor3 name=valor3 style=“HEIGHT: 22px; WIDTH: 51px”></TD>
34 </TR>
35 </TABLE>
46 </FORM>
47 </BODY>
48 </HTML>
241
Criando Sites Dinâmicos com ASP 3.0
Agora vamos criar a página ASP (exemplo2-asp) que faz o cálculo de cada item individual-
mente, depois calcula o total dos três itens e, finalmente, aplica o imposto e o frete de acordo
com o estado selecionado pelo cliente. Após fazer os cálculos a página ASP retorna os valores
fornecidos pelo usuário mais os cálculos realizados.
Na Listagem 4.32 temos o código para a página – exemplo-2.asp. Sempre lembrando que
procuramos desenvolver o código pensando na facilidade do entendimento. Diversas soluções
diferentes poderiam ser adotadas, com a obtenção do mesmo resultado.
242
Capítulo 4 – A Tecnologia ASP e o Modelo de Objetos do ASP 3.0
14 If Request.Form(“unit2”)<>“” Then
15 subtot2=CSng(Request.Form(“unit2”))*Csng(Request.Form(“quant2”))
16 Else
17 subtot2=0
18 End If
19 If Request.Form(“unit3”)<>“” Then
20 subtot3=CSng(Request.Form(“unit3”))*Csng(Request.Form(“quant3”))
21 Else
22 subtot3=0
23 End If
24 total_inicial=subtot1+subtot2+subtot3
27 Case “RS”
28 total_imposto=total_inicial+total_inicial*0.12
29 total_geral=total_imposto+3.50
30 valor_frete=3.50
31 Case “SC”
32 total_imposto=total_inicial+total_inicial*0.13
33 total_geral=total_imposto+4.20
34 valor_frete=4.20
35 Case “PR”
36 total_imposto=total_inicial+total_inicial*0.11
37 total_geral=total_imposto+4.50
38 valor_frete=4.50
39 Case “SP”
243
Criando Sites Dinâmicos com ASP 3.0
40 total_imposto=total_inicial+total_inicial*0.17
41 total_geral=total_imposto+5.50
42 valor_frete=5.50
43 Case “RJ”
44 total_imposto=total_inicial+total_inicial*0.14
45 total_geral=total_imposto+5.50
46 valor_frete=5.50
47 End Select
51 %>
54 <TR>
55 <TD>Descrição</TD>
56 <TD>Pr. Unit.</TD>
57 <TD>Quant.</TD>
58 <TD>Subtotal</TD>
59 </TR>
60 <TR>
61 <TD><INPUT id=prod1 name=prod1 value=“ <%=Request.Form(“prod1”)%> ”></TD>
62 <TD><INPUT id=unit1 name=unit1 value=“ <%=Request.Form(“unit1”)%>”
style=“HEIGHT: 22px; WIDTH: 37px”></TD>
63 <TD><INPUT id=quant1 name=quant1 value=“<%=Request.Form(“quant1”)%>”
style=“HEIGHT: 22px; WIDTH: 37px”></TD>
64 <TD align=right ><B><%=subtot1%></B></TD>
65 </TR>
66 <TR>
67 <TD><INPUT id=prod2 name=prod2 value=“ <%=Request.Form(“prod2”)%> ”></TD>
68 <TD><INPUT id=unit2 name=unit2 value=“ <%=Request.Form(“unit2”)%>”
style=“HEIGHT: 22px; WIDTH: 37px”></TD>
244
Capítulo 4 – A Tecnologia ASP e o Modelo de Objetos do ASP 3.0
72 <TR>
73 <TD><INPUT id=prod3 name=prod3 value=“ <%=Request.Form(“prod3”)%> ”></TD>
74 <TD><INPUT id=unit3 name=unit3 value=“ <%=Request.Form(“unit3”)%>”
style=“HEIGHT: 22px; WIDTH: 37px”></TD>
75 <TD><INPUT id=quant3 name=quant3 value=“<%=Request.Form(“quant3”)%>”
style=“HEIGHT: 22px; WIDTH: 37px”></TD>
76 <TD align=right ><B><%=subtot3%></B></TD>
77 </TR>
78 <%
83 %>
84 <TR>
85 <TD>TOTAL PROD.->></TD>
86 <TD></TD>
87 <TD></TD>
88 <TD align=right><% =FormatNumber(subtot1+subtot2+subtot3,2)%></TD>
89 </TR>
90 <TR>
91 <TD>IMPOSTO ->></TD>
92 <TD></TD>
93 <TD></TD>
94 <TD align=right><% =FormatNumber(total_imposto-total_inicial,2)%></TD>
95 </TR>
96 <TR>
97 <TD>FRETE ->></TD>
98 <TD></TD>
99 <TD></TD>
245
Criando Sites Dinâmicos com ASP 3.0
102 <TR>
103 <TD>TOTAL GERAL ->></TD>
104 <TD></TD>
105 <TD></TD>
106 <TD align=right><% =FormatNumber(total_geral,2)%></TD>
107 </TR>
108 </TABLE>
109 <A HREF=“exemplo-2.htm”>Clique aqui para voltar a página de Pedidos.</A>
110 </BODY>
111 </HTML>
devem ser digitadas em uma única linha. A linha aparece dividida por questões de espaço
para exibição; quando for digitá-la, digite-a como uma linha única.
➥ O exemplo foi desenvolvido de maneira que o código fosse de fácil compreensão, além
disso foram inseridas diversas linhas de comentário para facilitar o acompanhamento
do exemplo proposto. Cabe lembrar que para criarmos uma linha de comentário
devemos iniciar a mesma com o sinal de apóstrofe.
➥ Observe que utilizamos diversos elementos da linguagem VBScript, tais como a
estrutura Select Case...End Select, para calcular o imposto e o frete, com base no Estado
selecionado pelo cliente. Utilizamos também a função Csng para converter os valores
de Preço Unitário e Quantidade em valores numéricos, de tal forma que fosse possível
realizar cálculos com estes valores. Utilizamos a função FormatNumber para formatar
os valores calculados, de tal forma a exibir os valores com duas casas decimais, conforme
mostrado no fragmento de código a seguir:
<% =FormatNumber(valor_frete,2)%>
Agora vamos a um exemplo de utilização da nossa aplicação. Na figura 4.30, temos um exemplo
onde o formulário de pedidos foi aberto no Internet Explorer e o usuário preencheu o pedido
com três produtos. O estado selecionado foi SP.
246
Capítulo 4 – A Tecnologia ASP e o Modelo de Objetos do ASP 3.0
Ao clicar no botão Calcular Total será chamada a página exemplo-2.asp, a qual faz os cálculos
e exibe os resultados, conforme indicado na Figura 4.31.
247
Criando Sites Dinâmicos com ASP 3.0
Com isso comprovamos que a nossa página, para cálculo do Total do Pedido, está funcionando
corretamente.
Conclusão
Neste capítulo aprendemos aspectos fundamentais do ASP 3.0.
Primeiro, aprendemos exatamente o que é uma página ASP, onde a mesma é processada e
qual o resultado que retorna para o navegador do cliente. Depois tivemos uma visão geral
sobre o Modelo de Objetos do ASP 3.0.
Na parte final do capítulo apresentamos dois exemplos mais elaborados, onde utilizamos
diversos conceitos apresentados até o momento, tais como o conhecimento dos objetos Request
e Response e da linguagem VBScript.
Mas, para que nossos exemplos assumam um aspecto mais profissional, precisamos aprender
a acessar bancos de dados a partir de páginas ASP. Este é o assunto do Capítulo 5. Então,
vamos lá, sem mais demoras.
248
Capítulo 5 – Conectando Páginas ASP com Bancos de Dados
Capítulo 5
Conectando Páginas ASP
com Bancos de Dados
249
Criando Sites Dinâmicos com ASP 3.0
Estamos vivendo na Era da Informação. Os aplicativos, quer sejam os tradicionais quer sejam
aplicativos para a Web, são todos ligados à informações de bancos de dados. Quando você faz
o cadastro em um site de Comércio Eletrônico, os dados fornecidos são armazenados em um
banco de dados. Da próxima vez que você visitar o site, estas informações poderão ser
recuperadas a partir deste banco de dados. Quando ligamos para a companhia telefônica
para reclamar, o atendente pede que seja informado o nosso código de cliente. É através deste
código que as informações sobre o cliente são recuperadas, a partir do banco de dados da
empresa. Existem incontáveis exemplos de aplicações que usam bancos de dados, não
importando se este está residente em um Mainframe ou em um servidor de Rede que roda um
servidor de banco de Dados, como o Microsoft SQL Server 2000. Devemos salientar a
importância e a necessidade da utilização de banco de dados para o armazenamento de um
volume cada vez maior de informações, sendo que estas informações e sua correta utilização
são de fundamental importância para a empresa.
Neste capítulo aprenderemos a utilizar a tecnologia ASP 3.0 para conectar nossas páginas com
banco de dados. Iniciaremos por uma revisão de dois conceitos muito importantes:
➥ Modelo Relacional de dados.
➥ Linguagem SQL – Structured Query Language.
Uma vez revistos estes conceitos partiremos para a conexão de páginas ASP com bancos de
dados utilizando os objetos do ASP. Uma vez estabelecida a conexão aprenderemos a utilizar
objetos do ASP que recuperam informações do banco de dados. Diversos exemplos práticos
serão apresentadospara facilitar o entendimento dos conceitos apresentados. Também veremos
como inserir informações em um Banco de dados, a partir de um formulário HTML.
Este capítulo fornece a base necessária para conectar páginas ASP com bancos de dados,
além da revisão dos conceitos básicos relativos a bancos de dados e à linguagem SQL. No
próximo capítulo estaremos abordando diversos aspectos avançados em relação a utilização
de bancos de dados com páginas ASP.
250
Capítulo 5 – Conectando Páginas ASP com Bancos de Dados
Em muitas situações teremos que conectar nossas páginas ASP com bancos de dados já
existentes, neste caso precisamos conhecer os conceitos aqui apresentados, para podermos
otimizar sua utilização.
Em outras situações teremos que criar o banco de dados a ser utilizado pela aplicação
Web. Neste caso, os conceitos apresentados neste item auxiliam na criação de um banco
de dados melhor estruturado e otimizado, tanto em termos de espaço de armazenamento,
quanto da qualidade e disponibilidade das informações nele contidas. Revisaremos os
seguintes conceitos:
➥ Entidades e Atributos.
➥ Chave Primária.
➥ Relacionamentos entre Entidades (Tabelas).
➥ Integridade Referencial.
➥ Normalização de Tabelas.
Entidades e Atributos
Toda informação de um banco de dados é armazenada em Tabelas, que também são chamadas
de Entidades. Por exemplo, poderíamos ter uma tabela “Clientes”, onde seriam armazenadas
informações sobre os diversos clientes.
Sobre cada um dos clientes poderíamos armazenar informações tais como: Nome, Rua, Bairro,
Telefone, CEP, Data de Nascimento, etc. Essas diversas características de cada cliente são os
“atributos” do cliente, muitas vezes chamados de Campos da entidade Cliente. O conjunto de
todos os atributos de um cliente e os valores dos mesmos forma o Registro do cliente. Com
isso teremos a tabela constituída por um conjunto de registros (uma linha completa com
informações sobre o cliente) e cada registro formado por um conjunto de atributos (Nome,
Endereço, etc.).
Resumindo:
➥ Entidade ou Tabela – Conjunto de Registros.
➥ Campos ou Atributos – Características individuais da Entidade.
Considere o exemplo da Figura 5.1, onde temos uma tabela Cliente com os seus diversos
campos (atributos):
251
Criando Sites Dinâmicos com ASP 3.0
No exemplo da Figura 5.1, temos uma entidade – Clientes – e seus diversos atributos – Código
do Cliente, Nome da Empresa, Nome do Contato, Cargo do Contato, Endereço, etc. Em cada
linha temos um conjunto de atributos e seus valores. Cada linha forma um registro. Cada
coluna é um atributo da tabela Clientes.
Um dos grandes desafios em se projetar um banco de dados com sucesso é a correta determinação
das entidades que existirão, bem como dos atributos de cada uma delas.
Chave Primária
O conceito de Chave Primária é fundamental para o correto entendimento do funcionamento
de um banco de dados. Vamos procurar entender o que significa um campo ser a chave
primária de uma tabela.
Ao definirmos um campo como sendo uma chave primária, estamos informando ao banco de
dados que não podem existir dois registros com o mesmo valor de chave primária, ou seja, os
valores neste campo precisam ser únicos. Por exemplo, se defino o campo Número da
Identidade da tabela Clientes como sendo uma chave primária, estou dizendo ao banco de
dados que não podem existir dois clientes com o mesmo valor neste campo. Na prática, estou
garantindo que não podem ser cadastrados dois clientes com o mesmo Número de Identidade.
Em outras palavras poderíamos dizer que o campo chave primária identifica de maneira
única cada registro de uma tabela, isto é, de posse do valor da chave primária somente
localizaremos um registro com determinado valor neste campo.
252
Capítulo 5 – Conectando Páginas ASP com Bancos de Dados
Este é um conceito muito importante, pois, conforme veremos mais adiante, os conceitos de
Integridade Referencial e Normalização estão diretamente ligados ao conceito de chave primária.
Na Figura 5.2 vemos um exemplo da tabela Clientes onde o campo Código do Cliente é definido
como uma chave primária. Observe que não existem dois clientes com o mesmo código.
Um detalhe importante é que a chave primária pode ser formada pela combinação de mais de
um campo. Podem existir casos em que um único campo não é capaz de atuar como chave
primária, pelo fato do mesmo apresentar valores repetidos. Nestes casos podemos definir
uma combinação de dois ou mais campos para ser a nossa chave primária. Lembre-se que
uma tabela pode ter somente uma chave primária, seja ela simples ou composta.
Por exemplo: um pedido é feito para um cliente e neste pedido podem existir diversos itens,
os quais são armazenados na tabela Detalhes do Pedido. Além disso cada pedido tem um
número único, e um mesmo cliente pode fazer diversos pedidos.
253
Criando Sites Dinâmicos com ASP 3.0
Um exemplo poderia ser o seguinte: imagine uma escola com um cadastro de alunos na
tabela Alunos. Apenas uma pequena parte deles participa da Banda da escola. Por questões
de projeto do banco de dados, podemos optar por criar uma segunda tabela Alunos da Banda,
a qual pode se relacionar com a tabela Alunos através de um relacionamento Um para Um.
Cada aluno somente é cadastrado uma vez na tabela Alunos e uma única vez na tabela Alunos
da Banda. Poderíamos utilizar o campo Matrícula do Aluno como o campo que relaciona as
duas tabelas.
254
Capítulo 5 – Conectando Páginas ASP com Bancos de Dados
Considere o exemplo entre a tabela Clientes e Pedidos. Cada Cliente somente é cadastrado
uma única vez (por isso o campo Código do Cliente é uma chave primária, indicando que não
podem existir dois clientes com o mesmo código); portanto a tabela Clientes será o lado Um
do relacionamento. Porém cada cliente pode fazer diversos pedidos, por isso que o Código do
Cliente poderá aparecer várias vezes na tabela Pedidos, tantas vezes quantos forem os pedidos
que o cliente tiver feito. Por isso que temos um relacionamento do tipo Um para Vários entre
a tabela Clientes e Pedidos, através do campo Código do Cliente, indicando que um mesmo
cliente pode realizar diversos pedidos.
255
Criando Sites Dinâmicos com ASP 3.0
Na prática não temos como implementar um relacionamento deste tipo, devido a uma série
de problemas que este procedimento implicaria. Por exemplo, na tabela Pedidos teríamos
que repetir o Número do Pedido, Nome do Cliente, Nome do Funcionário, Data do Pedido,
etc. para cada item do Pedido.
Para evitar este tipo de problema é bastante comum quebrarmos um relacionamento do tipo
Vários para Vários em dois relacionamento do tipo Um para Vários. Isso é feito através da criação
de uma nova tabela, a qual fica com o lado Vários dos relacionamentos. No nosso exemplo
poderíamos criar a tabela Detalhes do Pedido, onde ficam armazenadas as informações sobre os
diversos itens de cada pedido. Então, ao invés de termos um relacionamento do tipo Vários para
Vários, teremos dois relacionamentos do tipo Um para Vários, conforme indicado na Figura 5.5.
Esta situação em que um relacionamento Vários para Vários é “quebrado” em dois relaciona-
mentos do tipo Um para Vários é bastante comum. Diversas vezes utilizamos esta técnica
para eliminar uma série de problemas no banco de dados, tais como informação repetida e
inconsistência de dados.
Integridade Referencial
A Integridade Referencial é utilizada para garantir a integridade dos dados entre as tabelas
relacionadas, evitando inconsistências dos dados, bem como repetições desnecessárias.
Por exemplo, existe um relacionamento do tipo Um para Vários entre a tabela Clientes e a
tabela Pedidos (um cliente pode fazer vários pedidos). Com a Integridade Referencial, o banco
de dados não permite que seja cadastrado um pedido para um cliente ainda não cadastrado.
Também podemos garantir o seguinte:
256
Capítulo 5 – Conectando Páginas ASP com Bancos de Dados
➥ Quando o código de um cliente for alterado na tabela Clientes, o banco de dados atualiza,
automaticamente, todos os Códigos do Cliente na tabela Pedidos, de tal maneira que
não fiquem registros órfãos, isto é, registros de Pedidos com um código de cliente que
não existe mais na tabela Clientes. Esta ação é conhecida como “Propagar atualização
dos campos relacionados”.
➥ Quando um cliente for excluído da tabela Clientes, podemos pedir para que o banco
de dados exclua, na tabela Pedidos, todos os pedidos do cliente que está sendo excluído.
Essa opção é conhecida como “Propagar exclusão dos registros relacionados” e pode
ser habilitada ou não, dependendo da especificação do banco de dados. Caso seja
necessário manter todo o histórico de compras do cliente, por exemplo, esta opção não
deve ser habilitada. Com isso, quando o cliente for eliminado da tabela Clientes, os
seus pedidos continuarão gravados na tabela Pedidos.
Essas opções são definidas no momento da criação das tabelas e dos relacionamentos entre as
tabelas do banco de dados.
A opção de “Propagar atualização dos campos relacionados” é utilizada na maioria das situações,
já a opção de “Propagar exclusão dos registros relacionados” deve ser estudada, caso a caso.
Normalização de Tabelas
O conceito de Normalização foi criado no início da década de 70.
Uma regra de ouro que devemos observar durante a elaboração do projeto de banco de dados
é a de “Não misturar assuntos em uma mesma tabela”.
Por exemplo na tabela Clientes devemos colocar somente campos relacionados com o assunto
Clientes. Não devemos misturar campos relacionados com outros assuntos, tais como Pedidos,
Produtos, etc. Essa “mistura de assuntos” em uma mesma tabela acaba por gerar repetição
desnecessária dos dados bem como inconsistência dos mesmos.
Com freqüência, após a aplicação das regras de Normalização, algumas tabelas acabam se dividindo
em duas ou mais, o que no final gera um número maior de tabelas do que o originalmente existente.
Este processo causa a simplificação dos atributos de uma tabela, colaborando para a estabilidade
do modelo, reduzindo-se consideravelmente as necessidades de manutenção.
257
Criando Sites Dinâmicos com ASP 3.0
Figura 5.6: Uma tabela que não está na Primeira Forma Normal.
Podemos notar que uma tabela com esta estrutura apresentaria diversos problemas. Por
exemplo, se um casal tiver mais de um filho, teríamos que digitar o nome do pai e o nome da
mãe diversas vezes, tantas quantas forem os filhos. Isso forma um Grupo de Repetição. Além
do mais, pode ser que por erro de digitação o nome dos pais não seja digitado exatamente
igual todas as vezes, o que pode acarretar problemas na hora de fazer pesquisas ou emitir
relatórios. Este problema ocorre porque misturamos assuntos em uma mesma tabela.
Colocamos as informações dos pais e dos filhos em uma mesma tabela.
A resolução para este problema é simples: criamos uma tabela separada para a informação
dos pais e relacionamos a tabela Pais com a tabela Filhos através de um relacionamento do
tipo Um para Vários, ou seja, Um casal pode ter Vários filhos.
As duas tabelas resultantes desse processo de Normalização, Pais e Filhos, estão na Primeira
Forma Normal; a tabela original, a qual misturava informações de Pais e Filhos, não estava na
Primeira Forma Normal.
258
Capítulo 5 – Conectando Páginas ASP com Bancos de Dados
Figura 5.8: Uma tabela que não está na Segunda Forma Normal.
A resolução para este problema também é simples: dividimos a tabela, que não está na Segunda
Forma Normal, em duas outras tabelas, conforme indicado pela Figura 5.9, sendo que as duas
tabelas resultantes estão na Segunda Forma Normal.
259
Criando Sites Dinâmicos com ASP 3.0
NOTA
A distinção entre a Segunda e a Terceira Formas Normais, que veremos no próximo item,
muitas vezes é confusa. A Segunda Forma Normal, na maioria das vezes, está ligada a ocorrência
de chaves primárias compostas.
Quando isto ocorre, dizemos que a tabela não está na Terceira Forma Normal, conforme
indicado pela tabela da Figura 5.10.
Figura 5.10: Uma tabela que não está na Terceira Forma Normal.
Observe que o campo DescriçãoDoCurso depende apenas do campo CódigoDoCurso, o qual não
faz parte da chave primária. Por isso dizemos que esta tabela não está na Terceira Forma Normal.
A solução para este caso também é simples. Novamente basta dividir a tabela em duas outras,
conforme indicado pela Figura 5.11. As duas tabelas resultantes estão na Terceira Forma Normal.
260
Capítulo 5 – Conectando Páginas ASP com Bancos de Dados
IMPORTANTE
Com isso podemos concluir que, como resultado do processo de Normalização, iremos obter
um número maior de tabelas, porém sem problemas de redundância e inconsistência dos
dados, ou com estes problemas minimizados.
261
Criando Sites Dinâmicos com ASP 3.0
➥ Refinar a estrutura do banco de dados. Antes de inserir muitos dados, ou até mesmo
antes de inserir qualquer dado, verificar se a estrutura contém erros, isto é, verificar se
os resultados obtidos são os desejados. Isto, freqüentemente, pode ser obtido através do
processo de Normalização. Caso necessário, deve-se alterar a estrutura do banco de dados.
262
Capítulo 5 – Conectando Páginas ASP com Bancos de Dados
Introdução
Na Figura 5.12 temos um exemplo de uma instrução SQL. Embora possa parecer complexa, em
um primeiro momento, veremos que a linguagem SQL é bastante simples e de fácil aprendizado.
Uma instrução SQL descreve o conjunto de dados que você deseja recuperar (campos, de
quais tabelas, critérios, classificação, expressões calculadas, etc.).
Todas as instruções SQL são conduzidas com um único comando que contém uma descrição
completa da informação exigida. Ao escrever uma instrução SQL, você não deve se preocupar
em como os dados são recuperados, mas somente com o conteúdo do conjunto de dados.
Esse é o principal benefício do método SQL.
263
Criando Sites Dinâmicos com ASP 3.0
Lembre-se que o SQL é um padrão genérico para expressões de consulta em banco de dados.
Embora a maior parte das versões do SQL compartilhe elementos básicos, elas não são
idênticas. O Access SQL usa algumas palavras-chave que você não encontra em outras versões
do SQL. Também existem pequenas diferenças entre o Microsoft Access e o Microsoft SQL
Server, conforme iremos salientar durante este capítulo.
A Instrução SELECT
Esta é com certeza, a instrução SQL mais importante; não existe pesquisa que não utilize esta
instrução. Agora vamos conhecê-la em detalhes.
A instrução Select é utilizada para especificar quais os campos de quais tabelas farão parte da
consulta, quais critérios de pesquisa serão utilizados, qual a ordem de classificação, etc.
Elemento Descrição
campo1, campo2 ... campon Nome dos campos a serem retornados a partir
de uma ou mais tabelas.
nome_da_tabela Nome da tabela a partir da qual os dados devem
ser recuperados.
WHERE Permite que sejam especificados
critérios de pesquisa.
GROUP BY Podemos agrupar os resultados em
torno de um ou mais campos de dados.
264
Capítulo 5 – Conectando Páginas ASP com Bancos de Dados
Elemento Descrição
Por exemplo, em um relatório de vendas anuais,
posso ter os resultados agrupados por mês, com
a soma das vendas do mês logo após a listagem
de vendas do mês.
HAVING Especifica critérios para serem utilizados
juntamente com Group By.
ORDER BY Podemos ordenar os resultados obtidos com
base em um ou mais campos de dados. Por
exemplo, podemos ordenar uma listagem de
vendas em ordem alfabética do nome do cliente
ou do nome do vendedor.
Exemplo 1
Criar uma instrução SQL que retorne o campo NúmeroDoPedido, o campo DataDoPedido, o
campo Frete e o campo PaísDeDestino da tabela Pedidos.
SELECT Pedidos.NúmeroDoPedido, Pedidos.DataDoPedido, Pedidos.PaísDeDestino,
Pedidos.Frete FROM Pedidos;
Toda instrução SQL deve terminar com um ponto e vírgula (;), conforme indicado no Exemplo 1.
Observe que os nomes dos campos estão separados por vírgula, além disso estamos utilizando o
nome completo, isto é: Nome_da_tabela.Nome_do_campo. Também poderíamos utilizar o
comando, sem o nome da tabela antes do nome do campo, conforme indicado no seguinte comando:
SELECT NúmeroDoPedido, DataDoPedido, PaísDeDestino, Frete FROM Pedidos;
IMPORTANTE
Somente é obrigatória a utilização do nome da tabela antes do nome do campo quando o
mesmo campo existir em duas ou mais tabelas que fazem parte da instrução SQL. Por exemplo,
imagine que estejamos escrevendo uma instrução SQL para criar uma listagem com o código
e o nome do cliente, bem como todos os pedidos efetuados pelo cliente. Acontece que o Código
do Cliente, no nosso exemplo, existe nas duas tabelas: Clientes e Pedidos. Neste caso devemos
especificar o nome da tabela, antes do nome do campo.
265
Criando Sites Dinâmicos com ASP 3.0
Exemplo 2
Alterar a instrução SQL anterior para que os registros sejam classificados em ordem crescente
pelo valor do Frete.
SELECT NúmeroDoPedido, DataDoPedido, PaísDeDestino, Frete FROM Pedidos
ORDER BY Frete;
Exemplo 3
Agora vamos começar a inserir condições. Muitas vezes as condições são chamadas de filtro;
uma vez estabelecida uma condição, somente os registros que atendem a condição especificada
serão retornados. Desta forma a condição atua como se fosse um filtro. Neste exemplo vamos
alterar a instrução SQL anterior para que sejam exibidos somente os pedidos cujo PaísDeDestino
seja Brasil.
SELECT NúmeroDoPedido, DataDoPedido, PaísDeDestino, Frete FROM Pedidos
WHERE PaísDeDestino=“Brasil”
ORDER BY Frete;
Observe a utilização da cláusula WHERE para filtrar somente os pedidos cujo PaísDeDestino seja
Brasil. Como o campo PaísDeDestino é um campo do tipo texto, o valor do critério (Brasil) tem
que vir entre aspas. Se fosse um campo do tipo data, o valor do critério teria que vir delimitado
pelo sinal #, por exemplo #01/01/1995#. Vamos trabalhar um pouco mais com a cláusula WHERE.
Exemplo 4
Altere a instrução SQL anterior para que sejam exibidos somente os pedidos para o Brasil ou
Alemanha como PaísDeDestino.
SELECT NúmeroDoPedido, DataDoPedido, PaísDeDestino, Frete FROM Pedidos
WHERE (((Pedidos.PaísDeDestino)=“Brasil” Or (Pedidos.PaísDeDestino)=”Alemanha”))
ORDER BY Frete;
266
Capítulo 5 – Conectando Páginas ASP com Bancos de Dados
Exemplo 5
Altere a instrução SQL anterior, retirando o critério para PaísDeDestino. Adicione um critério
para NúmeroDoPedido maior do que 10500, retire a classificação do campo Frete a classifique
pelo campo NúmeroDoPedido.
SELECT NúmeroDoPedido, DataDoPedido, PaísDeDestino, Frete FROM Pedidos
WHERE NúmeroDoPedido>10500
ORDER BY NúmeroDoPedido;
Podemos ver, através dos exemplos, que a linguagem SQL não é tão difícil como pode parecer
à primeira vista. Observe que a sintaxe da linguagem é bastante intuitiva e orientada a extração
de dados através das consultas.
Vamos continuar analisando alguns exemplos de aplicação da linguagem SQL com a utilização
de recursos mais avançados.
Exemplo 6
Alterar a instrução SQL anterior, e adicionar um critério de tal maneira que somente sejam
exibidos os pedidos para o ano de 1995. Tirar o critério do campo NúmeroDoPedido.
SELECT NúmeroDoPedido, DataDoPedido, PaísDeDestino, Frete FROM Pedidos
WHERE ((Year([DataDoPedido])=1995))
ORDER BY NúmeroDoPedido;
Observe a utilização da função Year (Ano) para extrairmos apenas o ano do campo DataDoPedido a
fim de especificarmos como critério o Ano=1995. Também a cláusula ORDER BY foi mantida,
classificando a listagem em ordem crescente pelo número do pedido. A utilização de funções junto
com os comando SQL nos fornece inúmeras possibilidades de refinamento em nossas consultas.
Exemplo 7
Alterar a instrução SQL anterior, para que sejam exibidos somente os pedidos no período de 01/
01/1995 até 31/07/1995 e que tenham como PaísDeDestino Brasil, Argentina, Alemanha ou Canadá.
SELECT NúmeroDoPedido, DataDoPedido, PaísDeDestino, Frete FROM Pedidos
WHERE (((DataDoPedido) Between #1/1/95# And #8/31/95#)
AND
((PaísDeDestino) In (“Brasil”,“Argentina”,“Alemanha”,”Canadá”)))
ORDER BY Pedidos.NúmeroDoPedido;
267
Criando Sites Dinâmicos com ASP 3.0
Observe a utilização de vários critérios em diferentes campos. Colocamos critérios nos campos
DataDoPedido e PaísDeDestino. Os critérios de dois ou mais campos são ligados através do
operador AND, indicando que um registro deve atender ambos os critérios para ser selecionado.
Também temos a utilização dos operadores Between (Entre) para selecionar as datas dentre
um determinado intervalo e do operador In (Em) para selecionar o campo PaísDeDestino que
seja igual a um dos valores apresentados na lista. Observe também que os valores de data
vem delimitados pelos marcadores #, conforme descrito anteriormente. A utilização dos
parênteses visa facilitar o entendimento da instrução e facilitar a avaliação da expressão.
IMPORTANTE
Algumas destas funcionalidades podem necessitar de pequenas alterações para funcionar em
nossas páginas ASP, conforme veremos mais adiante neste capítulo.
Exemplo 8
Criar uma instrução SQL que retorne os campos NúmeroDoPedido, DataDoPedido,
DataDeEntrega, Frete e PaísDeDestino da tabela Pedidos. Criar uma coluna adicional que calcula
o número de dias entre a DataDeEntrega e a DataDoPedido. Chamar esta coluna de Dias_Ped_Entr.
SELECT NúmeroDoPedido, DataDoPedido, DataDeEntrega, PaísDeDestino, Frete,
[DataDeEntrega]-[DataDoPedido] AS Dias_Ped_Entr FROM Pedidos
WHERE (((DataDoPedido) Between #1/1/95# And #8/31/95#)
AND
((PaísDeDestino) In (“Brasil”,“Argentina”,“Alemanha”,“Canadá”)))
ORDER BY Pedidos.NúmeroDoPedido;
Veja que a coluna calculada [DataDeEntrega]-[DataDoPedido] está junto com a listagem dos
campos no início da instrução SELECT. Além disso foi utilizada a palavra AS para atribuir
um nome (apelido) para esta coluna calculada. Este nome é o que será utilizado para fazer
referência à coluna, no nosso código ASP.
268
Capítulo 5 – Conectando Páginas ASP com Bancos de Dados
Exemplo 9
Alterar a instrução SQL anterior, eliminando os critérios para a DataDoPedido e para o
PaísDeDestino. Colocar um novo critério para PaísDeDestino, onde sejam exibidos apenas os
pedidos cujo PaísDeDestino tem a primeira letra na faixa de A até M. Utilize o operador Like.
SELECT NúmeroDoPedido, DataDoPedido, DataDeEntrega, PaísDeDestino, Frete,
[DataDeEntrega]-[DataDoPedido] AS Dias_Ped_Entr
FROM Pedidos
WHERE ((PaísDeDestino) Like “[A-M]%”))
ORDER BY PaísDeDestino;
Observe a utilização do operador Like (Como) como critério de pesquisa para esta consulta.
Nunca é demais salientar que a utilização das instruções SQL juntamente com as funções de
operadores como o Like, nos fornece um amplo conjunto de possibilidades. O caractere % é
utilizado como um caractere curinga. Por exemplo, se especificarmos o seguinte critério:
WHERE NomeDoCliente Like “João%”
serão retornados todos os registros para Clientes cujo nome inicia com João. O caractere
curinga % significa, em termos simples, “qualquer coisa”, ou seja, o critério especifica que o
nome inicie com João, não importando (qualquer coisa) o que vier depois.
IMPORTANTE
Aqui cabe um aviso importante para os usuários do Microsoft Access. No Microsoft Access, o
caractere curinga é o *, já na construção de páginas ASP, utilizamos como caractere curinga o
%, o qual também é utilizado no Microsoft SQL Server.
Até agora estivemos trabalhando com instruções que selecionam registros de uma única tabela.
Porém é bastante comum criarmos instruções SQL baseadas em duas ou mais tabelas. Quando
criamos instruções SQL que buscam dados em duas ou mais tabelas, dizemos que está sendo
feito um “Join” entre as duas tabelas. Normalmente este Join (ou ligação) é feito através de um
campo comum às duas tabelas. Por exemplo, NúmeroDoPedido na tabela Pedidos e
NúmeroDoPedido na tabela Detalhes do Pedido. Outro exemplo, CódigoDoCliente na tabela
Pedidos e CódigoDoCliente na tabela Clientes. Pode acontecer de termos consultas que
trabalham com três ou mais tabelas, neste caso teremos diversos Joins.
269
Criando Sites Dinâmicos com ASP 3.0
Exemplo 10
Criar uma instrução SQL que selecione os seguintes campos:
➥ NúmeroDoPedido da tabela Pedidos.
➥ DataDoPedido da tabela Pedidos.
➥ PaísDeDestino da tabela Pedidos.
➥ Frete da tabela Pedidos.
➥ CódigoDoProduto, PreçoUnitário e quantidade da tabela DetalhesdoPedido.
Primeiro devemos observar que, pelo fato de estarmos tratando com dados de duas tabelas,
estamos utilizando a nomenclatura completa, isto é, Nome_da_tabela.Nome_do_campo.
Observe que esta listagem irá trazer vários registros para cada pedido, tantos quantos forem
os itens de cada pedido.
E se, ao invés do CódigoDoProduto, nós quisermos que seja exibida a descrição do produto?
Em primeiro lugar, esta informação encontra-se na tabela Produtos, logo teremos que adicionar
a tabela à nossa consulta, a qual irá se ligar à tabela DetalhesDoPedido através do campo
CódigoDoProduto. Logo, teremos mais um Join.
270
Capítulo 5 – Conectando Páginas ASP com Bancos de Dados
FROM Produtos
INNER JOIN (Pedidos INNER JOIN DetalhesdoPedido ON Pedidos.NúmeroDoPedido=Detalhesdo
Pedido.NúmeroDoPedido) ON Produtos.CódigoDoProduto=DetalhesdoPedido.CódigoDoProduto
ORDER BY Pedidos.NúmeroDoPedido;
Observe que neste caso temos um INNER JOIN dentro do outro. Dentro do parênteses é feita
a ligação entre as tabelas Pedidos e DetalhesdoPedido, através do campo NúmeroDoPedido, e
externamente é feita a ligação entre as tabelas Produtos e DetalhesdoPedido, através do campo
NúmeroDoPedido.
Podemos utilizar diversos níveis de INNER JOIN, embora esta não seja uma prática
recomendada, pois se aumentarmos muito os níveis de INNER JOIN, podemos ter pesquisas
mais lentas, em conseqüência do aumento da complexidade das mesmas. Até três ou quatro
níveis é considerado normal, acima disso é preciso repensar a maneira de construir a consulta.
Exemplo 11
Alterar a instrução SQL do item anterior para que somente sejam exibidos os pedidos para os
produtos cujo NomeDoProduto inicie com uma letra na faixa de A até J. Tirar a classificação
do campo NúmeroDoPedido e classificar em ordem crescente do campo NomeDoProduto.
SELECT Pedidos.NúmeroDoPedido, Pedidos.DataDoPedido, Pedidos.PaísDeDestino,
Pedidos.Frete, Produtos.NomeDoProduto, DetalhesdoPedido.PreçoUnitário,
DetalhesdoPedido.Quantidade
FROM Pedidos
INNER JOIN (Produtos INNER JOIN DetalhesdoPedido ON
Produtos.CódigoDoProduto=DetalhesdoPedido.CódigoDoProduto)
ON Pedidos.NúmeroDoPedido=DetalhesdoPedido.NúmeroDoPedido
WHERE (((Produtos.NomeDoProduto) Like “[A-J]*”))
ORDER BY Produtos.NomeDoProduto;
Observe, além dos dois INNER JOIN, a utilização da cláusula WHERE com o operador Like
para especificar o critério desejado.
Até este momento estivemos construindo instruções SQL que executam consultas no banco
de dados. Especificamos quais campos serão exibidos, critérios de filtragem para estes campos
e uma ordem de classificação. A partir de agora aprenderemos a utilizar instruções SQL para
a construção de outros tipos de instruções SQL, as quais realizam alterações e inclusões em
tabelas de banco de dados.
271
Criando Sites Dinâmicos com ASP 3.0
A Instrução UPDATE
A instrução UPDATE é utilizada para alterar informações em um banco de dados. Podemos
criar um formulário onde o usuário pode alterar os seus dados cadastrais. Primeiro os dados
são recuperados a partir do banco de dados, em seguida as alterações são enviadas de volta
para o banco de dados, através de uma instrução UPDATE. Vamos estudar esta instrução
através de exemplos, assim como fizemos com a instrução SELECT.
Exemplo 1
Criar uma instrução SQL que aumenta o PreçoUnitário em 20 % na tabela DetalhesdoPedido,
devido a um ajuste na moeda e uma desvalorização em relação ao Dólar.
UPDATE DetalhesdoPedido
SET PreçoUnitário = PreçoUnitário*1.2;
Exemplo 2
Alterar a instrução SQL do item anterior para que somente sejam aumentados os registros
cujo PreçoUnitário for maior ou igual a R$ 20,00.
UPDATE DetalhesdoPedido
SET PreçoUnitário = PreçoUnitário*1.2
WHERE PreçoUnitário>=20;
Apenas foi adicionada uma cláusula WHERE, para atualizar apenas os registros cujo
PreçoUnitário seja maior ou igual a R$ 20,00.
Exemplo 3
Alterar a instrução SQL do exemplo anterior para que somente sejam aumentados os registros cujo
PreçoUnitário for maior ou igual a R$ 20,00 e cujo NúmeroDoPedido seja menor do que 10500.
UPDATE DetalhesdoPedido
SET PreçoUnitário = PreçoUnitário*1.2
WHERE (((PreçoUnitário)>=20)
AND
((NúmeroDoPedido)<10500));
272
Capítulo 5 – Conectando Páginas ASP com Bancos de Dados
Vamos refinar um pouco mais a nossa consulta de atualização. Vamos fazer com que somente
sejam atualizados os pedidos para o ano da DataDoPedido igual a 1995, e ainda iremos manter
os critérios adicionados até agora.
Exemplo 4
Alterar a instrução SQL do exemplo anterior para incluir um critério para que o ano da
DataDoPedido seja 1995. Você terá que incluir a tabela Pedidos, uma vez que o campo
DataDoPedido, encontra-se nesta tabela.
UPDATE Pedidos INNER JOIN DetalhesdoPedido
ON Pedidos.NúmeroDoPedido = DetalhesdoPedido.NúmeroDoPedido
SET DetalhesdoPedido.PreçoUnitário = PreçoUnitário*1.2
WHERE (((DetalhesdoPedido.PreçoUnitário)>=20)
AND
((DetalhesdoPedido.NúmeroDoPedido)<10500)
AND
(Year([DataDoPedido])=1995));
Temos diversos detalhes interessantes a observar nesta instrução SQL. Primeiro um INNER
JOIN relacionando as tabelas Pedidos e DetalhesdoPedido, através do campo NúmeroDoPedido.
Isso mostra que é perfeitamente possível utilizar um INNER JOIN dentro de uma consulta de
atualização. Segundo, temos a utilização da função Year para extrair apenas o ano do campo
DataDoPedido e compará-lo com o critério 1995.
A Instrução INSERT
A instrução INSERT é utilizada para gravar registros em uma tabela de um banco de dados. Por
exemplo, quando o usuário preenche os dados de um formulário de cadastro e os envia para
uma página ASP, podemos utilizar a instrução INSERT para os inserir em um banco de dados.
273
Criando Sites Dinâmicos com ASP 3.0
Exemplo 1
Este exemplo cria um novo registro na tabela Funcionários:
INSERT INTO Funcionários (Nome, Sobrenome, Cargo) VALUES (‘Paulo’, ‘Braga’,
‘Estagiário’);
Exemplo 2
Este exemplo seleciona todos os estagiários de uma tabela Estagiários que tenham sido
contratados há mais de 30 dias e adiciona os registros selecionados à tabela Funcionários.
INSERT INTO Funcionários
SELECT Estagiários.* FROM Estagiários
WHERE DataDaContratação < Hoje() - 30;
Observe que utilizamos a função Hoje( ) para capturar a data do sistema e subtraímos 30,
para obter apenas os funcionários contratados a mais do que 30 dias.
A Instrução DELETE
A instrução DELETE é utilizada para excluir registros de um banco de dados. Vamos supor
que você tenha desenvolvido uma aplicação Web para agenda eletrônica, onde o usuário
pode cadastrar contatos, endereços, telefones e compromissos. Podemos criar uma página
ASP que permite ao usuário eliminar dados que não sejam mais necessários na agenda. Neste
caso podemos fazer uso da instrução DELETE. Vamos a um exemplo prático.
Exemplo 1
Criar uma instrução SQL que elimine todos os pedidos da tabela Pedidos cujo PaísDeDestino
seja a Alemanha.
DELETE Pedidos.PaísDeDestino
FROM Pedidos
WHERE (((Pedidos.PaísDeDestino)=“Alemanha”));
274
Capítulo 5 – Conectando Páginas ASP com Bancos de Dados
cláusula WHERE. Utilizar um DELETE sem uma cláusula WHERE significa que estaremos
eliminando todos os registros da tabela.
Agora que já revisamos os aspectos básicos relacionados a bancos de dados e à linguagem SQL,
chegou o momento de aprendermos a conectar nossas páginas ASP com bancos de dados.
Porém, na tentativa de disponibilizar o Acesso Universal aos Dados, muitas tecnologias foram
criadas, causando uma certa confusão e até desconforto para quem trabalha com desenvolvimento
de aplicações. Isso porque, a cada nova tecnologia anunciada, um novo ciclo de aprendizado se
inicia, sem contar que muitas vezes a comunicação entre as diferentes tecnologias não é exatamente
a esperada. Neste mundo de tecnologias já nos deparamos com siglas como:
➥ DAO – Data Access Objects.
➥ RDS – Remote Data Access.
➥ ADO – Activex Data Object.
➥ ODBC – Open Database Conectivity.
➥ OLE DB.
É normal que o desenvolvedor fique um pouco confuso com esta “sopa de letrinhas”. Mais
importante do que decorar o significado de cada sigla é entender a tecnologia que fornece
acesso aos dados e saber utilizá-las corretamente. Hoje, a tecnologia mais utilizada, e
recomendada pela Microsoft, é a dobradinha ADO/OLE DB. A utilização de ODBC é bastante
forte e deve se manter por um bom período. Por isso, analisaremos estas duas opções neste
capítulo, e muitas vezes estaremos utilizando as duas ao mesmo tempo; mas isto será mais
adiante, agora vamos procurar entender um pouco melhor estas tecnologias.
275
Criando Sites Dinâmicos com ASP 3.0
ODBC é uma interface que permite que os aplicativos acessem qualquer base de dados para
a qual existe um driver ODBC. Utilizando ODBC, podemos criar páginas ASP que acessem
dados para os quais existam drives ODBC, de uma maneira simples e rápida.
Com a utilização de ODBC, podemos criar aplicações que se tornam independentes do sistema
de banco de dados que está sendo utilizado. Por exemplo, desenvolvemos uma aplicação para
acessar uma fonte de dados ODBC. A fonte de dados ODBC está ligada a um banco de dados do
Microsoft Access. Em determinado momento resolvemos migrar do Microsoft Access para o
Microsoft SQL Server. Sem problemas. Basta alterar nossa fonte de dados ODBC para que a
mesma passe a referenciar o banco de dados no Microsoft SQL Server e pronto! A nossa aplicação
passa a utilizar a nova fonte de dados de maneira transparente, através do driver ODBC.
Na Figura 5.13, temos uma visão geral do acesso aos dados utilizando ODBC.
Aplicação Web
Gerenciador ODBC
Para que uma fonte ODBC possa ser utilizada a mesma precisa ser previamente criada,
utilizando-se o Gerenciador ODBC, o qual é acessível através das Ferramentas administrativas
do menu Programas. Agora aprenderemos a criar fontes de dados ODBC. Ao desenvolver o
aplicativo, o desenvolvedor fará referência a fonte ODBC criada. A título de exemplo, iremos
criar duas fontes, uma para um banco de dados Microsoft Access 97 e outra para um banco
de dados Microsoft SQL Server 2000 – Beta 2.
276
Capítulo 5 – Conectando Páginas ASP com Bancos de Dados
IMPORTANTE
Dependendo da versão do ODBC instalado em seu computador, as telas apresentadas podem
ser um pouco diferentes das aqui apresentadas.
3. Uma fonte de dados é chamada de DSN – Data Source Name, a qual pode ser de três tipos:
➥ User DSN
➥ System DSN
➥ File DSN
277
Criando Sites Dinâmicos com ASP 3.0
NOTA
Para maiores informações sobre os diferentes tipos de DSN consulte o site http://
msdn.microsoft.com.
278
Capítulo 5 – Conectando Páginas ASP com Bancos de Dados
9. Nesta janela devemos fornecer diversas informações, tais como o nome para a fonte
ODBC, a localização do arquivo .mdb, etc.
10. No campo Nome da fonte de dados, digite nwind.
279
Criando Sites Dinâmicos com ASP 3.0
14. Dê um clique no botão Selecionar. Utilizamos este botão para selecionar o arquivo
.mdb que será relacionado à fonte ODBC que está sendo criada.
15. Surge a janela Selecionar banco de dados.
16. Navegue até a pasta onde está o arquivo .mdb. No nosso exemplo vamos navegar até a
pasta Meus documentos do drive C:, e dentro da pasta Meus documentos vou selecionar
nwind.mdb, conforme indicado na Figura 5.19.
17. Dê um clique no botão OK e você estará de volta à janela Configurar ODBC para
Microsoft Access.
18. Dê um clique no botão OK para fechar esta janela.
19. Você estará de volta à janela do Gerenciador de fontes ODBC, com a fonte ODBC nwind
já criada, conforme indicado pela Figura 5.20.
280
Capítulo 5 – Conectando Páginas ASP com Bancos de Dados
NOTA
Estaremos utilizando esta fonte ODBC em diversos exemplos deste livro.
281
Criando Sites Dinâmicos com ASP 3.0
Criando uma Fonte ODBC Para um Banco de Dados do Microsoft SQL Server 2000
Vamos criar uma fonte para um banco de dados do Microsoft SQL Server 2000. Utilizaremos
o banco de dados de exemplo que já vem com o Microsoft SQL Server 2000 – pubs. No nosso
exemplo, o nome do servidor SQL é SERVIDOR. Caso você esteja trabalhando em um servidor
com um nome diferente, utilize o nome do servidor no qual você está trabalhando.
IMPORTANTE
Dependendo da versão do ODBC instalado em seu computador, as telas apresentadas podem
ser um pouco diferentes das aqui apresentadas.
282
Capítulo 5 – Conectando Páginas ASP com Bancos de Dados
5. Dê um clique no botão Concluir. É aberta a janela Create a New Data Source to SQL
Server, conforme indicado na Figura 5.22.
6. Nesta janela devemos fornecer diversas informações, tais como o nome para a fonte
ODBC, o nome do servidor, etc.
7. No campo Name digite sqlpubs.
8. No campo Description digite Fonte de dados SQL Server.
9. Na lista Server, selecione o nome do Servidor SQL a ser utilizado.
10. A janela Create a New Data Source to SQL Server deve estar conforme indicado na
Figura 5.23.
11. Dê um clique no botão Avançar para ir para a próxima etapa.
12. Aceite as opções selecionadas e dê um clique no botão Avançar, indo para a terceira etapa.
13. Surge a janela indicada na Figura 5.24.
14. Em um servidor SQL Server podem existir diversos bancos de dados. Neste caso
precisamos definir a qual banco de dados a nossa fonte ODBC irá conectar-se.
15. Marque a opção Change the default database to.
16. Na lista abaixo desta opção selecione pubs, conforme indicado na Figura 5.25.
283
Criando Sites Dinâmicos com ASP 3.0
Figura 5.24: Definindo a qual banco de dados a fonte ODBC irá conectar-se.
284
Capítulo 5 – Conectando Páginas ASP com Bancos de Dados
285
Criando Sites Dinâmicos com ASP 3.0
22. Nesta janela podemos clicar no botão Test Data Source..., para verificar se a conexão
com o banco de dados está OK.
23. Dê um clique neste botão.
24. Deve surgir uma janela indicando que o teste foi realizado com sucesso, conforme
indicado na Figura 5.28.
25. Dê um clique em OK para fechar a janela de teste.
26. Dê um clique em OK para fechar a janela de resumo.
27. Você estará de volta à janela do Gerenciador de fontes ODBC, com a fonte ODBC sqlpubs
já criada, conforme indicado pela Figura 5.29.
28. Dê um clique em OK para fechar o Gerenciador de fontes ODBC.
NOTA
Estaremos utilizando esta fonte ODBC em diversos exemplos deste livro.
286
Capítulo 5 – Conectando Páginas ASP com Bancos de Dados
287
Criando Sites Dinâmicos com ASP 3.0
Agora que já sabemos um pouco sobre ODBC vamos falar sobre OLE DB.
Diferente do ODBC, não existe um driver OLE DB para cada fonte de dado. Na tecnologia
OLE DB, o conector para uma fonte de dados é chamado de OLE DB Provider. Por exemplo,
existe um OLE DB Provider para Microsoft Access, um para Microsoft SQL Server, um OLE
DB Provider para mensagens de correio do Microsoft Exchange, um para bancos de dados
Oracle e assim por diante.
Muitos usuários pensam que OLE DB veio para substituir completamente o padrão ODBC. Na
verdade, isto pode até acontecer daqui a algum tempo. Porém, na prática, existe um OLE DB
Provider para ODBC. Com isso, utilizando OLE DB podemos ter acesso a qualquer fonte de
dados ODBC. O ODBC funciona como se fosse um subconjunto de OLE DB, uma vez que OLE
DB fornece acesso a todas as fontes de dados ODBC (utilizando o OLE DP Provider para ODBC),
mais as fontes de dados não estruturadas para as quais existem OLE DB Provider disponíveis.
Na Figura 5.30, temos uma visão geral do acesso a fontes de dados, utilizando OLE DB.
Veja que é possível o acesso a qualquer fonte de dados ODBC. Também é possível o acesso
sem a utilização de ODBC, utilizando-se o OLE DB Provider adequado para cada situação.
Quanto estamos utilizando OLE DB temos a figura da fonte de dados e do consumidor de
dados. Um OLE DB Provider é a fonte de dados, já o aplicativo é o consumidor de dados. No
próximo item criaremos páginas ASP que acessam dados de um arquivo do Microsoft Access.
Com isso, nossas páginas ASP atuarão como consumidores de dados.
Porém, OLE DB, na verdade, é uma API (Application Programming Interface) baseada na
tecnologia COM da Microsoft. Utilizar diretamente uma API é algo que requer conhecimentos
avançados de programação, tais como o domínio das linguagens C e C++. Embora seja factível
utilizar diretamente OLE DB, é muito pouco produtivo, além de exigir profissionais com
conhecimentos avançados de programação.
288
Capítulo 5 – Conectando Páginas ASP com Bancos de Dados
OLE DB
OLE DB Providers
Para solucionar o problema de utilização direta de OLE DB foi criada uma camada adicional
de programação, a qual é conhecida como ADO – ActiveX Data Objects. Com a utilização de
ADO temos acesso a uma série de objetos e seus métodos. A utilização dos objetos ADO é
bem mais simples do que a utilização direta da API OLE DB. Com a utilização de ADO, a
produtividade do desenvolvedor aumenta bastante, pois seus objetos são de fácil aprendizagem
e utilização, principalmente para quem já programa em Visual Basic. Quando utilizamos um
objeto ADO, o próprio objeto sabe como converter a chamada feita em ADO, para comandos
que a API OLE DB entende e é capaz de executar.
Neste livro, sempre que formos fazer acesso a bases de dados, estaremos utilizando objetos
ADO. Por exemplo, quando estabelecemos uma conexão com um banco de dados, estaremos
utilizando o objeto Connection; para extrair informações de uma tabela estaremos utilizando
um objeto chamado Recordset e assim por diante.
Na Figura 5.31, representamos o acesso a dados através de ADO, o qual se comunica com a
API OLE DB.
IMPORTANTE
Com isso, terminamos nosso estudo sobre os aspectos teóricos necessários ao entendimento da
conexão de páginas ASP com bancos de dados. A partir do próximo item estaremos aprendendo,
na prática, a escrever páginas ASP que fazem conexão com banco de dados. Grande parte do
nosso trabalho será estudar os objetos, métodos, propriedades e eventos da tecnologia ADO.
Nunca é demais salientar que ADO é a forma de acesso a dados indicada pela Microsoft. No
289
Criando Sites Dinâmicos com ASP 3.0
site msdn.microsoft.com existem diversos documentos que ensinam como migrar de outras
tecnologias mais antigas (como DAO, por exemplo), para a tecnologia ADO/OLE DB. Além
disso, a Microsoft vem anunciando que as tecnologias mais antigas (como DAO e RDO) serão
descontinuadas, isto é, serão substituídas por ADO.
ADO
OLE DB
OLE DB Providers
Exchange
Jet Jet Server Gerenciador ODBC
Provider Provider Provider
Outro ponto importante a salientar é que ADO não é somente para uso em aplicações Web.
Podemos utilizar ADO para qualquer aplicação, como as tradicionais aplicações Cliente/
Servidor de duas camadas desenvolvidas em Visual Basic ou qualquer outra linguagem com
suporte a ADO/OLE DB.
290
Capítulo 5 – Conectando Páginas ASP com Bancos de Dados
Connection
Errors Error
Properties Property
Command
Parameters Parameter
Properties Property
Recordset
Fields Field
Properties Property
Record
Fields Field
Stream
Um detalhe importante a ser salientado é que a criação de uma conexão com um banco de
dados, através da utilização do objeto Connection, não é obrigatória. Podemos utilizar
diretamente os objetos Command, Recordset e Record, pois cada vez que utilizarmos um
destes objetos, uma conexão será automaticamente criada. Porém, pode ser mais prática a
criação explícita de uma conexão, principalmente em situações em que muitos comandos
são executados contra a fonte de dados. Neste caso a criação de uma conexão, com a utilização
do objeto Connection, pode melhorar o desempenho da aplicação Web.
291
Criando Sites Dinâmicos com ASP 3.0
➥ Command: Este objeto pode ser utilizado para executar um comando (uma instrução
SQL por exemplo) em uma fonte de dados. Podemos utilizar este objeto para efetuar
uma consulta em um banco de dados e retornar o resultado em um objeto Recordset.
Também podemos utilizar este objeto para alterar a estrutura de um banco de dados,
desde que tenhamos permissão para isso.
➥ Recordset: Este objeto representa um conjunto de registros obtidos a partir de um
banco de dados. Este conjunto de registros pode, por exemplo, ter sido retornado devido
a uma operação do objeto Command. Todo objeto Recordset é formado por linhas e
colunas, como se fosse uma tabela de um banco de dados.
➥ Record: Este objeto representa uma única linha (ou seja, um único registro) de um
objeto Recordset.
➥ Stream: Este objeto é utilizado para manipular dados não estruturados, normalmente
organizados em formas de árvores hierárquicas. Pode ser utilizado para acessar
informações de um sistema de arquivos ou um sistema de correio eletrônico.
Cada um destes objetos apresenta uma série de métodos, propriedades, eventos e coleções.
Iniciaremos o estudo de cada objeto com uma apresentação rápida de cada um destes
elementos. À medida que formos utilizando estes métodos, propriedades, eventos e coleções,
apresentaremos maiores detalhes sobre cada um deles.
IMPORTANTE
Na maioria das situações utilizamos os objetos Connection e Recordset juntos em uma mesma
página. No próximo item iremos estudar o objeto Connection, porém já fazendo uso do objeto
Recordset nos exemplos práticos. No item a seguir será apresentado apenas o básico sobre o
objeto Recordset. Na parte final do capítulo e nos próximos capítulos estudaremos maiores
detalhes sobre o objeto Recordset.
O Objeto Connection
Conforme descrevemos anteriormente, o primeiro passo para conectar uma página ASP com
uma fonte de dados, é estabelecer uma “conexão” com a fonte de dados. Para estabelecermos
esta conexão utilizamos o objeto Connection.
Ao estabelecermos uma conexão estamos informando para a nossa página ASP uma série de
detalhes que a mesma necessita para poder acessar os dados. Utilizando o objeto Connection
podemos definir qual o OLE DB Provider a ser utilizado, qual a fonte de dados e demais
informações, tais como nome de usuário e senha, caso sejam necessários.
Na Tabela 5.2 temos uma breve descrição dos principais métodos do objeto Connection.
292
Capítulo 5 – Conectando Páginas ASP com Bancos de Dados
Método Descrição
BeginTrans Inicia uma nova transação. Falaremos mais sobre Transações
no Capítulo 12.
Cancel Cancela a execução assíncrona dos comandos Execute e
Open.
Close Fecha uma conexão que esteja aberta e quaisquer objetos
que sejam dependentes desta conexão.
CommitTrans Salva as alterações que foram feitas e encerra a transação
corrente.
Execute Executa um consulta, um comando ou uma instrução SQL
e retorna um objeto do tipo Recordset. Pode, por exemplo,
ser utilizado para obter uma listagem de vendas de
um banco de dados, ou qualquer outra listagem podendo
ser obtida a partir de uma instrução SQL.
Open Abre uma conexão com uma fonte de dados. Feito isso,
comandos podem ser executados através desta conexão.
OpenSchema Utilizado para obter informação sobre a estrutura de uma
fonte de dados, tais como as definições de tabelas e
relacionamentos de um banco de dados relacional.
RoolbackTrans Cancela quaisquer alterações que tenham sido feitas pela
transação e finaliza a transação.
Na Tabela 5.3 temos uma breve descrição das principais propriedades do objeto Connection.
Propriedade Descrição
Attributes Indica uma ou mais características de um objeto
Connection. Retorna um valor Long.
CommandTimeout Indica o tempo máximo de execução de um comando.
Caso o comando demore mais do que o tempo definido
nesta propriedade, será gerado um erro. O valor padrão
é 30 segundos.
293
Criando Sites Dinâmicos com ASP 3.0
Propriedade Descrição
ConnectionString Contém todas as informações utilizadas para
estabelecer a conexão com a fonte de dados.
ConnectionTimeout Indica o tempo máximo para tentativa de estabelecer
uma conexão. Caso a conexão não seja estabelecida
em um tempo menor ou igual ao definido em
ConnectionTimeout, a conexão será encerrada e um
erro gerado. Por padrão este valor é definido em 15
segundos.
CursorLocation Define ou retorna a localização do cursor, se no
servidor ou no cliente. Iremos falar um pouco mais
sobre cursores no próximo capítulo.
DefaultDatabase Indica qual o banco de dados padrão para um objeto
Connection. Por exemplo, quando estamos conectando
com um servidor SQL precisamos definir qual a base
de dados que será acessada. Fazemos isso definindo
qual o banco de dados padrão, através da utilização
da propriedade DefaultDatabase.
Errors Contém todos os objetos Error criados em resposta a
falhas envolvendo o provedor de dados. Falaremos
mais sobre o objeto Error no Capítulo 11.
IsolationLevel Define o nível de isolamento das transações para um
objeto Connection. Voltaremos a este assunto no
Capítulo 12.
Mode Indica as permissões disponíveis para modificação de
dados através de uma conexão.
Properties Contém todos os objetos Property de um determinado
objeto Connection.
Provider Retorna o nome do Provedor para uma determinada
conexão.
State Indica se a conexão está aberta ou fechada.
Version Retorna a versão da tecnologia ADO. Por exemplo,
2.0 ou 2.5.
294
Capítulo 5 – Conectando Páginas ASP com Bancos de Dados
Na Tabela 5.4 temos uma breve descrição dos principais eventos do objeto Connection.
Evento Descrição
BeginTransComplete Ocorre após o término de uma operação
BeginTrans.
CommitTransComplete Ocorre após o término de uma operação
CommitTrans.
ConnectComplete Ocorre após o início de uma conexão.
Disconnect Ocorre após o término de uma conexão.
ExecuteComplete Ocorre após o término da execução de um comando.
InfoMessage Ocorre sempre que a operação ConnectionEvent
ocorre com sucesso e uma informação adicional
é retornada pelo provedor de dados.
RollBackTransComplete Ocorre após a execução da operação RollbackTrans.
WillConnect Ocorre antes do início de uma conexão.
WillExecute Ocorre antes que um comando pendente seja
executado em uma determinada conexão.
O Primeiro Exemplo
Neste item vamos utilizar o conhecimento que já temos para criar uma página ASP que conecta
o banco de dados Nwind e mostra uma listagem de clientes com as seguintes informações:
➥ Código do Cliente (CodigoDoCliente)
➥ Cargo (Cargo)
➥ Endereço (Endereco)
➥ Telefone (Fone)
NOTA
O nome entre parênteses é o nome do campo na tabela clientes do banco de dados Nwind.
Caso você esteja utilizando outro banco de dados ou outra tabela, utilize os nomes de campo
adequados. O banco de dados Nwind é um banco de exemplo que é instalado juntamente com
o Microsoft Access.
295
Criando Sites Dinâmicos com ASP 3.0
Na Figura 5.33 podemos ver a estrutura da tabela Clientes que está sendo utilizada no nosso
exemplo.
Pode acontecer que a estrutura do Nwind esteja em inglês. Os nomes dos campos aparecem
com CustomerID, City, Address e assim por diante. Utilize os nomes conforme os mesmos se
apresentam na sua cópia do banco de dados Nwind.mdb.
Na Listagem 5.1 apresentamos uma página ASP que faz a conexão com o banco de dados Nwind
e exibe uma listagem de clientes. Logo após explicaremos cada um dos comandos utilizados.
Listagem 5.1 – Uma página ASP que conecta com o banco de dados Nwind – clientes.asp.
1 <%@ Language=VBScript %>
2 <HTML>
3 <HEAD>
4 <TITLE>Listagem de Clientes</TITLE>
5 </HEAD>
6 <BODY>
7 <H1>
8 <FONT color=navy>Clientes da Empresa ABC Ltda.</FONT>
9 </H1>
10 <%
296
Capítulo 5 – Conectando Páginas ASP com Bancos de Dados
17 conn.Open “nwind”
38 %>
297
Criando Sites Dinâmicos com ASP 3.0
39 <P>
40 <HR>
42 <TR>
43 <TD align=middle bgColor=gray>Código</TD>
44 <TD align=middle bgColor=gray>Cargo</TD>
45 <TD align=middle bgColor=gray>Endereço</TD>
46 <TD align=middle bgColor=gray>Fone</TD>
47 </TR>
48 <%
53 <TR>
54 <TD align=middle bgColor=gray><%=Clientes.Fields(“CodigoCliente”)%></TD>
55 <TD align=middle bgColor=gray><%=Clientes.Fields(“Cargo”)%></TD>
56 <TD align=middle bgColor=gray><%=Clientes.Fields(“Endereco”)%></TD>
57 <TD align=middle bgColor=gray><%=Clientes.Fields(“Fone”)%></TD>
58 </TR>
59 <%
60 Clientes.MoveNext
61 Loop %>
62 </TABLE>
63 </P>
64 <HR>
65 </BODY>
66 </HTML>
298
Capítulo 5 – Conectando Páginas ASP com Bancos de Dados
Ao carregar esta página no Internet Explorer, o usuário recebe uma listagem conforme indicado
na Figura 5.34.
Antes de comentarmos esta listagem gostaria de salientar a natureza dinâmica das páginas
criadas com ASP. Neste exemplo, qualquer alteração que seja feita na tabela Clientes, será
exibida na listagem de clientes, na próxima vez que o usuário carregar a página Clientes.asp.
Isto acontece porque a listagem é montada, a partir do banco de dados, cada vez que a página
é carregada. Com isso ao carregar a página, todos os dados existentes na tabela Clientes serão
exibidos. Por isso que dizemos que a página é criada dinamicamente, ou seja, cada vez que a
página é solicitada, o código ASP estabelece a conexão com o banco de dados, solicita a
listagem de clientes e apresenta a listagem no formato de uma tabela, conforme definimos.
Agora vamos às explicações a respeito do código da Listagem 5.1. Embora existam diversos
comentários na própria listagem, cabe aqui alguns esclarecimentos. Vamos detalhar diversos
trechos de código desta listagem, pois estaremos utilizando estas técnicas ao longo do livro.
299
Criando Sites Dinâmicos com ASP 3.0
Esta linha cria um objeto Connection chamado conn. Poderíamos utilizar qualquer nome
válido para este objeto. Um ponto importante a salientar é a utilização da instrução Set.
Sempre que formos criar um objeto (Connection, Recordset, etc.), devemos usar a instrução
Set. Se não utilizarmos esta instrução na criação de objetos, obteremos um erro na hora de
carregar a página.
Este código cria um objeto no servidor, que é do tipo ADODB.Connection, ou seja, uma conexão
ADO para banco de dados.
Após a execução deste comando, um objeto Connection foi criado, porém o mesmo ainda não
faz referência a nenhum banco de dados específico.
➥ Trecho 2: Considere o seguinte trecho de código:
15 ‘Agora abro uma conexão com a fonte ODBC “nwind”
16 ‘criada anteriormente.
17 conn.Open “nwind”
Na linha 17 estou associando a conexão conn com uma fonte ODBC nwind. Lembrando que
esta fonte ODBC foi criada previamente. Caso você esteja utilizando uma fonte ODBC diferente,
utilize o nome adequado. Esta associação é feita através do método Open, do objeto Connection.
A partir deste momento, a minha conexão “conn” está associada ao banco de dados Nwind,
conforme definido pela fonte ODBC nwind.
Uma vez estabelecida a conexão é hora de recuperar dados, isto é, registros, a partir do banco
de dados. Isto é feito pelo seguinte trecho de código:
➥ Trecho 3: Considere o seguinte trecho de código.
20 inst_sql=“SELECT Clientes.CodigoCliente, Clientes.Cargo,
Clientes.Endereco, Clientes.Fone FROM Clientes”
300
Capítulo 5 – Conectando Páginas ASP com Bancos de Dados
Na linha 20, criamos uma variável chamada inst_sql, a qual contém a instrução SQL que será
executada no banco de dados Nwind. Observe que é uma instrução SQL bastante simples, a
qual, basicamente, seleciona os campos CodigoCliente, Cargo, Endereco e Fone da tabela
Clientes do banco de dados Nwind.
Uma vez definida a instrução SQL, partimos para a criação de um objeto RecordSet. A criação
do objeto RecordSet, chamado Clientes, é feita na linha 26. Poderíamos ter escolhido qualquer
nome para este objeto. Observe a utilização da instrução Set. Como estamos criando um
objeto (do tipo RecordSet), devemos utilizar a instrução Set.
Agora devemos executar a instrução SQL para que o objeto Recordset contenha os registros
retornados pela instrução. Isto é feito pelo seguinte código:
29 Clientes.Open inst_sql, conn, 3, 3
Neste caso utilizamos o método Open do objeto RecordSet Clientes. O primeiro parâmetro é
a instrução SQL a ser utilizada – inst_sql. O segundo parâmetro é o nome da conexão a ser
utilizada – conn. O terceiro e quatro parâmetros definem comportamentos para o objeto
RecordSet, tais como se é possível mover-se para frente e para trás, avançando e voltando
pelos registros, se os registros retornados são apenas para leitura ou para leitura e alterações
e assim por diante. Estudaremos estas opções no próximo capítulo.
Bem, neste momento já temos um objeto RecordSet chamado Clientes, o qual possui uma
série de registros obtidos a partir da tabela Clientes do banco de dados Nwind. Cada registro
possui quatro campos, conforme foi definido pela nossa instrução SQL que somente retorna
os campos CodigoCliente, Cargo, Endereco e Fone.
➥ Trecho 4: Considere o seguinte trecho de código.
41 <TABLE bgColor=gray border=1 borderColor=navy cellPadding=1
cellSpacing=1
width=“100%”>
42 <TR>
43 <TD align=middle bgColor=gray>Código</TD>
301
Criando Sites Dinâmicos com ASP 3.0
53 <TR>
54 <TD align=middle bgColor=gray><%=Clientes.Fields
(“CodigoCliente”)%></TD>
55 <TD align=middle bgColor=gray><%=Clientes.Fields(“Cargo”)%></TD>
56 <TD align=middle bgColor=gray><%=Clientes.Fields(“Endereco”)%></
TD>
57 <TD align=middle bgColor=gray><%=Clientes.Fields(“Fone”)%></TD>
58 </TR>
59 <%
60 Clientes.MoveNext
61 Loop %>
62 </TABLE>
Uma vez que o RecordSet Clientes foi criado com sucesso, é hora de criarmos uma tabela que
exibe os dados do objeto RecordSet. Começamos criando a primeira linha da tabela, a qual irá
conter o título das colunas. Isto é feito pelo seguinte código:
41 <TABLE bgColor=gray border=1 borderColor=navy cellPadding=1 cellSpacing=1
width=“100%”>
42 <TR>
43 <TD align=middle bgColor=gray>Código</TD>
44 <TD align=middle bgColor=gray>Cargo</TD>
45 <TD align=middle bgColor=gray>Endereço</TD>
46 <TD align=middle bgColor=gray>Fone</TD>
47 </TR>
Observe que para criar o cabeçalho da tabela, utilizamos código HTML puro. Veja que estamos
criando uma tabela com quatro colunas. Vamos exibir um registro por linha, como cada registro
possui quatro campos, precisamos de uma tabela com quatro colunas. Esta tabela terá tantas
linhas quantos forem os registros do objeto Clientes.
302
Capítulo 5 – Conectando Páginas ASP com Bancos de Dados
Na linha 52, iniciamos um laço Do Until Condição... Loop. Como condição utilizamos a propriedade
Eof do objeto Clientes. O laço continua sendo executado até que a condição Clientes.eof se torne
Verdadeira. Esta condição somente irá tornar-se Verdadeira quando o indicador de registro já
estiver além do último registro. Com isso, o laço somente será encerrado depois que tivermos
percorrido todos os registros do objeto Clientes, que é exatamente o que queremos.
Para cada registro é criada uma nova linha na tabela. Isto é feito pelo seguinte trecho de código:
53 <TR>
54 <TD align=middle bgColor=gray><%=Clientes.Fields(“CodigoCliente”)%></TD>
55 <TD align=middle bgColor=gray><%=Clientes.Fields(“Cargo”)%></TD>
56 <TD align=middle bgColor=gray><%=Clientes.Fields(“Endereco”)%></TD>
57 <TD align=middle bgColor=gray><%=Clientes.Fields(“Fone”)%></TD>
58 </TR>
Este fragmento retorna o valor do campo CodigoCliente do registro atual do Recordset Clientes.
Com isso vamos preenchendo cada coluna com os respectivos valores. A primeira coluna com o
campo CodigoCliente, a segunda com o campo Cargo, e assim por diante. Neste caso, utilizamos a
coleção Fields do RecordSet Clientes, a qual nos dá acesso aos campos individuais de cada registro.
62 </TABLE>
Se não colocássemos a linha 60, esta página ASP entraria em Loop infinito e somente o primeiro
registro seria exibido repetidamente, até congelar a página. Quando criamos um objeto RecordSet,
por padrão, o indicador de registro é posicionado no primeiro registro. Utilizamos o método
MoveNext para mover o indicador para o próximo registro. Com isso, a cada passagem do laço Do
303
Criando Sites Dinâmicos com ASP 3.0
Until, o indicador é posicionado no próximo registro, até o momento em que todos os registros
foram percorridos. Se não houvesse esta linha, o indicador ficaria sempre no primeiro registro e
o laço nunca seria encerrado, pois a condição Clientes.eof seria sempre verdadeira, impedindo o
encerramento do laço. A linha 62 é simplesmente a tag HTML de fechamento da tabela.
Muito simples, basta modificar a instrução SQL para incluir a ordenação. Isto é feito,
modificando-se a linha 20 da Listagem 5.1. A nova instrução SQL, já ordenando pelo campo
Cargo ficaria assim:
20 inst_sql=“SELECT Clientes.CodigoCliente, Clientes.Cargo, Clientes.Endereco,
Clientes.Fone FROM Clientes ORDER BY Clientes.Cargo”
Feita esta alteração, ao acessarmos esta página no Internet Explorer, obteremos o resultado
indicado na Figura 5.35.
Figura 5.35: A listagem de clientes do banco de dados Nwind, ordenada pelo campo Cargo.
304
Capítulo 5 – Conectando Páginas ASP com Bancos de Dados
Observe que uma simples modificação na instrução SQL já produz os resultados desejados.
Também poderíamos sugerir outra alteração. Vamos supor que foi solicitado que retirássemos
o campo Fone e incluíssemos o campo Fax. Esta mudança também é extremamente simples.
Bastaria alterar as seguintes linhas:
➥ A instrução SQL na linha 20 ficaria assim:
20 inst_sql=“SELECT Clientes.CodigoCliente, Clientes.Cargo,
Clientes.Endereco, Clientes.Fax FROM Clientes ORDER BY Clientes.Cargo”
➥ O cabeçalho da quarta coluna, na linha 46 ficaria assim:
46 <TD align=middle bgColor=gray>Fax</TD>
➥ Na linha 57 basta trocar o nome do campo de Fone para Fax, conforme indicado:
57 <TD align=middle bgColor=gray><%=Clientes.Fields(“Fax”)%></TD>
Figura 5.36: A listagem de clientes do banco de dados Nwind, com o campo Fax.
Com a utilização de SQL e ASP fica fácil fazer alterações em nossas páginas.
A partir do próximo item estudaremos mais detalhes sobre o objeto Connection. Ainda neste
capítulo, aprenderemos a criar um formulário onde o usuário pode digitar um critério e
pesquisar registros que atendam ao critério digitado. Conforme descrito, continuaremos
305
Criando Sites Dinâmicos com ASP 3.0
fazendo uso de objetos RecordSet, embora somente iremos estudar os mesmos, em detalhes,
no próximo capítulo.
6 <BODY>
7 <H3>
8 <FONT color=navy>Tabela com as propriedades do objeto Connection !!!
9 </FONT>
10 </H3>
11 <%
13 Set obj_conn=Server.CreateObject(“ADODB.Connection”)
16 obj_conn.Open “nwind”
306
Capítulo 5 – Conectando Páginas ASP com Bancos de Dados
26 %>
27 <P>
28 <HR>
30 <TR>
31 <TD align=middle bgColor=gray>Propriedade</TD>
32 <TD align=middle bgColor=gray>Valor</TD>
33 </TR>
34 <TR>
35 <TD align=middle bgColor=gray>Attributes</TD>
36 <TD align=middle bgColor=gray><%=obj_conn.Attributes %></TD>
37 </TR>
38 <TR>
39 <TD align=middle bgColor=gray>CommandTimeout</TD>
40 <TD align=middle bgColor=gray><%=obj_conn.CommandTimeout %></TD>
41 </TR>
42 <TR>
43 <TD align=middle bgColor=gray>ConnectionString</TD>
44 <TD align=middle bgColor=gray><%=obj_conn.ConnectionString %></TD>
45 </TR>
46 <TR>
47 <TD align=middle bgColor=gray>ConnectinTimeout</TD>
48 <TD align=middle bgColor=gray><%=obj_conn.ConnectionTimeout %></TD>
49 </TR>
307
Criando Sites Dinâmicos com ASP 3.0
50 <TR>
51 <TD align=middle bgColor=gray>CursorLocation</TD>
52 <TD align=middle bgColor=gray><%=obj_conn.CursorLocation %></TD>
53 </TR>
54 <TR>
55 <TD align=middle bgColor=gray>DefaultDatabase</TD>
56 <TD align=middle bgColor=gray><%=obj_conn.DefaultDatabase %></TD>
57 </TR>
58 <TR>
59 <TD align=middle bgColor=gray>IsolationLevel</TD>
60 <TD align=middle bgColor=gray><%=obj_conn.IsolationLevel %></TD>
61 </TR>
62 <TR>
63 <TD align=middle bgColor=gray>Provider</TD>
64 <TD align=middle bgColor=gray><%=obj_conn.Provider %></TD>
65 </TR>
66 <TR>
67 <TD align=middle bgColor=gray>State</TD>
68 <TD align=middle bgColor=gray><%=obj_conn.State %></TD>
69 </TR>
70 <TR>
71 <TD align=middle bgColor=gray>Version</TD>
72 <TD align=middle bgColor=gray><%=obj_conn.Version %></TD>
73 </TR>
74 </TABLE>
76 </P>
77 <HR>
78 </BODY>
79 </HTML>
308
Capítulo 5 – Conectando Páginas ASP com Bancos de Dados
➥ Algumas propriedades são somente para leitura, isto é, somente podemos verificar o
valor da propriedade. Como exemplo de propriedades que são apenas para leitura,
podemos citar as propriedades State e Version.
➥ Outras propriedades são para leitura e escrita, isto é, além de acessarmos o valor atual
da propriedade, podemos alterá-lo. A título de exemplo, vamos supor que quiséssemos
309
Criando Sites Dinâmicos com ASP 3.0
NOTA
Cuidado! A propriedade ConnectionTimeout deve ser definida antes da conexão ser aberta com
a utilização do método Open, caso contrário será gerado um erro e a página não será carregada.
IMPORTANTE
Uma dúvida que muitos usuários têm é sobre a obrigatoriedade ou não de utilizarmos ODBC. A
utilização de uma fonte ODBC não é obrigatória, podemos montar uma conexão OLE DB diretamente
para qualquer fonte de dados. Basta, para isso, montar a String de conexão correta e passá-la
como um parâmetro para o método Open da conexão, que irá referenciar, diretamente, a fonte de
dados, sem a necessidade de uma fonte ODBC estar configurada.
Agora vamos fazer alguns comentários sobre os valores padrão de algumas propriedades.
Valor Descrição
1 Não utiliza os serviços de cursor. Falaremos mais sobre
cursores no próximo capítulo.
2 Este é o valor padrão, conforme pode ser comprovado na
Figura 5.37. Com este valor são utilizados os serviços de
cursor do provedor de dados, isto é, no lado do Servidor.
3 Utiliza cursor no Cliente.
310
Capítulo 5 – Conectando Páginas ASP com Bancos de Dados
Valor Descrição
0 Indica que a conexão está fechada.
1 Indica que a conexão está aberta.
2 Indica que a conexão está sendo efetuada.
4 Indica que está sendo executado um comando através da
conexão.
8 Indica um resultado sendo retornado, como por exemplo,
os registros de um Recordset.
➥ Por último gostaria de salientar a utilização do método Close, para fechar a conexão,
conforme indicado no seguinte trecho de código:
75 <% obj_conn.Close %>
Agora vamos explorar mais um exemplo de utilização da conexão de páginas ASP com banco
de dados.
Problema: Criar um formulário, onde o usuário possa digitar o número do produto e clicar em
um botão Pesquisar. Ao clicar neste botão é chamada uma página ASP (definida no atributo
action da tag FORM), que conecta com o banco de dados Nwind.mdb, através da fonte ODBC
nwind e exibe as informações da tabela Produtos, para o produto cujo código foi digitado no
formulário de pesquisa. A página ASP deve ter um formulário para o usuário digitar outro
código e clicar em um botão Pesquisar para buscar as informações de outro produto. Neste
caso, ao clicar no botão Pesquisar da página ASP, a própria página será chamada (através da
definição do atributo action da tag FORM). A página ASP fará a pesquisa para o novo código
digitado e exibirá o produto correspondente.
311
Criando Sites Dinâmicos com ASP 3.0
5 <BODY>
6 <P><FONT color=navy>
7 <B>PESQUISA DE PRODUTOS.</B>
8 </FONT>
9 </P>
13 </B>
14 </FONT></P>
15 <P><B><FONT color=#000080>
16 <INPUT id=pesquisar name=pesquisar type=submit value=“Clique aqui para pesquisar
o produto !!” >
17 </FONT>
18 </B>
19 </P>
20 </FORM>
21 </BODY>
22 </HTML>
312
Capítulo 5 – Conectando Páginas ASP com Bancos de Dados
NOTA
Estamos pedindo para que seja digitado um número entre 1 e 77 pois estes são os dados
existentes para produtos no banco de dados Nwind.mdb. Porém, vamos fazer um teste: iremos
digitar um código 95 e mandar pesquisar. A nossa página ASP detectará que não existe nenhum
produto com este código e avisará que nenhum produto foi encontrado para o código digitado.
Na Listagem 5.4 temos o código para criação da página ASP. Após a Listagem apresentaremos
os esclarecimentos necessários.
313
Criando Sites Dinâmicos com ASP 3.0
6 <BODY>
7 <H2>
8 <FONT color=navy>Resultado para a Pesquisa.</FONT>
9 </H2>
10 <P><FONT color=navy>
11 <B>PESQUISA DE PRODUTOS.</B>
12 </FONT>
13 </P>
25 <%
26 ‘O primeiro passo é criar a conexão com o banco de dados
27 ‘Para isto crio um objeto do tipo Connection
28 ‘Cria um objeto do tipo ADODB.Connection
29 Set conn=Server.CreateObject(“ADODB.Connection”)
32 conn.Open “nwind”
33 ‘O próximo passo é criar uma instrução SQL
314
Capítulo 5 – Conectando Páginas ASP com Bancos de Dados
47 %>
48 <HR>
49 <%
50 If Produto.RecordCount = 0 Then
51 Response.Write “Nenhum produto foi encontrado para o código: ”
52 Response.Write Request.Form(“codigo”) & “<BR>”
53 Response.Write “Tente pesquisar um outro código !”
54 Response.Write “<HR>”
55 Else
56 Response.Write “<B>DADOS DO PRODUTO:</B><BR>”
57 Response.Write “Código: ” & produto.Fields(“ProductID”) & “<BR>”
58 Response.Write “Nome: ” & produto.Fields(“ProductName”) & “<BR>”
59 Response.Write “Cód. Fornec.: ” & produto.Fields(“SupplierID”) & “<BR>”
60 Response.Write “Cód. Categ.: ” & produto.Fields(“CategoryID”) & “<BR>”
61 Response.Write “Preço Unit.: ” & produto.Fields(“UnitPrice”) & “<BR>”
62 Response.Write “Estoque: ” & produto.Fields(“UnitsInStock”) & “<BR>”
63 Response.Write “<HR>”
64 End If
65 %>
66 </BODY>
67 </HTML>
315
Criando Sites Dinâmicos com ASP 3.0
Agora vamos testar o nosso exemplo. Na figura 5.39 temos o formulário de pesquisa carregado,
onde o usuário digitou o código 32.
Ao clicarmos no botão “Clique aqui para pesquisar o produto !!”, é retornado o resultado
indicado na Figura 5.40.
316
Capítulo 5 – Conectando Páginas ASP com Bancos de Dados
Observe que no próprio formulário do resultado, colocamos a opção do usuário entrar com
um novo código para fazer outra pesquisa, conforme havíamos proposto na apresentação
deste problema.
Agora vamos fazer o seguinte teste: vamos digitar um código para um produto que não existe
e clicar fazer a pesquisa. Por exemplo, digite o código 89 e clique no botão de pesquisa. Você
obterá o resultado indicado na Figura 5.41.
Observe que, além de informar que o produto não foi encontrado, é informado qual o código
que foi digitado.
Nesta construção estamos utilizando a cláusula Where para especificar um critério. Ao executar a
página ASP, o código Request.Form(“Código”) é substituído pelo valor digitado pelo usuário. Vamos
supor que o usuário digitou 32 para o código. Neste caso a nossa instrução SQL ficaria assim:
SELECT * FROM Produtos where ProductID=32
que é justamente, a instrução que retorna o produto cujo código é igual ao digitado no
formulário de pesquisa. Esta é uma técnica bastante útil, pois inúmeras vezes precisamos
construir instruções semelhantes a esta em nossas aplicações Web.
317
Criando Sites Dinâmicos com ASP 3.0
Neste caso utilizamos a propriedade RecordCount do objeto Recordset. Caso esta propriedade
seja igual a zero, significa que nenhum registro foi encontrado. Neste caso, informamos ao
usuário que nenhum produto foi encontrado.
Caso tenha sido encontrado algum produto, retornamos os dados sobre o Produto, o que é
feito na parte Else do laço If..Then...Else.
Conclusão
Neste capítulo foram apresentados diversos conceitos fundamentais para a utilização de banco
de dados com páginas ASP.
318
Capítulo 5 – Conectando Páginas ASP com Bancos de Dados
Começamos com uma revisão do Modelo Relacional de banco de dados, onde vimos conceitos
como Entidades, Atributos, Chave Primária, relacionamentos e Normalização. Em seguida
fizemos uma rápida revisão da linguagem SQL que, conforme descrito anteriormente, é de
fundamental importância em se tratando de banco de dados.
Na seqüência, vimos as tecnologias para acesso a fontes de dados; conceitos como ODBC, OLE
DB e ADO e a maneira como os mesmos se relacionam. Também aprendemos a criar uma fonte
ODBC para um banco de dados do Microsoft Access e do Microsoft SQL Server 2000.
Depois estudamos o Modelo de Objetos do ADO, onde vimos em detalhes o objeto Connection.
Nos exemplos de aplicação vimos como conectar uma página ASP para exibir uma listagem a
partir de uma tabela de um banco de dados do Microsoft Access. Também aprendemos alguns
detalhes sobre o objeto Recordset, que será melhor detalhado no próximo capítulo.
Para finalizar o capítulo foi apresentado um exemplo no qual o usuário digita um critério e
é efetuada uma pesquisa em uma tabela do banco de dados, com base no critério digitado
pelo usuário.
319
Capítulo 6 – Bancos de Dados com ASP – Conceitos Avançados Parte I
Capítulo 6
Bancos de Dados com ASP –
Conceitos Avançados Parte I
321
Criando Sites Dinâmicos com ASP 3.0
Introdução
Neste capítulo veremos uma série de conceitos avançados sobre a conexão de páginas ASP
com bancos de dados.
Aprenderemos mais detalhes sobre conexões com fontes de dados, inclusive como conectar,
sem a utilização de ODBC, somente através da utilização do objeto Connection e de sua
propriedade ConnectionString.
Também aprenderemos a interagir com fontes de dados, não somente através de consultas.
Aprenderemos a inserir, alterar e excluir dados que não sejam mais necessários. Neste item
continuaremos utilizando, intensamente, as propriedades, métodos e coleções do objeto Recordset.
Veremos como construir instruções SQL que utilizam funções para gerar campos calculados,
os quais não existem nas tabelas dos banco de dados. Por exemplo, utilizaremos a função
Year para criar um campo que retorna apenas o ano de um campo data. Depois utilizaremos
este campo para filtrar os resultados obtidos.
Com os assuntos tratados neste capítulo, teremos estudado diversos aspectos do Modelo de
Objetos ADO. Mas de maneira alguma teremos esgotado o assunto, uma vez que o mesmo é
bastante extenso. Nos demais capítulos do livro continuaremos a aprender um pouco mais
sobre ADO, além de outros assuntos, como gerenciamento de sessões e aplicações, utilização
de componentes ASP do servidor, segurança e tratamento de erros dentre outros.
322
Capítulo 6 – Bancos de Dados com ASP – Conceitos Avançados Parte I
OLE DB
OLE DB Providers
Conforme ilustrado nesta figura, é possível o acesso a fontes de dados sem a utilização de
ODBC. Este é um ponto de confusão entre muitos programadores iniciantes em ASP. Em
diversas conversas com colegas que estavam iniciando o estudo de ASP, surgiu esta dúvida:
“É possível conectar com uma fonte de dados, como por exemplo um banco de dados do
Microsoft Access, sem a utilização de um driver ODBC?”
A resposta é sim; é perfeitamente possível. Para isto basta criar um objeto Connection e
configurar corretamente a sua propriedade ConnectionString.
323
Criando Sites Dinâmicos com ASP 3.0
São informações necessárias para que a página ASP possa estabelecer a conexão com a fonte
de dados, utilizando o OLE DB Provider correto. Pode até ser que seja utilizado o OLE DB
Provider para ODBC, mas isto não é obrigatório.
A Propriedade ConnectionString
Esta propriedade deve ser configurada de maneira diferente, de acordo com a fonte de dados
que estiver sendo utilizada. Por exemplo, a configuração para acessar um banco de dados do
Microsoft Access é diferente da configuração para acessar um banco de dados do Microsoft
SQL Server ou do Oracle. Vamos estudar como configurar esta propriedade para acessar
algumas das principais fontes de dados: Microsoft Access, Microsoft SQL Server e Oracle.
onde argumento pode ser a informação sobre o provedor, o nome do usuário, etc. Apenas a
título de exemplo, listamos a seguir a propriedade ConnectionString do exemplo da Listagem
5.2, do capítulo anterior:
Provider=MSDASQL.1;Data Source=nwind;Extended Properties=“DSN=nwind;DBQ=C:\MEUS
DOCUMENTOS\NWIND.MDB;DriverId=281;FIL=MS Access;MaxBufferSize=2048;PageTimeout=5;”
Tabela 6.1 Definindo a propriedade ConnectionString para uma fonte do Microsoft Access.
Propriedade Descrição
Provider Deve ser especificado o OLE DB Provider para o Microsoft
Access. Para esta propriedade utilizamos o seguinte valor:
Microsoft.Jet.OLEDB.4.0.
324
Capítulo 6 – Bancos de Dados com ASP – Conceitos Avançados Parte I
Propriedade Descrição
Data Source Informamos o caminho para o arquivo .mdb. Por exemplo,
C:\Arquivos de programas\office\nwind.mdb.
User ID Especifica o nome do usuário com a qual a conexão será
estabelecida. Caso esta propriedade não seja informada, a
mesma será definida como “admin”, o qual é o usuário padrão.
Password Informa a senha para o usuário que fará a conexão. Caso não esta
propriedade não seja informada, a mesma será definida como “ ”.
IMPORTANTE
Por padrão, o OLE DB Provider para Microsoft Access (também chamado de Jet OLE DB Provider),
abre o banco de dados com permissão de leitura e escrita, isto é, os dados também podem ser
modificados. Para alterar o modo de abertura, para, por exemplo, somente escrita, devemos utilizar
a propriedade Mode, do objeto Connection.
Abaixo temos um exemplo de uma conexão com um banco de dados, utilizando a propriedade
ConnectionString:
1 Set conn=Server.CreateObject(“ADODB.Connection”)
conn.Open “PROVIDER=MICROSOFT.JET.OLEDB.4.0;DATA SOURCE=c:\meus documentos\
nwind.mdb”
Primeiro criamos um objeto do tipo Connection. Depois utilizamos o método Open, para
abrir esta conexão. Observe que após o método Open é passada uma String de conexão com
o parâmetro para o método Open. Este parâmetro é a propriedade ConnectionString.
Poderíamos obter o mesmo resultado de uma maneira diferente: primeiro vamos definir a
propriedade ConnectionString, depois simplesmente chamamos o método Open. Ao chamar
o método Open, o mesmo verifica se a propriedade ConnectionString já está definida e utiliza
a mesma. Nosso exemplo ficaria assim:
1 Set conn=Server.CreateObject(“ADODB.Connection”)
2 conn.ConnectionString = “PROVIDER=MICROSOFT.JET.OLEDB.4.0;DATA SOURCE=c:\meus
documentos\nwind.mdb”
3 conn.Open
325
Criando Sites Dinâmicos com ASP 3.0
OBSERVAÇÃO
Utilizamos os números de linha apenas para referência. Quando criamos nossas páginas ASP
não devemos utilizar números de linhas.
NOTA
A linha 2 aparece “quebrada” em duas linhas por questões de espaço para exibição, mas a
mesma deve ser digitada em uma única linha.
No exemplo a seguir, temos um caso onde foi fornecido o nome do usuário e a senha para
conexão:
1 Set conn=Server.CreateObject(“ADODB.Connection”)
2 conn.ConnectionString = “PROVIDER=MICROSOFT.JET.OLEDB.4.0;DATA SOURCE=c:\meus
documentos\nwind.mdb; User ID=jsilva;Password=senha12”
3 conn.Open
Para maiores detalhes sobre segurança de bancos de dados do Microsoft Access, consulte a
documentação do próprio Access.
Tabela 6.2 Definindo a propriedade ConnectionString para uma fonte do Microsoft Access.
Propriedade Descrição
Provider Deve ser especificado o OLE DB Provider para
o Microsoft SQL Server. Para esta propriedade
utilizamos o seguinte valor: SQLOLEDB.
Data Source ou Server Informamos o nome do servidor SQL.
Initial Catalog ou Database Nome do banco de dados a ser utilizado. Em
um servidor SQL, podem existir vários bancos
de dados.
User ID ou uid Especifica o nome do usuário com o qual a
conexão será estabelecida.
326
Capítulo 6 – Bancos de Dados com ASP – Conceitos Avançados Parte I
Propriedade Descrição
Password ou pwd Informa a senha para o usuário que fará a
conexão. Caso esta propriedade não seja
informada, a mesma será definida como “ ”.
Na Listagem 6.1, temos um exemplo de uma conexão com um banco de dados do Microsoft
SQL Server, utilizando a propriedade ConnectionString:
Listagem 6.1 – Conectando com um banco de dados do Microsoft SQL Server 2000 –
nwind_sql.asp.
1 <%@ Language=VBScript %>
2 <HTML>
3 <HEAD>
4 <TITLE>Conectando com o SQL Server 2000</TITLE>
5 </HEAD>
6 <BODY>
7 <H1>
8 <FONT color=navy>Pedidos da Empresa ABC Ltda.</FONT>
9 </H1>
10 <%
11 ‘O primeiro passo é criar a conexão com o banco de dados
12 ‘Para isto crio um objeto do tipo Connection
13 ‘Cria um objeto do tipo ADODB.Connection
14 Set conn=Server.CreateObject(“ADODB.Connection”)
17 conn.ConnectionString = “PROVIDER=SQLOLEDB;
Data Source=SERVIDOR\SERVIDOR;Initial Catalog=Northwind;
User ID=sa;Password=senha123"
18 conn.Open
327
Criando Sites Dinâmicos com ASP 3.0
34 %>
35 <P>
36 <HR>
37 <TABLE bgColor=gray border=1 borderColor=navy cellPadding=1 cellSpacing=1
width=“100%”>
38 <TR>
39 <TD align=middle bgColor=gray>Código</TD>
40 <TD align=middle bgColor=gray>Data</TD>
41 <TD align=middle bgColor=gray>Cidade</TD>
42 <TD align=middle bgColor=gray>País</TD>
43 </TR>
44 <%
328
Capítulo 6 – Bancos de Dados com ASP – Conceitos Avançados Parte I
49 <TR>
50 <TD align=middle bgColor=gray><%=Pedidos.Fields(“OrderID”)%></TD>
51 <TD align=middle bgColor=gray><%=Pedidos.Fields(“OrderDate”)%></TD>
52 <TD align=middle bgColor=gray><%=Pedidos.Fields(“ShipCity”)%></TD>
53 <TD align=middle bgColor=gray><%=Pedidos.Fields(“ShipCountry”)%></TD>
54 </TR>
55 <% Pedidos.MoveNext
56 Loop %>
57 </TABLE>
58 </P>
59 <HR>
60 </BODY>
61 </HTML>
329
Criando Sites Dinâmicos com ASP 3.0
Tabela 6.3 Parâmetros para a String de conexão com o servidor SQL Server.
Este formato é uma novidade do Microsoft SQL Server 2000. O valor antes da barra (\) é o
nome do servidor e o valor depois da barra é o nome da “instância” do SQL Server a ser
utilizada (neste exemplo é igual ao nome do servidor, mas poderia ser diferente). Com o
Microsoft SQL Server 2000, posso ter várias instâncias do servidor SQL, isto é como se eu
tivesse vários servidores SQL Server 2000 diferentes no mesmo equipamento, sendo que
cada um deles deve possuir um nome diferente. Assim poderíamos ter o seguinte exemplo:
330
Capítulo 6 – Bancos de Dados com ASP – Conceitos Avançados Parte I
SERVIDOR\SERVIDOR
SERVIDOR\PRODUCAO
SERVIDOR\ESPECIAL
Neste caso temos três “instâncias” do servidor SQL Server 2000 no computador de nome
SERVIDOR. As três instâncias são:
SERVIDOR
PRODUCAO
ESPECIAL
Quando vou definir a String de conexão, preciso definir a qual instância quero conectar a
página ASP.
Se você estiver utilizando o Microsoft SQL Server 7.0, basta fornecer o nome do servidor.
Neste caso definiríamos a propriedade ConnectionString da seguinte maneira:
“PROVIDER=SQLOLEDB;
Data Source=SERVIDOR;
Initial Catalog=Northwind;
User ID=sa;Password=senha123”
➥ Observe que estamos conectando com o banco de dados Northwind. Dentro deste
banco de dados, a nossa instrução SQL acessa dados da tabela Orders, conforme
indicado pelo seguinte fragmento de código:
20 inst_sql=“SELECT Orders.OrderID, Orders.OrderDate, Orders.ShipCity,
Orders.ShipCountry FROM Orders ORDER BY Orders.OrderDate”
Com esta instrução são retornados os campos OrderID, OrderDate, ShipCity e ShipCountry.
Além disso a listagem obtida é classificada pelo campo OrderDate, conforme pode ser
confirmado pelos resultados exibidos na Figura 6.2.
Propriedade Descrição
Provider Deve ser especificado o OLE DB Provider para o ORACLE. Para
esta propriedade utilizamos o seguinte valor: MSDAORA.
Data Source Informamos o nome do servidor ORACLE.
331
Criando Sites Dinâmicos com ASP 3.0
Propriedade Descrição
User ID Especifica o nome do usuário com o qual a conexão será
estabelecida.
Password Informa a senha para o usuário que fará a conexão.
Abaixo temos um exemplo de uma conexão com um banco de dados, utilizando a propriedade
ConnectionString:
1 Set conn=Server.CreateObject(“ADODB.Connection”)
2 conn.Open “Provider=MSDAORA;Data Source=SERVIDOR;User ID=admin; Password=admin123”
Primeiro criamos um objeto do tipo Connection. Depois utilizamos o método Open, para
abrir esta conexão. Observe que após o método Open é passada uma String de conexão como
parâmetro para o método Open. Este parâmetro é a propriedade ConnectionString.
Poderíamos obter o mesmo resultado de uma maneira diferente: primeiro vamos definir a
propriedade ConnectionString, depois simplesmente chamamos o método Open. Ao chamar
o método Open, o mesmo verifica se a propriedade ConnectionString já está definida e a
utiliza. Nosso exemplo ficaria assim:
1 Set conn=Server.CreateObject(“ADODB.Connection”)
2 conn.ConnectionString = “Provider=MSDAORA;Data Source=SERVIDOR;
User ID=admin; Password=admin123”
3 conn.Open
OBSERVAÇÕES
Utilizamos os números de linha apenas para referência. Quando criamos nossas páginas ASP
não devemos utilizar números de linhas.
NOTA
A linha 2 aparece “quebrada” em duas linhas por questões de espaço para exibição, mas a
mesma deve ser digitada em uma única linha.
IMPORTANTE
Para maiores detalhes sobre o ORACLE, consulte a documentação do produto.
332
Capítulo 6 – Bancos de Dados com ASP – Conceitos Avançados Parte I
Microsoft Access, Microsoft SQL Server e ORACLE são os casos mais comuns de conexões de
páginas ASP com fontes de dados. Porém, conforme descrito no Capítulo 5, através de OLE
DB podemos estabelecer conexões com qualquer fonte de dados para a qual esteja disponível
um OLE DB Provider, inclusive fontes de dados não estruturadas no formato de bancos de
dados relacionais. Como exemplos de fontes que não possuem o tradicional formato dos
bancos de dados relacionais, poderíamos citar os arquivos de mensagens de correio eletrônico
do Microsoft Exchange ou do Lotus Notes, um catálogo de indexação do Microsoft Index
Server ou, até mesmo, uma fonte de dados residente em um Mainframe.
O Método Close
O método Close é utilizado para fechar/encerrar uma conexão e quaisquer outros objetos que
sejam dependentes da conexão. Por exemplo, se criamos um objeto RecordSet que obteve
dados a partir da conexão que está sendo encerrada, o objeto RecordSet também será encerrado.
A sintaxe deste método é bastante simples. Vamos supor que tenhamos criado uma conexão
chamada Clientes; para encerrá-la, poderíamos utilizar o seguinte código:
<% Clientes.Close %>
333
Criando Sites Dinâmicos com ASP 3.0
la. No exemplo abaixo, fechamos o objeto Clientes e depois voltamos a abri-lo, utilizando o
método Open.
<% Clientes.Close
Clientes.Open
%>
Neste caso poderíamos voltar a utilizar o objeto Clientes. Para remover um objeto, em definitivo,
da memória, devemos definir o seu valor como “Nothing”, conforme indicado no exemplo:
<% Set Clientes = Nothing %>
Feito isso, somente poderemos voltar a utilizar o objeto se o mesmo for novamente criado,
utilizando o seguinte código:
Set Clientes = Server.CreateObject(“ADODB.Connection”)
Observe que, pelo fato de Clientes ser um objeto (do tipo Connection) e não simplesmente uma
variável, devemos utilizar o operador Set. Se tentarmos criar ou remover um objeto, sem a
utilização do operador Set, obteremos uma mensagem de erro e a página não será exibida.
“Pool” de Conexões
Quando um usuário fecha uma conexão, através da utilização do método Close, conforme
descrito anteriormente, esta conexão é mantida na memória e adicionada a um “Pool” de
conexões inativas. Da próxima vez que o mesmo usuário, ou qualquer outro, for abrir uma
nova conexão, o OLE DB primeiro verifica se, no Pool de conexões inativas, existe uma conexão
exatamente igual ao que o usuário está solicitando. Se for encontrada, a mesma será utilizada,
caso contrário uma nova conexão será criada e enviada para o usuário que solicitou.
O OLE DB mantém um Pool de conexões porque o processo de criar uma conexão é o que
mais exige recursos do servidor Web. Sempre que uma conexão puder ser reaproveitada, a
partir do Pool de conexões, estaremos economizando recursos do servidor.
334
Capítulo 6 – Bancos de Dados com ASP – Conceitos Avançados Parte I
O Objeto RecordSet
Nos exemplos que foram apresentados até aqui, já utilizamos o RecordSet. Agora chegou o
momento de fazer um estudo mais aprofundado deste objeto.
Estaremos selecionando todos os registros da tabela Pedidos, os quais poderão ser acessados
através de um objeto do tipo RecordSet.
Existem detalhes importantes que devemos conhecer a respeito do acesso aos dados. Devemos
considerar questões como:
➥ O acesso deve ser somente para leitura dos dados ou devem ser permitidas alterações
e inserções de novos dados?
➥ Como tratar questões sobre o acesso simultâneo aos dados? Por exemplo, como tratar a
situação em que dois usuários tentam alterar o mesmo registro, ao mesmo tempo?
Estas são questões importantes e devem ser consideradas sempre que formos disponibilizar
acesso aos dados da nossa empresa, para usuários da Internet. Também precisamos conhecer
o que são Cursores, quais os tipos disponíveis e para que utilizamos. Vamos estudar estes
pontos neste tópico.
Neste exemplo estamos criando um RecordSet chamado Pedidos. Uma vez criado o RecordSet,
o próximo passo é utilizarmos o método Open. Este método possui a seguinte sintaxe:
recordset.Open Source, ActiveConnection, CursorType, LockType, Options
Considere o exemplo:
Pedidos.Open inst_sql, conn, 3, 3
Os parâmetros a serem passados para o método Open estão descritos na Tabela 6.5.
335
Criando Sites Dinâmicos com ASP 3.0
Parâmetro Descrição
Source Pode ser o nome de um objeto Command; uma instrução
SQL ou o nome de uma variável que contém uma
instrução SQL; o nome de uma tabela ou de um Store
Procedure do banco de dados; ou até uma URL que
aponta para uma fonte de dados.
ActiveConnection O nome da conexão a ser utilizada ou a String de conexão
para uma fonte de dados ODBC ou OLE DB. É opcional.
CursorType É um valor que determina o tipo de cursor que será
utilizado pelo provedor de dados na abertura do
RecordSet. É opcional. Falaremos mais sobre tipos de
cursores ainda neste item.
LockType É um valor que determina o tipo de Lock que será utilizado
pelo provedor de dados na abertura do RecordSet. É opcional.
Falaremos mais sobre tipos de Lock ainda neste item.
Options Um valor do tipo Long, o qual define como o provedor de
dados deve avaliar o argumento Source, quando o mesmo
for algo diferente de um objeto Command, ou quando o
RecordSet deve ser recuperado a partir de um arquivo
salvo previamente.
Cursores
Um Cursor é o mecanismo utilizado em ADO para gerenciar o conjunto de registros de um
objeto RecordSet. Somente podemos ter acesso a um registro chamado de Registro Corrente.
Quando utilizamos o método Open, por padrão, o primeiro registro é o Registro Corrente.
Um Cursor também é utilizado para determinar qual o Registro Corrente, bem como para
movimentar o indicador de registro entre os diversos registros do objeto RecordSet. O
mecanismo que identifica qual é o Registro Corrente é chamado de “Record pointer”. Quem
lida com a manipulação do Record pointer é o Cursor. Por isso quando utilizamos os métodos
MoveNext (mover para o próximo registro), MovePrevious (mover para o registro anterior) ou
qualquer outro método de movimentação, estamos utilizando o Cursor.
O mecanismo do Cursor também gerencia situações em que tentamos avançar além do último
registro ou voltar além do primeiro registro, ou quando acessamos o valor de um campo de
336
Capítulo 6 – Bancos de Dados com ASP – Conceitos Avançados Parte I
um registro. De uma maneira simples, podemos afirmar que grande parte da funcionalidade
de um objeto RecordSet é fornecida pelo mecanismo do Cursor.
Valor/Constante Tipo/Descrição
3 Define um Cursor do tipo Static. Um Cursor deste tipo
adOpenStatic contém uma cópia estática dos registros. O conteúdo
do RecordSet é definido no momento da criação do
mesmo. Caso sejam feitas alterações no banco de dados,
estas alterações não serão visíveis para o RecordSet que
utiliza um Cursor do tipo Static. Somente recriando o
RecordSet é que poderemos ter acesso às alterações
efetuadas. Podemos movimentar o ponteiro de registro
em ambas as direções, isto é, podemos utilizar os
métodos MoveNext, MovePrevious e assim por diante.
0 Cria um Cursor do tipo Forward Only. Este é o valor
adOpenForwardOnly padrão que será utilizado caso não seja definido nenhum
outro tipo. Somente podemos utilizar o método MoveNext.
Se tentarmos utilizar um outro método de movimentação,
será gerado um erro e a página não será carregada. Também
é um Cursor do tipo Static, com a diferença que somente
podemos nos movimentar para a frente.
2 Cria um Cursor do tipo Dynamic. Um Cursor deste tipo
adOpenDynamic não possui um conjunto fixo de registros. Quaisquer
alterações, adições e exclusões feitas por outros usuários
serão visíveis para o objeto RecordSet, sem que o
mesmo tenha que ser eliminado e recriado. Podemos nos
movimentar em ambas as direções dentro do RecordSet.
1 Cria um Cursor do tipo Keyset. Um Cursor deste tipo
adOpenKeyset é parecido com um Cursor Dynamic, com a exceção de
que o conjunto de registros é fixo. O RecordSet
enxerga as alterações feitas por outros usuários, porém
a adição de novos registros não é visível para um
337
Criando Sites Dinâmicos com ASP 3.0
Valor/Constante Tipo/Descrição
RecordSet deste tipo. Caso algum registro seja
eliminado por outros usuários, o respectivo registro
estará inacessível. podemos nos movimentar em
ambas as direções dentro do RecordSet.
O tipo de Cursor a ser utilizado depende da aplicação que estamos desenvolvendo. Por
exemplo, se estamos desenvolvendo uma página ASP apenas para exibir um conjunto de
registros, podemos utilizar um cursor do tipo Static. Cursores mais simples, como o do
tipo Static, consomem menos recursos. Cursores mais sofisticados, como o do tipo
Dynamic, consomem mais recursos computacionais. Estes recursos podem ser consumidos
na estação do cliente ou no servidor Web, dependendo da localização do Cursor. Veremos
como definir a localização do Cursor através da utilização da propriedade CursorLocation,
no próximo item.
Este exemplo cria um RecordSet chamado Clientes e define um cursor do tipo Static:
<%
inst_sql=“Select * from Clientes”
Set Clientes = Server.CreateObject(“ADODB.Recordset”)
Clientes.Open inst_sql, conn, 3, 3
%>
O próximo exemplo cria um RecordSet chamado Clientes e define um Cursor do tipo Keyset.
<%
inst_sql=“Select * from Clientes”
Set Clientes = Server.CreateObject(“ADODB.Recordset”)
Clientes.Open inst_sql, conn, 1, 3
%>
338
Capítulo 6 – Bancos de Dados com ASP – Conceitos Avançados Parte I
Localização do Cursor
O Cursor pode estar localizado no servidor Web ou no cliente que está acessando os dados.
Algumas fontes de dados, como o Microsoft SQL Server, podem oferecer serviços de Cursor
no servidor. O Microsoft Access não oferece serviços de Cursor e, com isso, o mesmo fica
localizado no cliente. Quando acessamos fontes de dados, utilizando OLE DB, podemos utilizar
o serviço de Cursor oferecido pelo próprio OLE DB. A opção padrão, caso não seja definido
nada em contrário, é que o Cursor esteja no servidor.
Para definir a localização do cursor, devemos utilizar a propriedade CursorLocation, do objeto
RecordSet. Definimos esta propriedade antes da utilização do método Open deste objeto. A
Tabela 6.7 descreve os valores possíveis para esta propriedade.
Valor/Constante Tipo/Descrição
3 Utiliza serviços de Cursor no cliente.
adUseClient
1 Não utiliza serviços de Cursor. Somente é mantido por
adUseNone questões de compatibilidade com as versões anteriores.
2 Utiliza serviços de Cursor do servidor ou do provedor
adUseServer OLE DB.
339
Criando Sites Dinâmicos com ASP 3.0
IMPORTANTE
A propriedade CursorLocation deve ser definida antes da utilização do método Open. Se
tentarmos definir a propriedade CursorLocation, com o RecordSet aberto, obteremos a seguinte
mensagem de erro:
Tipo de erro:
ADODB.Recordset (0x800A0E79)
Operation is not allowed when the object is open.
/Capitulo6/pubs_sql.asp, line 40
A mensagem indica que a operação (definir a localização do Cursor) não é permitida quando
o objeto está aberto.
Quando uma aplicação Web é desenvolvida, a localização dos Cursores deve ser discutida na
fase de projeto, sempre procurando propiciar o melhor desempenho possível para a aplicação.
Em uma mesma aplicação posso ter páginas que utilizam o Cursor no servidor e outras que
utilizam o Cursor no cliente, depende apenas da natureza de cada página.
340
Capítulo 6 – Bancos de Dados com ASP – Conceitos Avançados Parte I
Lembrando que não é necessário definir o Cursor no servidor, pois essa é a definição padrão,
ou seja, se não for definida, explicitamente, a propriedade CursorLocation assume o valor
adUseServer.
Lock de Registros
Os bancos de dados utilizam o Lock de registros como uma maneira de garantir a integridade
dos dados. Com a utilização do Lock garantimos que um mesmo registro não esteja sendo
alterado, simultaneamente, por mais do que um usuário. Quando um usuário acessa um registro
para fazer alguma alteração, o mesmo é bloqueado, de tal forma que outros usuários não possam
ter acesso a ele. O acesso ao registro somente será liberado após as alterações terem sido salvas
no banco de dados. O tipo de Lock é definido pela propriedade LockType do objeto RecordSet.
Existem diferentes maneiras de se fazer o Lock dos registros, conforme descrito na Tabela 6.8.
Valor/Constante Tipo/Descrição
1 Cria um Lock do tipo Read Only. É o tipo padrão de
adLockReadOnly Lock. O RecordSet é somente leitura, isto é, os registros
não podem ser modificados, logo não precisam ser
bloqueados. Com isso tem um processamento mais
rápido, porém perde-se a capacidade de fazer alterações
nos registros.
2 Cria um Lock do tipo Pessimistic. O provedor OLE DB
adLockPessimistic tenta bloquear o registro no momento em que o mesmo
começa a ser editado. Isso é feito para tentar garantir
que o registro será editado com sucesso.
341
Criando Sites Dinâmicos com ASP 3.0
Valor/Constante Tipo/Descrição
3 Cria um Lock do tipo Optimistic. O registro não é
adLockOptimistic bloqueado enquanto as alterações não forem salvas
no banco de dados através da utilização do método
Update do RecordSet.
4 Cria um Lock do tipo Batch Optimistic. Este tipo de
adLockBatchOptimistic Lock permite que vários registros sejam modificados.
Os registros somente serão bloqueados quando for
chamado o método UpdateBatch do objeto RecordSet.
-1 Não define o tipo de Lock. Quando utilizamos o método
adLockUnspecified Clone, para criar uma cópia do RecordSet, o Clone
será criado com o mesmo tipo de Lock do RecordSet
original.
Um registro bloqueado não pode nem sequer ser visualizado pelos usuários, evitando-se que
seja exibido um registro que está sendo alterado.
Para definir o tipo de Lock, utilizamos a propriedade LockType, conforme indicado no exemplo
a seguir, onde definimos o tipo de Lock como Optimistic:
<%
inst_sql=“Select * from Clientes”
Set Clientes = Server.CreateObject(“ADODB.Recordset”)
Clientes.LockType = 3
Clientes.Open inst_sql, conn, 3, 3
%>
IMPORTANTE
A propriedade LockType deve ser definida antes da utilização do método Open. Ao tentarmos
definir a propriedade CursorLocation, com o RecordSet aberto, obteremos a seguinte
mensagem de erro:
342
Capítulo 6 – Bancos de Dados com ASP – Conceitos Avançados Parte I
Tipo de erro:
ADODB.Recordset (0x800A0E79)
Operation is not allowed when the object is open.
/Capitulo6/pubs_sql.asp, line 40
A mensagem indica que a operação (definir a localização do Cursor) não é permitida quando
o objeto está aberto.
Agora que já discutimos um pouco sobre Cursores, localização do Cursor e Lock de registros,
podemos partir para o estudo de mais alguns detalhes do objeto RecordSet.
Propriedade Descrição
AbsolutePage Retorna a página do Registro Corrente. Página é um
conceito de armazenamento de banco de dados.
AbsolutePosition Indica a posição do Registro Corrente, dentro do
RecordSet.
343
Criando Sites Dinâmicos com ASP 3.0
Propriedade Descrição
ActiveCommand Retorna o objeto Command utilizado para criar o
RecordSet, caso tenha sido utilizado um objeto
Command. Esta propriedade é somente leitura.
BOF Esta propriedade torna-se verdadeira quando
estivermos no primeiro registro e utilizarmos o método
MovePrevious, ou seja, indica uma tentativa de
voltarmos além do primeiro registro. É somente leitura.
Bookmark Retorna um marcador (bookmark) que identifica de
maneira única cada registro do RecordSet. Também
pode ser utilizado para tornar o registro identificado
pelo Bookmark como o Registro Corrente. Nem todas as
fontes de dados e seus respectivos OLE DB Providers
oferecem esta propriedade.
CacheSize Indica o número de registros do RecordSet que devem
ser mantidos no Cache local de memória. Também pode
ser utilizada para definir este número de registros.
CursorLocation Pode ser utilizada para definir ou retornar a posição do
Cursor.
CursorType Indica o tipo de Cursor utilizado em um objeto
RecordSet. Também pode ser utilizada para definir o
tipo de Cursor. Deve ser utilizada antes do método
Open, caso contrário irá provocar um erro quando a
página for carregada.
EditMode Retorna um valor que indica o status de edição do
registro atual. Este valor pode ser: 0 – indica que não
existe edição em andamento; 1– indica que os dados
do registro atual foram modificados, porém ainda não
foram salvos; 2 – indica que o método AddNew foi
chamado e o registro que está sendo criado, ainda não
foi salvo no banco de dados; 4 – indica que o registro
atual foi deletado. É somente leitura.
EOF Esta propriedade torna-se verdadeira quando
estivermos no último registro e utilizarmos o método
MoveNext, ou seja, indica uma tentativa de avançarmos
além do último registro. É somente leitura.
344
Capítulo 6 – Bancos de Dados com ASP – Conceitos Avançados Parte I
Propriedade Descrição
Filter Pode ser utilizada para filtrar os registros de um
RecordSet de acordo com um critério definido.
Falaremos sobre esta propriedade mais adiante.
Também serão mostrados alguns exemplos práticos.
LockType Indica o tipo de Lock que está sendo utilizado. Também
pode ser utilizada para definir o tipo de Lock, antes que
o método Open tenha sido utilizado.
MaxRecords Define o número máximo de registros que uma consulta
deve retornar para o objeto RecordSet. O valor padrão é
zero, o que significa sem limite de registros.
PageCount Indica quantas páginas de dados o objeto RecordSet
contém. É somente leitura.
PageSize Indica o número de registros por página.
RecordCount Indica o número de registros do objeto RecordSet. É
somente leitura.
Sort Especifica um ou mais campos para ordenação do
RecordSet, além do tipo de ordenação se ascendente
ou descendente. Para utilizarmos esta propriedade
devemos utilizar o Cursor no cliente.
Source Indica as fontes dos dados de um objeto RecordSet.
Por exemplo, exibe a instrução SQL que deu origem
aos dados ou o nome da tabela ou consulta que
originou os dados do objeto RecordSet.
State Indica o estado do objeto RecordSet. Indica se o mesmo
está aberto, fechado ou executando uma operação de
maneira assíncrona. É somente leitura.
345
Criando Sites Dinâmicos com ASP 3.0
Método Descrição
AddNew Utilizado para adicionar um novo registro em um
RecordSet que seja atualizável.
Cancel Cancela a execução de uma operação Open assíncrona.
CancelBatch Cancela uma operação de atualização em Batch.
CancelUpdate Cancela qualquer alteração feita no Registro Corrente,
ou alterações feitas em um novo registro antes da
chamada do método Update.
Clone Cria uma cópia do objeto RecordSet.
Close Fecha o objeto RecordSet e todos os objetos dele
dependentes.
Delete Elimina o registro corrente ou um grupo de registros
selecionados.
Find Pesquisa no RecordSet por um registro que atende um
critério especificado.
GetRows Retorna registros de um RecordSet e os armazena em
um array.
GetString Retorna todo o RecordSet como uma String.
Move Movimenta o indicador de registro a partir de uma
posição especificada de um determinado número de
registros. Por exemplo, posso movimentar o indicador
dez registros a partir do registro 10, com isso o
indicador fica no registro 20.
MoveFirst Movimenta o indicador para o primeiro registro.
MoveLast Movimenta o indicador para o último registro.
MoveNext Movimenta o indicador para o próximo registro.
MovePrevious Movimenta o indicador para o registro anterior.
Open Abre o objeto RecordSet.
Requery Atualiza o conjunto de registros do RecordSet,
executando novamente a consulta que deu origem ao
RecordSet.
346
Capítulo 6 – Bancos de Dados com ASP – Conceitos Avançados Parte I
Método Descrição
Resync Atualiza os dados do RecordSet, buscando os dados a
partir do banco de dados.
Save Salva o conteúdo do RecordSet em um arquivo.
Update Salva quaisquer alterações que tenham sido feitas para
o objeto RecordSet.
Agora vamos aprender a executar algumas operações bastante comuns em aplicações Web.
Aprenderemos a inserir, excluir e alterar um determinado registro.
Podemos utilizar este exemplo para criar um formulário de cadastro de usuários ou qualquer
outra aplicação que necessite armazenar os dados digitados em um formulário.
NOTA
Eu, por exemplo, utilizo uma aplicação deste tipo para fazer a avaliação dos treinamentos que
ministro em todo o país. Ao final do treinamento, os usuários, sem se identificar, preenchem
um formulário com as opiniões sobre o treinamento, o material e o desempenho do instrutor.
Estes dados são armazenados diretamente em um banco de dados do Microsoft Access, a
partir do qual faço uma série de estatísticas.
Na Listagem 6.2 temos o código HTML para a criação do formulário de cadastro, no qual o
usuário poderá digitar os dados.
347
Criando Sites Dinâmicos com ASP 3.0
6 <P>
7 <FONT color=white size=6 style=“BACKGROUND-COLOR: navy”>
8 <B>Empresa ABC Ltda. - (0-xx-11-1111-2222)</B>
9 </FONT>
10 </P>
11 <P>
12 <FONT color=#ffffff size=5 style=“BACKGROUND-COLOR: darkred”>
13 <B><EM>CADASTRO DE NOVOS CLIENTES:</EM></B>
14 </FONT>
15 </P>
16 <P>
17 <FONT color=navy size=4>
18 <EM>Digite os dados solicitados e clique no botão Enviar.</EM>
19 </FONT>
20 </P>
21 <P>
24 <TR>
25 <TD>Nome:</TD>
26 <TD><INPUT id=nome maxLength=50 name=nome size=35>
27 <FONT color=red><B>(*)</B></FONT></TD>
28 </TR>
29 <TR>
30 <TD>Rua:</TD>
31 <TD><INPUT id=rua maxLength=30 name=rua size=35>
32 <FONT color=red><B>(*)</B></FONT></TD>
33 </TR>
348
Capítulo 6 – Bancos de Dados com ASP – Conceitos Avançados Parte I
34 <TR>
35 <TD>Bairro:</TD>
36 <TD><INPUT id=bairro maxLength=20 name=bairro>
37 <FONT color=red><B>(*)</B></FONT></TD>
38 </TR>
39 <TR>
40 <TD>Cidade:</TD>
41 <TD><INPUT id=cidade maxLength=25 name=cidade size=25>
42 <FONT color=red><B>(*)</B></FONT></TD>
43 </TR>
44 <TR>
45 <TD>CEP:</TD>
46 <TD><INPUT id=cep maxLength=10 name=cep size=10>
47 <FONT color=red><FONT color=#000000>nnnnn-nnn
48 </FONT><B>(*)</B></FONT></TD>
49 </TR>
50 <TR>
52 <TD>Fone:</TD>
53 <TD><INPUT id=fone maxLength=20 name=fone></TD>
54 </TR>
55 <TR>
56 <TD>Fax:</TD>
57 <TD><INPUT id=fax maxLength=20 name=fax></TD></TR>
58 <TR>
59 <TD>Cartão:</TD>
60 <TD>
61 <INPUT id=cartaotipo name=cartaotipo type=radio value=Visa>Visa
62 <INPUT id=cartaotipo name=cartaotipo type=radio value=Master_Card>Master
Card
63 <INPUT id=cartaotipo name=cartaotipo type=radio value=Outros>Outros
64 <FONT color=red><B>(*)</B></FONT>
65 </TD>
66 </TR>
67 <TR>
68 <TD colSpan=2>
349
Criando Sites Dinâmicos com ASP 3.0
73 </TABLE>
74 </FORM>
75 </P><BR>
76 <FONT color=red><B>(*)
77 <FONT color=navy>Campos de preenchimento obrigatório.</FONT></B></FONT>
78 </BODY>
79 </HTML>
350
Capítulo 6 – Bancos de Dados com ASP – Conceitos Avançados Parte I
Agora precisamos construir a página – cadastro.asp, a qual irá verificar se todos os campos de
preenchimento obrigatório foram preenchidos. Se todos os campos obrigatórios foram
preenchidos, os dados serão gravados em um banco de dados, caso contrário o formulário é
enviado para o usuário, solicitando que o mesmo preencha os campos que estão faltando.
Para acessar este banco de dados utilizaremos OLE DB, sem a necessidade da criação de uma
fonte ODBC. Faremos isto através da utilização da propriedade ConnectionString, já descrita
neste capítulo.
351
Criando Sites Dinâmicos com ASP 3.0
mantendo os campos que já haviam sido preenchidos, para que o usuário possa
preencher somente os campos que estão faltando.
7 <%
8 ‘O primeiro passo é criar a conexão com o banco de dados
9 ‘Para isto crio um objeto do tipo Connection
10 ‘Cria um objeto do tipo ADODB.Connection
11 Set conn=Server.CreateObject(“ADODB.Connection”)
14 conn.ConnectionString = “PROVIDER=MICROSOFT.JET.OLEDB.4.0;
DATA SOURCE=c:\meus documentos\clientes.mdb”
15 conn.Open
22 ‘**************************************************
23 ‘ Inicia a verificação para saber se todos
24 ‘ os campos obrigatórios foram preenchidos.
‘**************************************************
352
Capítulo 6 – Bancos de Dados com ASP – Conceitos Avançados Parte I
26 nome=Request.Form(“nome”)
27 rua =Request.Form(“rua”)
28 bairro=Request.Form(“bairro”)
29 cidade=Request.Form(“cidade”)
30 cep=Request.Form(“cep”)
31 cartao=Request.Form(“cartaotipo”)
32 ‘Verifica se os campos obrigatório foram preenchidos.
33 ‘Qualquer dado obrigatório que não tenha sido preenchido,
34 ‘definirá a variável faltou_dado em Sim.
35 If (nome=“”)Then
36 mensagem_nome=“Preencha o campo Nome:”
37 faltou_dado=“Sim”
38 faltou_nome=“Sim”
39 End If
40 If (rua=“”)Then
41 mensagem_rua=“Preencha o campo Rua:”
42 faltou_dado=“Sim”
43 faltou_rua=“Sim”
44 End If
45 If (bairro=“”)Then
46 mensagem_bairro=“Preencha o campo Bairro:”
47 faltou_dado=“Sim”
48 faltou_bairro=“Sim”
49 End If
50 If (cidade=“”)Then
51 mensagem_cidade=“Preencha o campo Cidade:”
52 faltou_dado=“Sim”
53 faltou_cidade=“Sim”
54 End If
55 If (cep=“”)Then
56 mensagem_cep=“Preencha o campo CEP:”
57 faltou_dado=“Sim”
58 faltou_cep=“Sim”
353
Criando Sites Dinâmicos com ASP 3.0
59 End If
60 If (cartao=“”)Then
61 mensagem_cartao=“Preencha o campo Cartão:”
62 faltou_dado=“Sim”
63 faltou_cartao=“Sim”
64 End If
68 If faltou_dado<>“Sim” Then
69 Cadastro.AddNew
70 Cadastro.Fields(“Nome”)= Request.Form(“nome”)
71 Cadastro.Fields(“Rua”)= Request.Form(“rua”)
72 Cadastro.Fields(“Bairro”)= Request.Form(“bairro”)
73 Cadastro.Fields(“Cidade”)= Request.Form(“cidade”)
74 Cadastro.Fields(“Cep”)= Request.Form(“cep”)
75 Cadastro.Fields(“Fone”)= Request.Form(“fone”)
76 Cadastro.Fields(“Fax”)= Request.Form(“fax”)
77 Cadastro.Fields(“Cartao”)= Request.Form(“cartaotipo”)
78 Cadastro.Update
79 Cadastro.Close
80 Set Cadastro = Nothing
354
Capítulo 6 – Bancos de Dados com ASP – Conceitos Avançados Parte I
98 If faltou_nome=“Sim” Then
99 Response.Write “<B>O campo Nome deve ser preenchido.</B> <BR>”
100 End If
101 If faltou_rua=“Sim” Then
102 Response.Write “<B>O campo Rua deve ser preenchido.</B> <BR>”
103 End If
116 %>
117 <%
118 ‘Começo a reenviar o formulário para o usuário, utilizando Response.Write.
122 %>
355
Criando Sites Dinâmicos com ASP 3.0
356
Capítulo 6 – Bancos de Dados com ASP – Conceitos Avançados Parte I
357
Criando Sites Dinâmicos com ASP 3.0
NOTA
Algumas linhas aparecem divididas em duas ou mais linhas. Nunca é demais lembrar que
estas linhas devem ser digitadas como uma linha única. As mesmas estão exibidas em duas ou
mais linhas apenas por questão de espaço.
358
Capítulo 6 – Bancos de Dados com ASP – Conceitos Avançados Parte I
Neste código, utilizamos o método AddNew do objeto RecordSet Cadastro. Depois vamos
preenchendo cada novo campo do registro, com o respectivo valor preenchido pelo usuário
no formulário. No final, utilizamos o método Update para salvar o registro na tabela.
O método Close é utilizado para fechar o RecordSet Cadastro e, por fim, tiramos o objeto
Cadastro da memória. Isto é feito atribuindo-se o valor “Nothing” para o objeto Cadastro. É
importante lembrar que para atribuir valor para um objeto, devemos utilizar o operador Set,
caso contrário obteremos uma mensagem de erro.
➥ Também gostaria de observar a situação em que o usuário deixa de preencher algum
campo obrigatório. Neste caso, o usuário é informado a respeito de qual ou quais cam-
pos não foram preenchidos. O formulário é retornado para o usuário, juntamente com
os valores já digitados, para que o usuário não precise redigitar todos os valores
novamente. Observe que todo o código HTML que gera o formulário é retornado
utilizando-se Response.Write – da linha 124 à linha 189.
➥ Vamos testar o funcionamento da página cadastro.asp.
Na Figura 6.5, o usuário preencheu alguns campos, porém não preencheu os campos
obrigatórios Bairro e Rua.
Ao clicar no botão Enviar dados, a página cadastro.asp detecta que alguns campos obrigatórios
não foram preenchidos e informa isto ao usuário, conforme indicado na Figura 6.6.
359
Criando Sites Dinâmicos com ASP 3.0
Figura 6.6: O usuário é informado que alguns campos obrigatórios não foram preenchidos.
Agora o usuário preenche os campos obrigatórios que estão faltando, conforme indicado na
Figura 6.7.
360
Capítulo 6 – Bancos de Dados com ASP – Conceitos Avançados Parte I
NOTA
Existem maneiras mais simples para executar este procedimento. Optei pela utilização de três
páginas, para que os passos envolvidos ficassem bem claros. O código ASP também foi
desenvolvido de uma maneira didática, visando facilitar o entendimento do mesmo.
361
Criando Sites Dinâmicos com ASP 3.0
Listagem 6.4 – A página ASP para selecionar o produto a ser alterado – produto.asp.
1 <%@ Language=VBScript %>
2 <HTML>
3 <HEAD>
4 <TITLE>Selecione o produto a ser alterado.</TITLE>
5 </HEAD>
6 <BODY>
7 <%
11 Set conn=Server.CreateObject(“ADODB.Connection”)
14 conn.ConnectionString = “PROVIDER=MICROSOFT.JET.OLEDB.4.0;
DATA SOURCE=c:\meus documentos\nwind.mdb”
15 conn.Open
23 %>
362
Capítulo 6 – Bancos de Dados com ASP – Conceitos Avançados Parte I
28 <%
37 %>
38 </SELECT>
39 <BR>
40 <BR>
41 <HR>
43 </FORM>
44 </BODY>
45 </HTML>
Para esta listagem vamos comentar apenas o código ASP que constrói a lista com os nomes de
produtos disponíveis.
Lembrando da nossa revisão de HTML, o código para construir uma Caixa de combinação é
o seguinte:
<SELECT id=select1 name=Item1>
<OPTION value=Item1>Item1</OPTION>
<OPTION value=Item2>Item2</OPTION>
363
Criando Sites Dinâmicos com ASP 3.0
<OPTION value=Item3>Item3</OPTION>
</SELECT>
Neste exemplo temos uma lista com três itens. Para cada produto encontrado devemos criar
um item da lista, o que é feito com as tags <OPTION> </OPTION>. Por exemplo, para o
produto “Alice Mutton”, teríamos que criar a seguinte opção:
<OPTION value=Alice Mutton>Alice Mutton</OPTION>
A primeira vez que aparece o nome – value=Alice Mutton – é a designação do nome associado
com cada opção. Na segunda vez que aparece o nome, é a definição do texto que será exibido
na lista. Para construir esta lista dinamicamente, utilizamos o seguinte código ASP:
33 Do While Not Produtos.EOF
34 Response.Write “<OPTION value=” & Chr(34) & Produtos.Fields(“ProductName”) &
Chr(34) & “>” & Produtos.Fields(“ProductName”)& “</OPTION>”
35 Produtos.MoveNext
36 Loop
IMPORTANTE
Observe que utilizamos Chr(34) antes e depois de Produtos.Fields(“ProductName”), na definição
do atributo value, conforme indicado a seguir: Chr(34) & Produtos.Fields(“ProductName”) & Chr(34)
Isto é feito para tratar o caso de nomes de produtos que tem espaço em branco no nome. Se
não utilizássemos as aspas (Chr(34)), somente o primeiro nome do produto seria utilizado.
Por exemplo, um produto chá mate, seria truncado em chá. Com isso, na hora de pesquisar o
nome do produto, não iríamos encontrá-lo na tabela Produtos.
Nesta página o usuário seleciona o produto a ser alterado, conforme indicado na Figura 6.10,
onde o usuário selecionou o produto Camembert Pierrot. Após selecionar o produto, o usuário
clica no botão Localizar Produto. Ao fazer isso, é chamada a página localiza.asp, que irá
carregar o registro correspondente ao produto selecionado.
364
Capítulo 6 – Bancos de Dados com ASP – Conceitos Avançados Parte I
365
Criando Sites Dinâmicos com ASP 3.0
6 <BODY>
7 <%
8 ‘O primeiro passo é criar a conexão com o banco de dados.
9 ‘Para isto crio um objeto do tipo Connection.
10 ‘Cria um objeto do tipo ADODB.Connection
11 Set conn=Server.CreateObject(“ADODB.Connection”)
14 conn.ConnectionString = “PROVIDER=MICROSOFT.JET.OLEDB.4.0;
DATA SOURCE=c:\meus documentos\nwind.mdb”
15 conn.Open
366
Capítulo 6 – Bancos de Dados com ASP – Conceitos Avançados Parte I
28 <%
32 %>
33 <TABLE>
34 <%
367
Criando Sites Dinâmicos com ASP 3.0
NOTA
Algumas linhas aparecem divididas em duas ou mais linhas. Nunca é demais lembrar que as
mesmas devem ser digitadas como uma linha única; apenas estão exibidas, em duas ou mais
linhas, por questão de espaço.
Esta é uma instrução SQL, que utiliza a cláusula WHERE para pesquisar apenas o registro
cujo nome do produto foi selecionado na lista de produtos. Vamos supor que o usuário tenha
selecionado o produto Geitost. A instrução SQL para localizar o registro para este produto,
deve ser a seguinte:
Select * from Produtos WHERE Produtos.ProductName=‘Geitost’
Observe no código da linha 20 que colocamos o apóstrofe logo após o sinal de igual (=), depois
utilizamos Request.Form(“listaprodutos”), para capturar o valor do produto que o usuário
selecionou na lista de produtos e, finalmente, anexamos o apóstrofe final (“ ’ ”). Com isso o código
ASP monta a instrução SQL correta, seja qual for o produto selecionado na lista de produtos.
Um detalhe importante a ser observado é que o critério, quando for um campo de texto, deve vir
entre os sinais de apóstrofe. Já para um campo do tipo data, o critério deve vir entre os sinais #.
368
Capítulo 6 – Bancos de Dados com ASP – Conceitos Avançados Parte I
Uma vez montada a instrução SQL corretamente, a mesma é passada como parâmetro para o
método Open do RecordSet Produtos. Com isso, apenas o registro para o produto selecionado,
será retornado pelo banco de dados.
➥ Após termos recuperado o registro para o produto selecionado, passamos a montar um
formulário, onde são exibidos os diversos campos do produto selecionado. Observe
que utilizamos uma tabela para facilitar o posicionamento e o alinhamento dos cam-
pos. Cada uma das linhas da tabela, possui duas colunas: uma onde vai a descrição do
campo e outra que exibe o campo propriamente dito. No exemplo abaixo, é montada a
primeira linha da tabela, onde é exibido o campo ProductID:
35 Response.Write “<TR><TD>Código:</TD><TD><INPUT id=ProductID maxLength=10
name=ProductID size=10 value=“ & Chr(34)& Produtos.Fields(“ProductID”) &
Chr(34)& “></TD></TR>”
Uma linha semelhante é utilizada para todos os demais campos do produto selecionado.
➥ Na Figura 6.11, o usuário selecionou o produto Queso Cabrales.
Ao clicar no botão “Localizar Produto”, será chamada a página localiza.asp, a qual localiza o
registro do produto selecionado e exibe o mesmo em um formulário, para que o usuário
possa alterar os campos que forem necessários, conforme indicado na Figura 6.12.
369
Criando Sites Dinâmicos com ASP 3.0
Listagem 6.6 – Página ASP que atualiza os dados no banco de dados – atualiza.asp.
1 <%@ Language=VBScript %>
2 <HTML>
3 <HEAD>
4 </HEAD>
5 <TITLE>Dados atualizados com sucesso.</TITLE>
6 <BODY>
7 <%
8 ‘O primeiro passo é criar a conexão com o banco de dados.
370
Capítulo 6 – Bancos de Dados com ASP – Conceitos Avançados Parte I
371
Criando Sites Dinâmicos com ASP 3.0
27 Produtos.Fields(“UnitPrice”)= Request.Form(“UnitPrice”)
28 Produtos.Fields(“UnitsInStock”)= Request.Form(“UnitsInStock”)
29 Produtos.Fields(“UnitsOnOrder”)= Request.Form(“UnitsOnOrder”)
30 Produtos.Fields(“ReorderLevel”)= Request.Form(“ReorderLevel”)
31 Produtos.Fields(“Discontinued”)= Cbool(Request.Form(“Discontinued”))
32 ‘Atualizo o registro, utilizando o método Update.
33 Produtos.Update
Cada campo do registro recebe o valor contido no campo respectivo do formulário da Figura
6.12. Depois utilizamos o método Update para atualizar o registro. No momento que chamamos
o método Update é que as atualizações são gravadas no banco de dados.
Ao clicarmos no botão Localizar Produto, é carregada a página localiza.asp, a qual nos exibe
os campos do produto Ravioli Angelo, conforme indicado na Figura 6.14.
Nesta página vamos alterar o valor do campo Preço Unit. Vamos alterar de 19,52 para 25,34,
conforme indicado na Figura 6.15.
372
Capítulo 6 – Bancos de Dados com ASP – Conceitos Avançados Parte I
Ao clicar no botão Atualizar Produto, é chamada a página atualiza.asp, que faz as atualizações
no banco de dados, exibe uma mensagem de que estas atualizações foram feitas com sucesso
373
Criando Sites Dinâmicos com ASP 3.0
e apresenta um link para que o usuário possa voltar para a página produto.asp para selecionar
um outro produto a ser atualizado, conforme indicado na Figura 6.16.
Na Figura 6.17, abrimos a tabela Produtos do banco de dados C:\meus documentos\ nwind.mdb,
na qual podemos comprovar que o preço unitário para o produto Ravioli Angelo foi realmente
alterado para 25,34.
IMPORTANTE
Veja que através da utilização de ASP podemos construir aplicações Web com as mesmas
funcionalidades de banco de dados existentes em aplicações tradicionais. Podemos inserir, pesquisar
e alterar registros. No próximo item aprenderemos a eliminar registros, utilizando ASP.
374
Capítulo 6 – Bancos de Dados com ASP – Conceitos Avançados Parte I
7 <%
375
Criando Sites Dinâmicos com ASP 3.0
NOTA
Algumas linhas aparecem divididas em duas ou mais linhas. Nunca é demais lembrar que
estas devem ser digitadas como uma linha única. As mesmas estão exibidas em duas ou mais
linhas apenas por questão de espaço.
376
Capítulo 6 – Bancos de Dados com ASP – Conceitos Avançados Parte I
24 Response.Write “existe mais do que um <BR> produto com este nome: </B>”
25 Response.Write Request.Form(“ProductName”)
26 Else
27 Produtos.Delete
28 Response.Write “PRODUTO: ”
29 Response.Write Request.Form(“ProductName”)
30 Response.Write “ foi excluído da tabela de Produtos. <BR>”
31 End If
Neste código utilizamos o método RecordCount para verificar se não foi encontrado nenhum
produto (RecordCount = 1) ou foi encontrado mais do que um produto (RecordCount>1).
Nestas duas situações informamos que o produto não existe ou existe mais do que um produto
com o nome selecionado. Em ambos os casos não podemos utilizar o método Delete.
Caso tenha sido encontrado somente um registro (RecordCount = 1), utilizamos o método
Delete do objeto Produtos, para eliminar o registro encontrado.
Neste exemplo, utilizamos o método Delete sem nenhum parâmetro, o que faz com que seja
eliminado somente o registro atual. Podemos passar um parâmetro para o método Delete, o
qual altera o comportamento do mesmo. Para isso utilizaríamos a seguinte sintaxe:
RecordSet.Delete parâmetro
Na Tabela 6.11, descrevemos os valores mais utilizados para o parâmetro do método Delete.
Valor Descrição
1 Elimina o registro atual, isto é, o registro no qual está o
indicador de registros.
2 Elimina somente os registros selecionados através da
utilização da propriedade Filter do objeto RecordSet. A
propriedade Filter já deve ter sido definida anteriormente.
3 Elimina todos os registros do objeto RecordSet.
377
Criando Sites Dinâmicos com ASP 3.0
Ao clicarmos no botão Localizar Produto, é carregada a página localiza.asp, a qual nos exibe
os campos do produto Filo Mix, conforme indicado na Figura 6.19.
378
Capítulo 6 – Bancos de Dados com ASP – Conceitos Avançados Parte I
Os dados do produto Filo Mix são exibidos para que o usuário confira se este realmente é o
produto a ser excluído no banco de dados. Para excluir o produto selecionado é só clicar no
botão Excluir Produto.
Ao clicar no botão Excluir Produto, é chamada a página exclui.asp, que exclui o produto
selecionado, e exibe uma mensagem de que a exclusão foi realizada com sucesso e apresenta
um link para que o usuário possa voltar para a página produto.asp para selecionar um outro
produto a ser excluído, conforme indicado na Figura 6.20.
Na Figura 6.21, abrimos a tabela Produtos do banco de dados C:\meus documentos\ nwind.mdb,
na qual podemos comprovar que o produto Filo Mix foi realmente excluído.
379
Criando Sites Dinâmicos com ASP 3.0
IMPORTANTE
Veja que através da utilização de ASP podemos construir aplicações Web com as mesmas
funcionalidades de banco de dados existentes em aplicações tradicionais. Podemos inserir,
pesquisar, alterar e excluir registros.
A configuração da propriedade Filter apenas faz com que seja limitada a visibilidade do
RecordSet. Podemos redefinir a propriedade Filter, de tal maneira que todos os registros voltem
a estar disponíveis.
Na Listagem 6.8, criamos uma página que acessa a tabela Orders, do banco de dados
nwind.mdb. São recuperados os campos OrderID, OrderDate, ShipCity e ShipCountry. Depois
utilizamos a propriedade Filter, para exibir somente os pedidos para o ano de 1994.
6 <BODY>
7 <%
11 Set conn=Server.CreateObject(“ADODB.Connection”)
380
Capítulo 6 – Bancos de Dados com ASP – Conceitos Avançados Parte I
24 %>
28 <HR>
29 </P>
30 <%
34 Pedidos.Filter = “AnoPedido=1994”
36 %>
381
Criando Sites Dinâmicos com ASP 3.0
37 <%
38 <TABLE>
39 <TR>
40 <TD>Código</TD>
41 <TD>Data</TD>
42 <TD>Cidade</TD>
43 <TD>País</TD>
44 <TD>Ano</TD>
45 </TR>
46 <%
47 Pedidos.MoveFirst
49 <TR>
50 <TD><% =Pedidos.Fields(“OrderID”) %></TD>
51 <TD><% =Pedidos.Fields(“OrderDate”) %></TD>
52 <TD><% =Pedidos.Fields(“ShipCity”) %></TD>
53 <TD><% =Pedidos.Fields(“ShipCountry”)%></TD>
54 <TD><% =Pedidos.Fields(“AnoPedido”) %></TD>
55 </TR>
56 <%
57 Pedidos.MoveNext
58 Loop
59 %>
60 </TABLE>
61 </BODY>
62 </HTML>
382
Capítulo 6 – Bancos de Dados com ASP – Conceitos Avançados Parte I
Observe que na instrução SQL, utilizamos a função Year(NomeDoCampo), para criar um campo
chamado AnoPedido, o qual contém apenas o ano da data do Pedido. Esta construção mostra o
poder e a simplicidade da linguagem SQL, motivo pelo qual foi colocado anteriormente sobre a
importância de aprendermos a utilizar com eficiência a linguagem SQL.
➥ Agora vamos observar a utilização da propriedade Filter, no seguinte fragmento de código:
34 Pedidos.Filter = “AnoPedido=1994”
Com este comando estamos restringindo os registros de tal forma que somente sejam exibidos
os registros cujo campo AnoPedido seja igual a 1994.
Para salientar a flexibilidade desta propriedade, vamos considerar um outro exemplo. Vamos
supor que seja necessário exibir apenas os pedidos para o ano de 1994 e cujo país de destino
fosse o Brazil (com “z” porque no banco de dados Nwind está com “z”). Para obter este resultado,
bastaria definir a propriedade Filter da seguinte maneira:
Pedidos.Filter = “AnoPedido=1994 And ShipCountry=“Brazil’”
383
Criando Sites Dinâmicos com ASP 3.0
Vamos refinar um pouco mais. Vamos fazer com que sejam exibidos apenas os registros para
o ano de 1994 e para Brazil ou Germany (Alemanha).
Pedidos.Filter = “(AnoPedido=1994 And ShipCountry=‘Brazil’) OR (AnoPedido=1994 And
ShipCountry=‘Germany’)”
Este comando deve ser digitado em uma única linha, além disso os espaços devem ser
rigorosamente respeitados. Após fechar parênteses, apenas um espaço, após o OR mais um
espaço e assim por diante. Na Figura 6.24 temos o resultado desta pesquisa, na qual são
exibidos apenas os pedidos para o Brazil e para a Germany, no ano de 1994.
Observe que, com a correta utilização da propriedade Filter, podemos obter resultados
interessantes. Voltaremos a utilizar esta propriedade em outros exemplos deste livro.
Para eliminar qualquer filtro aplicado e voltar a disponibilizar todos os registros, basta utilizar
os seguinte comando:
Pedidos.Filter = “ ”
384
Capítulo 6 – Bancos de Dados com ASP – Conceitos Avançados Parte I
Também podemos utilizar o operador Like para fazer uma pesquisa por padrões. Por exemplo,
vamos supor que queremos filtrar apenas os registros cujo campo NomeCliente inicie com a
letra J. Poderíamos utilizar o seguinte comando:
Pedidos.Filter = “NomeCliente Like ‘J%’ ”
Neste caso o % funciona como um caractere curinga, isto é, a primeira letra do nome deve ser
J e o que vem depois não importa. Neste caso seriam retornados registros tais como:
➥ José da Silva
➥ Juvenal Pereira
➥ Júlio Battisti
Conclusão
No início do capítulo aprendemos a estabelecer conexões com banco de dados, sem utilizar
ODBC. Fizemos isto, definimos a propriedade ConnectionString do objeto Connection,
385
Criando Sites Dinâmicos com ASP 3.0
acessando as fontes de dados utilizando o provedor OLE DB para cada fonte. Foram
apresentados exemplos para o Microsoft Access, Microsoft SQL Server e ORACLE.
Aprendemos a criar páginas ASP que fazem operações bastante comuns em aplicações Web,
tais como:
➥ Pesquisar registros em um banco de dados.
➥ Alterar registros.
➥ Eliminar registros.
➥ Fazer a validação dos dados digitados em um formulário.
➥ Filtrar os registros retornados por um objeto RecordSet.
386
Capítulo 7 – Bancos de Dados com ASP – Conceitos Avançados Parte II
Capítulo 7
Bancos de Dados com ASP –
Conceitos Avançados Parte II
387
Criando Sites Dinâmicos com ASP 3.0
Neste capítulo serão apresentados mais alguns tópicos sobre o acesso a banco de dados.
Iniciaremos por um estudo do objeto Command, o qual pode ser utilizado para retornar um
conjunto de registros em um objeto RecordSet e para efetuar operações que envolvem diversos
registros – como, por exemplo, atualizar o campo PreçoUnitário em todos os registros da
tabela Produtos. O objeto Command também pode ser utilizado para passar parâmetros para
uma Consulta Parametrizada.
Veremos exemplos de acesso a banco de dados com a utilização dos métodos e propriedades
do objeto Command. Serão apresentadas tabelas com a descrição dos principais métodos e
propriedades deste objeto. A utilização do objeto Command é especialmente indicada para
situações onde temos que passar parâmetros para Consultas Parametrizadas ou para Stored
Procedures. Através da utilização do objeto Command e de seus métodos, propriedades e
coleções, podemos criar os diversos parâmetros necessários, passá-los para o banco de dados
e, até mesmo, receber valores de retorno de Stored Procedures em parâmetros definidos para
o objeto Command.
Também serão apresentadas tabelas com a descrição dos principais métodos e propriedades
dos diversos objetos estudados.
Como exemplo de aplicação, no final do capítulo, criaremos um formulário que permite que
o próprio usuário defina a pesquisa a ser realizada. No formulário, o usuário poderá fazer
pesquisa na tabela Orders do banco de dados Nwind. O usuário poderá decidir se deseja
fazer a pesquisa por País de destino, País de destino e Cidade, por Ano da Data do Pedido ou
388
Capítulo 7 – Bancos de Dados com ASP – Conceitos Avançados Parte II
Mês da Data do Pedido. Também utilizaremos o modelo de eventos do Internet Explorer para
ativar ou desativar campos à medida em que o usuário seleciona opções no formulário.
Neste capítulo, estaremos utilizando como exemplo o banco de dados nwind.mdb do Microsoft
Access. Existem pequenas diferenças na linguagem SQL do Microsoft Access e do Microsoft
SQL Server. Para maiores detalhes sobre a criação de instruções com o Microsoft SQL Server,
consulte a documentação do produto.
O Objeto Command
Utilizamos o objeto Command para definir um determinado “comando” que deverá ser
executado em um fonte da dados, como um banco de dados do Microsoft Access ou do
Microsoft SQL Server. O objeto Command é especialmente indicado para a execução de
comandos que necessitem de parâmetros, com por exemplo, Stored Procedures de um banco
de dados do Microsoft SQL Server, ou Consultas Parametrizadas do Microsoft Access.
NOTA
Uma Consulta Parametrizada é um tipo especial de consulta, a qual espera receber um ou
mais valores (os parâmetros). Os valores recebidos são utilizados, normalmente, como critérios
de pesquisa, de tal forma que somente serão retornados os registros que atenderem os critérios
especificados. Por exemplo, poderíamos ter um parâmetro no campo ShipCountry da tabela
Orders do banco de dados nwind.mdb. Se passarmos para este parâmetro o valor Germany,
serão retornados apenas os registros em que o campo ShipCountry for igual a Germany.
IMPORTANTE
Nunca é demais lembrar que, para criar um objeto, devemos utilizar o operador Set, caso
contrário obteremos um erro quando a página for carregada.
Para iniciarmos o estudo do objeto Command, vamos analisar o exemplo da Listagem 7.1.
389
Criando Sites Dinâmicos com ASP 3.0
6 <BODY>
7 <%
11 Set conn=Server.CreateObject(“ADODB.Connection”)
14 conn.ConnectionString = “PROVIDER=MICROSOFT.JET.OLEDB.4.0;
DATA SOURCE=c:\meus documentos\nwind.mdb”
15 conn.Open
390
Capítulo 7 – Bancos de Dados com ASP – Conceitos Avançados Parte II
27 %>
28 <HR>
29 <TABLE>
30 <TR>
31 <TD>Código</TD>
32 <TD>Data </TD>
33 </TR>
34
35 <%
36 Do Until Ped.EOF
37 %>
38 <TR>
39 <TD><%=Ped.Fields(“OrderID”) %> </TD>
40 <TD><%=Ped.Fields(“OrderDate”)%> </TD>
41 </TR>
42 <%
43 Ped.MoveNext
44 Loop
45 %>
46 </TABLE>
47 <HR>
48 </BODY>
49 </HTML>
Primeiro criamos um objeto do tipo Command, conforme indicado pelo seguinte comando:
18 Set com_orders = Server.CreateObject(“ADODB.Command”)
391
Criando Sites Dinâmicos com ASP 3.0
Em seguida definimos a conexão com a qual o objeto com_orders está associado. Para isto
definimos a propriedade ActiveConnection, conforme indicado no seguinte comando:
20 com_orders.ActiveConnection = conn
A partir de agora, os comandos executados pelo objeto Command serão executados na conexão
conn, que está ligada ao banco de dados nwind.mdb.
O último passo é utilizar o método Execute do objeto com_orders. Ao utilizarmos este método,
é executada a instrução contida na propriedade CommandText. O resultado é retornado para
o objeto RecordSet especificado no comando, conforme indicado abaixo:
26 Set Ped=com_orders.Execute
392
Capítulo 7 – Bancos de Dados com ASP – Conceitos Avançados Parte II
Neste caso após a execução do método Execute, os registros retornados estarão armazenados
no objeto Ped, o qual é um objeto do tipo RecordSet.
Veja que o que fizemos foi, simplesmente, utilizar um objeto Command e as propriedades
CommandText, ActiveConnection e o método Execute, para criar um objeto RecordSet com
todos os registros da tabela Orders.
Você pode estar questionando: “Por que todos esses passos, se podemos simplesmente utilizar
o método Open do objeto RecordSet, como já fizemos nos capítulos anteriores?”.
Agora que já fizemos um estudo preliminar do objeto Command, vamos apresentar as demais
propriedades e métodos deste objeto.
Método Descrição
Cancel Cancela a execução do método Execute caso a mesma
ainda esteja pendente.
CreateParameter Cria um novo objeto do tipo Parameter. Pode ser
utilizado, por exemplo, para passar parâmetros para
Consultas Parametrizadas do Microsoft Access.
Execute Executa uma pesquisa, instrução SQL ou Stored
Procedure especificado na propriedade CommandText.
393
Criando Sites Dinâmicos com ASP 3.0
Propriedade Descrição
ActiveConnection Determina a qual conexão o objeto Command estará
ligado, isto é, através de qual conexão os comandos
serão executados.
CommandText Contém o texto do comando que será executado contra
a conexão definida na propriedade ActiveConnection.
CommandTimeout Indica por quanto tempo o comando pode ser
executado. Caso o comando não retorne um resultado
no tempo especificado por esta propriedade, será
gerada uma mensagem de erro e a execução do
comando será suspensa. O tempo é especificado em
segundos e o valor padrão é 30 segundos.
CommandType Indica o tipo de comando que será executado. Na tabela
7.3 temos uma descrição dos tipos de comandos possíveis.
Name Indica o nome do objeto Command.
Parameters Contém todos os objetos do tipo Parameter definidos
para o objeto Command.
Prepared Indica se é para salvar ou não uma versão compilada
do objeto Command após a execução do mesmo. O
armazenamento de versões compiladas melhora o
desempenho do banco de dados. Esta possibilidade
depende do banco de dados que está sendo acessado.
O Microsoft SQL Server 2000 permite que sejam
criadas e armazenadas versões compiladas dos
comandos e Store Procedures executados. Assim, da
próxima vez que o comando for executado, o mesmo
não precisa ser novamente interpretado para gerar a
versão compilada. Em ambientes acessados por um
grande número de usuários, este recurso pode ser de
grande valia para melhorar o desempenho.
Properties Contém todos os objetos do tipo Property definidos
para o objeto Command.
State Indica se o objeto Command está aberto (Open) ou
fechado (Closed). Esta propriedade é somente para leitura.
394
Capítulo 7 – Bancos de Dados com ASP – Conceitos Avançados Parte II
Na Tabela 7.3, temos uma relação dos tipos de comandos possíveis, os quais são definidos
pela propriedade CommandType.
ou
Objeto.CommandType = constante
Observe que podemos utilizar o valor numérico ou uma constante predefinida. Por exemplo,
podemos utilizar o valor 1 ou a constante adCmdText para definir o tipo do comando como
sendo texto.
395
Criando Sites Dinâmicos com ASP 3.0
Existe um grande número de constantes predefinidas para os objetos ADO. Estas constantes
estão localizadas nos seguintes arquivos:
➥ adovbs.inc: Constantes para a linguagem VBScript.
➥ adojavas.inc: Constantes para a linguagem JScript.
Estes arquivos estão localizados, normalmente, em uma das seguintes pastas:
➥ Para o Windows 2000 em Português: Arquivos de programas\Arquivos comuns\System\ADO.
➥ Para o Windows 2000 em Inglês: Program Files\Common Files\system\ado.
Para que possamos utilizar estas constantes, devemos utilizar uma diretiva include para incluir
estes arquivos, ou definir uma referência utilizando a tag a seguir:
<!- -METADATA TYPE=“typelib” uuid=”{00000205-0000-0010-8000-00AA006D2EA4}” – ->
Esta tag deve ser incluída dentro da seção <HEAD></HEAD> de cada página ASP que
utilizará as constantes ou no arquivo global.asa. Ao serem incluídas no arquivo global.asa, as
constantes estarão disponíveis para qualquer página ASP que faça parte da aplicação Web.
NOTA
Voltaremos a falar sobre o arquivo global.asa.
Agora vamos ver alguns exemplos de código para o objeto Command, alguns de seus métodos
e propriedades.
Vamos iniciar criando um objeto Connection e um objeto Command, conforme indicado pelo
trecho a seguir:
‘Criamos um objeto do tipo Connection
Set conn=Server.CreateObject(“ADODB.Connection”)
conn.ConnectionString = “PROVIDER=MICROSOFT.JET.OLEDB.4.0;
DATA SOURCE=c:\meus documentos\nwind.mdb”
conn.Open
‘Agora crio um objeto do tipo Command
Set com_orders = Server.CreateObject(“ADODB.Command”)
396
Capítulo 7 – Bancos de Dados com ASP – Conceitos Avançados Parte II
Uma vez criado o objeto Command, vamos definir qual a conexão que o mesmo utilizará.
Para isso definimos a propriedade ActiveConnection:
com_orders.ActiveConnection = conn
Agora vamos definir o tipo de comando. Para isso utilizaremos a propriedade CommandType:
com_orders.CommandType = 1
Ao invés do valor numérico podemos utilizar a constante equivalente, conforme indicado no exemplo:
com_orders.CommandType = adCmdText
Agora vamos definir o comando que o objeto Command executará. Para isso definimos a
propriedade CommandText:
com_orders.CommandText = “Select * From Orders Order By OrderDate”
Vamos definir o TimeOut em 2 minutos (120 segundos) para a execução deste objeto Command,
utilizando a propriedade CommandTimeout:
com_orders.CommandTimeout= 120
Agora vamos criar um objeto RecordSet e utilizar o método Execute do objeto Command para
retornar registros para o objeto RecordSet:
Set Ped= Server.CreateObject(“ADODB.RecordSet”)
Set Ped=com_orders.Execute
NOTA
Para saber mais sobre a criação de consultas no Microsoft Access, consulte a documentação do
produto ou consulte o livro “Microsoft Access 2000 Curso Básico e Rápido”, da editora Axcel Books.
Na Figura 7.2 temos uma consulta do Microsoft Access. A consulta é baseada na tabela Orders
e foram incluídos os seguintes campos:
➥ OrderID
➥ OrderDate
➥ ShipName
397
Criando Sites Dinâmicos com ASP 3.0
➥ ShipCity
➥ ShipCountry
Ao executarmos esta consulta, no Microsoft Access, são exibidos todos os pedidos, pois nenhum
critério de filtragem foi imposto. Na Figura 7.3, vemos o resultado da execução desta consulta.
398
Capítulo 7 – Bancos de Dados com ASP – Conceitos Avançados Parte II
Podemos definir um critério de filtragem. Por exemplo, queremos que sejam exibidos os pedidos
apenas para a Argentina. Para isso poderíamos especificar um critério para o campo
ShipCountry, conforme indicado na Figura 7.4.
Ao executarmos esta consulta, no Microsfot Access, serão exibidos apenas os pedidos em que
o campo ShipCountry seja igual a Argentina. Na Figura 7.5, vemos o resultado da execução
desta consulta.
399
Criando Sites Dinâmicos com ASP 3.0
Observe que somente foram exibidos os pedidos para a Argentina, o que confirma o correto
funcionamento do critério que foi especificado.
Porém esta maneira de especificar critérios é pouco flexível, pois cada vez que quisermos
alterar o critério, teremos que digitar o novo critério, salvar a consulta e executá-la novamente.
Podemos obter uma maior flexibilidade especificando um parâmetro para a consulta. Depois,
colocamos este parâmetro como critério no campo ShipCountry. Ao especificarmos um
parâmetro como critério para este campo, cada vez que a consulta for executada, o Microsoft
Access nos pergunta o valor do parâmetro. Nós digitamos o valor desejado que passa a servir
como critério de filtragem.
Para definir um parâmetro, selecione o menu Consulta -> Parâmetros. Na janela que surge
digite Pais (sem acento) para o nome do parâmetro e selecione Texto para o tipo do parâmetro,
conforme indicado na Figura 7.6.
Depois basta colocar como critério, no campo ShipCountry, o nome do parâmetro entre
colchetes, conforme indicado na Figura 7.7.
Vamos supor que o usuário digite France e dê um clique em OK. Serão exibidos todos os
pedidos em que o campo ShipCountry seja igual a France, conforme indicado na Figura 7.9.
400
Capítulo 7 – Bancos de Dados com ASP – Conceitos Avançados Parte II
Figura 7.9: Execução da consulta com o valor do parâmetro definido como France.
401
Criando Sites Dinâmicos com ASP 3.0
Utilizando parâmetros, cada vez que a consulta é executada, podemos fornecer um valor
diferente para o parâmetro, valor esse que serve para filtrar os resultados. Podemos definir
parâmetros em mais do que um campo da consulta, com isso, ao executar a consulta, serão
pedidos valores para cada um dos parâmetros definidos.
O nosso objetivo é poder, a partir de uma página ASP, executar uma Consulta Parametrizada
do Microsoft Access. Para isso, precisamos passar, a partir da página ASP, os valores para os
parâmetros definidos na consulta. Isso é possível de ser feito com a utilização do objeto
Parameter e a propriedade Parameters do objeto Command.
NOTA
Esta consulta foi salva com o nome de con_pedidos. Utilizaremos este nome em exemplos mais
adiante. Caso você tenha criado uma consulta com um nome diferente, utilize o nome da
consulta que você criou, nos exemplos deste capítulo.
O Objeto Parameter
O objeto Parameter representa parâmetros associados com Consultas Parametrizadas ou
argumentos de entrada e valores de retorno para Stored Procedures. Com a utilização do
objeto Parameter podemos definir, detalhadamente, os parâmetros que serão enviados para
uma Consulta Parametrizada, ou os argumentos de entrada enviados para um Stored Procedure.
Na Tabela 7.4, temos uma descrição das principais propriedades do objeto Parameter.
Propriedade Descrição
Attributes Indica uma ou mais características do objeto Parameter.
Direction Define se o objeto Parameter representa um parâmetro de
entrada, de saída ou ambos; ou indica se o parâmetro é
um valor de retorno de um Stored Procedure.
Name Contém o nome do objeto Parameter.
NumericScale Indica uma faixa de valores numéricos aceitáveis para o
valor do parâmetro.
402
Capítulo 7 – Bancos de Dados com ASP – Conceitos Avançados Parte II
Propriedade Descrição
Precision Indica a precisão a ser utilizada para valores numéricos.
Size Indica o tamanho máximo do parâmetro, em bytes ou
caracteres.
Type Indica o tipo de dados para o objeto Parameter.
Value Indica o valor associado com o objeto Parameter.
NOTA
Um Stored Procedure é um conjunto de comandos gravados com um nome no banco de dados.
Podemos, por exemplo, criar um Stored Procedure que gera uma listagem com o total de vendas
por mês do ano. Um Stored Procedure pode receber valores como argumentos de entrada. Um
exemplo de argumento de entrada poderia ser o ano para o qual deve ser gerada uma listagem
do total de vendas mensais. Um Stored Procedure também pode retornar valores após a sua
execução. Podemos utilizar o objeto Parameter para enviar argumentos de entrada e também
para receber os valores calculados pelo Stored Procedure.
Para cada parâmetro, que o objeto Command precisa tratar, é criado um objeto Parameter.
Todos os objetos Parameter podem ser acessados através da coleção Parameters do objeto
Command. Para criar um objeto do tipo Parameter, podemos utilizar o método CreateParameter
do objeto Command.
403
Criando Sites Dinâmicos com ASP 3.0
nwind.mdb
command2.asp procurapais.asp
Consulta:
con_pedidos
6 <BODY>
7 <%
11 Set conn=Server.CreateObject(“ADODB.Connection”)
14 conn.ConnectionString = “PROVIDER=MICROSOFT.JET.OLEDB.4.0;
DATA SOURCE=c:\meus documentos\nwind.mdb”
15 conn.Open
404
Capítulo 7 – Bancos de Dados com ASP – Conceitos Avançados Parte II
24 %>
29 <%
38 %>
39 </SELECT>
40 <BR>
41 <HR>
43 </FORM>
44 </BODY>
45 </HTML>
405
Criando Sites Dinâmicos com ASP 3.0
Agora precisamos construir a página procurapais.asp. Esta página receberá o valor selecionado
na lista, passará este valor para o parâmetro Pais da consulta con_pedidos, a qual irá retornar
somente os pedidos para o país selecionado. A página procurapais.asp também exibirá os
resultados obtidos.
7 <%
8 ‘O primeiro passo é criar a conexão com o banco de dados.
9 ‘para isto crio um objeto do tipo Connection.
10 ‘Cria um objeto do tipo ADODB.Connection
11 Set conn=Server.CreateObject(“ADODB.Connection”)
14 conn.ConnectionString = “PROVIDER=MICROSOFT.JET.OLEDB.4.0;
DATA SOURCE=c:\meus documentos\nwind.mdb”
15 conn.Open
406
Capítulo 7 – Bancos de Dados com ASP – Conceitos Avançados Parte II
30 com_paises.ActiveConnection = conn
31 com_paises.CommandType = 4
34 nome_par = “Pais”
38 valor_par= Request.Form(“listapaises”)
45 Set pais_par=com_paises.CreateParameter
(nome_par,tipo_par,dire_par,tama_par,valor_par)
47 com_paises.Parameters.Append pais_par
407
Criando Sites Dinâmicos com ASP 3.0
50 com_paises.CommandText = “con_pedidos”
58 %>
77 %>
408
Capítulo 7 – Bancos de Dados com ASP – Conceitos Avançados Parte II
78 </SELECT>
80 </FORM>
81 <%
84 %>
88 <TABLE border=1>
89 <TR>
90 <TD><B>Código</B></TD>
91 <TD><B>Data</B></TD>
92 <TD><B>Cidade</B></TD>
93 <TD><B>País</B></TD>
94 </TR>
95 <%
96 Do While Not Resultados.EOF
97 %>
98 <TR>
99 <TD><% =Resultados.Fields(“OrderID”) %></TD>
100 <TD><% =Resultados.Fields(“OrderDate”) %></TD>
101 <TD><% =Resultados.Fields(“ShipCity”) %></TD>
102 <TD><I><% =Resultados.Fields(“ShipCountry”) %></I></TD>
103 </TR>
409
Criando Sites Dinâmicos com ASP 3.0
107 </TABLE>
108 <BR>
109 <HR>
110 </BODY>
111 </HTML>
A Listagem 7.3 salienta diversos pontos importantes na utilização do objeto Command para a execução
de Consultas Parametrizadas, através da passagem de parâmetros utilizando o objeto Parameter.
Vamos detalhar alguns trechos desta listagem. Observe o seguinte trecho de código:
29 Set com_paises = Server.CreateObject(“ADODB.Command”)
30 com_paises.ActiveConnection = conn
31 com_paises.CommandType = 4
NOTA
Na Tabela 7.3 estão listados os valores e respectivas constantes para a propriedade
CommandType.
Em seguida começo a definir as características do parâmetro que será criado e passado para a
consulta. Isto é feito com o seguinte trecho de código:
32 ‘Agora começo a definir as características do parâmetro.
34 nome_par = “Pais”
410
Capítulo 7 – Bancos de Dados com ASP – Conceitos Avançados Parte II
38 valor_par= Request.Form(“listapaises”)
Primeiro definimos o nome do parâmetro, que deve ser o mesmo utilizado para a definição
do parâmetro, quando da criação da consulta no Microsoft Access. Neste caso criamos uma
variável chamada nome_par e definimos o seu valor como “Pais”.
Logo em seguida criamos a variável valor_par, a qual irá conter o valor que será passado para
o parâmetro Pais. Este valor é o selecionado na lista de países da página command2.asp,
conforme indicado pelo código abaixo:
38 valor_par= Request.Form(“listapaises”)
Seguindo as definições, criamos uma variável para o tipo do parâmetro – tipo_par. A esta
variável foi atribuído o valor 129. Ao invés do valor 129 poderíamos ter utilizado a constante
adChar, que define o parâmetro como sendo uma String, isto é, do tipo texto. Na Tabela 7.5
temos uma listagem com os principais valores e respectivas constantes que podem ser definidas
para o tipo do parâmetro.
Valor/Constante Descrição
0x2000/adArray Um valor de Flag indicativo de que temos um array
de valores, o qual deve ser combinado com outro
valor indicativo de tipo. Este valor indica um array
de parâmetros de um determinado tipo.
20/adBigInt Indica um inteiro de 8 bytes.
128/adBibary Indica um valor binário.
11/adBoolean Indica um valor boleano, do tipo Verdadeiro ou
Falso, Sim ou Não.
8/sdBSTR Indica uma String de caracteres de terminação nula
(Unicode).
129/adChar Indica um valor de String, isto é, texto.
411
Criando Sites Dinâmicos com ASP 3.0
Valor/Constante Descrição
6/adCurrency Indica um valor do tipo currency, o qual é um
número com quatro casas decimais fixas.
7/adDate Indica um valor do tipo Data.
134/adDBTime Indica um valor de hora, no formato hhmmss.
135/adDBTimeStamp Indica um valor de data/hora no formato
yyyymmddhhmmss
14/adDecimal Indica um valor decimal.
5/adDouble Indica um valor numérico de precisão dupla.
0/adEmpty Não define nenhum valor.
10/adError Indica um código de erro de 32 bits.
72/adGUID Indica um valor do tipo GUID – Globally Unique
Identifier.
3/adInteger Indica um valor inteiro de 4 bytes.
4/adSingle Indica um valor numérico de precisão simples.
Em seguida definimos um tamanho máximo em bytes para o parâmetro, que no nosso exemplo
foi definido para 50, conforme indicado pelo seguinte comando:
42 tama_par = 50 ‘define o tamanho do parâmetro.
Finalmente definimos uma variável para conter o valor de definição para a propriedade
Direction do parâmetro. Este valor foi definido em 1, o que significa um parâmetro de entrada,
isto é, um parâmetro que envia um valor para a consulta do Microsoft Access. Esta definição
está indicada no código a seguir:
43 dire_par = 1 ‘define um parâmetro de entrada.
Ao invés do valor 1, poderíamos ter utilizado a constante adParamInput. Na Tabela 7.6 temos
uma listagem com os valores e respectivas constantes que podem ser definidas para a
propriedade Direction.
Valor/Constante Descrição
1/adParamImput Indica um parâmetro de entrada. É o valor padrão.
2/adParamOutput Indica que o parâmetro é de saída.
412
Capítulo 7 – Bancos de Dados com ASP – Conceitos Avançados Parte II
Valor/Constante Descrição
3/adParamInputOutput Indica que o parâmetro é de entrada e saída.
4/adParamReturnValue Indica que o parâmetro representa um valor de
retorno.
0/adParamUnknown Indica um parâmetro com direção desconhecida.
NOTA
Criamos variáveis para conter estes valores. Depois passaremos estas variáveis para o método
CreateParameter. Ao invés de criarmos as variáveis, poderíamos passar os valores diretamente para
o método CreateParameter. Adotamos este procedimento para facilitar o entendimento do código.
45 Set pais_par=com_paises.CreateParameter
(nome_par,tipo_par,dire_par,tama_par,valor_par)
Onde temos:
➥ Name: O nome do parâmetro.
➥ Type: O tipo do parâmetro. Os principais valores de tipo possíveis estão listados na
Tabela 7.5.
➥ Direction: Definição da direção do parâmetro. Os principais valores de direção possíveis,
estão listados na Tabela 7.6.
➥ Size: Define o tamanho máximo para o parâmetro.
➥ Value: Define o valor do parâmetro. No nosso caso é o valor que será enviado para a
consulta con_pedidos, e que servirá como critério de filtragem para o campo
ShipCountry.
Uma vez criado o parâmetro é hora de adicioná-lo à coleção Parameters do objeto Command.
Para fazer isso, utilizamos o método Append da coleção Parameters, conforme indicado a seguir:
46 ‘Adiciono o parâmetro à coleção Parameters.
47 com_paises.Parameters.Append pais_par
413
Criando Sites Dinâmicos com ASP 3.0
Observe que passamos para o método Append o nome do objeto Parameter a ser adicionado
a coleção Parameters. Utilizando Append, podemos adicionar novos parâmetros.
O passo final é criar um objeto RecordSet utilizando o método Execute do objeto Command.
Isto é feito com o seguinte código:
54 Set Resultados = Server.CreateObject(“ADODB.RecordSet”)
55 Set Resultados = com_paises.Execute
Assim, o valor selecionado na lista de países é passado para a consulta con_pedidos. A consulta
é executada e somente são retornados os registros em que o campo ShipCountry contém o
valor selecionado na lista de países.
Com a utilização do objeto Command e do objeto Parameter foi possível executar uma Consulta
Parametrizada no Microsoft Access, passando o valor do parâmetro para a consulta.
414
Capítulo 7 – Bancos de Dados com ASP – Conceitos Avançados Parte II
Vamos supor que o usuário selecionou “Norway”, na lista de países. Ao clicar no botão Pesquisar
serão exibidos apenas os pedidos para o país selecionado, conforme indicado na Figura 7.12.
Observe que novamente é exibida a lista de países e o país selecionado anteriormente aparece
selecionado na lista. Para pesquisar os pedidos para outro país é só selecionar o país desejado
e clicar no botão Pesquisar. Veja que com isso construímos um formulário de pesquisa bastante
interativo. O usuário seleciona o país desejado e manda pesquisar. Cada vez que o usuário
seleciona um país diferente na lista, e clica no botão Pesquisar, o novo valor selecionado é
passado como parâmetro para a consulta con_pedidos. A consulta é executada e retorna
somente os registros que atendem ao critério passado como parâmetro.
415
Criando Sites Dinâmicos com ASP 3.0
Vamos supor que o usuário selecionou “Brazil”, na lista de países e 1994 na lista Ano. Ao
clicar no botão Pesquisar serão exibidos apenas os pedidos para país e ano selecionados,
conforme indicado na Figura 7.14.
Para fazer uma nova pesquisa, basta selecionar novos critérios e clicar no botão Pesquisar.
416
Capítulo 7 – Bancos de Dados com ASP – Conceitos Avançados Parte II
Em caso de dificuldades na criação da nova versão do nosso exemplo é só entrar em contato pelo
e-mail: juliobattisti@hotmail.com. Mas antes de entrar em contato procure revisar os conceitos já
apresentados até o momento. Praticar é muito importante para conseguir fixá-los.
IMPORTANTE
Estaremos utilizando exemplos que acessam bancos de dados do Microsoft Access. Para o
acesso a outros bancos de dados, podem existir pequenas diferenças, dependendo do OLE DB
Provider para cada caso. Caso você esteja utilizando outro banco de dados, consulte a
documentação do padrão SQL do mesmo.
417
Criando Sites Dinâmicos com ASP 3.0
NOTA
Estamos tomando como base a tabela Customers do banco de dados nwind.mdb.
Esta instrução iria selecionar apenas os registros cujo campo CompanyName iniciasse com La.
IMPORTANTE
Quando utilizamos o Microsoft Access, utilizamos o “*” como caractere coringa; já em ASP
utilizamos o “%”. Outra diferença importante é em relação a critérios de texto. Quando
utilizamos o Microsoft Access, todo critério de texto deve vir entre aspas (“), já no caso de
páginas ASP, todo critério de texto deve vir entre apóstrofes (‘).
418
Capítulo 7 – Bancos de Dados com ASP – Conceitos Avançados Parte II
6 <BODY>
7 <%
8 Set conn=Server.CreateObject(“ADODB.Connection”)
11 conn.ConnectionString = “PROVIDER=MICROSOFT.JET.OLEDB.4.0;
12 DATA SOURCE=c:\meus documentos\nwind.mdb”
13 conn.Open
18 %>
19 <P>
20 <FONT color=navy size=4><B>
21 Relação de Clientes cujo nome começa com La.
22 </B></FONT>
23 </P>
24 <HR>
25 <TABLE>
26 <TR>
27 <TD><B>Código</B></TD>
28 <TD><B>Nome </B></TD>
29 <TD><B>Cidade </B></TD>
30 </TR>
31 <%
419
Criando Sites Dinâmicos com ASP 3.0
32 Do Until Cust.EOF
33 %>
34 <TR>
35 <TD><%=Cust.Fields(“CustomerId”) %> </TD>
36 <TD><%=Cust.Fields(“CompanyName”)%> </TD>
37 <TD><%=Cust.Fields(“City”)%> </TD>
38 </TR>
39 <%
40 Ped.MoveNext
41 Loop
42 %>
43 </TABLE>
44 <HR>
45 </BODY>
46 </HTML>
Ao carregarmos este exemplo no Internet Explorer, obteremos o resultado indicado na Figura 7.15.
Agora vamos supor que você quisesse uma listagem de todos os consumidores que possuem
o texto “La” em qualquer parte do nome, não necessariamente no início. Mais uma vez a
420
Capítulo 7 – Bancos de Dados com ASP – Conceitos Avançados Parte II
utilização do operador Like facilita a nossa vida. Para obter o resultado desejado, bastaria
alterar a instrução SQL da Listagem 7.4. A instrução deve ficar da seguinte maneira:
inst_sql=“Select * from Customers where CompanyName Like ‘%La%’”
Bastou colocar mais um caractere % antes do La. Com isso serão retornados todos os registros que
contiverem La em qualquer parte do campo CompanyName, conforme indicado na Figura 7.16.
Poderíamos começar a refinar mais ainda a nossa consulta. Vamos pesquisar todos os registros
em que o Nome do Cliente (campo CompanyName) possui “La” e o CEP (campo PostalCode)
possui o número 3.
Para obter o resultado desejado, bastaria alterar a instrução SQL da Listagem 7.4. A instrução
deve ficar da seguinte maneira:
inst_sql=“Select * from Customers where CompanyName Like ‘%La%’ and
PostalCode Like ‘%3%’”
Na Figura 7.17 temos a listagem obtida após esta alteração da instrução SQL.
421
Criando Sites Dinâmicos com ASP 3.0
Agora vamos supor que você queira uma listagem somente com os registros em que o campo
CompanyName inicie com uma letra na faixa de A até M, isto é, a primeira letra do nome deve
estar entre A e M. Além disso você deseja que esta listagem seja classificada em ordem ascendente
do campo CompanyName. Para obter este resultado, basta utilizar a instrução SQL a seguir:
inst_sql=“Select * from Customers where CompanyName Like ‘[A-M]%’ Order By CompanyName”
NOTA
Ao invés de digitar a instrução SQL diretamente no código ASP, a mesma pode ser construída
a partir de valores digitados ou selecionados em um formulário. No final do capítulo, criaremos
um formulário genérico para pesquisas, onde o usuário poderá definir por qual ou quais critérios
deseja fazer a pesquisa e selecionar um valor para os critérios. Ao clicar em um botão Pesquisar,
os dados são enviados para uma página ASP, que monta a instrução SQL de acordo com as
opções selecionadas pelo usuário.
Com estes exemplos, podemos comprovar a versatilidade e facilidade de uso do operador Like.
422
Capítulo 7 – Bancos de Dados com ASP – Conceitos Avançados Parte II
O Operador And
Quando utilizamos o operador And para “ligar” dois critérios, somente serão selecionados os
registros que atenderem, ao mesmo tempo, aos dois critérios. Caso o registro somente atenda
a um dos critérios, não será selecionado. Considere o seguinte exemplo:
inst_sql=“Select * from Orders where ShipCountry = ‘France’ and ShipCity = ‘Lyon’ ”
Neste caso somente serão selecionados os registros em que o país for France e a cidade Lyon,
isto é, somente os registros que atenderem aos dois critérios.
Podemos utilizar mais do que um operador And. Com isso podemos especificar três ou mais
critérios. Mas, a regra se mantém: para que um registro seja selecionado, ele precisa atender
423
Criando Sites Dinâmicos com ASP 3.0
a todos os critérios ligados pelos operadores And. Se um único critério falhar, o registro não
será selecionado.
O Operador Or
Quando utilizamos o operador Or para “ligar” dois critérios, somente serão selecionados os
registros que atenderem, pelo menos, a um dos dois critérios. O registro somente não será
selecionado se não atender a nenhum dos dois critérios. Considere o seguinte exemplo:
inst_sql=“Select * from Orders where ShipCountry = ‘France’ Or ShipCity = ‘Lyon’”
Neste caso serão selecionados todos os registros que atenderem a pelo menos um dos critérios,
isto é, se o país for igual a France, o registro será selecionado, independente da cidade. Se a
cidade for igual a Lyon, o registro será selecionado, independente do país. Caso o registro
atenda aos dois critérios também será selecionado. A única situação em que o registro não será
selecionado é quando não atender a nenhum dos dois critérios ligados pelo operador Or.
Podemos utilizar mais do que um operador Or. Com isso podemos especificar três ou mais
critérios. Mas a regra se mantém, para que um registro seja selecionado, ele precisa atender a
pelo menos um dos critérios ligados pelos operadores Or. Somente se todos os critérios falharem
é que o registro não será selecionado.
Observe que quando formos definir um critério para um campo do tipo Data, devemos colocar
o valor entre os sinais de #.
424
Capítulo 7 – Bancos de Dados com ASP – Conceitos Avançados Parte II
Seriam retornados todos os pedidos para o país France, independente do ano. Também seriam
retornados todos os pedidos para o ano de 1994, independente do País. Lembre que para ser
selecionado, basta que o registro atenda um dos critérios ligados pelo Or. Ao colocarmos os
parênteses, estamos forçando que os critérios da data sejam avaliados de uma maneira única.
O resultado desta comparação é que é ligado pelo Or à primeira parte do critério.
Exemplo 3: Vamos fazer uma pesquisa em que sejam exibidos os pedidos para todos os países,
com exceção dos pedidos em que o campo ShipCountry seja igual a France. Podemos utilizar
a seguinte instrução SQL:
inst_sql=“Select * from Orders where ShipCountry <>‘France’”
425
Criando Sites Dinâmicos com ASP 3.0
Neste caso fizemos uso do operador diferente <>. Com isso estamos dizendo que devem ser
selecionados todos os registros em que o campo ShipCountry for diferente de France.
Exemplo 4: Queremos pesquisar por registros que possam apresentar dois ou mais valores
em um determinado campo, como por exemplo, pesquisar todos os pedidos para Brazil, France,
Argentina ou Germany. Poderíamos utilizar vários critérios ligados pelo operador Or, porém
existe uma maneira mais simples de fazer isso, que é através da utilização do operador In,
conforme indicado no exemplo abaixo:
inst_sql=“Select * from Orders where ShipCountry In (‘France’,‘Argentina’, ‘Brazil’,
‘Germany’) Order By ShipCountry”
Com o uso do operador In, podemos definir dois ou mais critérios para um determinado
campo. A lista de critérios vem entre parênteses, cada critério deve ser colocado entre
apóstrofes e separados por vírgula.
Exemplo 5: Vamos “inverter” um pouco o exemplo anterior: criar uma listagem de todos os
pedidos, com exceção dos pedidos enviados para os seguintes países:
➥ Argentina
➥ Brazil
➥ France
➥ Germany
Podemos utilizar a mesma instrução anterior, apenas colocando o operador Not, antes do
operador In, conforme indicado a seguir:
inst_sql=“Select * from Orders where ShipCountry Not In (‘France’,‘Argentina’, ‘Brazil’,
‘Germany’) Order By ShipCountry”
O Not informa que devem ser selecionados todos os registros, com exceção daqueles em que
o campo ShipCountry contiver os valores especificados como parâmetros do operador In.
426
Capítulo 7 – Bancos de Dados com ASP – Conceitos Avançados Parte II
Para obter estes resultados consolidados, podemos utilizar as diversas funções de agregação
disponíveis. Na Tabela 7.7, temos a descrição das principais funções de agregação disponíveis.
Função Descrição
Count( ) É utilizada para efetuar uma contagem. Pode ser uma
contagem geral, como por exemplo o número de registros de
uma tabela, ou específica, como o número de pedidos para
cada país.
AVG( ) É utilizada para cálculo de médias. Calcula a média aritmética
de um determinado campo. Somente pode ser utilizada com
campos numéricos. Valores do tipo Null serão ignorados.
Sum( ) É utilizada para efetuar a soma de campos numéricos.
Max( ) É utilizada para determinar o maior valor de um campo
numérico.
Min( ) É utilizada para determinar o menor valor de um campo
numérico.
Na Listagem 7.5, temos um exemplo de uma página ASP, excount.asp, que faz uso desta
instrução SQL.
427
Criando Sites Dinâmicos com ASP 3.0
6 <BODY>
7 <%
11 Set conn=Server.CreateObject(“ADODB.Connection”)
14 conn.ConnectionString = “PROVIDER=MICROSOFT.JET.OLEDB.4.0;
DATA SOURCE=c:\meus documentos\nwind.mdb”
15 conn.Open
21 %>
22 <P>
23 <FONT color=navy size=4><B>
24 Número de pedidos por país de destino.
25 </B></FONT>
26 </P>
27 <HR>
28 <TABLE border=1>
29 <TR>
428
Capítulo 7 – Bancos de Dados com ASP – Conceitos Avançados Parte II
30 <TD><B>País</B></TD>
31 <TD><B>Pedidos </B></TD>
32 </TR>
33 <%
34 Do Until Ped.EOF
35 %>
36 <TR>
37 <TD> <%=Ped.Fields(“ShipCountry”) %> </TD>
38 <TD><B><%=Ped.Fields(“Totais”) %> </B></TD>
39 </TR>
40 <%
41 Ped.MoveNext
42 Loop
43 %>
44 </TABLE>
45 <HR>
46 </BODY>
47 </HTML>
429
Criando Sites Dinâmicos com ASP 3.0
Exemplo 2: Vamos supor que devêssemos alterar a nossa listagem, para classificá-la em ordem
descendente do número de pedidos, isto é, devem ser listados primeiro os países com o
maior número de pedidos. Para obter este resultado, bastaria alterar a instrução SQL, deixando-
a da seguinte maneira:
inst_sql=“Select ShipCountry, Count(OrderID) As Totais from Orders Group By
ShipCountry Order By Count(OrderID)Desc”
IMPORTANTE
Quando formos fazer a ordenação, utilizando a cláusula Order By, não podemos utilizar o
“aliás” do campo. O aliás é o nome que damos ao campo que está sendo calculado. No nosso
exemplo, chamamos o campo com o total de pedidos de Totais. Um aliás é criado com a
palavra “As”. Se utilizarmos um aliás na cláusula Order By, obteremos um erro e a página não
será carregada. A instrução a seguir comete este erro.
430
Capítulo 7 – Bancos de Dados com ASP – Conceitos Avançados Parte II
Figura 7.22: Erro causado pelo uso de um aliás na cláusula Order By.
Exemplo 3: Agora vamos utilizar a função Sum para retornar a soma do valor do Frete (Freight)
para cada país. Para obter este resultado, podemos utilizar o comando SQL a seguir:
inst_sql=“Select ShipCountry, Sum(Freight) As SomFrei from Orders Group By
ShipCountry Order By Sum(Freight) Desc”
Na Listagem 7.6, temos um exemplo de uma página ASP, exsum.asp, que faz uso desta
instrução SQL.
431
Criando Sites Dinâmicos com ASP 3.0
7 <%
11 Set conn=Server.CreateObject(“ADODB.Connection”)
14 conn.ConnectionString = “PROVIDER=MICROSOFT.JET.OLEDB.4.0;
DATA SOURCE=c:\meus documentos\nwind.mdb”
15 conn.Open
21 %>
22 <P>
23 <FONT color=navy size=4><B>
24 Soma do frete por país de destino.
25 </B></FONT>
26 </P>
27 <HR>
28 <TABLE border=1>
29 <TR>
30 <TD><B>País</B></TD>
31 <TD><B>Soma do Frete </B></TD>
32 </TR>
432
Capítulo 7 – Bancos de Dados com ASP – Conceitos Avançados Parte II
33 <%
34 Do Until Ped.EOF
35 %>
36 <TR>
37 <TD> <%=Ped.Fields(“ShipCountry”) %> </TD>
38 <TD align=Right><B><%=FormatNumber(Ped.Fields(“SomFrei”),2)
39 %> </B></TD>
40 </TR>
41 <%
42 Ped.MoveNext
43 Loop
44 %>
45 </TABLE>
46 <HR>
47 </BODY>
48 </HTML>
433
Criando Sites Dinâmicos com ASP 3.0
Apenas um comentário sobre a utilização da função FormatNumber: esta função foi utilizada
para delimitar o resultado da soma em duas casas decimais.
Exemplo 3: Ao invés da função Sum, vamos utilizar a função Avg, para retornar a média
aritmética do valor do Frete (Freight) para cada país. Para obter este resultado, podemos utilizar
o comando SQL a seguir:
inst_sql=“Select ShipCountry, Avg(Freight) As AvgFrei from Orders Group By
ShipCountry Order By Avg(Freight) Desc”
Exemplo 4: Vamos construir um exemplo um pouco mais sofisticado. Vamos fazer com que
sejam listados todos os pedidos, cujo valor do frete seja maior do que o valor médio do frete.
A listagem será classificada em ordem decrescente do valor do frete. Podemos utilizar a seguinte
instrução SQL:
Select ShipCountry, OrderID, OrderDate, Avg(Freight) As AvgFrei from Orders
Group By ShipCountry, OrderID, OrderDate
Having Avg(Freight)>Davg(‘Freight’,’Orders’) Order By Avg(Freight) Desc
Observe que nesta instrução utilizamos algumas elementos novos, como por exemplo:
434
Capítulo 7 – Bancos de Dados com ASP – Conceitos Avançados Parte II
➥ A cláusula Having: quando utilizamos a cláusula Group By, devemos utilizar a cláusula
Having ao invés da cláusula Where.
➥ Utilizamos a função Davg, que é uma função chamada de domínio. A função Davg foi
utilizada para calcular a média geral do frete na tabela Orders. Utilizamos a seguinte sintaxe:
Davg(‘Nome_campo’,‘Nome_da_tabela’)
Exemplo 5: Agora vamos utilizar as funções Max e Min, para retornar o pedido com o menor
valor de frete e o pedido com o maior valor de frete.
Na Listagem 7.7, temos um exemplo de uma página ASP, exmaxmin.asp, a qual faz uso das
funções Max e Min
435
Criando Sites Dinâmicos com ASP 3.0
6 <BODY>
7 <%
11 Set conn=Server.CreateObject(“ADODB.Connection”)
14 conn.ConnectionString = “PROVIDER=MICROSOFT.JET.OLEDB.4.0;
DATA SOURCE=c:\meus documentos\nwind.mdb”
15 conn.Open
21 %>
22 <P>
23 <FONT color=navy size=4><B>
24 Valores Máximos e Mínimos de Frete.
25 </B></FONT>
26 </P>
27 <HR>
28 <TABLE border=1>
29 <TR>
30 <TD><B>Máximo</B></TD>
31 <TD><B>Mínimo</B></TD>
32 </TR>
33 <TR>
34 <TD> <%=Ped.Fields(“MaiorFrete”) %> </TD>
436
Capítulo 7 – Bancos de Dados com ASP – Conceitos Avançados Parte II
37 </TABLE>
38 <HR>
39 </BODY>
40 </HTML>
A Figura 7.26 mostra o resultado da página exmaxmin.asp, ao ser carregada no Internet Explorer.
Figura 7.26: Resultados obtidos com a utilização das funções Max( ) e Min( ).
Agora vamos ao nosso exemplo final, no qual iremos construir um formulário genérico, onde
o usuário poderá selecionar por qual campo e por qual critério deseja fazer a pesquisa.
437
Criando Sites Dinâmicos com ASP 3.0
O formulário permite que sejam feitas pesquisa utilizando um ou mais destes critérios. Na
Figura 7.27 temos um exemplo do formulário geral.asp, onde o usuário pode selecionar por
quais campos deseja pesquisar a tabela Orders e qual o valor para cada campo.
Figura 7.27: O formulário onde o usuário define os critérios a serem utilizados – geral.asp.
5 <BODY bgColor=silver>
6 <HR>
438
Capítulo 7 – Bancos de Dados com ASP – Conceitos Avançados Parte II
16 <%
20 Set conn=Server.CreateObject(“ADODB.Connection”)
23 conn.ConnectionString = “PROVIDER=MICROSOFT.JET.OLEDB.4.0;
DATA SOURCE=c:\meus documentos\nwind.mdb”
24 conn.Open
439
Criando Sites Dinâmicos com ASP 3.0
39 </FONT></B></FONT>
41 <%
47 Loop
48 %>
49 </SELECT>
61 <%
440
Capítulo 7 – Bancos de Dados com ASP – Conceitos Avançados Parte II
71 </SELECT>
78 <BR>
84 </BODY>
85 </HTML>
Observe que mais uma vez as listas com os nomes dos países e os anos, para os quais existem
pedidos, foram construídas dinamicamente, a partir dos dados da tabela Orders. Ao construir
as listas dinamicamente, evitamos que o usuário tente pesquisar, por exemplo, os pedidos
para um país que não existe na tabela Orders. Com isso o usuário não perde tempo e faz as
pesquisas apenas para os países para os quais realmente existem pedidos cadastrados. O
mesmo é válido para a lista com os anos para os quais existem pedidos cadastrados.
441
Criando Sites Dinâmicos com ASP 3.0
O próximo passo é construir a página pesquisa.asp. Esta página irá montar uma instrução
SQL de acordo com as opções selecionadas pelo usuário na página geral.asp. Por exemplo, se
o usuário marcar Sim somente para a lista de países e selecionar Argentina, a página
pesquisa.asp terá que montar uma instrução SQL que pesquise a tabela Orders e retornar
somente os pedidos em que o campo ShipCountry for igual a Argentina.
O usuário poderá selecionar uma ou mais opções. Com isto teremos oito possibilidades a
serem consideradas; o usuário está pesquisando:
➥ Apenas pelo nome do país.
➥ Apenas pelo ano da data do pedido.
➥ Apenas pelo endereço ou parte do endereço.
➥ Pelo nome do país e pelo ano da data do pedido.
➥ Pelo nome e pelo endereço ou parte do endereço.
➥ Pelo ano da data do pedido e pelo endereço ou parte do endereço.
➥ Com base nos três critérios.
Ou ainda:
➥ O usuário não especificou nenhum critério de pesquisa.
A página pesquisa.asp terá que analisar essas oito possibilidades e montar uma instrução
SQL diferente para cada uma delas.
6 <BODY bgColor=silver>
442
Capítulo 7 – Bancos de Dados com ASP – Conceitos Avançados Parte II
7 <%
11 Set conn=Server.CreateObject(“ADODB.Connection”)
14 conn.ConnectionString = “PROVIDER=MICROSOFT.JET.OLEDB.4.0;
DATA SOURCE=c:\meus documentos\nwind.mdb”
15 conn.Open
16 ‘Agora passamos a analisar cada uma das oito possibilidades.
17 ‘**************************************************
18 ‘A primeira possibilidade é o caso em que o usuário
19 ‘selecionou apenas um país na lista de países.
443
Criando Sites Dinâmicos com ASP 3.0
444
Capítulo 7 – Bancos de Dados com ASP – Conceitos Avançados Parte II
445
Criando Sites Dinâmicos com ASP 3.0
98 <TR>
99 <TD><B>Código </B></TD>
100 <TD><B>Data </B></TD>
101 <TD><B>Endereço</B></TD>
102 <TD><B>País </B></TD>
103 </TR>
104 <%
105 Do While Not Pedidos.EOF
106 %>
107 <TR>
108 <TD><% =Pedidos.Fields(“OrderID”) %></TD>
109 <TD><% =Pedidos.Fields(“OrderDate”) %></TD>
110 <TD><% =Pedidos.Fields(“ShipAddress”)%></TD>
111 <TD><% =Pedidos.Fields(“ShipCountry”)%></TD>
112 </TR>
113 <%
114 Pedidos.MoveNext
115 Loop
116 %>
117 </TABLE>
118 </BODY>
119 </HTML>
Observe que a página pesquisa.asp não tem nada de especial. Apenas testamos as oito
possibilidades descritas anteriormente. Para cada uma das possibilidades montamos a instrução
SQL correspondente e informamos os critérios de pesquisa especificados pelo usuário.
Na Figura 7.28 temos um exemplo onde o usuário apenas definiu um país como critério, no
caso o país selecionado foi Austria.
446
Capítulo 7 – Bancos de Dados com ASP – Conceitos Avançados Parte II
Ao clicar no botão Pesquisar, são obtidos os resultados indicados na Figura 7.29. Observe que
foram encontrados 40 registros para Austria.
447
Criando Sites Dinâmicos com ASP 3.0
Agora vamos clicar no link Clique aqui para fazer outra pesquisa, com isso voltaremos para a
página geral.asp, onde poderemos definir outros critérios de pesquisa.
Vamos refinar um pouco mais a nossa pesquisa. Selecione Austria na lista País e 1994 na lista
Ano. Não esqueça de marcar a opção Sim ao lado de cada critério selecionado, caso contrário o
critério será ignorado. O formulário de pesquisa deverá estar igual ao indicado na Figura 7.30.
Ao clicar no botão Pesquisar, são obtidos os resultados indicados na Figura 7.31. Observe que
foram encontrados cinco registros para Austria no ano de 1994.
Agora vamos fazer uma pesquisa envolvendo os três critérios. Vamos definir os seguintes critérios:
➥ País: Brazil
➥ Ano: 1994
➥ Endereço contendo: Rua
Clique no link Clique aqui para fazer outra pesquisa, com isso voltaremos para a página
geral.asp. Defina os critérios de pesquisa conforme indicado na Figura 7.32.
448
Capítulo 7 – Bancos de Dados com ASP – Conceitos Avançados Parte II
Figura 7.32: Pesquisando os pedidos para Brazil, no ano de 1994 e com o endereço contendo a palavra Rua.
449
Criando Sites Dinâmicos com ASP 3.0
Ao clicar no botão Pesquisar, são obtidos os resultados indicados na Figura 7.33. Observe que foram
encontrados seis registros para Brazil, no ano de 1994, com o endereço contendo a palavra Rua.
Figura 7.33: Listagem de pedidos para Brazil, no ano de 1994, com o endereço contendo a palavra Rua.
Veja que, através deste exemplo, conseguimos criar um formulário de pesquisa extremamente
versátil. Podemos definir de um a três critérios de pesquisa, além de definir o valor para cada
critério. Este exemplo demonstra as possibilidades na utilização de ASP para a construção de
sites dinâmicos.
Conclusão
Neste capítulo aprendemos uma série de técnicas úteis na construção de aplicações Web
profissionais.
Iniciamos pelo estudo dos objetos Command e Parameter, os quais facilitam a execução de
Consultas Parametrizadas, bem como o envio de parâmetros e o recebimento de valores de
retorno dos Stored Procedures. Além disso, utilizando os métodos e propriedades dos objetos
450
Capítulo 7 – Bancos de Dados com ASP – Conceitos Avançados Parte II
Command e Parameter podemos ter um controle bastante apurado sobre tipo, tamanho e
outras características dos parâmetros a serem passados para consultas e Stored Procedures.
Foram apresentados exemplos práticos de utilização destes dois objetos.
Por fim, apresentamos um exemplo prático que salienta a natureza dinâmica e as capacidades
do ASP 3.0, na construção de sites dinâmicos, principalmente no que se refere a conexão e
pesquisas em bancos de dados.
No próximo capítulo falaremos um pouco mais sobre o que é uma aplicação Web e sobre os
conceitos de Sessão e Aplicação, além de aprendermos o conceito de componentes ASP.
451
Capítulo 8 – Aplicativos Web e Componentes
Capítulo 8
Aplicativos Web
e Componentes
453
Criando Sites Dinâmicos com ASP 3.0
Introdução
Neste capítulo veremos o que significa uma “Aplicação Web” criada em ASP, que fica
armazenada no servidor IIS. Veremos exatamente quais os componentes que formam uma
aplicação Web. Revisaremos o conceito de estado e os problemas oriundos do fato do protocolo
HTTP não manter uma conexão aberta após o carregamento da página.
Por exemplo, quando um usuário passa de uma página para outra, a página acessada não teria
como acessar as opções selecionadas pelo usuário e os dados da página anterior, a não ser que
tivessem sido armazenados em um banco de dados. Então, a página que está sendo acessada,
recuperaria estas informações a partir deste banco de dados. Porém, trabalhar intensivamente
com o banco de dados pode degradar o desempenho da aplicação.
Com o objeto Session podemos armazenar informações utilizadas em uma sessão do usuário.
As variáveis armazenadas no objeto Session não serão perdidas quando o usuário acessar
outras páginas da nossa aplicação Web. Estas variáveis somente serão descartadas quando o
usuário sair da aplicação, ou quando a sessão for encerrada por TimeOut.
O objeto Application pode ser utilizado para compartilhar informações entre todos os usuários
que estão acessando uma determinada aplicação Web. Enquanto o objeto Session permite
que um usuário tenha acesso à variáveis armazenadas nele; o objeto Application permite que
todos os usuários que estão acessando a aplicação Web tenham acesso às informações
armazenadas neste objeto.
Veremos exemplos de código que utilizam os objetos Session e Application, bem como os
diversos métodos, propriedades e eventos destes objetos.
454
Capítulo 8 – Aplicativos Web e Componentes
As informações de identificação são utilizadas para estabelecer uma “conexão” com o servidor.
Esta conexão é mantida enquanto a aplicação Cliente estiver sendo utilizada. Através desta
conexão, o lado servidor da aplicação consegue identificar o usuário. Com a identificação do
usuário podem ser aplicadas regras de segurança, como níveis de permissão de acesso aos
dados, níveis de permissão para as funcionalidades da aplicação, log das ações realizadas
pelo usuário, etc. Por exemplo, as opções de menu da aplicação Cliente podem ser montadas
com base nas permissões de acesso que o usuário possui. Se o usuário não possui permissões
para alterar os dados, o menu com as opções de alteração não será exibido para ele.
NOTA
Para maiores detalhes sobre os modelos de aplicação de duas ou mais camadas, consulte o
Capítulo 1.
➥ Controle de versão: Garantir que todas as estações de trabalho estejam com a última versão
da aplicação é uma tarefa nada fácil, a qual, dependendo do número de estações da rede
da empresa, pode exigir uma equipe de Help Desk praticamente dedicada a esta tarefa.
➥ Problemas de conflitos de DLL e padronização de ambiente tornam a manutenção e o
gerenciamento destas aplicações uma tarefa difícil e de custo elevado.
455
Criando Sites Dinâmicos com ASP 3.0
Estes problemas surgem para cada aplicação Cliente/Servidor tradicional que estiver sendo
usada. Agora imagine o caso de uma grande empresa, com milhares de computadores ligados
em rede, com dezenas de aplicações. A situação torna-se insustentável, além do custo de
manutenção e suporte atingir patamares impraticáveis.
Para resolver estes e outros problemas das aplicações Cliente/Servidor tradicionais é que
começaram a ser desenvolvidas aplicações para a Web, das quais vamos falar um pouco mais.
Para acessar uma aplicação Web o único programa que o usuário precisa é um navegador
instalado na sua estação. Existem inclusive aplicações Web bem projetadas que não obrigam
o usuário a utilizar um navegador específico, o que aumenta mais ainda a flexibilidade.
Uma aplicação Web reside no servidor, no nosso caso no IIS. Toda e qualquer alteração que se
fizer necessária na aplicação, será feita diretamente no servidor Web, sem que seja necessária
nenhuma modificação nas estações dos usuários. Na próxima vez que o usuário acessar a
aplicação, utilizando o navegador instalado em sua estação, já estarão disponíveis as alterações
efetuadas. Com este modelo não é necessária a “atualização” (que muitas vezes significa uma
reinstalação) da aplicação em todas as estações da rede, cada vez que forem feitas alterações
na aplicação. Com isso, a equipe de suporte fica dispensada da tediosa tarefa de atualização
da aplicação em cada estação da rede.
O modelo de aplicações Web traz inúmeras vantagens, dentre as quais podemos destacar:
➥ Atualização das aplicações centralizada no servidor Web, sem a necessidade de atualizar
todas as estações da rede que acessam a aplicação.
➥ Facilidade de manutenção e suporte, uma vez que o cliente precisa somente de um
navegador para acessar a aplicação.
➥ Redução do chamado TCO – Total Cost Ownership (Custo Total de Propriedade). O
TCO é uma medida de quanto custa, por ano, a manutenção de uma estação de rede
em funcionamento. O cálculo do TCO leva em consideração diversos fatores. Para
maiores informações sobre este cálculo acesse o site do Gardner Group na Internet.
Porém nem tudo são vantagens. Pela natureza e implementação do modelo Web, o qual faz
uso do protocolo HTTP, as aplicações Web não têm como manter uma conexão permanente
com o usuário. Por isso que o modelo Web, muitas vezes, é conhecido como “State Less”, isto
é, “Sem estado”. Isso acontece porque após ter enviado a página solicitada pelo usuário, a
456
Capítulo 8 – Aplicativos Web e Componentes
conexão é encerrada, não sendo possível continuar trocando informações com o usuário, a
não ser que uma nova conexão seja estabelecida.
Para vencer as limitações impostas por este modelo “State Less”, é que iremos estudar os objetos
Application e Session do ASP, além de aprendermos sobre o que é e como utilizar o arquivo global.asa.
Através da utilização destes objetos, podemos manter diversas informações sobre o usuário
que está acessando a aplicação Web. Na verdade estamos “simulando” uma conexão, porém
utilizando os recursos disponibilizados pelos objetos Application e Session.
A possibilidade de diferenciar cada usuário que está acessando uma aplicação Web é de
fundamental importância, para que possamos criar conteúdos mais personalizados e
interativos, além da possibilidade de aplicar conceitos como níveis de permissão de acesso
aos dados e auditoria de acesso.
De uma maneira simples e didática poderíamos definir uma aplicação Web desenvolvida
com ASP como sendo:
“Uma pasta virtual e todas as suas subpastas, com o conjunto de páginas ASP e componentes
COM ou COM+, projetadas para executar uma ou mais tarefas específicas, por exemplo um
sistema para controle do departamento de Recursos Humanos.”
Conforme detalharemos mais adiante, componentes COM ou COM+ (no Windows 2000 o
padrão COM foi aperfeiçoado e transformado em COM+) são elementos de software que
desempenham funções específicas. Por exemplo, a minha aplicação de controle do
departamento de Recursos Humanos pode fazer uso de um componente COM+ o qual faz
cálculos previdenciários. Um componente COM+ pode ser desenvolvido internamente na
empresa, para ser utilizado por uma ou mais aplicações ou pode ser adquirido de empresas
especializadas no desenvolvimento de componentes.
O nosso conjunto de páginas ASP pode fazer uso dos diversos componentes disponíveis para
a aplicação Web.
NOTA
No Capítulo 10 voltaremos a falar de componentes e do Microsoft Transaction Services.
457
Criando Sites Dinâmicos com ASP 3.0
No IIS, o ponto de partida para criar uma aplicação Web é criar uma pasta. O próximo passo
é transformar esta pasta em uma “Pasta Virtual” do servidor IIS.
NOTA
Para saber como transformar uma pasta em uma “Pasta Virtual” do IIS, consulte o Capítulo 1,
no item “Tornando a pasta livro, parte do servidor IIS”.
Vamos supor que você tenha criado uma pasta chamada WebApl no drive (C:\WebApl), de
um servidor IIS chamado www.abc.com.br. Agora você registrou esta pasta como uma pasta
virtual chamada WebApl. Dentro do diretório você criou uma página ASP chamada index.asp,
a qual será a página inicial da aplicação Web. Você lembra como seria o endereço para acessar
a página index.asp do diretório virtual WebApl do servidor www.abc.com.br?
Dentro da pasta WebApl poderíamos criar outras pastas, conforme a necessidade da nossa
aplicação Web. As pastas criadas dentro de uma pasta virtual, já passam a ser acessíveis para
o servidor Web. Por exemplo, dentro da pastas WebApl criamos uma pasta chamada Seguranca.
Dentro dela colocamos um arquivo chamado login.asp. O endereço para acessar o arquivo
login.asp seria o seguinte:
http://www.abc.com.br/WebApl/Seguranca/login.asp
Todos as subpastas da pasta WebApl também farão parte da aplicação Web. Com isso podemos
concluir, em um primeiro momento, que uma aplicação Web do IIS está ligada à criação de
uma pasta virtual no servidor IIS.
458
Capítulo 8 – Aplicativos Web e Componentes
7. Todos os aplicativos Web estão disponíveis através da opção Site da Web Padrão. Dê
um clique no sinal de + ao lado desta opção para abri-la.
8. Serão exibidas todas as pastas virtuais disponíveis no servidor IIS, conforme indicado
na Figura 8.3.
459
Criando Sites Dinâmicos com ASP 3.0
460
Capítulo 8 – Aplicativos Web e Componentes
461
Criando Sites Dinâmicos com ASP 3.0
Figura 8.6: A DLL asp.dll é responsável pelo processamento das páginas ASP.
462
Capítulo 8 – Aplicativos Web e Componentes
Quando o estado da sessão é ativado, o Active Server Pages cria uma sessão para cada usuário
que acessa um aplicativo ASP, de modo que você possa identificar o usuário através das páginas
do aplicativo. Quando o estado da sessão é desativado, o ASP não controla usuários e não
permite que um script do ASP armazene informações no objeto Session ou use os eventos
Session.OnStart ou Session.OnEnd. Uma sessão é finalizada automaticamente se o usuário não
solicitou ou atualizou uma página em um aplicativo no fim do tempo limite – TimeOut.
Um script pode terminar explicitamente uma sessão com o método Session.Abandon. Mesmo
que o estado da sessão esteja ativado em um aplicativo, você poderá desativá-lo em uma
página ASP individual usando a diretiva <%@ ENABLESESSIONSTATE = False %>, no
cabeçalho da página.
IMPORTANTE
Se você ativar essa opção, não forneça acesso de execução aos diretórios pai, caso contrário,
um script poderá tentar executar um programa não autorizado em um diretório pai.
➥ Linguagem ASP padrão: Por padrão é definida como sendo VBScript. Caso deseje,
pode alterar para JScript. Também podemos especificar o nome de qualquer outra
linguagem para a qual tenhamos o interpretador instalado no servidor IIS, como por
exemplo Perl. Esta opção define a linguagem que será utilizada para interpretar os
comandos dentro das tags <% e %>.
463
Criando Sites Dinâmicos com ASP 3.0
➥ Tempo limite do script ASP: Especifica o período de tempo durante o qual o ASP
permitirá a execução de um script. Se a execução do script não terminar ao final do
período de tempo limite, o ASP irá pará-lo e gravar um evento no arquivo de log de
eventosYdo Windows 2000. Você pode definir o período de tempo limite como um
valor entre 1 e 2147483647, além de poder substituir essa opção em uma página ASP
usando o método Server.ScriptTimeout.
18. Não iremos alterar nenhuma opção nesta guia.
19. Dê um clique na guia Depuração de aplicativo.
20. Na guia Depuração de aplicativo, temos diversas configurações relacionadas com a
depuração de erros em páginas ASP, conforme indicado na Figura 8.8.
464
Capítulo 8 – Aplicativos Web e Componentes
➥ Ativar a depuração de script ASP do lado do cliente: Essa caixa de seleção está reservada
para uso futuro e não tem efeito sobre a versão atual do ASP (esta é a informação
contida na própria documentação do IIS 5.0).
➥ Enviar mensagens de erro do ASP detalhadas para o cliente: Selecione essa opção para
enviar informações específicas de depuração (incluindo o nome do arquivo, a mensagem
de erro e o número da linha) para o navegador. Principalmente quando estamos
desenvolvendo nossas aplicações é importante que esta opção esteja selecionado, pois
ao testarmos uma página, se a mesma contiver um erro, o navegador informa o número
da linha onde está o erro, o que facilita a correção do script.
➥ Enviar mensagem de erro de texto para o cliente: Selecione esta opção para enviar
uma mensagem de erro padrão ao navegador quando algum erro impedir o servidor
Web de processar a página ASP. Uma mensagem de erro específica é gravada no log de
erros. Você pode alterar a mensagem de erro padrão digitando uma nova mensagem na
caixa de texto. Não é recomendada a utilização desta opção no ambiente de
desenvolvimento, pelos motivos descritos no parágrafo anterior.
21. Não iremos alterar nenhuma opção nesta guia.
22. Dê um clique no botão OK para fechar a janela de configuração.
23. Dê um clique no botão OK para fechar a janela de propriedades da pasta virtual WebApl.
24. Você estará de volta ao Gerenciador do Internet Services.
25. Feche-o.
Bem, agora já conhecemos o que é uma aplicação Web do IIS e quais os elementos que a
compõem. Um último elemento, porém não menos importante, é um arquivo chamado
global.asa. No próximo item iremos aprender o que é este arquivo.
O Arquivo Global.asa
O arquivo global.asa é um arquivo opcional, porém é bastante comum a utilização do mesmo
em nossas aplicações Web residentes no IIS. A extensão .asa é uma abreviatura para Active
Server Applications. O arquivo global.asa trabalha em conjunto com os objetos Application
e Session, para permitir o gerenciamento das informações de estado de cada usuário que
acessa a aplicação.
No arquivo global.asa é possível especificar scripts de eventos e declarar os objetos que têm
escopo de sessão (Session) ou de aplicação (Application).
Não se trata de um arquivo de conteúdo exibido para os usuários; em vez disso, o arquivo
armazena informações de eventos e os objetos utilizados globalmente pelo aplicativo. Esse
arquivo deve ser nomeado como global.asa e armazenado na pasta raiz do aplicativo.
465
Criando Sites Dinâmicos com ASP 3.0
Através do arquivo global.asa podemos acompanhar, para o objeto Session, os seguintes eventos:
➥ Session_OnStart: Este evento ocorre quando o usuário acessa uma das páginas da
aplicação Web. Quando o usuário acessar outras páginas, dentro da mesma aplicação,
este evento não ocorrerá novamente, ou seja, o evento Session_OnStart somente ocorre
para a primeira página da aplicação que o usuário acessar; ele ocorre quando o servidor
cria uma nova sessão. O servidor processa esse script antes de executar a página solicitada.
O evento Session_OnStart é o momento adequado para definir as variáveis no nível de
sessão, porque as mesmas serão definidas antes de se acessar quaisquer páginas.
➥ Session_OnEnd: Este evento ocorre quando a sessão do usuário é encerrada por TimeOut
ou quando o usuário acessar uma página de outra aplicação Web.
466
Capítulo 8 – Aplicativos Web e Componentes
2 ‘Sub Session_OnStart
3 ‘** Código para o evento.
4 ‘End Sub
5 ‘EventName Description
6 ‘Session_OnStart Runs the first time a user runs any page in your application
7 ‘Session_OnEnd Runs when a user’s session times out or quits your
application
8 ‘Application_OnStart Runs once when the first page of your application is run
for the first 9 time by any user
10 ‘Application_OnEnd Runs once when the web server shuts down
11 </SCRIPT>
13 Sub Application_OnStart
14 Application(“nwind_ConnectionString”) = “DSN=nwind;DBQ=C:\MEUS
DOCUMENTOS\NWIND.MDB;DriverId=281;FIL=MS
Access;MaxBufferSize=2048;PageTimeout=5;”
15 Application(“nwind_ConnectionTimeout”) = 15
16 Application(“nwind_CommandTimeout”) = 30
17 Application(“nwind_CursorLocation”) = 3
18 Application(“nwind_RuntimeUserName”) = “”
19 Application(“nwind_RuntimePassword”) = “”
20 End Sub
21 </SCRIPT>
Agora que já conhecemos a anatomia de uma aplicação Web no IIS, bem coma a função do
arquivo global.asa, vamos estudar os objetos Session e Application, para que possamos
aprender na prática a utilizá-los.
467
Criando Sites Dinâmicos com ASP 3.0
O Objeto Application
Conforme descrito anteriormente, podemos utilizar o objeto Application para compartilhar
informações entre todos os usuários de um determinado aplicativo. Um aplicativo Web baseado
no ASP é definido como todos os arquivos .asp em uma pasta virtual e seus subdiretórios. Como
o objeto Application pode ser compartilhado por mais de um usuário, existem os métodos Lock e
Unlock para garantir que vários usuários não tentarão alterar uma propriedade ao mesmo tempo.
Itens do objeto Application podem ser variáveis necessárias para todos os usuários que acessam
uma aplicação, como a cotação do dólar ou o índice da poupança. Também podemos utilizar
o objeto Application para criar uma instância de um componente que fornece uma determinada
funcionalidade utilizada pela nossa aplicação Web.
Uma aplicação Web é inicializada quando qualquer uma de suas páginas ASP for acessada. A
partir do momento em que a primeira página ASP for acessada, o objeto Application estará
disponível e quaisquer valores que tenham sido definidos por este objeto, estarão disponíveis
para todos os usuários que acessarem a aplicação.
O diagrama da Figura 8.9, demonstra a relação entre o objeto Application, o servidor Web e as
diversas aplicações Web hospedadas no servidor.
Usuário 1
Aplicação: web1
Usuário 2
objeto Application
Usuário 3
Aplicação: web2
Usuário 4
objeto Application
Usuário 5
Servidor Web
Aplicação: web3
objeto Application Usuário 6
Figura 8.9: Relação entre o objeto Application, o servidor Web e as diversas aplicações.
Cada aplicação Web possui seu próprio objeto Application e informações disponíveis no
objeto Application podem ser acessadas por quaisquer usuário que estiverem acessando a
468
Capítulo 8 – Aplicativos Web e Componentes
aplicação. Também podemos notar, na Figura 8.9, que em um mesmo servidor Web podemos
ter várias aplicações Web.
Evento Descrição
OnStart Ocorre quando a aplicação Web é iniciada (quando a primeira
página da aplicação é acessada), antes da página solicitada
pelo usuário ser interpretada e antes que qualquer objeto
Session tenha sido criado. É por isso que o objeto Session
pode utilizar valores armazenados no objeto Application, pois
obrigatoriamente o objeto Application será criado antes de
qualquer objeto Session. Este evento pode ser utilizado para
inicializar variáveis, criar objetos ou rodar código necessário
à inicialização da aplicação.
OnEnd Ocorre quando a aplicação Web é finalizada. Isto acontece após
o encerramento do último objeto Session e depois que
o código para o evento Session_OnEnd é executado. Todas
as variáveis existentes são retiradas da memória quando a
aplicação é encerrada. O encerramento da sessão normalmente
ocorre quando existia somente um usuário conectado e o
mesmo fecha o navegador ou acessa outro site ou outra
aplicação dentro do mesmo site.
O código para os eventos OnStart e OnEnd deve ser colocado no arquivo global.asa. Agora
passaremos a estudar a utilização destes dois eventos.
Evento Application_OnStart
A seguir é mostrada a sintaxe para este evento.
469
Criando Sites Dinâmicos com ASP 3.0
End Sub
</SCRIPT>
A seguir temos um exemplo de definição de código para o evento OnStart. Neste exemplo são
criadas duas variáveis de nível de aplicação. Uma com a estação do ano e outra com cotação
do dólar.
<SCRIPT LANGUAGE=“VBScript” RUNAT.= “Server”>
Sub Application_OnStart
Application(“EstacaoAno”) = “Inverno”
Application(“CotDolar”) = 1.77
End Sub
</SCRIPT>
As variáveis EstacaoAno e CotDolar podem ser acessadas por qualquer usuário, em qualquer
página ASP da aplicação Web, pois são variáveis de nível de aplicação, tecnicamente falando,
diríamos que são variáveis de nível do objeto Application.
Para acessar os valores das variáveis do objeto Application é muito simples, basta utilizar a
sintaxe:
<% = Application(“Nome_da_Variável”) %>
470
Capítulo 8 – Aplicativos Web e Componentes
Vamos a um exemplo prático. Suponhamos que tenham sido definidas três variáveis no evento
Application_OnStart da aplicação Web denominada Capitulo8, conforme indicado na Listagem
8.2, onde temos o arquivo global.asa para a aplicação Capitulo8.
Listagem 8.2 – Arquivo global.asa onde são definidos três variáveis de nível de aplicação.
1 <SCRIPT LANGUAGE=VBScript RUNAT=Server>
2 Sub Application_OnStart
3 Application(“Mensagem”)= “Bem vindo ao site da empresa ABC Ltda!”
8 End Sub
9 </SCRIPT>
Agora vamos criar uma página ASP que faz uso destas variáveis. A página usa_appvar.asp irá
detectar a hora do dia. Até às 11:59 será apresentada a mensagem “Bom Dia” e será informado
a cotação do dólar armazenada na variável CotAM. A partir de 12:00 será apresentada a
mensagem “Boa Tarde” e será informada a cotação do dólar armazenada na variável CotPM.
Em ambos os casos será emitida a mensagem contida na variável Mensagem.
6 <BODY>
471
Criando Sites Dinâmicos com ASP 3.0
7 <%
9 hora_dia = hour(Time())
10 If hora_dia<12 Then
11 Response.Write “<HR>”
12 Response.Write “Bom Dia ! <BR>”
13 Response.Write “Cotação do dólar: “ & Application(“CotAM”) & “<BR>”
14 Response.Write Application(“Mensagem”)
15 Response.Write “<HR>”
16 Else
17 Response.Write “<HR>”
18 Response.Write “Boa tarde ! <BR>”
19 Response.Write “Cotação do dólar: “ & Application(“CotPM”) & “<BR>”
20 Response.Write Application(“Mensagem”)
21 Response.Write “<HR>”
22 End If
23 %>
24 </BODY>
25 </HTML>
Observe que utilizamos a função hour(Time( )); como parâmetro para a função hour, passamos
a função Time. A função Time captura a hora do servidor Web e a função hour retira apenas
o valor numérico da hora.
Observe que, para ter acesso a uma variável do objeto Application, é só utilizar a sintaxe:
Application(“Nome_da_Variável”)
Já, ao visualizarmos o arquivo da Listagem 8.3, após o meio-dia, obteremos o resultado indicado
na Figura 8.11.
472
Capítulo 8 – Aplicativos Web e Componentes
Porém não estamos limitados à criação de variáveis simplesmente. Podemos criar objetos no
evento OnStart. Por exemplo, posso criar um objeto do tipo ADODB.Connection e utilizar o método
Open do mesmo. Com isso estou disponibilizando uma conexão de banco de dados para todas as
páginas da minha aplicação. Esta técnica apresenta, dentre outras, duas vantagens importantes:
➥ Não é necessário a colocação do código para criação da conexão, em cada página que
precisar da mesma. Isto facilita a construção das páginas e reduz a possibilidade de erros.
473
Criando Sites Dinâmicos com ASP 3.0
➥ Se, por algum motivo, for necessária a alteração das propriedades da conexão, basta
alterar a String de conexão em um único local (no arquivo global.asa), e não em todas
as páginas que fazem uso da conexão que está sendo alterada.
2 Sub Application_OnStart
12 Set Application(“conn”)=Server.CreateObject(“ADODB.Connection”)
13 Application(“conn”).ConnectionString = “PROVIDER=MICROSOFT.JET.OLEDB.4.0;
DATA SOURCE=c:\meus documentos\nwind.mdb”
14 Application(“conn”).Open
15 End Sub
16 </SCRIPT>
IMPORTANTE
Para que o objeto conn seja uma conexão do objeto Application, e com isso disponível para
todas as páginas da aplicação, devemos utilizar a sintaxe indicada na Listagem 8.4, ou seja:
12 Set Application(“conn”)=Server.CreateObject(“ADODB.Connection”)
474
Capítulo 8 – Aplicativos Web e Componentes
Agora que criamos uma conexão no evento OnStart, podemos utilizar esta conexão em qualquer
página da aplicação. Vamos a um exemplo de página ASP que utiliza esta conexão.
Na Listagem 8.5 temos uma página ASP que utiliza a conexão criada no evento OnStart.
Observe que estamos criando um objeto RecordSet que utiliza esta conexão como parâmetro
para o método Open do objeto RecordSet.
6 <BODY>
7 <%
475
Criando Sites Dinâmicos com ASP 3.0
31 %>
32 <TR>
33 <TD><% =Pedidos.Fields(“OrderID”) %></TD>
34 <TD><% =Pedidos.Fields(“OrderDate”) %></TD>
35 <TD><% =Pedidos.Fields(“ShipCity”) %></TD>
36 <TD><% =Pedidos.Fields(“ShipCountry”) %></TD>
37 </TR>
38 <%
39 Pedidos.MoveNext
39 Loop
40 %>
41 </TABLE>
42 <BR>
43 <HR>
44 </BODY>
45 </HTML>
IMPORTANTE
No evento Application_OnStart não podemos utilizar os seguintes objetos:
➥ Response
➥ Request
➥ Session
Se tentarmos utilizar um destes objetos no evento Application_OnStart, obteremos a mensagem
de erro indicada na Figura 8.13.
476
Capítulo 8 – Aplicativos Web e Componentes
Figura 8.12: Página que utiliza uma conexão criada no arquivo global.asa.
477
Criando Sites Dinâmicos com ASP 3.0
Evento Application_OnEnd
Embora possamos criar variáveis e objetos no evento Application_OnEnd isto não teria
utilidade prática. Normalmente utilizamos o evento OnEnd para funções administrativas,
tais como gravar informações em um log de auditoria ou parar um determinado serviço para
manutenção.
End Sub
</SCRIPT>
A seguir temos um exemplo de definição de código para o evento OnEnd. Neste exemplo
estamos retirando o objeto conn da memória.
<SCRIPT LANGUAGE=“VBScript” RUNAT.= “Server”>
Sub Application_OnEnd
Set Application(“conn”) = Nothing
End Sub
</SCRIPT>
NOTA
Uma situação especial em que o evento Application_OnEnd ocorre é quando o arquivo global.asa
precisa ser novamente interpretado e carregado na memória. Isto acontece quando este arquivo
é alterado e as alterações são salvas.
478
Capítulo 8 – Aplicativos Web e Componentes
Coleção Descrição
Contents Contém todos os itens que foram adicionados ao objeto
Application, com exceção dos que foram declarados com a
tag <OBJECT>. Todas as variáveis e objetos criados com Set,
fazem parte desta coleção. Podemos usar a coleção Contents
para obter a lista de itens aos quais tenha sido atribuído
escopo do aplicativo ou para especificar um item específico
para ser o destino de uma operação. É possível também
remover os itens da coleção com os métodos Remove e
RemoveAll. No próximo tópico falaremos sobre os métodos
do objeto Application.
StaticObjects A coleção StaticObjects contém todos os objetos criados com
as tags <OBJECT> dentro do escopo do objeto Application.
Podemos usar esta coleção para determinar o valor de uma
propriedade específica de um objeto ou fazer interação através
da coleção e recuperar todas as propriedades dos objetos
estáticos.
Agora passaremos a estudar a sintaxe e alguns exemplos de utilização das coleções do objeto
Application.
A Coleção Contents
Para acessarmos um item da coleção Contents, utilizamos a seguinte sintaxe:
Application.Contents(Chave)
Por exemplo, vamos supor que as seguintes variáveis tenham sido criadas no arquivo global.asa,
no evento Application_OnStart:
Application(“Var1”) = “José da Silva”
Application(“Var2”) = “Maria do Socorro”
Application(“HoraDia”) = Hour(Time( ))
479
Criando Sites Dinâmicos com ASP 3.0
Como estamos trabalhando com uma coleção, podemos utilizar o operador For Each...Next
para percorrer todos os itens da coleção Contents. No exemplo de código a seguir, exibimos o
nome de todos os elementos da coleção Contents.
<%
For Each elemento in Application.Contents
Response.Write “Nome do elemento: ” & elemento & “<BR>”
Next
%>
Considere a Listagem 8.6, onde fazemos uso do operador For Each...Next para exibir o nome
de todos os itens da coleção Contents do objeto Application.
13 Response.Write “<HR>”
14 %>
15 </BODY>
16 </HTML>
Ao carregarmos esta página no Internet Explorer, obtemos o resultado indicado na Figura 8.14.
480
Capítulo 8 – Aplicativos Web e Componentes
Figura 8.14: Usando For Each...Next para exibir o nome dos elementos da coleção Contents.
NOTA
Neste caso a página contents.asp faz parte da aplicação que utiliza o arquivo global.asa da
Listagem 8.4. Observe que inclusive o elemento conn, o qual é um objeto do tipo Connection,
faz parte da coleção Contents.
Poderíamos modificar a Listagem 8.6, para que, além de exibir o nome de cada elemento, a mesma
exibisse o valor de cada um dos elementos. Esta alteração está indicada na Listagem 8.7.
481
Criando Sites Dinâmicos com ASP 3.0
11 <TD><B>Valor</B></TD>
12 </TR>
13 <%
14 Response.Write “Elementos da coleção Contents. <HR>”
Ao carregarmos esta nova versão da página, no Internet Explorer, obtemos o resultado indicado
na Figura 8.15.
482
Capítulo 8 – Aplicativos Web e Componentes
A Coleção StaticObjects
Para acessarmos um item da coleção StaticObjects, utilizamos a seguinte sintaxe:
Application.StaticObjects(Chave)
Como estamos trabalhando com uma coleção, podemos utilizar o operador For Each...Next
para percorrer todos os itens da coleção Contents. No exemplo de código a seguir, exibimos o
nome de todos os elementos da coleção StaticObjects.
<%
For Each elemento in Application.StaticObjects
Response.Write “Nome do elemento: ” & elemento & “<BR>”
Next
%>
Agora que já conhecemos os eventos e coleções do objeto Application, vamos ao estudo dos
métodos deste objeto.
Método Descrição
Contents.Remove O método Application.Contents.Remove exclui um
item de uma coleção. Este método considera uma
seqüência de caracteres ou um inteiro como um
parâmetro de entrada. Se o parâmetro de entrada for
uma seqüência de caracteres, o método pesquisará a
coleção Contents para localizar um item com esse
mesmo nome e o removerá. Se o parâmetro de entrada
for um inteiro, o método contará o número de itens
equivalente a partir do início da coleção e removerá o
item correspondente.
Contents.RemoveAll O método Application.Contents.RemoveAll remove
todos os itens que foram adicionados à coleção
Application.Contents.
483
Criando Sites Dinâmicos com ASP 3.0
Método Descrição
Lock O método Lock impede que outros clientes
modifiquem as variáveis armazenadas no objeto
Application, garantindo que apenas um cliente de
cada vez possa alterar ou acessar as variáveis do
objeto Application. Se o método Unlock não for
chamado explicitamente, o servidor desbloqueará o
objeto Application bloqueado quando o arquivo .asp
for concluído ou atingir seu tempo limite – TimeOut.
Unlock O método Unlock permite que outros clientes
modifiquem as variáveis armazenadas no objeto
Application após ele ter sido bloqueado usando o
método Lock. Se você não chamar explicitamente esse
método, o servidor Web desbloqueará objeto
Application quando o arquivo .asp for concluído ou
atingir seu tempo limite – TimeOut.
Agora vamos analisar alguns exemplos de código que utilizam os métodos do objeto Application.
No exemplo a seguir são adicionadas três variáveis em nível de aplicação. Depois utilizamos
o método Contents.Remove para remover uma das variáveis.
<%
Application(“Nome”) = Request.Form(“nome”)
Application(“Idade”) = Request.Form(“idade”)
Application(“ValorDolar”) = 1.72
Application.Contents.Remove(Idade)
%>
No exemplo a seguir são adicionadas três variáveis em nível de aplicação. Depois utilizamos
o método Contents.RemoveAll para remover todas as variáveis, inclusive variáveis que tenham
sido adicionadas em outras páginas ASP da aplicação, ou através do arquivo global.asa.
<%
Application(“Nome”) = Request.Form(“nome”)
Application(“Idade”) = Request.Form(“idade”)
484
Capítulo 8 – Aplicativos Web e Componentes
Application(“ValorDolar”) = 1.72
Application.Contents.RemoveAll( )
%>
No exemplo a seguir, o método Lock impede que mais de um cliente acesse a variável
NumVisitantes ao mesmo tempo. Se o aplicativo não tivesse sido bloqueado, dois clientes
poderiam tentar incrementar a variável NumVisitantes simultaneamente.
<%
Application.Lock
Application(“NumVisitantes”) = Application(“NumVisitantes”) + 1
Application(“DataUltimaVisita”) = Now()
Application.Unlock
No exemplo a seguir, o método Unlock libera o objeto bloqueado para que o próximo cliente
possa incrementar NumVisitantes.
<%
Application.Lock
Application(“NumVisitantes ”) = Application(“NumVisitantes ”) + 1
Application(“DataUltimaVisita ”) = Now()
Application.Unlock
%>
IMPORTANTE
O método Lock do aplicativo é cumulativo, significando que se o mesmo script chamar Lock
várias vezes, ele também deverá chamar Unlock o mesmo número de vezes para liberar
totalmente o aplicativo. Se isso não ocorrer, o bloqueio do aplicativo será mantido até que o
script termine de executar.
485
Criando Sites Dinâmicos com ASP 3.0
Com isso encerramos o estudo do objeto Application. Conforme estudamos, podemos criar
variáveis que estarão acessíveis para todos os usuários da aplicação (semelhante ao conceito
de variável global nas aplicações tradicionais); podemos criar objetos, como por exemplo um
objeto Connection, de tal forma que qualquer página ASP da aplicação utilize-o sem que para
isso o mesmo tenha que ser criado em cada página.
O Objeto Session
Podemos usar o objeto Session para armazenar as informações necessárias para uma
determinada sessão de usuário. As variáveis armazenadas no objeto Session não são
descartadas quando o usuário alterna entre as páginas do aplicativo; em vez disso, essas
variáveis persistem durante toda a sessão de usuário.
O servidor Web cria automaticamente um objeto Session quando uma página da Web de um
aplicativo é solicitada por um usuário que não tem uma sessão. O servidor descarta o objeto
Session quando a sessão expira (por TimeOut) ou é abandonada.
Um uso comum para o objeto Session é para armazenar as preferências do usuário. Por exemplo,
se um usuário indicar que prefere não visualizar elementos gráficos, você deverá armazenar
essa informação no objeto Session.
O diagrama da Figura 8.16 demonstra a relação entre o objeto Application, os diversos objetos
Session, o servidor Web e as diversas aplicações Web hospedadas no servidor.
Cada aplicação Web possui seu próprio objeto Application e informações disponíveis neste
objeto podem ser acessadas por qualquer usuário que estiver acessando a aplicação. Para
cada usuário que acessa a aplicação Web é criado um objeto Session, onde ficam armazenadas
as informações relacionadas a ele. Também podemos notar, na Figura 8.16, que em um mesmo
servidor Web podemos ter várias aplicações Web.
IMPORTANTE
O objeto Session é baseado em Cookies, por isso o estado da sessão só é mantido para
navegadores que suportam Cookies.
486
Capítulo 8 – Aplicativos Web e Componentes
Usuário 1
Aplicação: web1
objeto Application
Sessão1 Usuário 2
Sessão2
Sessão3
Usuário 3
Aplicação: web2
objeto Application
Usuário 4
Sessão4
Sessão5
Usuário 5
Aplicação: web3
objeto Application Usuário 6
Sessão6
Evento Descrição
OnStart O evento Session_OnStart ocorre quando o servidor cria uma nova
sessão, processando esse script antes de executar a página solicitada.
O evento Session_OnStart é uma ótima oportunidade de definir as
variáveis no nível de sessão, porque as mesmas serão definidas antes
de se acessar quaisquer páginas. Todos os objetos incorporados
(Application, ObjectContext, Request, Response, Server e Session)
estão disponíveis e podem ser referenciados no script do evento
Session_OnStart. Você pode chamar o método Redirect no evento
Session_OnStart, por exemplo, para assegurar que os usuários sempre
iniciem uma sessão em determinada página da Web. Quando o
usuário entrar no aplicativo, o servidor criará uma sessão para este
usuário e processará o script do evento Session_OnStart. É possível
incluir um script nesse evento para verificar se a página aberta pelo
usuário é a página inicial e, se não for, podemos redirecioná-lo para a
página inicial através de uma chamada ao método Response.Redirect.
487
Criando Sites Dinâmicos com ASP 3.0
Evento Descrição
OnEnd O evento Session_OnEnd ocorre quando uma sessão é abandonada ou
o tempo limite expira – TimeOut. Para esse evento, somente estão
disponíveis os objetos Application, Server e Session.
O Evento Session_OnStart
A seguir é mostrada a sintaxe para este evento:
<SCRIPT LANGUAGE=Linguagem_de_script RUNAT=Server>
Sub Session_OnStart
End Sub
</SCRIPT>
Sub Session_OnStart
Session(“EstacaoAno”) = “Inverno”
Session(“CotDolar”) = 1.77
End Sub
</SCRIPT>
As variáveis EstacaoAno e CotDolar podem ser acessadas, pelo usuário conectado, em qualquer
página ASP da aplicação Web, pois são variáveis de nível de sessão, tecnicamente falando,
diríamos que são variáveis de nível do objeto Session, as quais estão disponíveis, em qualquer
página, para o usuário ligado à sessão.
488
Capítulo 8 – Aplicativos Web e Componentes
Um detalhe importante a ser lembrado é que não é apenas no evento Session_OnStart que
podemos definir variáveis de nível de sessão. Em qualquer página ASP podemos definir uma
variável que estará disponível em nível de sessão. Para isso utilizamos a mesma sintaxe
utilizada no arquivo global.asa, conforme indicado abaixo:
<%
Session(“Nome_da_Variável”) = Valor_da_Variável
%>
Para acessar os valores das variáveis do objeto Session é muito simples, basta utilizar a sintaxe:
<%
= Session(“Nome_da_Variável”)
%>
Vamos a um exemplo prático. Suponhamos que tenham sido definidas três variáveis no evento
Session_OnStart, conforme indicado na Listagem 8.8, onde temos o arquivo global.asa para a
aplicação Capitulo8.
Listagem 8.8 – Arquivo global.asa onde são definidos três variáveis de nível de sessão.
1 <SCRIPT LANGUAGE=VBScript RUNAT=Server>
2 Sub Session_OnStart
3 Session(“Mensagem”)= “Bem-vindo ao site da empresa ABC Ltda !”
9 </SCRIPT>
489
Criando Sites Dinâmicos com ASP 3.0
Agora vamos criar uma página ASP que faz uso destas variáveis. A página usa_sessionvar.asp
irá detectar a hora do dia. Até às 11:59 será apresentada a mensagem “Bom Dia” e será
informado a cotação do dólar armazenada na variável CotAM. A partir de 12:00 será
apresentada a mensagem “Boa Tarde” e será informada a cotação do dólar armazenada na
variável CotPM. Em ambos os casos será emitida a mensagem contida na variável Mensagem.
Observe que utilizamos a função hour(Time( )); como parâmetro para a função hour, passamos
a função Time ( ). A função Time( ) captura a hora do servidor Web e a função hour retira
apenas o valor numérico da hora.
490
Capítulo 8 – Aplicativos Web e Componentes
Observe que para ter acesso a uma variável do objeto Session é só utilizar a seguinte sintaxe:
Session(“Nome_da_Variável”).
491
Criando Sites Dinâmicos com ASP 3.0
Porém não estamos limitados a criação de variáveis simplesmente. Podemos criar objetos no
evento Session_OnStart. Por exemplo, posso criar um objeto do tipo ADODB.Connection e
utilizar o método Open do mesmo. Com isso estou disponibilizando uma conexão de banco
de dados para o usuário, e em qualquer página da aplicação esta conexão pode ser utilizada.
Esta técnica apresenta, dentre outras, duas vantagens importantes:
➥ Não é necessário a colocação do código para criação da conexão, em cada página que
precisar da mesma. Isto facilita a construção das páginas e reduz a possibilidade de erros.
➥ Se, por algum motivo, for necessária a alteração das propriedades da conexão, basta
alterar a String de conexão em um único local (no arquivo global.asa), e não em todas
as páginas que fazem uso da conexão que está sendo alterada.
Na Listagem 8.10, temos um exemplo de conexão criada no evento Session_OnStart.
492
Capítulo 8 – Aplicativos Web e Componentes
14 Session(“conexao”).Open
15 End Sub
16 </SCRIPT>
IMPORTANTE
Para que o objeto conexao seja uma conexão do objeto Session, e com isso esteja disponível
para todas as páginas que o usuário acessar dentro da aplicação, devemos utilizar a sintaxe
indicada na Listagem 8.10, ou seja:
12 Set Session(“conexao”)=Server.CreateObject(“ADODB.Connection”)
Agora que criamos uma conexão no evento Session_OnStart, podemos utilizar esta conexão
em qualquer página da aplicação. Vamos a um exemplo de página ASP que utiliza esta conexão.
Na Listagem 8.11 temos uma página ASP que utiliza a conexão criada no evento
Session_OnStart. Observe que estamos criando um objeto RecordSet que utiliza esta conexão
como parâmetro para o método Open do objeto RecordSet.
6 <BODY>
493
Criando Sites Dinâmicos com ASP 3.0
7 <%
17 %>
20 <TR>
21 <TD><B>Código</B></TD>
22 <TD><B>Data</B></TD>
23 <TD><B>Cidade</B></TD>
24 <TD><B>País</B></TD>
25 </TR>
26 <%
31 %>
32 <TR>
33 <TD><% =Pedidos.Fields(“OrderID”) %></TD>
494
Capítulo 8 – Aplicativos Web e Componentes
38 <%
39 Pedidos.MoveNext
39 Loop
40 %>
41 </TABLE>
42 <BR>
43 <HR>
44 </BODY>
45 </HTML>
Figura 8.19: Página que utiliza uma conexão criada no evento Session_OnStart.
495
Criando Sites Dinâmicos com ASP 3.0
Evento Session_OnEnd
Embora possamos criar variáveis e objetos no evento Application_OnEnd isto não teria
utilidade prática. Normalmente utilizamos o evento OnEnd para funções administrativas,
tais como gravar informações em um log de auditoria ou para gravar escolhas feita pelo usuário
em um banco de dados.
A seguir temos um exemplo de definição de código para o evento OnEnd. Neste exemplo
estamos retirando o objeto conexao da memória, para liberar recursos no servidor Web.
<SCRIPT LANGUAGE=“VBScript” RUNAT.= “Server”>
Sub Application_OnEnd
Set Application(“conexao”) = Nothing
End Sub
</SCRIPT>
Coleção Descrição
Contents Contém todos os itens que foram adicionados para uma
sessão, com exceção dos que foram declarados com a tag
<OBJECT>. Todas as variáveis e objetos criados com Set,
fazem parte desta coleção. Podemos usar a coleção Contents
para obter uma lista de itens aos quais tenha sido atribuído
escopo da sessão. É possível também remover os itens da
coleção com os métodos Remove e RemoveAll.
496
Capítulo 8 – Aplicativos Web e Componentes
Coleção Descrição
StaticObjects A coleção StaticObjects contém todos os objetos criados com
as tags <OBJECT> dentro do escopo da sessão. Podemos usar
esta coleção para determinar o valor de uma propriedade
específica de um objeto ou fazer interação através da coleção
e recuperar todas as propriedades de todos os objeto.
Agora passaremos a estudar a sintaxe e alguns exemplos de utilização das coleções do objeto
Session.
A Coleção Contents
Para acessarmos um item da coleção Contents, utilizamos a seguinte sintaxe:
Session.Contents(Chave)
Por exemplo, vamos supor que as seguintes variáveis tenham sido criadas no arquivo global.asa,
no evento Application_OnStart
Session(“Var1”) = “José da Silva”
Session (“Var2”) = “Maria do Socorro”
Session (“HoraDia”) = Hour(Time( ))
Como estamos trabalhando com uma coleção, podemos utilizar o operador For Each...Next
para percorrer todos os itens da coleção Contents. No exemplo de código a seguir, exibimos o
nome de todos os elementos da coleção Contents.
497
Criando Sites Dinâmicos com ASP 3.0
<%
For Each elemento in Session.Contents
Response.Write “Nome do elemento: ” & elemento & “<BR>”
Next
%>
Considere a Listagem 8.12, onde fazemos uso do operador For Each...Next para exibir o nome
de todos os itens da coleção Contents do objeto Session.
8 <%
9 Response.Write “Elementos da coleção Contents. <HR>”
13 Response.Write “<HR>”
14 %>
15 </BODY>
16 </HTML>
Ao carregarmos esta página no Internet Explorer, obtemos o resultado indicado na Figura 8.20.
498
Capítulo 8 – Aplicativos Web e Componentes
Figura 8.20: Usando For Each...Next para exibir o nome dos elementos da coleção Contents.
Poderíamos modificar a Listagem 8.11, para que além de exibir o nome de cada elemento, a
mesma exibisse o valor de cada um dos elementos. Esta alteração está indicada na Listagem 8.12.
6 <BODY>
7 <HR>
499
Criando Sites Dinâmicos com ASP 3.0
20 <%
21 Next
22 Response.Write “<HR>”
23 %>
24 </TABLE>
25 </BODY>
26 </HTML>
Ao carregarmos esta nova versão da página, no Internet Explorer, obtemos o resultado indicado
na Figura 8.21.
Figura 8.21: Usando For Each...Next para exibir o nome e o conteúdo dos
elementos da coleção Contents.
500
Capítulo 8 – Aplicativos Web e Componentes
A Coleção StaticObjects
Para acessarmos um item da coleção StaticObjects, utilizamos a seguinte sintaxe:
Session.StaticObjects(Chave)
Como estamos trabalhando com uma coleção, podemos utilizar o operador For Each...Next
para percorrer todos os itens da coleção Contents. No exemplo de código a seguir, exibimos o
nome de todos os elementos da coleção StaticObjects.
<%
For Each elemento in Session.StaticObjects
Response.Write “Nome do elemento: ” & elemento & “<BR>”
Next
%>
Agora que já conhecemos os eventos e coleções do objeto Session, vamos ao estudo dos
métodos deste objeto.
Método Descrição
Abandon O método Abandon elimina todos os objetos
armazenados em um objeto Session e libera seus
recursos. Se você não chamar o método Abandon
explicitamente, o servidor eliminará esses objetos
quando a sessão atingir seu tempo limite. Quando o
método Abandon é chamado, o objeto Session atual é
colocado em fila para exclusão, mas na verdade não é
excluído até que todos os comandos de script da página
atual tenham sido processados. Isso significa que você
pode acessar as variáveis armazenadas no objeto
Session na mesma página que utilizou o método
Abandon, mas não em quaisquer páginas subseqüentes
da aplicação Web.
501
Criando Sites Dinâmicos com ASP 3.0
Método Descrição
Contents.Remove O método Session.Contents.Remove exclui um item
especificado da coleção Contents. O método
Contents.Remove considera uma seqüência de
caracteres ou um inteiro como um parâmetro de
entrada. Se o parâmetro de entrada for uma seqüência
de caracteres, o método pesquisará a coleção Contents
para localizar um item com esse mesmo nome e o
removerá. Se o parâmetro de entrada for um inteiro, o
método contará o número de itens equivalente a partir
do início da coleção e removerá o item correspondente.
Contents.RemoveAll O método Session.Contents.RemoveAll remove todos os
itens que foram adicionados à coleção Session.Contents.
Agora vamos analisar alguns exemplos de código que utilizam os métodos do objeto Session.
No exemplo a seguir são adicionadas três variáveis em nível de sessão. Depois utilizamos o
método Contents.Remove para remover uma das variáveis.
<%
Session(“Nome”) = Request.Form(“nome”)
Session (“Idade”) = Request.Form(“idade”)
Session (“ValorDolar”) = 1.72
Session.Contents.Remove(Idade)
%>
No exemplo a seguir são adicionadas três variáveis em nível de sessão. Depois utilizamos o
método Contents.RemoveAll para remover todas as variáveis, inclusive as que tenham sido
adicionadas pela sessão do usuário, em outras páginas ASP da aplicação, ou através do arquivo
global.asa utilizando o método Session_OnStart.
<%
Session (“Nome”) = Request.Form(“nome”)
Session (“Idade”) = Request.Form(“idade”)
502
Capítulo 8 – Aplicativos Web e Componentes
Observe o exemplo a seguir, onde utilizamos o método Session.Abandon, porém após termos
utilizado este método, definimos e exibimos uma variável em nível de sessão. Esta variável será
exibida pois, conforme descrito anteriormente, a sessão somente será destruída após todas as
linhas de Script da página que chamou o método Session.Abandon terem sido executadas.
<%
Session.Abandon
Session(“NomeUsuario”) = “José da Silva”
Response.Write “Nome do usuário: ” & Session (“NomeUsuario”)
%>
NOTA
O servidor cria um novo objeto Session quando você abre uma página subseqüente da aplicação
Web depois de abandonar uma sessão. Você pode armazenar variáveis e objetos nesse novo
objeto Session.
Propriedade Descrição
CodePage É uma propriedade de leitura e escrita, representada por um
número inteiro. A propriedade CodePage determina a página
de código que será usada para exibir o conteúdo dinâmico de
uma página ASP. Uma página de código é um conjunto de
caracteres que pode incluir números, marcas de pontuação e
503
Criando Sites Dinâmicos com ASP 3.0
Propriedade Descrição
outros hieróglifos. Diferentes idiomas e locais podem usar
diferentes páginas de código. Por exemplo, a página de código
ANSI 1252 é usada para o inglês americano e a maioria dos
idiomas europeus; a página de código OEM 932 é usada para
o Kanji japonês.
LCID A propriedade LCID determina o identificador de local que
será usado para exibir o conteúdo dinâmico.
SessionID A propriedade SessionID retorna o identificador da sessão,
um identificador exclusivo que é gerado pelo servidor quando
a sessão é criada. Uma identificação da sessão é retornada
como um tipo de dado LONG.
TimeOut A propriedade TimeOut especifica o tempo limite de duração
do objeto Session para esse aplicativo, em minutos. Se o
usuário não atualizar ou solicitar uma página dentro do período
de limite de tempo, a sessão é encerrada pelo servidor IIS.
Número Descrição
437 MS-DOS / EUA
850 MS-DOS / Internacional
1251 Windows / Rússia
504
Capítulo 8 – Aplicativos Web e Componentes
Número Descrição
1252 Windows/ ANSI
1253 Windows/ Grécia
10000 Macintosh/ Padrão
NOTA
As configurações de localidade definem diversas configurações, como por exemplo o símbolo da
moeda, o número de casas decimais, o formato da data e da hora, etc. São as opções configuradas
através do ícone Opções regionais do Painel de Controle. Para maiores detalhes sobre a
configuração das Opções regionais, consulte o Capítulo 2 do livro “Microsoft Windows 2000
Server Curso Básico & Rápido”, de minha autoria e publicado pela editora Axcel Books.
O número varia, pois para cada sessão este número é gerado automaticamente pelo servidor IIS.
505
Criando Sites Dinâmicos com ASP 3.0
IMPORTANTE
Você não deve usar a propriedade SessionID para gerar valores de chave primária para um
aplicativo de banco de dados. Isso porque se o servidor Web for reinicializado, alguns valores
de SessionID poderão ser os mesmos daqueles gerados antes do servidor ser parado. Em vez
disso, você deve usar os campos de auto-incremento do próprio banco de dados.
Com isso encerramos o estudo destes dois importantes objetos do ASP: Application e Session.
Conclusão
Neste capítulo estudamos alguns conceitos fundamentais, tais como:
➥ O que é uma aplicação Web no IIS.
➥ Quais os componentes de uma aplicação Web no IIS.
➥ O problema de manter o estado de uma conexão.
Aprendemos sobre quais elementos que compões uma aplicação Web no servidor IIS. Também
tratamos sobre as configurações de uma aplicação Web, utilizando o Gerenciador do Internet
Services. Aprendemos sobre diversas propriedades que podem ser configuradas para uma
aplicação Web.
Na seqüência aprendemos sobre o arquivo global.asa. Vimos que toda aplicação Web pode
conter um arquivo global.asa, no qual podem ser definidas variáveis de inicialização, tanto em
nível de aplicação quanto em nível de sessão. Para isso utilizamos, basicamente, quatro eventos
para os quais podemos escrever código no arquivo global.asa. Os eventos são os seguintes:
➥ Application_OnStart
➥ Application_OnEnd
➥ Session_OnStart
➥ Session_OnEnd
506
Capítulo 8 – Aplicativos Web e Componentes
O próximo passo foi o estudo detalhado do objeto Session. Foram explicados e exemplificados
todos os métodos, coleções, eventos e propriedades deste objeto. Apresentamos alguns
exemplos completos de utilização do objeto Session, tanto no arquivo global.asa quanto em
páginas ASP. Criamos um objeto do tipo ADODB.Connection, no evento Session_OnStart e
depois utilizamos este objeto em exemplos de páginas ASP.
No próximo capítulo iremos estudar alguns aspectos de segurança. Hoje em dia, com a
crescente onda de ataques a sites e aplicativos Web, em um mundo em que milhões de usuários
estão conectados a Internet, a questão de segurança é crítica. Iremos analisar algumas medidas
que podem melhorar o nível de segurança de nossos sites e aplicações Web, embora a
“criatividade” dos ataques tem sido cada vez mais surpreendente.
507
Capítulo 9 – Segurança de Aplicações Web com IIS e ASP
Capítulo 9
Segurança de Aplicações
Web com IIS e ASP
509
Criando Sites Dinâmicos com ASP 3.0
Quando se fala de Internet nos dias de hoje, o assunto mais tratado, sem nenhuma dúvida, é
Segurança. Muitos relatos, alguns verdadeiros e outros mais fantasiosos, sobre invasões
mirabolantes, roubo de número de cartões de créditos, acesso a informações sigilosas de
órgãos governamentais e assim por diante.
Não podemos negar que o problema de segurança existe e é crítico, principalmente hoje
quando o Comércio Eletrônico é, mais do que uma realidade, uma necessidade e um diferencial
competitivo para as empresas. O diferencial competitivo não é entrar ou não no mundo do e-
business, e sim criar serviços agregados ao Comércio Eletrônico, capazes de gerar diferenciais
competitivos. Assuntos como fidelização do cliente, melhorias nos sistemas de CRM –
Customer Relationship Management (Gerenciamento das Relações com o Cliente), B2B –
Bussines to Bussines, B2C – Bussines to Consumer e outros, estão em evidência.
Existem os mais variados tipos de ataques pela Internet. Um engano comum é pensar que
único tipo ataque capaz de causar prejuízos é aquele que rouba ou destrói dados. No caso de
um site de Comércio Eletrônico, qualquer ataque que torne o site indisponível por um
determinado período de tempo causa prejuízos incalculáveis. Isso porque, além das compras
que deixaram de ser realizadas no período de indisponibilidade, tem a questão da imagem da
empresa, e da possibilidade de o cliente ter feito a compra no site do concorrente, gostar, e
passar a fazer as próximas compras lá.
Por todos estes motivos é que a questão de segurança é fundamental e deveria ser prioritária
quando tratamos de aplicações Web. Outro fato importante a ser mencionado é que a maioria
dos ataques, ao contrário do que muitos pensam, é originado na Intranet da própria empresa.
Pode ser um funcionário descontente ou desonesto, ou um usuário com permissões de acesso
indevidas que causa algum prejuízo por imperícia técnica. O fato é que a Segurança não deve
ser tratada apenas como uma questão de proteção contra “as forças do mal que vem da Internet”.
O que precisa-se é definir uma política de segurança que permita que todos possam realizar
o seu trabalho, porém com os níveis de permissão adequados.
Outro erro bastante comum é achar que a questão de segurança é responsabilidade somente
da equipe de desenvolvimento ou do administrador da rede. Na verdade o item segurança é
510
Capítulo 9 – Segurança de Aplicações Web com IIS e ASP
Conforme veremos neste capítulo, existem aspectos de segurança que são de responsabilidade
do desenvolvimento e outros que são de responsabilidade da administração de rede. Na
verdade, o que se faz é criar várias barreiras para que o hacker não tenha sucesso em sua
tentativa de invasão. Algumas destas barreiras são criadas na própria rede da empresa e
outras em nível de aplicação Web.
De maneira alguma temos a pretensão de que este capítulo seja um guia completo para a
segurança na Internet e para o Comércio Eletrônico. O objetivo é fornecer as informações
básicas para que o usuário possa tomar as medidas mínimas necessárias para garantir algum
grau de segurança para seu site e suas aplicações Web.
Quando trabalhamos com ASP, IIS e Windows 2000 Server, o endereço a seguir é de consulta
obrigatória para assuntos relacionados à segurança de tecnologias Microsoft: http://www.
microsoft.com/security.
Neste site são publicados boletins sobre segurança dos produtos Microsoft. Sempre que algum
novo problema é descoberto, são divulgadas informações sobre o problema, bem como a maneira
de corrigi-los. Também são disponibilizados arquivos para download. Estes arquivos normalmente
contém correções (Hot-fix) que devem ser aplicadas para solucionar problemas de segurança.
NOTA
Para acompanhar este capítulo o usuário deve conhecer alguns aspectos básicos do Windows
2000 Server, tais como: Permissões NTFS; Contas de Usuários e Grupos de Usuários; Utilização
do MMC – Microsoft Management Console e de Snap-in.
DICA
Para informações sobre estes itens, consulte o livro Windows 2000 Server Curso Básico & Rápido,
de minha autoria, publicado pela editora Axcel Books.
511
Criando Sites Dinâmicos com ASP 3.0
O Acesso Anônimo
Um tipo de autenticação bastante comum é o que permite o acesso anônimo. O IIS permite
que seja configurado um tipo de acesso chamado Acesso Anônimo, no qual não é necessário
que o usuário forneça um username e senha para ter acesso ao site. Este acesso anônimo está
ligado a uma única conta de usuário do Windows 2000 Server. Todo o usuário que acessar
um site configurado para permitir acesso anônimo, será identificado como se estivesse
autenticado usando a conta de usuário configurada para este tipo de acesso.
Por exemplo, ao instalarmos o IIS em um servidor chamado SERVER02SP, será criada a seguinte
conta para permitir o acesso anônimo:
IUSR_SERVER02SP
A autenticação anônima fornece aos usuários acesso a áreas públicas do seu site, sem solicitar
um nome de usuário ou uma senha.
512
Capítulo 9 – Segurança de Aplicações Web com IIS e ASP
Se existem vários sites no seu servidor ou áreas no seu site que exigem privilégios de acesso
diferentes, você pode criar várias contas anônimas, uma para cada área site, diretório ou arquivo.
Por exemplo, você pode querer medir o nível de acesso a diferentes áreas do seu site, utilizando
para isso diferentes contas para o acesso anônimo a cada uma destas áreas.
NOTA
Veremos sobre os outros métodos de autenticação ainda neste capítulo.
Na Figura 9.1, temos uma representação desta seqüência para o acesso anônimo.
513
Criando Sites Dinâmicos com ASP 3.0
IUSR_SERVER02SP IUSR_SERVER02SP
tem permissões não tem permissões
NTFS, então acesso OK. NTFS, acesso negado.
Autenticado:
Usuário
IUSR_SERVER02SP
Servidor: SERVER02SP
Se a autenticação anônima for ativada, o IIS tentará sempre a autenticação usando-a primeiro,
mesmo se outros métodos forem ativados.
Você pode alterar a conta usada para a autenticação anônima no Snap-in do IIS, no nível de
serviço do servidor Web ou para diretórios virtuais ou arquivos individuais.
A conta anônima deve ter o direito de usuário de efetuar logon localmente. Se a conta não
tiver a permissão “Efetuar logon localmente”, o IIS não poderá atender qualquer solicitação
anônima. Ao instalarmos o IIS, automaticamente, a permissão “Efetuar logon localmente” é
concedida à conta IUSR_NOME_DO_COMPUTADOR.
NOTA
As contas IUSR_NOME_DO_COMPUTADOR em controladores de domínio não são adicionadas
ao grupo Convidados do domínio, por padrão, e devem ser alteradas para Efetuar logon
localmente a fim de permitir logon anônimo.
514
Capítulo 9 – Segurança de Aplicações Web com IIS e ASP
Estas atividades são importantes, não só para as configurações do acesso anônimo, mas para
a configuração de qualquer tipo de acesso.
DICA
Para informações mais detalhadas sobre estes itens, consulte o livro Windows 2000 Server
Curso Básico & Rápido de minha autoria, publicado pela editora Axcel Books.
515
Criando Sites Dinâmicos com ASP 3.0
7. Neste momento podemos configurar o acesso anônimo para todos os aplicativos Web
contidos no servidor ou para cada aplicativo individualmente. Inclusive podemos
configurar diferentes contas do Windows 2000 Server, para serem utilizadas para o
acesso anônimo em diferentes áreas do site. Podemos configurar uma conta a nível do
servidor Web, de cada aplicação e até mesmo para uma pasta dentro de uma aplicação.
Com isso poderíamos ter diferentes pastas, dentro de uma mesma aplicação Web (que
para o IIS é representada por uma pasta virtual, conforme descrito no capítulo ante-
rior), com diferentes contas para acesso anônimo.
8. No nosso exemplo, iremos configurar uma única conta para acesso anônimo para todo
o site. O procedimento é o mesmo quer seja para o site como um todo, para uma
aplicação Web do site ou para uma pasta dentro da aplicação Web.
9. Clique com o botão direito do mouse sobre a opção Site da Web padrão (ou na opção
correspondente, caso você tenha alterado este nome). No menu de opções que surge
dê um clique em Propriedades.
10. Será exibida a janela Propriedades de Site Web padrão, conforme indicado na Figura 9.4.
11. Dê um clique na guia Segurança de pasta. Serão exibidas as opções indicadas na Figura 9.5.
12. A primeira opção desta guia é Controle de acesso anônimo e autenticação. Dê um
clique no botão Editar, ao lado desta opção. Surge a janela Métodos de autenticação,
indicada na Figura 9.6.
13. A primeira opção desta janela é Acesso anônimo. Para que o acesso anônimo seja
permitido, esta opção deve estar marcada.
14. Para definir a conta que será utilizada para o acesso anônimo, dê um clique no botão
Editar desta opção.
15. Será exibida a janela Conta de usuário anônimo, conforme indicado na Figura 9.7.
516
Capítulo 9 – Segurança de Aplicações Web com IIS e ASP
517
Criando Sites Dinâmicos com ASP 3.0
16. Nesta janela você pode definir a conta que será utilizada para o acesso anônimo. Ob-
serve que por padrão é definida a conta IUSR_NOME_DO_COMPUTADOR. No exemplo
da Figura 9.7, aparece IUSR_SERVIDOR, pois o computador que estou utilizando para
escrever este livro tem o nome de SERVIDOR.
17. Caso você queira utilizar outra conta e não lembre o nome da mesma, é só clicar no
botão Procurar, que será exibida uma lista de usuários do Windows 2000.
18. A opção Permitir que o IIS controle a senha é interessante de ser comentada. Esta
opção quando selecionada permite ao IIS sincronizar automaticamente as configurações
de senha anônima com aquelas definidas no Windows 2000. Se a senha fornecida à
518
Capítulo 9 – Segurança de Aplicações Web com IIS e ASP
Porém mais adiante, por algum motivo ou por solicitação do Administrador do IIS, a senha
para esta conta é alterada no Windows 2000. Como a sincronização não está ativada, o IIS
continua tentando usar a senha antiga. Como as duas senhas estão diferentes o acesso é
negado e o usuário recebe uma mensagem de acesso negado ao tentar acessar o site.
IMPORTANTE
A sincronização de senhas deve ser usada somente com contas de usuário anônimas definidas
no computador local e não com contas anônimas de computadores remotos.
19. Após ter configurado as informações para a conta de acesso anônimo, dê um clique em OK.
20. Você estará de volta à janela Métodos de autenticação, dê um clique em OK para fechá-la.
21. Você estará de volta à janela Propriedades do site da Web padrão, dê um clique em OK
para fechá-la.
22. Você estará de volta ao Gerenciador do Internet Services. Feche-o.
NOTA
Para definir uma conta de acesso anônimo diferente para uma das aplicações Web do site, ou
até mesmo para uma subpasta de uma aplicação Web, basta repetir os passos indicados.
519
Criando Sites Dinâmicos com ASP 3.0
NOTA
Se o servidor que você estiver utilizando for um controlador de domínio, você deve abrir o
console para Gerenciamento do Active Directory. As opções que surgem podem ser um pouco
diferentes das apresentadas neste exemplo.
520
Capítulo 9 – Segurança de Aplicações Web com IIS e ASP
9. Para saber a quais grupos o usuário pertence, dê um clique na guia Participante de,
com isso veremos que o usuário IUSR_SERVIDOR somente pertence ao grupo
Convidados. Se estivéssemos em um servidor que atua como controlador de domínio,
teríamos o grupo Convidados do domínio.
521
Criando Sites Dinâmicos com ASP 3.0
DICA
Para informações mais detalhadas sobre Controladores de domínio e Active Directory, consulte
o livro Windows 2000 Server Curso Básico & Rápido, de minha autoria, publicado pela editora
Axcel Books.
522
Capítulo 9 – Segurança de Aplicações Web com IIS e ASP
Agora precisamos verificar se a conta IUSR_SERVIDOR tem a permissão para efetuar logon local.
NOTA
Se o servidor que você estiver utilizando for um controlador de domínio, você deve abrir o
console para Gerenciamento do Active Directory. As opções que surgem podem ser um pouco
diferentes das apresentadas aqui.
523
Criando Sites Dinâmicos com ASP 3.0
9. Dê um clique duplo sobre a permissão Efetuar logon local, para exibir a janela de
configurações para esta Diretiva de segurança local. Nesta janela surge uma lista dos
usuários que possuem a permissão de Efetuar logon local, conforme indicado na Figura
9.15. O usuário IUSR_SERVIDOR deve fazer parte da lista.
10. Caso o usuário IUSR_SERVIDOR não estivesse na lista, você poderia adicioná-lo
utilizando o botão Adicionar.
524
Capítulo 9 – Segurança de Aplicações Web com IIS e ASP
11. A permissão Efetuar logon local autoriza o usuário a fazer o logon no console do servidor,
isto é, localmente no servidor. A conta utilizada para acesso anônimo precisa desta
permissão, caso contrário o acesso anônimo não irá funcionar.
12. Dê um clique no botão OK para voltar ao console Configurações locais de segurança.
13. Feche-o.
Com isso já sabemos que a conta para acesso anônimo está configurada corretamente. No próximo
item vamos retirar as permissões NTFS da conta de acesso anônimo de uma das aplicações
Web do servidor. Vamos tentar acessar esta aplicação e observar os resultados obtidos.
525
Criando Sites Dinâmicos com ASP 3.0
definimos permissões NTFS. Isso reforça o fato de que a segurança é tanto responsabilidade
do grupo de desenvolvimento, quanto do administrador da rede.
Antes de aprendermos a definir permissões NTFS vamos aprender um pouco mais sobre as mesmas.
Um sistema de arquivos determina a maneira como o Windows 2000 Server organiza e recupera
as informações no disco rígido ou em outros tipos de mídia. O Windows 2000 Server reconhece
os seguintes sistemas de arquivos:
➥ FAT
➥ FAT32
➥ NTFS
➥ NTFS 5
O sistema FAT vem desde a época do DOS e tem sido mantido por questões de compatibilidade.
Além disso, se você tiver instalado mais de um Sistema Operacional no seu computador,
alguns sistemas mais antigos (DOS, Windows 3.x e as primeiras versões do Windows 95)
somente reconhecem o sistema FAT. Com o sistema de arquivos FAT, a única maneira de
restringir o acesso ao conteúdo de uma pasta compartilhada, é através das permissões de
compartilhamento, as quais, não tem efeito no caso de acessos pela Internet, através do IIS.
Com a utilização do sistema FAT, alguns recursos avançados, tais como compressão, criptografia
e auditoria, não estão disponíveis.
O sistema FAT32 apresenta algumas melhorias em relação ao sistema FAT. Existe um melhor
aproveitamento do espaço no disco, com conseqüente menor desperdício. Um grande
inconveniente do sistema FAT32 é que ele não é reconhecido pelo Windows NT Server 4.0.
Com o sistema de arquivos FAT32, a única maneira de restringir o acesso ao conteúdo de uma
pasta compartilhada, é através das permissões de compartilhamento. Assim como ocorre
com a utilização do FAT, no sistema FAT32, alguns recursos avançados, tais como compressão,
criptografia e auditoria, não estão disponíveis.
526
Capítulo 9 – Segurança de Aplicações Web com IIS e ASP
O sistema de arquivos NTFS é utilizado no Windows NT Server 4.0 e foi mantido e melhorado
no Windows 2000 Server, por questões de compatibilidade, já que uma nova versão do NTFS
foi introduzida com o Windows 2000 – NTFS 5. É um sistema bem mais eficiente do que FAT
e FAT32, além de permitir uma série de recursos avançados, tais como:
➥ Permissões a nível de arquivos e pastas.
➥ Compressão.
➥ Auditoria de acesso.
➥ Partições bem maiores do que as permitidas com FAT e FAT32.
➥ Desempenho bem superior do que com FAT e FAT32.
Uma das principais vantagens do NTFS é que o mesmo permite que sejam definidas permissões
de acesso a nível de arquivo e de pastas, isto é, posso ter arquivos em uma mesma pasta, com
permissões diferentes para usuários diferentes. Além disso, as permissões NTFS têm efeito
localmente, isto é, mesmo que o usuário faça o logon no computador onde um determinado
arquivo existe, se o usuário não tiver as permissões NTFS necessárias, ele não poderá acessar
o arquivo. Isso confere um alto grau de segurança, desde que as permissões NTFS sejam
configuradas corretamente.
No Windows 2000 Server, conforme descrito anteriormente, temos também o NTFS 5, o qual
apresenta diversas melhorias em relação ao NTFS, tais como:
➥ Criptografia de arquivos e pastas (a criptografia é uma maneira de “embaralhar” a
informação de tal forma que mesmo que um arquivo seja copiado, o mesmo se torna
ininteligível, a não ser para a pessoa que possui a “chave” para descriptografá-lo).
➥ Cotas de usuário, fazendo com que seja possível limitar o espaço em disco que cada
usuário pode utilizar.
➥ Gerenciamento e otimização melhorados.
Um inconveniente do NTFS 5 é que ele não é reconhecido pelas versões anteriores, tais como
o Windows NT Server 4.0. Caso você possua uma rede na qual estão presentes servidores
com o Windows 2000 Server e com o Windows NT Server 4.0, planeje com bastante cuidado
a utilização do NTFS 5.
Com relação às permissões NTFS, temos um conjunto diferente de permissões quando tratamos
de pastas ou arquivos. Nas Tabelas 9.1 (para pastas) e 9.2 (para arquivos), são apresentadas as
permissões e o nível de acesso para cada uma delas.
527
Criando Sites Dinâmicos com ASP 3.0
528
Capítulo 9 – Segurança de Aplicações Web com IIS e ASP
Todo arquivo ou pasta em uma unidade formatada com NTFS, possui uma Lista de Controle
de Acesso (Access Control List ) – ACL. Nesta ACL ficam uma lista de todas as contas de
usuários e grupos para os quais foi garantido acesso para o recurso, bem como o nível de
acesso de cada um deles.
Agora que já conhecemos um pouco mais sobre permissões NTFS, podemos aprender como
configurar estas permissões.
529
Criando Sites Dinâmicos com ASP 3.0
Para acessar as permissões NTFS de uma pasta e retirar as permissões do usuário IUSR_SERVIDOR,
faça o seguinte:
1. Faça o logon com privilégios de administrador.
2. Utilizando o Windows Explorer, localize a pasta cujas permissões NTFS serão alteradas.
3. Dê um clique com o botão direito do mouse sobre a pasta. No menu de opções que
surge dê um clique em Propriedades.
4. Surge a janela indicada na Figura 9.16.
530
Capítulo 9 – Segurança de Aplicações Web com IIS e ASP
7. Observe que a conta com a descrição Conta de convidado da Internet é a conta para
acesso anônimo, que no nosso exemplo é IUSR_SERVIDOR. Somente possuem
permissão de acesso, as contas que fazem parte desta lista.
8. Dê um clique no botão Avançado. Surge a janela indicada na Figura 9.18.
9. Observe que a conta para acesso anônimo, possui permissão somente de leitura.
10. Vamos remover as permissões da conta IUSR_SERVIDOR (Conta de convidado da
Internet). Para isso dê um clique sobre a conta para marcá-la, depois dê um clique no
botão Remover.
11. A conta IUSR_SERVIDOR não aparece mais na listagem.
12. Marque a opção Redefinir opções em todos os objetos filhos e permitir a propagação
das permissões herdades. Esta opção deve ser marcada para que as alterações que
estão sendo feitas na pasta, sejam propagadas para todas as subpastas e arquivos
pertencentes a esta pasta. Esta modificação é necessária para que a permissão para o
usuário IUSR_SERVIDOR seja retirada de todos os arquivos pertencentes a pasta que
está sendo alterada.
531
Criando Sites Dinâmicos com ASP 3.0
Agora que retiramos as permissões do usuário anônimo, se alguém tentar acessar algum arquivo
que está na pasta cujas permissões foram retiradas, irá receber uma mensagem de erro,
conforme indicado na Figura 9.20.
Veja que a mensagem informa que o acesso à página solicitada foi negado. Isto acontece
porque o usuário IUSR_SERVIDOR não possui as permissões NTFS necessárias.
532
Capítulo 9 – Segurança de Aplicações Web com IIS e ASP
Figura 9.19: Lista de permissões, onde foi retirada a permissão de acesso para o usuário anônimo.
Figura 9.20: Mensagem de erro ao tentar acessar uma página para a qual o usuário anônimo
(conta IUSR_SERVIDOR, no nosso exemplo) não tem mais permissão de acesso.
533
Criando Sites Dinâmicos com ASP 3.0
IMPORTANTE
Caso você teste o acesso localmente no servidor onde a página está gravada e a autenticação
integrada esteja habilitada, você terá acesso à página. Isto acontece porque o IIS tenta primeiro
acesso com a autenticação anônima. Não obtém sucesso. Se a autenticação integrada (a qual
utiliza a conta do Windows que você utilizou para fazer o logon) estiver habilitada, o IIS tenta
utilizá-la. Caso a conta que você utilizou para fazer o logon tenha permissão de acesso à
página, o IIS libera o acesso. Isto também é válido para usuários da sua rede local que fizeram
o logon em um domínio do Windows NT Server 4.0 ou do Windows 2000 e cujas contas ou
grupos a que pertencem possuam permissão de acesso para o arquivo solicitado. Nos próximos
itens veremos mais sobre a autenticação integrada.
Agora vamos restaurar as permissões NTFS para o usuário IUSR_SERVIDOR e testar para ver
se ele voltou a ter acesso.
534
Capítulo 9 – Segurança de Aplicações Web com IIS e ASP
5. Observe que a conta com a descrição Conta de convidado da Internet, que é a conta
para acesso anônimo (no nosso exemplo, IUSR_SERVIDOR), não aparece na lista de
usuários, portanto a mesma não possui permissões de acesso.
6. Dê um clique no botão Avançado. Observe que, na janela que surge, a conta
IUSR_SERVIDOR também não está na listagem, conforme indicado na Figura 9.22.
7. Dê um clique no botão Adicionar. Surge uma janela com a listagem de usuários. Localize
o usuário IUSR_SERVIDOR e dê um clique sobre o mesmo para marcá-lo, conforme
indicado na Figura 9.23.
8. Dê um clique no botão OK. Surge uma janela pedindo para que você defina as
permissões NTFS para o usuário IUSR_SERVIDOR.
9. Defina as permissões conforme indicado na Figura 9.24 e dê um clique no botão OK.
10. Você estará de volta à janela de opções avançadas. Certifique-se de que a opção –
Redefinir permissões em todos os objetos filho e permitir a propagação das permissões
herdadas – esteja marcada.
11. Dê um clique no botão OK para voltar à janela de propriedades da pasta.
535
Criando Sites Dinâmicos com ASP 3.0
12. Surge uma janela pedindo confirmação, conforme indicado na Figura 9.25. Dê um
clique em Sim para continuar.
536
Capítulo 9 – Segurança de Aplicações Web com IIS e ASP
537
Criando Sites Dinâmicos com ASP 3.0
Feito isso foram reatribuídas as permissões NTFS originais e qualquer usuário volta a ter
acesso à pasta (no nosso exemplo era a pasta Capitulo6) e a todo o seu conteúdo, porém com
permissão somente para leitura.
Agora, o usuário já poderá acessar a página que não será mais retornada a mensagem de
acesso negado.
Com este exemplo, podemos constatar que o servidor IIS trabalha em sintonia com o Windows
2000, de tal forma que os recursos de segurança do Sistema Operacional podem ser utilizados
pelo IIS.
Nós detalhamos um pouco mais o primeiro tipo de acesso – Acesso anônimo –, para explicar
alguns conceitos importantes em detalhes. Agora passaremos a estudar outros tipos de
538
Capítulo 9 – Segurança de Aplicações Web com IIS e ASP
autenticação possíveis com o IIS. Lembrando que a autenticação com o IIS é apenas um dos
tantos níveis de segurança que podemos configurar.
Autenticação Básica
A autenticação básica é uma das mais antigas que existem, desenvolvidas desde a época dos
primeiros servidores Web como o NCSA e o Cern HTTP. Neste tipo de autenticação, o usuário
precisa fornecer um username e uma senha. O método de autenticação básica é um padrão
de mercado amplamente usado para coletar informações de nome de usuário e senha. A
autenticação básica funciona da seguinte forma:
1. O navegador exibe uma caixa de diálogo na qual o usuário pode digitar seu username
e senha de conta do Windows 2000 atribuídos anteriormente. Por isso, é um pré-
requisito da autenticação básica que o usuário já possua uma conta cadastrada no
Windows 2000.
2. O navegador tenta estabelecer uma conexão usando essas informações (a senha é
codificada com Base64 antes de ser enviada pela rede).
3. Se o servidor rejeita as informações, o navegador da Web exibe repetidamente a caixa
de diálogo até que o usuário digite um nome de usuário e uma senha válidos ou feche
a caixa de diálogo.
4. Quando o servidor Web verifica que o nome de usuário e a senha correspondem a uma
conta de usuário do Windows 2000 válida, a conexão é estabelecida e o acesso à página
solicitada é liberado.
A autenticação básica apresenta como principal requisito o fato de que o usuário deve ter
uma conta no Windows 2000. Para sites que são acessados por um grande número de usuários
pode não ser uma boa opção. Além disso, o fato do usuário ter que digitar um username e
senha não é muito “simpático”.
Uma das grandes desvantagens deste método de autenticação é o fato de que a senha não é
criptografada ao ser transmitida pela rede. A codificação que é feita é extremamente simples
de ser quebrada, por isso este método de autenticação não é dos mais seguros.
A vantagem da autenticação básica é que ela faz parte da especificação do HTTP e tem suporte
da maioria dos navegadores. A desvantagem é que, pelo fato dos navegadores que usam a
autenticação básica transmitirem senhas de forma descriptografada, ao monitorar as
comunicações na sua rede, alguém pode interceptar e decifrar facilmente essas senhas usando
ferramentas disponíveis publicamente na própria Internet. Portanto, a autenticação básica
não é recomendada, a menos que você tenha certeza que a conexão entre o usuário e seu
servidor Web é segura, como uma conexão direta via cabo ou uma linha dedicada.
539
Criando Sites Dinâmicos com ASP 3.0
IMPORTANTE
A autenticação integrada do Windows (que veremos logo em seguida) tem prioridade sobre a
autenticação básica. O navegador escolherá a autenticação integrada do Windows e tentará
usar as informações de logon atuais do Windows antes de solicitar ao usuário um nome e
senha. Atualmente, somente o Internet Explorer, versão 2.0 e posterior, oferece suporte à
autenticação integrada do Windows.
NOTA
O Internet Explorer, versão 4.0 e posterior, pode ser configurado para solicitar inicialmente
informações do usuário, se necessário. Para obter mais informações, consulte a documentação
do Internet Explorer.
540
Capítulo 9 – Segurança de Aplicações Web com IIS e ASP
Embora a autenticação integrada do Windows seja segura, ela tem duas limitações:
➥ Somente o Microsoft Internet Explorer, versão 2.0 ou posterior, oferece suporte a esse
método de autenticação.
➥ A autenticação integrada do Windows não funciona em conexões feitas através de um
servidor Proxy.
É possível usar um certificado de servidor para permitir que os usuários façam a autenticação do
seu site da Web antes de transmitir informações pessoais, como um número de cartão de crédito.
Além disso, você pode usar certificados de cliente para autenticar os usuários que solicitam
informações no seu site da Web. O SSL faz a autenticação, verificando o conteúdo de uma
identificação digital (Certificado Digital) criptografada, submetida pelo navegador do usuário
durante o processo de logon. (Os usuários obtêm certificados de cliente de uma organização
independente mutuamente confiável.) Os certificados de servidor contêm geralmente informações
sobre sua empresa e a organização que emitiu o certificado. Os certificados de cliente contêm
normalmente informações de identificação sobre o usuário e a organização que emitiu o certificado.
541
Criando Sites Dinâmicos com ASP 3.0
com um certificado de cliente, seu servidor Web associa automaticamente esse usuário à
conta de usuário do Windows apropriada. Dessa forma, você pode autenticar automaticamente
os usuários que fazem logon com certificados de cliente, sem exigir o uso da autenticação
básica ou integrada do Windows. É possível mapear um certificado de cliente para uma conta
de usuário do Windows ou muitos certificados de cliente para uma conta. Por exemplo, se
você tivesse vários departamentos ou empresas diferentes no seu servidor, cada uma com seu
próprio site da Web, seria possível usar o mapeamento vários-para-um para mapear todos os
certificados de cliente de cada departamento ou empresa para o próprio site da Web. Dessa
forma, cada site forneceria acesso somente aos próprios clientes.
O tipo de autenticação é apenas um dos aspectos que precisam ser definidos; devem ser
consideradas diversas outras questões. A seguir, algumas questões que devem ser levadas em
considerações na hora de decidir sobre o tipo de autenticação que iremos configurar no IIS,
ou se devemos configurar mais do que um tipo de autenticação.
➥ Para um site público, ou áreas de acesso público, a autenticação utilizando acesso anônimo
é a mais indicada, pois evita que o usuário tenha que fornecer um username e senha.
➥ Para acesso ao conteúdo de uma Intranet, uma das primeiras opções a serem pensadas
é a utilização da autenticação integrada do Windows. Pois sendo uma Intranet um
ambiente controlado, é possível garantir que todos os clientes satisfaçam as condições
exigidas pela autenticação integrada.
➥ Para sites que trabalham com dados sensíveis como serviços bancários pela Internet e
Comercio Eletrônico, sem dúvida que a utilização de Certificados Digitais é o mais
indicado. Em Intranets os certificados também têm sido utilizados, pois conforme
descrevemos no início do capítulo, a maioria dos ataques parte de usuários da Intranet
da empresa. Muitas vezes nos preocupamos muito com os ataques externos e
esquecemos as ameaças que vem de dentro da própria empresa.
542
Capítulo 9 – Segurança de Aplicações Web com IIS e ASP
543
Criando Sites Dinâmicos com ASP 3.0
544
Capítulo 9 – Segurança de Aplicações Web com IIS e ASP
14. Selecione as opções desejadas. Se você clicar na opção Autenticação básica, o IIS emite
um aviso de que para esta opção as senhas serão transmitidas sem criptografia, conforme
indicado na Figura 9.31.
Figura 9.31: Avisa de que na autenticação básica a senha é transmitida sem criptografia.
545
Criando Sites Dinâmicos com ASP 3.0
19. Para estender as configurações basta selecionar uma ou mais das opções mostradas e clicar
no botão OK. Você também pode utilizar o botão Selecionar tudo e depois clicar em OK.
20. Você estará de volta ao Gerenciador do Internet Services. Feche-o.
Para configurar as opções para uma pasta virtual em particular, basta localizá-la abaixo da
opção Site da Web padrão, clicar com o botão direito sobre a mesma e clicar na opção
Propriedades. Depois é só seguir os passos indicados anteriormente.
NOTA
Caso você não tenha criado uma pasta virtual Capítulo6, utilize qualquer pasta virtual
disponível no seu servidor IIS.
7. Clique com o botão direito do mouse sobre a opção Capitulo6. No menu de opções que
surge, dê um clique em Propriedades.
546
Capítulo 9 – Segurança de Aplicações Web com IIS e ASP
547
Criando Sites Dinâmicos com ASP 3.0
Figura 9.34: Listagem exibida quando a opção Pesquisa em Pasta está habilitada.
Caso esta opção não esteja marcada e o usuário digite o endereço para a pasta, sem especificar
um arquivo a ser carregado, será retornada a mensagem de erro indicada na Figura 9.35.
Figura 9.35: Mensagem de erro quando a opção Pesquisa em Pasta estiver desabilitada.
548
Capítulo 9 – Segurança de Aplicações Web com IIS e ASP
➥ Criar log de visitantes: Selecione esta opção para registrar as visitas feitas a este
diretório em um arquivo de Log. As visitas serão registradas somente se o log estiver
ativado para este site da Web.
➥ Indexar este recurso: Para permitir que o Serviço de indexação da Microsoft (Index
Services) inclua este diretório em um índice de texto completo do site da Web,
selecione esta opção.
De uma maneira geral, recomendo que as opções Gravação e Pesquisa em pasta sejam marcadas
somente em situações especiais e para áreas que não contenham dados confidenciais.
Quando uma página é solicitada, o IIS segue a seqüência indicada na Figura 9.36.
Servidor Web
recebe requisição.
Endereço IP
permitido?
Usuário permitido?
Permissões do
servidor Web concedem
acesso?
Permissões do
NTFS concedem
acesso?
549
Criando Sites Dinâmicos com ASP 3.0
Observe que primeiro o IIS verifica se o usuário tem permissões da Web para o recurso
solicitado. Se o usuário não tiver, a solicitação falha e o usuário recebe uma mensagem “403
Acesso proibido”. Depois, o IIS verifica as permissões do NTFS para o recurso. Se o usuário
não tiver permissões do NTFS para o recurso, a solicitação falha e o usuário recebe uma
mensagem “401 Acesso negado”.
Então a resposta para o nosso exemplo é que o usuário não conseguiria gravar o conteúdo,
pois o mesmo não teria as permissões NTFS necessárias e receberia a mensagem de erro “401
Acesso negado”.
NOTA
Caso você não tenha criado uma pasta virtual Capítulo6, utilize qualquer pasta virtual
disponível no seu servidor IIS.
7. Clique com o botão direito do mouse sobre a pasta Capitulo6. No menu de opções que
surge dê um clique em Propriedades.
8. Será exibida a janela Propriedades de Capitulo6.
9. Certifique-se de que estão sendo exibidas as opções da guia Pasta.
10. Na parte de baixo da guia Pasta, temos um grupo de opções chamado Configurações do
aplicativo. A seguir temos uma descrição de cada uma destas opções.
Conforme descrito anteriormente, um aplicativo da Web do IIS é definido pela estrutura de
diretórios em que está localizado. Para obter mais informações, consulte o Capítulo 8 deste livro.
550
Capítulo 9 – Segurança de Aplicações Web com IIS e ASP
NOTA
Para determinar qual opção representa uma aplicação Web e qual é simplesmente uma pasta
virtual é só observar o ícone ao lado do nome, no Gerenciador do Internet Services. Opções que
são simplesmente uma pasta virtual são representadas por um envelope amarelo, já aplicações
Web possuem um ícone que parece uma caixa aberta, conforme indicado na Figura 9.37.
551
Criando Sites Dinâmicos com ASP 3.0
Figura 9.37: Ícones para uma aplicação Web e para uma pasta virtual.
Por exemplo, vamos supor que existe uma área do site que é para desenvolvimento, e que a
mesma não deva ser acessada nem por usuários da Intranet da empresa, muito menos por
usuários da Internet. Somente os participantes do grupo de desenvolvimento é que devem ter
acesso a esta parte do site. Podemos, sem maiores problemas, limitar o acesso, de tal maneira
que somente as estações de trabalho dos desenvolvedores tenham acesso a área de
desenvolvimento do site.
Neste item aprenderemos a configurar uma aplicação Web ou uma pasta virtual do IIS, para
limitar o acesso com base no endereço IP do usuário.
552
Capítulo 9 – Segurança de Aplicações Web com IIS e ASP
Figura 9.38: Janela para configuração das restrições de nome de domínio e endereço IP.
Observe que temos duas opções para configuração, conforme descrito a seguir:
➥ Acesso permitido: Se esta opção estiver marcada, todos terão acesso ao site, com exceção
dos endereços IP que estiverem indicados na listagem Exceto os listados abaixo. Este
mecanismo é chamado de “Lista Negra”, ou seja, todo mundo tem acesso, com exceção
de quem está na lista.
➥ Acesso negado: Se esta opção estiver marcada, ninguém terá acesso ao site, com exceção
dos endereços IP que estiverem indicados na listagem Exceto os listados abaixo. Este
mecanismo é chamado de “Lista Branca”, ou seja, ninguém tem acesso, com exceção
de quem está na lista.
9. A título de exemplo, deixe marcada a opção Acesso permitido. Agora vamos negar
acesso para um computador específico.
NOTA
No exemplo do livro estarei negando acesso para o IP: 10.204.123.1, que é o endereço IP do
meu computador. Utilize o endereço IP do equipamento para o qual você quer negar acesso, a
nível de teste.
553
Criando Sites Dinâmicos com ASP 3.0
Nesta janela temos três opções a serem escolhidas, conforme explicado a seguir:
➥ Um computador: Neste caso estamos negando acesso para um computador específico.
Basta digitar o endereço IP do mesmo. No nosso exemplo, utilizaremos esta opção e
iremos digitar o IP 10.204.123.1.
➥ Grupo de computadores: Se você marcar esta opção, surge, na parte de baixo da janela,
mais um campo, Máscara de sub-rede, conforme indicado na Figura 9.40. Podemos
utilizar esta opção para negar acesso a uma rede ou segmento de rede inteiro.
Por exemplo, podemos negar acesso a qualquer computador da rede 10.204.123, para isso
preencheríamos os campos da seguinte maneira:
554
Capítulo 9 – Segurança de Aplicações Web com IIS e ASP
Para negar acesso a todas as máquinas da rede 161.147, utilizaríamos a seguinte configuração:
➥ Identificação da rede: 161.147.0.0
➥ Máscara de sub-rede: 255.255.0.0
➥ Nome de domínio: Esta opção permite que neguemos acesso com base no nome DNS
de um grupo de computadores. Por exemplo, podemos negar acesso para setor de
contabilidade empresa, negando acesso para o domínio: contabilidade.abc.com.br. Ao
tentar utilizar esta opção, o IIS emite uma mensagem avisando que o desempenho do
servidor pode ser prejudicado pela ativação desta opção, e perguntando se você
realmente deseja ativá-la.
11. Vamos negar o acesso apenas para um computador – 10.204.123.1. Certifique-se de
que a opção Um computador esteja marcada e no campo Endereço IP, digite
10.204.123.1, conforme indicado na Figura 9.41.
555
Criando Sites Dinâmicos com ASP 3.0
16. Para estender as configurações basta selecionar uma ou mais das opções mostradas e clicar
no botão OK. Você também pode utilizar o botão Selecionar tudo e depois clicar em OK.
17. Você estará de volta ao Gerenciador do Internet Services. Feche-o.
Agora vou tentar acessar uma página do servidor IIS para qual o acesso foi negado para o IP
do meu computador – 10.204.123.1. Ao tentar fazer o acesso, recebo a mensagem indicada na
Figura 9.43.
556
Capítulo 9 – Segurança de Aplicações Web com IIS e ASP
Observe que a mensagem informa que o endereço IP foi rejeitado. Para que o endereço IP
10.204.123.1 volte a ter acesso ao site, é so seguir os passos indicados anteriormente e removê-
lo da lista de endereços IP com acesso negado.
No Microsoft SQL Server podemos atribuir níveis de permissão para os usuários do Windows
2000, e até mesmo para o usuário utilizado para acesso anônimo.
Na Figura 9.44, temos um exemplo onde o usuário IUSR_SERVIDOR está recebendo permissão
somente para leitura na tabela Orders do banco de dados Northwind em um servidor com o
Microsoft SQL Server 2000 – Beta 2.
Figura 9.44: Definindo permissões de banco de dados no Microsoft SQL Server 2000.
557
Criando Sites Dinâmicos com ASP 3.0
NOTA
Para maiores informações sobre configurações de segurança no Microsoft SQL Server 2000,
consulte a documentação do produto.
Na maioria dos bancos de dados pode ser necessário o fornecimento de um username e senha
para que o acesso seja liberado. Podemos construir um formulário HTML com dois campos,
onde o usuário digita o username e a senha. Ao clicar em um botão Logon, os valores digitados
são enviados para uma página ASP que monta a String de conexão de acordo com os dados
fornecidos pelo usuário, incluindo o username e senha.
Na Listagem 9.1, temos um exemplo de formulário, onde temos dois campos: username e
senha, nos quais o usuário irá digitar as informações de logon.
6 <P><FONT color=navy><B>
7 Digite os dados para efetuar o logon no servidor SQL:
8 </B></FONT></P>
9 <P>
12 <TR>
13 <TD>Username:</TD>
14 <TD><INPUT id=username maxLength=15 name=username></TD>
15 </TR>
16 <TR>
17 <TD>Senha:</TD>
18 <TD><INPUT id=senha maxLength=15 name=senha type=password></TD>
19 </TR>
558
Capítulo 9 – Segurança de Aplicações Web com IIS e ASP
20 <TR>
21 <TD></TD>
22 <TD><INPUT id=logon name=logon type=submit value=Logon></TD>
23 </TR>
24 </TABLE>
25 </P>
26 </FORM>
27 </BODY>
28 </HTML>
Na Figura 9.45, temos o formulário logon.htm carregado, onde o usuário digita as informações
para o logon.
Ao clicar no botão Logon, os dados digitados pelo usuário são enviados para a página logon.asp,
a qual monta uma String de conexão, com base nos dados informados pelo usuário. Na Listagem
9.2, temos um exemplo da página logon.asp.
Listagem 9.2 – Página ASP que monta a String de conexão para o servidor SQL – logon.asp.
1 <%@ Language=VBScript %>
2 <HTML>
559
Criando Sites Dinâmicos com ASP 3.0
3 <HEAD>
4 </HEAD>
5 <BODY>
6 <%
7 ‘O primeiro passo é criar a conexão com o banco de dados
8 ‘Para isto crio um objeto do tipo Connection
9 ‘Cria um objeto do tipo ADODB.Connection
10 Set conn=Server.CreateObject(“ADODB.Connection”)
11 ‘Agora defino a propriedade ConnectionString do objeto Connection
12 ‘criado anteriormente.
13 conn.ConnectionString = “PROVIDER=SQLOLEDB;
Data Source=SERVIDOR\SERVIDOR;Initial Catalog=Northwind;User ID=” &
Request.Form(“username”)& “;Password=” & Request.Form(“senha”)
14 conn.Open
15 %>
16 <HR>
17 <%
18 Response.Write “Conexão estabelecida com sucesso !!”
19 %>
20 <HR>
21 </BODY>
22 </HTML>
560
Capítulo 9 – Segurança de Aplicações Web com IIS e ASP
Observe que a mensagem informa que houve um erro no logon do usuário sa. O ideal é que
estas situações de erro sejam tratadas e ao invés do IIS simplesmente enviar uma página com
uma mensagem de erro padrão, podemos interceptar a ocorrência do erro e enviar para o
usuário uma página mais trabalhada, onde o mesmo tenha a opção de entrar novamente com
as informações de logon. Aprenderemos a fazer o tratamento de erros no Capítulo 11.
Conclusão
Neste capítulo aprendemos sobre aspectos básicos de segurança, tais como:
➥ Tipos de autenticação.
➥ Permissões NTFS do Windows 2000.
➥ Opções de segurança do IIS.
➥ Permissões a nível de banco de dados.
Muito existe a ser tratado sobre segurança. Livros inteiros já foram escritos sobre o assunto.
Pela experiência de anos trabalhando com ambientes de Rede Locais e acesso a dados críticos
561
Criando Sites Dinâmicos com ASP 3.0
posso afirmar com convicção: “O primeiro passo para estabelecer um ambiente seguro é a
definição de um política de segurança e a ampla divulgação da mesma, para que todos estejam
conscientes de suas responsabilidades em relação à segurança.”
Muitas vezes cuida-se muito da segurança de acesso lógico aos dados, com a otimização das
configurações de segurança do Sistema Operacional, do servidor Web e do servidor de Banco
de dados. São gastos milhares de dólares em equipamentos e programas sofisticados para
atuarem como Firewall. Investe-se em roteadores modernos, com capacidades de filtragem
de pacotes, detecção de tentativas de invasão e assim por diante. E, muitas vezes, a segurança
física é esquecida. De que adianta toda esta segurança no acesso lógico, se um desconhecido
pode, facilmente, invadir a sala dos servidores e sair com uma meia dúzia de fitas de backup
em baixo do braço?
Obviamente que o investimento em segurança de acesso lógico aos dados é necessária, porém
o aspecto da segurança no acesso físico é igualmente importante. Pontos como estes devem
ser definidos na política de segurança da empresa, a qual deve ser continuamente revisada
para se adaptar às freqüentes mudanças no mundo da tecnologia.
562
Capítulo 10 – Utilizando Componentes do IIS
Capítulo 10
Utilizando
Componentes do IIS
563
Criando Sites Dinâmicos com ASP 3.0
Introdução
Neste capítulo estaremos tratando de uma série de objetos do ASP e outros assuntos
importantes na construção de aplicativos Web com ASP 3.0.
Iniciaremos o capítulo por um estudo do objeto Server e dos seus diversos métodos e
propriedades. Veremos como solucionar problemas práticos, bastante comuns na construção
de aplicações Web.
Apresentaremos um exemplo prático que ilustra uma necessidade típica de aplicações Web.
No nosso exemplo, o usuário selecionará o nome de um país em uma lista de países. Ao clicar
em um botão Pesquisar, será retornada uma lista, em forma de tabela, com todos os Clientes
para o País selecionado. O nome do Cliente será um link, que ao ser clicado abrirá uma
página com as informações sobre o mesmo. Para construir esta página teremos que utilizar
alguns métodos do objeto Server.
Em seguida, passaremos ao estudo de alguns componentes ASP. Veremos com mais detalhes
o conceito de componentes. Também aprenderemos a utilizar diversos componentes que são
fornecidos juntamente com o IIS. Estudaremos os seguintes componentes:
➥ Content Link.
➥ Ad Rotator.
➥ Browser Capabilities.
➥ Page Counter.
Estes componentes são fornecidos juntamente com o IIS e oferecem uma série de
funcionalidades bastante interessantes, conforme veremos mais adiante.
O Objeto Server
O objeto Server nos fornece a possibilidade de estender as capacidades de nossas páginas
ASP, através da utilização de objetos e componentes externos. Estes objetos e componentes
fornecem funcionalidades específicas as quais são necessárias à aplicação que está sendo
desenvolvida.
564
Capítulo 10 – Utilizando Componentes do IIS
Com o objeto Server, podemos ter acesso aos componentes que são fornecidos juntamente
com o IIS, bem como a qualquer componente que tenha sido desenvolvido por uma empresa
de desenvolvimento de software. O requisito para que o componente possa ser utilizado é
que o mesmo siga o padrão COM/COM+ e tenha sido registrado no servidor Web.
Existem diversas empresas que produzem componentes e objetos para serem utilizados em
páginas ASP. Existem componentes para as mais diversas funcionalidades, tais como:
➥ Envio de e-mail a partir de páginas ASP.
➥ Impressão de bloquetos de cobrança bancária.
➥ Verificação de número de CPF, CNPJ ou cartão de crédito.
➥ Cálculo de impostos e outros acréscimos legais.
➥ Cálculos específicos para setores, como por exemplo: Recursos Humanos, Contabilidade, etc.
➥ Componentes para criação de gráficos em páginas Web.
➥ Componentes que facilitam a pesquisa em bancos de dados.
Agora passaremos ao estudo do objeto Server. Analisaremos os seus métodos e sua propriedade
(isso mesmo, propriedade no singular, pois temos uma única propriedade).
Esta propriedade pode ser utilizada para definir ou retornar o número de segundos que uma
página pode ficar em execução antes que a mesma seja interrompida pelo IIS e uma mensagem
de erro seja retornada. O valor padrão é 90 segundos. Esta propriedade é importante,
principalmente em páginas que apresentam um Loop infinito, devido a erros de programação.
Neste caso, após o período definido pela propriedade ScriptTimeout, a página terá sua execução
encerrada. Com isso evita-se que a página fique consumindo recursos no servidor até causar
uma parada do mesmo.
Uma prática comum é aumentar o valor desta propriedade para determinadas páginas, como,
por exemplo, para um formulário de compras. Se a página demorar para aparecer e retornar
um erro, o usuário poderá desconfiar de que a compra foi efetivada e não irá recarregar a
página com medo de duplicar o seu pedido.
565
Criando Sites Dinâmicos com ASP 3.0
IMPORTANTE
O tempo limite definido pela propriedade ScriptTimeout não terá efeito enquanto um
componente do servidor estiver processando. Por isso, caso você esteja utilizando um
componente com defeitos, o mesmo continuará em execução independente do valor definido
por esta propriedade.
Também podemos atribuir o valor armazenado nesta propriedade a uma variável, como no
exemplo a seguir:
<%
tempo_limite = Server.ScriptTimeout
Response.Write tempo_limite
%>
O Método CreateObject
O método CreateObject é utilizado para criar uma instância de um componente ou objeto
existente no servidor. O termo “existente no servidor” significa que o objeto deve ter sido
previamente instalado e registrado no IIS. Diversos objetos e componentes fazem parte da
instalação padrão do IIS e iremos estudá-los ainda neste capítulo.
566
Capítulo 10 – Utilizando Componentes do IIS
Onde temos:
➥ nome_objeto: É o nome da variável que será utilizada para fazer referência ao objeto
na página ASP onde o objeto é criado. Em diversos exemplos deste livro criamos um
objeto para conexão com banco de dados e atribuímos o mesmo a uma variável chamada
conn. O nome da variável é determinado pelo desenvolvedor; poderíamos ter utilizado
qualquer nome de variável válido.
➥ Identificador_do_objeto: Especifica o tipo de objeto a ser criado. O formato é
[Fornecedor.]Componente[.Versão]. Em diversos exemplos do livro utilizamos os
seguintes identificadores:
ADODB.Connection
ADODB.RecordSet
Este é o nome com que o componente está registrado no servidor Windows 2000. As
informações, sobre o registro do componente, ficam armazenadas na Registry do Windows
2000, conforme indicado na Figura 10.1.
Por padrão, os objetos criados pelo método Server.CreateObject têm escopo de página. Isso
significa que eles são automaticamente destruídos pelo servidor quando ele termina o
processamento da página ASP atual.
Para criar um objeto com escopo de sessão ou aplicativo, você poderá usar a marca <OBJECT>
no arquivo global.asa e definir o atributo SCOPE para SESSION ou APPLICATION, ou
armazenar o objeto em uma variável de sessão ou aplicativo. No Capítulo 8, criamos um
objeto do tipo ADODB.Connection e o armazenamos em uma variável de nível da aplicação,
utilizando o objeto Application.
567
Criando Sites Dinâmicos com ASP 3.0
Já um objeto criado em nível de Sessão, será destruído quando a sessão for encerrada. Isto
acontece quando a sessão atinge o tempo limite ou o método Abandon é chamado. No exemplo
abaixo criamos um objeto em nível de sessão chamado Rodar. Este componente é, na verdade,
uma instância do componente AdRotator. Estudaremos o mesmo mais adiante neste capítulo.
<%
Set Session(“rodar”) = Server.CreateObject(“MSWC.AdRotator”)
%>
Podemos destruir um objeto atribuindo a variável que representa o objeto, o valor Nothing.
<%
Session(“rodar”) = Nothing
%>
NOTA
Destruir o objeto significa retirá-lo da memória, de maneira que não possa mais ser utilizado
e os recursos que o mesmo utilizava são liberados.
IMPORTANTE
Não podemos criar uma instância de objeto com o mesmo nome de um objeto interno. O
exemplo a seguir retorna um erro:
<%
O Método Execute(“url”)
O método Execute chama um arquivo .asp e o processa como se ele fosse parte da chamada do
script ASP. A execução da página corrente é suspensa e o controle é transferido para a página
especificada no parâmetro URL. O método Execute é similar a uma chamada de procedimento
em muitas linguagens de programação. A página, chamada utilizando o método Execute, é
processada e, após o término da execução, o controle retorna para a página que fez a chamada.
568
Capítulo 10 – Utilizando Componentes do IIS
onde URL é uma seqüência de caracteres especificando o local do arquivo .asp a ser executado.
Se um caminho absoluto for especificado para esse parâmetro, então, ele deverá ser para um
arquivo .asp dentro do mesmo espaço do aplicativo, isto é, dentro da mesma pasta virtual que
representa o aplicativo.
Depois que o IIS processa o arquivo .asp especificado no parâmetro url de Server.Execute, a
resposta é retornada ao script ASP que fez a chamada. O arquivo .asp executado pode modificar
cabeçalhos HTTP. No entanto, como em qualquer arquivo .asp, se o mesmo tentar modificar
os cabeçalhos HTTP depois que enviar uma resposta para o cliente, gerará um erro.
O parâmetro url pode ser referente a um caminho absoluto ou relativo. Se o caminho for absoluto,
ele deverá mapear para um script ASP no mesmo aplicativo do arquivo ASP que fez a chamada.
Exemplo
O exemplo a seguir demonstra a execução de um arquivo .asp que retorna algum texto. No
arquivo chamador.asp temos uma chamada do método Execute para o arquivo chamado.asp.
Ao encontrar esta chamada, a execução desloca-se para o arquivo chamado.asp, o qual é
executado. Ao encerrar a execução do arquivo chamado.asp, a execução continua no arquivo
chamador.asp, com a linha seguinte a que utilizou o método Execute.
569
Criando Sites Dinâmicos com ASP 3.0
8 </BODY>
9 </HTML>
O Método GetLastError( )
O método GetLastError retorna um objeto do tipo ASPError que descreve a condição de erro
que ocorreu. Esse método só está disponível antes do arquivo .asp ter enviado algum conteúdo
para o cliente.
Sintaxe
Server.GetLastError ()
570
Capítulo 10 – Utilizando Componentes do IIS
NOTA
Votaremos a estudar este método, com maiores detalhes, no Capítulo 11, sobre tratamentos de
erro em páginas ASP.
O Método URLEncode(“texto”)
Passamos uma String como parâmetro para o método URLEncode. Por exemplo, posso passar
o meu nome como argumento:
Júlio Cesar Fabris Battisti
O método URLEncode converte os caracteres especiais, tais como letras acentuadas, espaços
em brancos e outros sinais que não são caracteres válidos para fazerem parte de uma URL,
nos equivalentes que são válidos. O meu nome seria convertido da seguinte maneira:
J%FAlio+Cesar+Fabris+Battisti
Observe que o ú (que não é um caractere válido para fazer parte de uma URL) foi substituído
por %FA (caractere válido para fazer parte de uma URL) e cada espaço em branco foi substituído
por um sinal de +. Podemos notar esta substituição, claramente, quando os dados que
preenchemos em um formulário são enviados através do método get. Conforme descrito
anteriormente neste livro, no método get as informações que foram digitadas em um formulário,
são enviadas junto com a URL da página que está sendo chamada. Para capturar estes dados,
precisamos utilizar o método QueryString do objeto Request – Request.QueryString
(“NomeDoCampo”).
Mais adiante estaremos apresentando um exemplo prático que fará uso do método URLEncode
e também do Método HTMLEncode, que veremos ainda neste item.
571
Criando Sites Dinâmicos com ASP 3.0
Considere o exemplo a seguir, onde temos uma URL bastante longa, a qual é resultado do
envio dos dados que foram preenchidos em um formulário, utilizando o método get ao invés
do método post:
http://servidor/capitulo10/cadastro.asp?nome=Jos%E9+da+Silva&
rua=Orlando+Fra%E7%E3o&bairro=Url%E2ndia+Alta&cidade=Boqueir%E3o+do+Le%E3o&
cep=97050-010&fone=2225211&fax=2226502&cartaotipo=Visa&enviar=Enviar+dados.
Observe que os dados preenchidos no formulário são enviados junto com a URL no formato
de pares e codificados de tal maneira que os caracteres especiais são convertidos em seus
equivalentes. Por exemplo, observe o seguinte trecho da URL:
nome=Jos%E9+da+Silva
Este trecho está indicando que o campo nome foi preenchido com o valor José da Silva.
Lembre que cada espaço é substituído por um sinal de + e o “é” foi substituído por seu
equivalente válido para fazer parte de uma URL – %E9.
No trecho de código a seguir, temos um exemplo dos resultados obtidos com a utilização de
Request.QueryString:
<%
Response.Write Request.QueryString(“nome”) & “<BR>”
Response.Write Request.QueryString(“rua”) & “<BR>”
Response.Write Request.QueryString(“bairro”) & “<BR>”
Response.Write Request.QueryString(“cidade”) & “<BR>”
Response.Write Request.QueryString(“cep”) & “<BR>”
Response.Write Request.QueryString(“fone”) & “<BR>”
Response.Write Request.QueryString(“fax”) & “<BR>”
Response.Write Request.QueryString(“cartao”) & “<BR>”
%>
Observe que o método QueryString decodifica os valores especiais de volta para os valores
originais. Por exemplo, o %E9 é substituído de volta para o original “é”.
572
Capítulo 10 – Utilizando Componentes do IIS
O Método MapPath(“url”)
O método MapPath(“url”) retorna o caminho físico no servidor, correspondente a URL passada
como parâmetro. Um caminho físico é um caminho do tipo: D:\Inetpub\wwwroot\Capitulo10.
O parâmetro URL especifica o caminho relativo ou virtual a ser mapeado para um diretório
físico. Se Caminho iniciar com uma barra simples (/) ou invertida (\), o método MapPath
retornará o caminho como se fosse um virtual completo. Se Caminho não iniciar com uma
barra, o método MapPath retornará um caminho relativo ao diretório do arquivo .asp que está
sendo processado.
6 <BODY>
7 <HR>
8 <%
9 Response.Write Server.MapPath(“/”) & “<BR>”
10 Response.Write Server.MapPath(“Capitulo6”) & “<BR>”
11 Response.Write Server.MapPath(“/Capitulo10”) & “<BR>”
12 Response.Write Server.MapPath(“/Capitulo10/exmap.asp”) & “<BR>”
13 Response.Write Server.MapPath(“/iishelp”) & “<BR>”
14 Response.Write Server.MapPath(“\”) & “<BR>”
15 %>
16 <HR>
17 </BODY>
18 </HTML>
Na Figura 10.3 temos o resultado da página da Listagem 10.3 quando carregada no Internet
Explorer.
573
Criando Sites Dinâmicos com ASP 3.0
Observe que tanto a barra normal (/), quanto a barra invertida (\) podem ser utilizadas como
parâmetro para que o método MapPath retorne o caminho físico para o diretório raiz do
servidor IIS.
NOTA
O método MapPath não verifica se o caminho que ele retorna é válido ou existe no servidor. Ele
apenas retorna qual seria o caminho físico para o endereço relativo que foi passado. O método
faz esta determinação com base no caminho físico do diretório raiz.
IMPORTANTE
Não podemos utilizar o método MapPath nos eventos Application_OnEnd e Session_OnEnd.
O Método Transfer(“url”)
O método Transfer(“url”) pára a execução da página atual, e transfere a execução para a
página especificada no parâmetro URL. Caso tenham sido definidas informações para o objeto
Session ou informações de transação, as mesmas serão transferidas para a nova página. Porém,
o método Transfer(“url”), após finalizar a execução da página que foi chamada, não retorna o
controle para a página original, como acontece no método Execute.
574
Capítulo 10 – Utilizando Componentes do IIS
Se o caminho que você especificar no parâmetro URL for de um arquivo .asp em outro
aplicativo, o arquivo .asp será executado como se estivesse no aplicativo que contém o comando
Server.Transfer. Em outras palavras, todas as variáveis e objetos, aos quais foram dados escopo
de aplicativo por outros arquivos .asp no aplicativo, ou pelo arquivo global.asa do aplicativo,
estarão disponíveis para o arquivo .asp chamado.
O Método HTMLEncode(“texto”)
O método HTMLEncode converte os caracteres especiais do texto, passado como parâmetro,
para caracteres reconhecidos no código HTML. Considere os exemplos:
575
Criando Sites Dinâmicos com ASP 3.0
PROBLEMA
Vamos criar um exemplo que faz conexão com o banco de dados nwind.mdb. No nosso exemplo,
será apresentada uma página – principal.asp – na qual o usuário selecionará o nome de um
país em uma lista de países. Esta lista de países será montada, dinamicamente, a partir da
tabela Customers, de tal maneira que somente sejam exibidos os países para os quais existem
clientes cadastrados. Além disso a listagem será classificada em ordem alfabética. Após
selecionar o país, o usuário clica em um botão Pesquisar. Com isso será retornada uma lista,
em forma de tabela, com todos os Clientes para o País selecionado – página listaclientes.asp. O
nome do Cliente será um link, que ao ser clicado abrirá uma página com as informações sobre
o mesmo – página cliente.asp. Para construir esta página teremos que utilizar alguns métodos
do objeto Server.
6 <BODY>
7 <%
8 ‘O primeiro passo é criar a conexão com o banco de dados.
9 ‘Para isto crio um objeto do tipo Connection.
10 ‘Cria um objeto do tipo ADODB.Connection
11 Set conn=Server.CreateObject(“ADODB.Connection”)
12 ‘Agora abro uma conexão com o arquivo nwind.mdb
13 ‘utilizando OLE DB.
14 conn.ConnectionString = “PROVIDER=MICROSOFT.JET.OLEDB.4.0;
DATA SOURCE=c:\meus documentos\nwind.mdb”
576
Capítulo 10 – Utilizando Componentes do IIS
15 conn.Open
21 %>
26 <%
39 %>
40 </SELECT>
577
Criando Sites Dinâmicos com ASP 3.0
41 <HR>
42 <INPUT type=“submit” value=“Pesquisar” id=Pesquisar name=Pesquisar>
43 </FORM>
44 </BODY>
45 </HTML>
Agora precisamos criar a página listaclientes.asp. Está página deverá fazer o seguinte:
➥ Receber o valor do país selecionado na lista.
➥ Criar um RecordSet com todos os Clientes para o país selecionado.
➥ Na hora de exibir os resultados, transformar o nome do funcionário em um link que,
ao ser clicado, chama a página cliente.asp. No próprio link será passado o Código do
Cliente junto com a URL. Este código será utilizado, pela página cliente.asp, para
localizar o registro do Cliente na tabela Customers.
➥ Para construir este link, utilizaremos o método URLEncode.
6 <BODY>
7 <%
11 Set conn=Server.CreateObject(“ADODB.Connection”)
578
Capítulo 10 – Utilizando Componentes do IIS
14 conn.ConnectionString = “PROVIDER=MICROSOFT.JET.OLEDB.4.0;
DATA SOURCE=c:\meus documentos\nwind.mdb”
15 conn.Open
21 %>
22 <HR>
23 <B>Lista de Clientes para:
27 <TR>
28 <TD><B>Nome do Cliente</B></TD>
29 <TD><B>País</B></TD>
30 </TR>
31 <%
32 Clientes.MoveFirst
33 Do Until Clientes.EOF
34 %>
35 <TR>
36 <TD>
37 <FONT FACE=“Arial”>
38 <P>
39 <A HREF=“http://servidor/Capitulo10/cliente.asp?Codigo=<%
579
Criando Sites Dinâmicos com ASP 3.0
=server.URLEncode(Clientes.Fields(“CustomerID”))%>”>
<%=Clientes.Fields(“CompanyName”)%>
40 </A>
41 </FONT>
42 </TD>
45 </TR>
46 <%
47 Clientes.MoveNext
48 Loop
49 %>
50 </TABLE>
51 <HR>
52 </BODY>
53 </HTML>
39 <A HREF=“http://servidor/capitulo10/cliente.asp?Codigo=
<% =server.URLEncode(Clientes.Fields(“CustomerID”))%>”>
<%=Clientes.Fields(“CompanyName”)%>
40 </A>
41 </FONT>
42 </TD>
Neste trecho estamos montando a primeira coluna da tabela. Utilizamos a tag HTML <A
HREF=> </A> para construir um link. Dentro deste link, construímos a seguinte URL:
http://servidor/capitulo10/cliente.asp?Codigo=
580
Capítulo 10 – Utilizando Componentes do IIS
Este código passa o campo CustomerID como parâmetro para o método URLEncode, o qual
irá converter qualquer caractere não permitido em uma URL para o equivalente permitido,
conforme descrito anteriormente. Vamos supor que o código do clientes seja JSILVA. Neste
ponto o nosso link estará assim:
http://servidor/capitulo10/cliente.asp?Codigo=JSILVA
Este código simplesmente exibirá o Nome do Cliente, que é o texto que aparecerá como texto
do link. Observe que montamos o link de tal forma que o parâmetro que será passado na URL
é o Código do Cliente (CustomerID), porém o texto que será exibido na página é o Nome do
Cliente (CompanyName). Estamos passando o Código do Cliente como parâmetro, porque
este campo é uma chave primária e, portanto, não existirão dois clientes com o mesmo código.
Porém, existe a possibilidade de existirem dois clientes com o mesmo nome.
Com isso montamos, facilmente, um link no nome de cada cliente. Quando o usuário clicar
no nome do cliente, será passado, juntamente com a URL o Código do Cliente como parâmetro
de pesquisa para a página cliente.asp. O passo final da nossa aplicação é construir a página
cliente.asp e depois testar o funcionamento da mesma.
6 <BODY>
7 <%
11 Set conn=Server.CreateObject(“ADODB.Connection”)
581
Criando Sites Dinâmicos com ASP 3.0
14 conn.ConnectionString = “PROVIDER=MICROSOFT.JET.OLEDB.4.0;
DATA SOURCE=c:\meus documentos\nwind.mdb”
15 conn.Open
19 %>
20 <HR>
25 <HR>
27 <TR>
28 <TD>Código do Cliente:</TD>
29 <TD><B><% =Cliente.Fields(“CustomerID”)%></B></TD>
30 </TR>
31 <TR>
32 <TD>Nome do Cliente:</TD>
33 <TD><B><% =Cliente.Fields(“CompanyName”)%></B></TD>
34 </TR>
35 <TR>
36 <TD> Contato:</TD>
37 <TD><B><% =Cliente.Fields(“ContactName”)%></B></TD>
582
Capítulo 10 – Utilizando Componentes do IIS
38 </TR>
39 <TR>
40 <TD> Endereço:</TD>
41 <TD><B><% =Cliente.Fields(“Address”)%></B></TD>
42 </TR>
43 <TR>
44 <TD> Cidade: </TD>
45 <TD><B><% =Cliente.Fields(“City”)%></B></TD>
46 </TR>
47 <TR>
48 <TD> CEP:</TD>
49 <TD><B><% =Cliente.Fields(“PostalCode”)%></B></TD>
50 </TR>
51 <TR>
52 <TD> Fone:</TD>
53 <TD><B><% =Cliente.Fields(“Phone”)%></B></TD>
54 </TR>
55 <TR>
56 <TD> Fax:</TD>
57 <TD><B><% =Cliente.Fields(“Fax”)%></B></TD>
58 </TR>
59 <TR>
60 <TD> País:</TD>
61 <TD><B><% =Cliente.Fields(“Country”)%></B></TD>
62 </TR>
63 <HR>
64 </TABLE>
65 </BODY>
66 </HTML>
583
Criando Sites Dinâmicos com ASP 3.0
Observe que utilizamos código ASP na tag <TITLE></TITLE>, o que é possível, sem maiores
problemas.
Outro detalhe a ser observado é que utilizamos o método Request.QueryString. Isto foi feito,
porque o Código do Cliente foi passado na própria URL. É como se estivéssemos utilizando o
método get da tag <FORM>. Por isso, para recuperar o valor passado como parâmetro,
precisamos utilizar o método Request.QueryString ao invés de Request.Form.
Na Figura 10.4 vemos que foi carregada a página principal.asp e o usuário selecionou Argentina
na lista de países.
Ao clicar no botão Pesquisar é chamada a página listaclientes.asp, a qual exibe uma listagem
com todos os Clientes da Argentina, conforme mostrado na Figura 10.5.
Observe que o nome de cada Cliente é um link. Se clicarmos no nome do cliente, será chamada
a página cliente.asp e será passado, na própria URL, o código do cliente. Com isso são exibidos
os dados do Cliente. Na Figura 10.6, temos o exemplo para o caso em que o usuário clicou no
link para o cliente Rancho Grande.
584
Capítulo 10 – Utilizando Componentes do IIS
O usuário pode clicar no link Clique aqui para selecionar outro país, para voltar à página
principal.asp e fazer uma nova pesquisa. O usuário também pode clicar no botão Voltar do
585
Criando Sites Dinâmicos com ASP 3.0
próprio navegador, para retornar à página listaclientes.asp, com a lista de Clientes da Argentina
e clicar em um outro Cliente para ver os dados do mesmo.
Com este exemplo prático, encerramos o estudo do objeto Server. Nos próximos itens
aprenderemos a utilizar alguns componentes que são fornecidos juntamente com o IIS.
Vamos estudar os chamados Active Server Componnents. São componentes que executam
no servidor IIS, retornando um determinado resultado para a página ASP, que os utiliza, ou
efetuando uma determinada operação.
Além dos componentes que já são fornecidos com o IIS e o Windows 2000, podem ser
adquiridos componentes de empresas desenvolvedoras de software. Existe uma infinidade
de componentes disponíveis na Internet, inclusive, gratuitos. Quando adquirimos um
componente, junto com o mesmo recebemos a documentação sobre como instalar, quais os
métodos, propriedades, eventos e coleções que o mesmo disponibiliza. A partir do momento
que o componente foi instalado, o mesmo pode ser utilizado em qualquer página ASP do
servidor onde foi instalado.
Os componentes desenvolvidos para serem utilizados por páginas ASP, no servidor IIS, devem
seguir o padrão COM (e no Windows 2000, o COM+). Estes componentes podem ser criados
utilizando-se ambientes de desenvolvimento como o Microsoft Visual Basic 6.0 ou o Microsoft
Visual C 6.0.
586
Capítulo 10 – Utilizando Componentes do IIS
página, fosse exibido uma lista de links, de forma que o usuário pudesse se deslocar para uma
parte específica do manual e também uma barra de navegação com links para o próximo
documento, o documento anterior, para o primeiro documento e para o último documento.
Obviamente que esta estrutura de navegação pode ser criada manualmente. Porém pequenas
modificações como a inserção ou inclusão de páginas, farão com que toda a estrutura de
navegação tenha que ser alterada. Para facilitar a criação de uma estrutura de navegação
deste tipo, podemos utilizar o componente Content Link.
O objeto Content Link é fornecido através da DLL Nextlink.dll, a qual encontra-se, normalmente,
na pasta \winnt\system32\inetsrv, do drive onde está instalado o Windows 2000.
onde MSWC.Nextlink é a identificação com que o objeto Content Link foi registrado.
Para salientar a utilização do componente Content Link, vamos criar um exemplo onde temos
um manual com cinco capítulos, além da Introdução. Queremos utilizar o componente Content
Link para exibir, em todas as páginas do manual, um índice com links para a Introdução e
para os cinco capítulos; e no final e início de cada documento, uma barra de navegação com
links para o próximo, anterior, primeiro e o último documento.
Os documentos para o nosso exemplo serão os indicados na Tabela 10.1.
Documento Descrição
intro.asp Página de abertura e Introdução do manual.
cap1.asp Capítulo 1 do manual de exemplo.
cap2.asp Capítulo 2 do manual de exemplo.
cap3.asp Capítulo 3 do manual de exemplo.
cap4.asp Capítulo 4 do manual de exemplo.
cap5.asp Capítulo 5 do manual de exemplo.
O componente Content Link trabalha em conjunto com um arquivo de texto, o qual é conhecido
como “Lista de conteúdo”. Neste arquivo de texto cada linha representa um documento que
fará parte da Lista de conteúdo. Cada linha possui o seguinte formato:
URL-Página Descrição Comentário
Cada um dos elementos deve ser separado do anterior por uma tabulação.
587
Criando Sites Dinâmicos com ASP 3.0
Este arquivo, além de descrever quais os documentos que farão parte da Lista de conteúdo,
também define a ordem do documento nesta lista. Por exemplo, se estamos no arquivo cap3.asp
e clicamos no link próximo, será carregada a página cap4.asp. Esta seqüência é definida pela
ordem das linhas no arquivo que contém a Lista de conteúdo.
Chamaremos este arquivo de conteudo.txt, o qual será salvo na mesma pasta que os demais
arquivos.
Uma vez criado o objeto, o próximo passo é definir qual o arquivo de texto que será utilizado
pelo componente Content Link.
A etapa final é utilizar os métodos do objeto Content Link para criar a estrutura dinâmica de
navegação.
588
Capítulo 10 – Utilizando Componentes do IIS
No nosso exemplo, como o arquivo conteudo.txt possui seis linhas, este comando irá retornar
o valor 6. É importante saber o número total de páginas na Lista de conteúdo, para que a
estrutura de navegação possa ser criada corretamente. A contagem dos elementos inicia com
1, e não zero como no caso de outros elementos. Assim, o primeiro elemento é o de índice 1,
o segundo é o de índice 2 e assim por diante. Se o arquivo passado como parâmetro não for
encontrado, o método GetListCount irá retornar 0.
➥ O método GetListIndex: Este método retorna o número do índice do elemento atual no
arquivo de conteúdo. A cada momento somente existe um item que é o atual. Podemos
alterar o item atual utilizando os métodos GetNextURL e GetPreviousURL, que estudaremos
mais adiante. Isto é semelhante ao conceito de registro corrente de um objeto RecordSet e
à utilização dos métodos MoveNext e MovePrevious do objeto RecordSet. O método retorna
0 se a página atual não estiver incluída no arquivo de conteúdo.
8 <%
9 ‘O primeiro passo é criar um objeto do tipo MSWC.Nextlink
10 Set conteudo=Server.CreateObject(“MSWC.Nextlink”)
589
Criando Sites Dinâmicos com ASP 3.0
12 ultimo = conteudo.GetListCount(“conteudo.txt”)
13 atual = conteudo.GetListIndex(“conteudo.txt”)
14 If atual=ultimo Then
15 Response.Write “A última página é a página atual.”
16 Else
17 Response.Write “A página atual é: ” & atual
18 End If
19 %>
20 </BODY>
21 </HTML>
590
Capítulo 10 – Utilizando Componentes do IIS
onde os parâmetros a serem passados são o arquivo de conteúdo e o índice do elemento cuja
descrição deve ser retornada.
➥ O método GetNthUrl: Esse método retorna a URL do enésimo item, especificada no
arquivo de conteúdo.
A sintaxe para este método é a seguinte:
conteudo.GetNthURL(“conteudo.txt”,3)
onde os parâmetros a serem passados são o arquivo de conteúdo e o índice do elemento cuja
URL deve ser retornada.
➥ O método GetPreviousURL: Esse método retorna a URL do item anterior ao atual,
especificada no arquivo de conteúdo. Se a página atual não estiver especificada, o
método GetPreviousURL retornará a URL da primeira página da lista. Por exemplo, se
você estiver na página cap3.asp do nosso exemplo, o método GetPreviousURL
(“conteudo.txt”) irá retornar cap2.asp, que é a página anterior a cap3.asp, na linha logo
acima da linha de cap3.asp.
A sintaxe para este método é a seguinte:
conteudo.GetPreviousURL(“conteudo.txt”)
591
Criando Sites Dinâmicos com ASP 3.0
6 <BODY>
7 <%
9 Set conteudo=Server.CreateObject(“MSWC.Nextlink”)
10 ultimo = conteudo.GetListCount(“conteudo.txt”)
11 primeiro = 1
12 %>
15 <TR>
16 <TD colSpan=2>
<A HREF=“<%=conteudo.GetNthURL(“conteudo.txt”,primeiro)%>”>[Início]</A>
<A HREF=“<%=conteudo.GetPreviousURL(“conteudo.txt”)%>”>[Anterior]</A>
<A HREF=“<%=conteudo.GetNextURL(“conteudo.txt”)%>”>[Próxima]</A>
<A HREF=“<%=conteudo.GetNthURL(“conteudo.txt”,ultimo)%>”>[Última]</A>
17 </TD>
18 </TR>
21 <TD width=10%>
592
Capítulo 10 – Utilizando Componentes do IIS
22 <%
28 </TD>
30 <TD width=90%>
31 <P><B>MANUAL DE PROCEDIMENTOS PARA A SEÇÃO DE ATENDIMENTO.</B></P>
32 <HR>
33 <P><I>INTRODUÇÃO</I></P>
34 <HR>
35 <P>Aqui colocaríamos o conteúdo da Introdução.</P>
36 <HR>
37 </TD>
38 </TR>
40 <TR>
41 <TD colSpan=2>
42 <A HREF=“<%=conteudo.GetNthURL(“conteudo.txt”,primeiro)%>”>[Início]</A>
43 <A HREF=“<%=conteudo.GetPreviousURL(“conteudo.txt”)%>”>[Anterior]</A>
44 <A HREF=“<%=conteudo.GetNextURL(“conteudo.txt”)%>”>[Próxima]</A>
45 <A HREF=“<%=conteudo.GetNthURL(“conteudo.txt”,ultimo)%>”>[Última]</A>
46 </TD>
47 </TR>
48 </TABLE>
49 </BODY>
50 </HTML>
593
Criando Sites Dinâmicos com ASP 3.0
Todos os links desta página foram construídos utilizando os métodos do objeto conteudo, o
qual é uma instância de um componente Content Link. Observe o trecho de código a seguir,
responsável pela criação do menu de navegação superior e inferior:
16 <TD colSpan=2>
<A HREF=“<%=conteudo.GetNthURL(“conteudo.txt”,primeiro)%>”>[Início]</A>
<A HREF=“<%=conteudo.GetPreviousURL(“conteudo.txt”)%>”>[Anterior]</A>
<A HREF=“<%=conteudo.GetNextURL(“conteudo.txt”)%>”>[Próxima]</A>
<A HREF=“<%=conteudo.GetNthURL(“conteudo.txt”,ultimo)%>”>[Última]</A>
17 </TD>
594
Capítulo 10 – Utilizando Componentes do IIS
valor 1 para fazer referência à primeira URL do arquivo de conteúdo, e ultimo contém o valor
retornado pelo método GetListCount, que é o índice da última URL.
Também gostaria de comentar a maneira como foi montado o menu de opções da coluna da
esquerda. Neste caso, utilizamos um laço For, variando de 1 até último, para montar um
menu com links para todas as páginas do arquivo de conteúdo.
Você pode estar se perguntando: “Por que utilizar o componente Content Link, se poderia ter
criado todos estes links manualmente”?
A resposta é simples. O componente Content Link facilita a nossa vida quando precisamos
inserir ou excluir páginas que não estão no início ou no fim do conteúdo. Vamos supor que
precisássemos inserir uma nova página cap3.asp, de tal forma que a cap3.asp antiga passasse a
ser cap4.asp, a cap4.asp antiga passasse a ser cap5.asp, e assim por diante. Se tivéssemos criado
os links manualmente, teríamos que revisar todas as páginas e alterá-los. Se estivermos utilizando
o componente Content Link, a única coisa que precisa ser feita é alterar o arquivo de conteúdo,
inserindo a nova página na posição correta e renomear as demais, conforme indicado a seguir:
Pode parecer que não é vantagem utilizar o componente Content Link quando utilizamos um
número pequeno de páginas, porém quando o número de páginas começa a crescer (eu diria
cinco ou mais páginas) para uma determinada documentação, o componente Content Link é
um auxiliar valioso.
595
Criando Sites Dinâmicos com ASP 3.0
Se você posicionar o mouse sobre os links, sem clicar, verá que os mesmos foram
automaticamente recalculados. Por exemplo, o link [Próxima] aponta para cap5.asp, o link
[Anterior] aponta para cap3.asp e assim por diante.
As outras páginas do nosso manual somente irão diferir da página intro.asp no conteúdo que
apresentam. Para isto basta inserir o conteúdo específico de cada página, a partir do seguinte parágrafo:
35 <P>Aqui colocaríamos o conteúdo da Introdução.</P>
O Componente Ad Rotator
O componente Ad Rotator permite que uma página ASP exiba um gráfico diferente a cada vez
em que é carregada. Sempre que um usuário abre ou recarrega a página da Web, o componente
Ad Rotator exibe um novo anúncio baseado nas informações especificadas em um arquivo de
texto, conhecido como Arquivo de Programação de Rotatória. Neste arquivo estão as diversas
informações necessárias para que o componente funcione corretamente.
596
Capítulo 10 – Utilizando Componentes do IIS
Este componente normalmente é utilizado para exibir imagens animadas que funcionam como
anúncios e propaganda. Cada vez que o usuário carrega a página é exibido um anúncio diferente.
Além disso, é possível registrar quantos usuários clicam em cada anúncio definindo o parâmetro
URL no Arquivo de Programação de Rotatória para redirecionar os usuários para uma
determinada página, quando o usuário clicar no anúncio. Quando especificamos esse parâmetro,
cada salto para a URL de um anunciante é registrado nos logs de atividade do servidor Web.
597
Criando Sites Dinâmicos com ASP 3.0
O Arquivo de Programação de Rotatória tem duas seções. A primeira seção define parâmetros
que se aplicam a todas as imagens de anúncios na programação de rotação. A segunda seção
especifica as informações sobre o arquivo e a localização de cada anúncio individual e a
porcentagem de tempo de exibição que cada anúncio deve receber. As duas seções são
separadas por uma linha que contém somente um asterisco (*).
Na primeira seção existem quatro parâmetros globais, cada um consistindo em uma palavra-
chave e um valor. Todos eles são opcionais. Se você não especificar valores para os parâmetros
globais, o componente Ad Rotator usará os valores padrão. Nesse caso, a primeira linha do
arquivo deve conter somente um asterisco (*).
Sintaxe
[REDIRECT URL]
[WIDTH Largura]
[HEIGHT Altura]
[BORDER Borda]
*
URL_anúncio
URL_home_page_anúncio
Texto
impressões
URL
Especifica o caminho para o arquivo dynamic link library (.dll, biblioteca de link dinâmico)
ou de aplicativo (.asp) que implementa o redirecionamento. Esse caminho pode ser
especificado por completo (http://MyServer/MyDir/redirect.asp) ou em relação ao diretório
virtual (/MyDir/redirect.asp).
Largura
Especifica a largura do anúncio na página, em pixels. O padrão são 440 pixels.
Altura
Especifica a altura do anúncio na página, em pixels. O padrão são 60 pixels.
598
Capítulo 10 – Utilizando Componentes do IIS
Borda
Especifica a espessura da borda do link em torno do anúncio, em pixels. O padrão é uma
borda de 1 pixel. Defina esse parâmetro para 0 para um link sem borda.
Estes quatro primeiros parâmetros são opcionais e caso sejam definidos têm efeitos sobre
todos os anúncios a serem exibidos. Caso um ou mais destes parâmetros não seja definido,
serão utilizados os valores padrão. Mesmo que nenhum destes parâmetros seja definido,
devemos colocar o * em uma linha, antes de iniciarmos a segunda seção do documento.
A partir de agora veremos os parâmetros para a segunda seção do documento, após a linha
com *. Estes parâmetros definem cada um dos anúncios a serem exibidos, individualmente.
URL_anúncio
A localização do arquivo de imagem do anúncio. Por exemplo: images/anuncio1.gif.
URL_home_page_anúncio
A localização da home page do anúncio, isto é, a página que será carregada se o usuário clicar
no anúncio. Se o anúncio não tiver uma home page, coloque um hífen (-) nessa linha para
indicar que não existe qualquer link para esse anúncio.
Texto
Um texto alternativo exibido se o navegador não oferecer suporte a elementos gráficos ou se
seus recursos gráficos estiverem desativados.
Impressões
Um número entre 0 e 10000 que indica a densidade relativa do anúncio.
Por exemplo, se um Arquivo de Programação de Rotatória contém três anúncios com o parâmetro
impressões definido para 2, 3 e 5, o primeiro anúncio será exibido durante 20 % do tempo, o
segundo, durante 30 % do tempo e o terceiro, durante 50 % do tempo. Se a soma dos parâmetros de
impressão de todos os itens exceder 10000, será gerado um erro na primeira vez que o Arquivo de
Programação de Rotatória for acessado por uma chamada do método GetAdvertisement.
599
Criando Sites Dinâmicos com ASP 3.0
Exemplo
O script a seguir demonstra como você pode usar um Arquivo de Programação de Rotatória
para exibir vários anúncios e como incluir um arquivo de redirecionamento.
Capitulo10\rotatoria.txt
WIDTH 236
HEIGHT 56
BORDER 4
*
/capitulo10/imagens/anuncio1.gif
-
Página do Anunciante 1
20
/capitulo10/imagens/anuncio2.gif
http://servidor/capitulo10/anunciante2.htm
Página do Anunciante 2
30
/capitulo10/imagens/anuncio3.gif
http://servidor/capitulo10/anunciante3.htm
Página do Anunciante 3
50
Observe que quando for exibido anuncio1.gif, o mesmo não será exibido como um link.
O Arquivo de Redirecionamento
O Arquivo de Redirecionamento é um arquivo criado pelo desenvolvedor da aplicação Web.
Ele inclui geralmente um script para a análise da seqüência de caracteres da solicitação pelo
objeto Ad Rotator e para o redirecionamento do usuário para a URL associada ao anúncio no
qual o usuário clicou.
Você também pode incluir um script no Arquivo de Redirecionamento para contar o número
de usuários que clicaram em um anúncio específico e salvar essas informações em um arquivo
no servidor.
Exemplo
O exemplo a seguir redireciona o usuário para a home page do anúncio.
600
Capítulo 10 – Utilizando Componentes do IIS
redireciona.asp
<% Response.Redirect(Request.QueryString(“url”)) %>
Observe que o parâmetro URL é passado no próprio link quando o usuário clica no anúncio.
É por isso que estamos utilizando Request.QueryString.
O nome do arquivo de imagem também é passado como parâmetro através da URL. Podemos
utilizar este parâmetro para calcular o número de vezes que cada anúncio é clicado. No
fragmento de código abaixo temos um exemplo de como calcular quantas vezes foram clicados
cada um dos anúncios do nosso exemplo:
➥ anuncio1.gif
➥ anuncio2.gif
➥ anuncio3.gif
Arquivo redireciona.asp que faz a contabilidade de cliques em cada anúncio:
<%
Select case Request.QueryString(“image”)
Case “anuncio1.gif”
count_anuncio1=count_anuncio1+1
Case “anuncio2.gif”
count_anuncio2=count_anuncio2+1
Case “anuncio3.gif”
count_anuncio3=count_anuncio3+1
End Select
Código para salvar o valor do contador para cada anúncio no banco de dados
...
Código para redirecionar para a página específica de cada anúncio
...
%>
Onde temos “Código para salvar o valor do contador para cada anúncio no banco de dados”,
poderíamos estabelecer uma conexão com um banco de dados e salvar o valor de cada contador
no banco de dados, pois após a página de redirecionamento ter sido abandonada, os valores
dos contadores seriam perdidos. Assim, salvando-os no banco de dados, podemos mantê-los,
que é justamente o objetivo.
601
Criando Sites Dinâmicos com ASP 3.0
Propriedade Descrição
Border Especifica o tamanho da borda em torno do anúncio. Para
definir a borda utilizamos a sintaxe:objeto.border=tamanho.
Onde tamanho especifica a espessura da borda que circunda
o anúncio exibido. O padrão é o valor definido no cabeçalho
do Arquivo de Programação de Rotatória. Ex: objeto.border = 2.
Clickable Define se o anúncio será ou não um link para uma outra
página. Pode ter os valores True ou False. A sintaxe para esta
propriedade é a seguinte: objeto.clickable=true ou
objeto.clickable=false.
TargetFrame Esta propriedade especifica o nome do Frame onde deve ser
carregado o anúncio. Utilizamos a seguinte sintaxe:
objeto.TargetFrame=nome_do_frame.
Sintaxe:
GetAdvertisement(arquivo de rotatória)
O único parâmetro para este método especifica o local do arquivo de programação de rotatória
em relação ao diretório virtual. Por exemplo, se o caminho físico fosse C:\Inetpub\wwwroot\
Ads\Adrot.txt (no qual wwwroot é o diretório virtual “/”), você especificaria o caminho \Ads\
Adrot.txt. No nosso exemplo, temos a pasta Capitulo10 dentro da pasta wwwroot, a qual está
localizada em E:\Inetpub\wwwroot\Capitulo10\rotatoria.txt. Vamos especificar \Capitulo10\
rotatoria.txt.
Este método retorna o código HTML que exibe o anúncio na página atual.
602
Capítulo 10 – Utilizando Componentes do IIS
6 <%
8 Set conteudo=Server.CreateObject(“MSWC.AdRotator”)
9 conteudo.Clickable = True
10 %>
11 <HR>
12 <P>Clique no Banner abaixo:</P>
13 <HR>
14 <% =conteudo.GetAdvertisement(“/Capitulo10/rotatoria.txt”)
15 %>
16 <HR>
17 <P> Conteúdo da Página.</P>
18 </BODY>
19 </HTML>
603
Criando Sites Dinâmicos com ASP 3.0
Assim, em metade das vezes que a página for acessada, será exibido o anúncio 3 (50%).
604
Capítulo 10 – Utilizando Componentes do IIS
Quando uma instância do objeto PageCounter é criada em uma página pelo método
Server.CreateObject, o objeto recupera a contagem atual de acessos à página da Web
especificada do objeto Central Management. Em seguida, o objeto pode ser manipulado com
os métodos que expõe.
O componente Contador de página cria entradas na Registry do Windows 2000. Ele adiciona
a chave MSWC.PageCounter ao registro quando o objeto é compilado ou registrado. A chave
é adicionada abaixo de HKEY_CLASSES_ROOT e contém os seguintes valores nomeados:
➥ File_Location: Uma seqüência de caracteres que especifica o caminho e o nome do
arquivo Hit Count Data. O nome de arquivo padrão é Hitcnt.cnt. Esse arquivo está
localizado em diretório \winnt\system32\inetsrv\Data. O ideal é deixar que o próprio
IIS gerencie este arquivo.
605
Criando Sites Dinâmicos com ASP 3.0
Considere o exemplo:
contador.Hits(“/capitulo10/anuncio1.asp”)
NOTA
O método Hits retorna um número do tipo LONG que indica o número de vezes que uma
página da Web específica foi aberta.
Considere o exemplo:
contador.PageHit( )
➥ Reset: O método Reset define a contagem de acessos à uma página da Web
especificada para 0.
606
Capítulo 10 – Utilizando Componentes do IIS
Veja o exemplo:
contador.Reset(“/capitulo10/anuncio1.asp”)
9 <%
11 Set contador=Server.CreateObject(“MSWC.PageCounter”)
12 %>
14 <%
15 contador.PageHit
16 Response.Write contador.Hits
17 %>
18 <%
19 If contador.Hits =1 Then
20 Response.Write “Vez”
607
Criando Sites Dinâmicos com ASP 3.0
21 Else
22 Response.Write “Vezes”
23 End If
24 %>
25 </B></FONT>
26 <HR>
27 </BODY>
28 </HTML>
Na primeira vez que esta página for acessada, obteremos o resultado indicado na Figura 10.11.
Na segunda vez que a página for acessada o contador já estará em 2, conforme indicado na
Figura 10.12, e assim sucessivamente.
608
Capítulo 10 – Utilizando Componentes do IIS
Na Figura 10.13, temos uma noção do arquivo hitcnt.cnt onde são armazenadas as informações
sobre o número de acessos.
Porém esta, realmente, não é uma tarefa simples. Apenas para ter uma idéia das dificuldades:
➥ Os Modelos de Objetos do Internet Explorer e do Netscape Navigator são diferentes.
➥ Existem, também, diferenças na implementação de DHTML e Java Script, que no Internet
Explorer era conhecido como JScript, agora foi definido um “padrão conhecido com
ECMA Script”, na tentativa de unificar a implementação dos dois principais navegadores.
➥ A maneira como as tags são interpretadas não é exatamente a mesma, podendo existir
diferenças na apresentação das páginas.
Isto significa que o desenvolvimento Web para a Internet é uma missão quase impossível? De
maneira alguma, esta aí o sucesso da Internet e dos sites de Comércio Eletrônico para
comprovar que o modelo Web já se estabeleceu e só tende a crescer.
609
Criando Sites Dinâmicos com ASP 3.0
capacidades do navegador do cliente, e com base nestas capacidades, carregar uma ou outra
versão da página, específica para cada caso.
Onde temos:
➥ nome_objeto: Especifica o nome do objeto BrowserType criado pela chamada do
Server.CreateObject.
➥ MSWC.BrowserType: É o nome pelo qual o componente é identificado no servidor IIS.
610
Capítulo 10 – Utilizando Componentes do IIS
Na Listagem 10.11, temos um pequeno exemplo retirado do Help do IIS, onde são detectadas
algumas capacidades do navegador.
7 <TABLE BORDER=1>
8 <TR>
9 <TD>Browser</TD>
10 <TD> <%= bc.browser %> </TD>
11 <TR>
12 <TD>Version</TD>
13 <TD> <%= bc.version %> </TD>
14 </TR>
15 <TR>
16 <TD>Frames</TD>
17 <TD>
18 <% if (bc.frames = TRUE) then %> TRUE
19 <% else %> FALSE
20 <% end if %>
<TD>
21 </TR>
22 <TR>
23 <TD>Tables</TD>
24 <TD>
25 <% if (bc.tables = TRUE) then %> TRUE
26 <% else %> FALSE
27 <% end if %>
28 </TD>
29 </TR>
611
Criando Sites Dinâmicos com ASP 3.0
30 <TR>
31 <TD>BackgroundSounds</TD>
32 <TD>
33 <% if (bc.BackgroundSounds = TRUE) then %> TRUE
34 <% else %> FALSE
35 <% end if %> </TD>
36 </TR>
37 <TR>
38 <TD>VBScript</TD>
39 <TD>
40 <% if (bc.vbscript = TRUE) then %> TRUE
41 <% else %> FALSE
42 <% end if %>
43 </TD>
44 </TR>
45 <TR>
46 <TD>JScript</TD>
47 <TD>
48 <% if (bc.javascript = TRUE) then %> TRUE
49 <% else %> FALSE
50 <% end if %>
51 </TD>
52 </TR>
53 </TABLE>
54 </BODY>
55 </HTML>
Ao carregarmos este exemplo no Internet Explorer, obtemos o resultado indicado na Figura 10.14.
612
Capítulo 10 – Utilizando Componentes do IIS
613
Criando Sites Dinâmicos com ASP 3.0
Propriedade Descrição
ActiveXControls Retorna True se o navegador suporta controles
ActiveX.
Backgroundsounds Retorna True se o navegador suporta sons de
fundo.
Beta Retorna True se o navegador for uma versão Beta.
Browser Retorna o nome do navegador.
Cookies Retorna True se o navegador suporta Cookies.
Frames Retorna True se o navegador suporta Frames.
JScript Retorna True se o navegador suporta JScript.
Plataform Especifica a plataforma (Sistema Operacional),
no qual roda o navegador.
Tables Retorna True se o navegador suporta Tabelas.
VBScript Retorna True se o navegador suporta VBScript.
Version Retorna a versão do navegador.
Como um exemplo final, podemos utilizar este componente para detectar se o navegador é o
Internet Explorer ou o Netscape e, com base nesta informação, redirecionar o usuário para
uma página desenvolvida especificamente para cada um dos navegadores.
5 <BODY>
614
Capítulo 10 – Utilizando Componentes do IIS
15 </BODY>
16 </HTML>
Conclusão
Neste capítulo estudamos, detalhadamente, alguns componentes importantes na criação de
aplicativos Web, utilizando ASP e o IIS.
Iniciamos o capítulo por um estudo completo do objeto Server. Vimos todos os métodos e a
única propriedade deste objeto. Depois, foi apresentado um exemplo prático, o qual soluciona
um problema bastante comum na criação de aplicações Web: como tornar o nome de um
usuário ou produto em um link, para o registro do funcionário ou produto no banco de dados.
Com a utilização dos métodos do objeto Server foi simples a solução deste problema.
Depois, passamos a estudar uma série de componentes do IIS. Estudamos em detalhes, cada
um dos seguintes componentes:
➥ Content Link.
➥ Ad Rotator.
➥ Page Counter.
➥ Browser Capabilities.
615
Criando Sites Dinâmicos com ASP 3.0
Para cada um destes componentes foram apresentados exemplos completos, que ilustraram a
utilização e as capacidades dos mesmos.
616
Capítulo 11 – Os Objetos FileSystemObject, Drive, Folder e File
Capítulo 11
Os Objetos FileSystemObject,
Drive, Folder e File
617
Criando Sites Dinâmicos com ASP 3.0
Introdução
Iniciaremos o capítulo por um estudo detalhado do objeto FileSystemObject. Este objeto nos
fornece uma série de recursos para acesso ao sistema de arquivos do servidor, através de
nossas páginas ASP.
Veremos uma série de métodos e uma propriedade que fazem parte deste objeto. Com a
utilização do objeto FileSystemObject podemos criar páginas ASP para execução de funções
administrativas, como por exemplo:
➥ Verificação do espaço disponível em disco e unidades da rede.
➥ Efetuar cópia de segurança entre unidades de disco.
➥ Verificar se determinadas unidades, como gravador de CD ou ZIP Drive, estão
disponíveis para uso.
➥ Fazer um levantamento do espaço utilizado em cada drive do sistema.
O objeto FileSystemObject é, com certeza, um dos que oferece o maior número de métodos.
Vamos estudar todos, detalhadamente. Também estudaremos alguns objetos derivados do
objeto FileSystemObject. Vamos estudar o objeto Drive e suas diversas propriedades. Um
pequeno exemplo de utilização destas propriedades será apresentado. Vamos estudar também
os objetos Folder e File suas diversas propriedades e métodos. Um pequeno exemplo de
utilização das propriedades de cada objeto será apresentado.
No final do capítulo, apresentaremos um exemplo prático que utiliza os diversos objetos que
foram mostrados neste capítulo.
O Objeto FileSystemObject
O objeto FileSystemObject nos fornece uma série de recursos para acesso ao sistema de arquivos
do servidor, através de nossas páginas ASP. Com os recursos oferecidos por este objeto, podemos
manipular arquivos de texto, pastas e drives a partir do código ASP.
618
Capítulo 11 – Os Objetos FileSystemObject, Drive, Folder e File
Set fileobj=Server.CreateObject(“Scripting.FileSystemObject”)
619
Criando Sites Dinâmicos com ASP 3.0
Para drives de dispositivos removíveis, como um CD-ROM ou um ZIP Drive, este método
retorna True, mesmo que não exista uma mídia no drive.
NOTA
Podemos utilizar a propriedade IsReady do objeto Drive para determinar se o mesmo está
pronto para ser acessado. No exemplo do CD-ROM, podemos utilizar a propriedade IsReady
para determinar se existe ou não um CD-ROM no drive de CD. Aprenderemos a utilizar a
propriedade IsReady quando estudarmos o objeto Drive mais adiante neste capítulo.
If fileobj.DriveExists(“X:”) Then
Response.Write “Drive X: Existe !!”
Else
Response.Write “Drive X: Não Existe !!”
End If
%>
➥ O método GetDrive: Este método retorna um objeto do tipo Drive, correspondente ao
caminho passado como parâmetro. Podemos passar como parâmetro a identificação
de um drive, como por exemplo: “d”, “d:”, “d:\” ou um caminho para um drive da rede,
no tradicional formato \\nome_do_computador\nome_do_compartilhamento.
620
Capítulo 11 – Os Objetos FileSystemObject, Drive, Folder e File
NOTA
Estudaremos o objeto Drive mais adiante neste capítulo.
Neste exemplo utilizamos a propriedade freespace do objeto Drive e a dividimos duas vezes
por 1024 para obter o espaço livre em MB. Depois utilizamos a função FormatNumber, para
exibir o valor obtido sem as casas decimais. O resultado deste trecho de código é algo do tipo:
Espaço livre em E: 1.070 MB
➥ O método GetDriveName: Este método retorna o nome do drive que foi passado como
parâmetro.
Set fileobj=Server.CreateObject(“Scripting.FileSystemObject”)
621
Criando Sites Dinâmicos com ASP 3.0
É importante observar que a pasta C:\pasta123 não será criada pela utilização deste método.
Apenas estamos atribuindo à variável novapasta, o caminho C:\pasta123. Para criar uma nova
pasta, podemos utilizar o método CreateFolder, que veremos logo adiante.
➥ O método CopyFolder “fonte”,“destino”,substituir: Copia uma ou mais pastas
especificadas no parâmetro fonte. Podemos copiar mais do que um pasta, pois podemos
utilizar caracteres curinga, como por exemplo C:\documentos\*. As pastas de origem
são copiadas para a pasta especificada pelo parâmetro destino. Todos os arquivos
contidos nas pastas de origem serão copiados para o destino. O parâmetro substituir é
opcional. Ele pode conter os valores True ou False. Este parâmetro especifica se arquivos
já existentes no destino devem ou não ser sobrescritos. Se a pasta de destino já existe
e o parâmetro substituir é definido em Falso, irá ocorrer um erro. O valor padrão para
o parâmetro substituir é True.
IMPORTANTE
Somente podemos utilizar caracteres curinga na parte final do caminho. Considere o seguinte
exemplo:
FileSystemObject.CopyFolder “C:\mydocuments\letters\*”, “C:\tempfolder\”
Se a pasta de destino ainda não existe, será criada, e a pasta de origem e todo o seu conteúdo
serão copiados.
Se o destino for o nome de uma pasta, o método tentará copiar a pasta de origem e todo o seu
conteúdo para a pasta de destino. Se um arquivo que está sendo copiado já existir na pasta de
destino e o parâmetro substituir estiver definido como False, irá ocorrer um erro. Caso contrário,
o arquivo do diretório de origem será copiado sobre o arquivo do diretório de destino.
622
Capítulo 11 – Os Objetos FileSystemObject, Drive, Folder e File
Esta linha de código irá copiar todo o conteúdo da pasta C:\meus documentos para a pasta
C:\teste. Caso a pasta C:\teste não exista, a mesma será automaticamente criada antes que a
cópia seja efetuada.
➥ O método CreateFolder(nomepasta): Este método cria uma pasta de acordo com o
parâmetro que foi passado para o mesmo. Caso a pasta já exista, será gerado um erro.
Figura 11.2: Erro gerado pelo método CreateFolder quando a pasta já existe.
623
Criando Sites Dinâmicos com ASP 3.0
Será gerado um erro se a pasta especificada pelo parâmetro pastaname não for encontrada.
Este método encerra a sua execução na ocorrência do primeiro erro, sendo que as alterações
que já foram feitas não serão desfeitas.
Considere o exemplo:
fileobj.DeleteFolder(“C:\teste123”)
Caso a pasta a ser eliminada não exista, obteremos a mensagem de erro indicada na Figura 11.3.
Figura 11.3: Erro gerado pelo método DeleteFolder quando a pasta não existe.
624
Capítulo 11 – Os Objetos FileSystemObject, Drive, Folder e File
If fileobj.FolderExists(caminho) then
Response.Write “<B>Este drive possui a pasta Meus documentos<B> <HR>”
Else
Response.Write “<B>Este drive não possui a pasta Meus documentos
<B><HR>”
End If
Next
%>
625
Criando Sites Dinâmicos com ASP 3.0
for C:\meus documentos e o parâmetro passado para este método for “cartas”, o valor
de retorno será C:\meus documentos\cartas.
Vamos a mais alguns exemplos para esclarecer o comportamento deste método. Vamos supor
que a pasta atual é C:\meus documentos\cartas. Na Tabela 11.1 temos alguns exemplos de
retorno deste método.
626
Capítulo 11 – Os Objetos FileSystemObject, Drive, Folder e File
Considere o exemplo:
pastacontem = fileobj.GetParentFolderName(“C:\meus documentos\word”)
0 – Pasta do Windows.
1 – Pasta de Sistema.
2 – Pasta temporária.
627
Criando Sites Dinâmicos com ASP 3.0
Com este fragmento de código, criamos um objeto do tipo Folder, o qual está ligado à pasta
temporária do Windows e pode ser acessado pela variável temppasta.
➥ O método MoveFolder(origem,destino): Move a pasta especificada no parâmetro origem,
para a pasta especificada no parâmetro destino. Podemos incluir caracteres curinga na
origem, porém não no destino.
Se a origem contém caracteres curinga ou o destino termina com o caractere “\”, o método
MoveFolder considera que o destino representa o nome de uma pasta já existente, para a qual
deve ser movida a pasta de origem. Caso contrário o método assume que o parâmetro destino
especifica o nome de uma pasta que deve ser criada e para a qual deve ser movido o conteúdo
da pasta de origem. Em ambos os casos, devemos considerar o seguinte:
1. Se a pasta de destino não existe, a pasta de origem será movida, sendo que a pasta de
destino será criada antes, pelo próprio método MoveFolder.
2. Se o parâmetro destino for o nome de um arquivo, será gerado um erro.
3. Se o parâmetro destino for o nome de uma pasta que já existe, será gerado um erro.
O método MoveFolder será interrompido na ocorrência do primeiro erro. Quaisquer alterações
que tenham sido feitas não serão revertidas.
Considere o exemplo:
fileobj.MoveFolder “C:\teste1”, “C:\teste2”
Se a origem contém caracteres curinga ou o destino termina com o caractere “\”, o método
CopyFile considera que o destino representa o nome de uma pasta já existente, para a qual
628
Capítulo 11 – Os Objetos FileSystemObject, Drive, Folder e File
devem ser copiados os arquivos especificados pelo parâmetro origem. Caso contrário o método
assume que o parâmetro destino especifica o nome de um arquivo que deve ser criado. Em
ambos os casos, devemos considerar o seguinte:
1. Se a pasta de destino não existe, os arquivos especificados no parâmetro origem serão
copiados, sendo que a pasta de destino será criada antes, pelo próprio método CopyFile.
2. Se o parâmetro destino for o nome de um arquivo que já existe, será gerado um erro
caso o parâmetro substituir esteja definido como False; caso contrário o arquivo existente
será substituído.
3. Se o parâmetro destino for o nome de uma pasta, será gerado um erro.
O parâmetro substituir pode assumir os valores True ou False. Quando este parâmetro tiver o
valor True, se o arquivo já existir, o mesmo será eliminado e um novo arquivo será criado. O
padrão para o parâmetro substituir é False. Este parâmetro é opcional.
O parâmetro unicode pode assumir os valores True ou False. Se este parâmetro tiver o valor
True, o texto será salvo com caracteres unicode, os quais utilizam 2 bytes por caractere, ao
invés de 1 byte por caractere como é o caso do padrão ASCII. O valor padrão para o parâmetro
unicode é False. Este parâmetro é opcional.
629
Criando Sites Dinâmicos com ASP 3.0
Este fragmento de código cria um objeto do tipo TextStream, o qual é associado à variável arqtexto.
Depois utilizamos o método writeline para escrever linhas de texto no arquivo c:\teste.txt.
Na Figura 11.6 temos o conteúdo do arquivo teste.txt, após a execução do código do nosso exemplo.
Se o arquivo especificado não for encontrado, será gerado um erro. O método DeleteFile será
interrompido na ocorrência do primeiro erro. Quaisquer alterações que tenham sido feitas
não serão revertidas.
Considere o exemplo:
fileobj.DeleteFile(“C:\meus documentos\oficio.doc”,true)
➥ O método FileExists(arquivo): Este método retorna True se o arquivo passado como
parâmetro existe, caso contrário o método irá retornar False.
630
Capítulo 11 – Os Objetos FileSystemObject, Drive, Folder e File
Considere o exemplo:
<%
Response.Write fileobj.GetBaseName(“C:\meus documentos\vendas.xls”)
%>
Considere o exemplo:
<%
Response.Write fileobj.GetExtensionName(“C:\meus documentos\vendas.xls”)
%>
NOTA
Iremos estudar o objeto File em detalhes, ainda neste capítulo.
Considere o exemplo:
<%
Set fileobj=Server.CreateObject(“Scripting.FileSystemObject”)
Set arquivo=fileobj.GetFile(“C:\autoexec.bat”)
Response.Write “Caminho do arquivo: ” & arquivo.path & “<HR>”
Response.Write “Data de criação: ” & arquivo.DateCreated & “<HR>”
Response.Write “Data último acesso: ” & arquivo.DateLastAccessed & “<HR>”
%>
631
Criando Sites Dinâmicos com ASP 3.0
NOTA
Observe que já utilizamos algumas propriedades do objeto File. Conforme descrito
anteriormente, iremos estudar este objeto ainda neste capítulo.
NOTA
Este método não verifica se o caminho passado como parâmetro existe ou não.
Este método não cria um arquivo temporário. Ele apenas gera um nome que pode ser utilizado
pelo método CreateTextFile, o qual pode ser usado para criar o arquivo.
Considere o exemplo:
<%
Set fileobj=Server.CreateObject(“Scripting.FileSystemObject”)
632
Capítulo 11 – Os Objetos FileSystemObject, Drive, Folder e File
tempname=fileobj.GetTempName
Set txttemp=fileobj.CreateTextFile(tempname)
%>
➥ O método MoveFile(origem, destino): Este método pode ser utilizado para mover o
arquivo passado no parâmetro origem para a localização especificada no parâmetro
destino. Podemos utilizar caracteres curinga na origem, porém não no destino.
Se a origem contém caracteres curinga ou o destino termina com o caractere “\”, o método
MoveFile considera que o destino representa o nome de uma pasta já existente, para a qual
deve ser movido o arquivo de origem. Caso contrário, o método assume que o parâmetro
destino especifica o nome de uma pasta e arquivo para o qual deve ser movido o arquivo de
origem. Em ambos os casos, devemos considerar o seguinte:
1. Se o destino não existe, o arquivo de origem será movido, sendo que a pasta de destino
será criada antes, pelo próprio método MoveFile.
2. Se o parâmetro destino for o nome de um arquivo existente, será gerado um erro.
3. Se o parâmetro destino for o nome de uma pasta, será gerado um erro.
O método MoveFile será interrompido na ocorrência do primeiro erro. Quaisquer alterações
que tenham sido feitas não serão revertidas.
Considere o exemplo:
<%
Set fileobj=Server.CreateObject(“Scripting.FileSystemObject”)
fileobj.MoveFile “C:\teste.txt”, “D:\documentos\teste.txt”
%>
➥ O método OpenTextFile(arquivo,iomode,create,format): Cria um arquivo com o nome
passado no parâmetro arquivo ou abre um arquivo existente. Este método retorna um
objeto do tipo TextStream que faz referência ao arquivo especificado pelo parâmetro arquivo.
O parâmetro iomode determina o tipo de acesso que teremos ao arquivo. Os valores permitidos
para este parâmetro são os seguintes:
1 – ForReading: Somente para leitura. Este é o valor padrão.
2 – ForWriting: Somente para escrita. Não podemos ler o conteúdo já existente.
8 – ForAppending: Abre o arquivo e grava informações no final do mesmo.
Se o parâmetro create for definido como True quando tentarmos escrever ou adicionar
(Appending) conteúdo a um arquivo que não existe, um novo arquivo será criado. O valor
padrão para este parâmetro é False.
633
Criando Sites Dinâmicos com ASP 3.0
Considere o exemplo:
<%
Set fileobj=Server.CreateObject(“Scripting.FileSystemObject”)
Set arquivo = fileobj.OpenTextFile(“C:\testfile.txt”, ForWriting, True)
%>
Com isso finalizamos o estudo dos métodos relacionados com arquivos e também o estudo
do objeto FileSystemObject. Agora iniciaremos o estudo dos objetos Drive, Folder e File.
O Objeto Drive
Para criar um objeto do tipo Drive, utilizamos o método GetDrive do objeto FileSystemObject,
conforme descrito anteriormente.
Agora podemos ter acesso a todas as propriedades do objeto driveobj. Então vamos ao estudo
destas propriedades.
Propriedade Descrição
AvailableSpace Retorna a quantidade de espaço livre, disponível no drive
para o usuário. Esta propriedade leva em consideração a
definição de quotas de disco e outras restrições que podem
634
Capítulo 11 – Os Objetos FileSystemObject, Drive, Folder e File
Propriedade Descrição
ser impostas pelo Windows 2000. O valor retornado é
em bytes. Caso não existam definição de quotas ou
outras restrições, esta propriedade retornará o mesmo
valor que a propriedade FreeSpace.
DriveLetter Retorna a letra do drive.
DriveType Retorna o tipo do drive. Os valores de retorno são os
seguintes: Desconhecido (0), Removível (1), Fixo (2),
Rede (3), CD-Rom (4) e RamDisk (5). Esta propriedade
retorna o valor numérico, isto é, 0, 1, 2, 3, 4 ou 5.
FileSystem Retorna o tipo de sistema de arquivo que está sendo
utilizado. Os valores possíveis são: FAT, FAT32, NTFS
ou CDFS.
FreeSpace Retorna a quantidade total de espaço livre, disponível
no drive. O valor retornado é em bytes.
IsReady Retorna True se o drive está pronto para ser usado e False
em caso contrário. Por exemplo, se um drive de CD-Rom
estiver sem CD esta propriedade irá retornar False.
Path Retorna o caminho para o drive, no seguinte formato C:,
D:, etc.
RootFolder Retorna um objeto do tipo Folder, o qual representa a
pasta raiz do drive.
SerialNumber Retorna um número serial, utilizado para identificar de
maneira única o drive.
ShareName Retorna o nome do compartilhamento de rede para o
drive, se o mesmo for um drive de rede.
TotalSize Retorna o tamanho total do drive em bytes.
VolumeName Pode ser utilizado para definir ou retornar o Label do
drive.
Na Listagem 11.1, podemos ver um exemplo de utilização das propriedades do objeto Drive.
635
Criando Sites Dinâmicos com ASP 3.0
7 <%
10 <HR>
11 <%
12 Set objdrive=fileobj.GetDrive(“D:”)
13 Response.Write “Espaço disponível em D para o usuário atual:<B> ” & objdrive.
AvailableSpace & “</B><BR>”
14 Response.Write “Letra do drive D:<B> ” & objdrive.DriveLetter & “</B><BR>”
15 Response.Write “Tipo do drive D: <B>” & objdrive.DriveType & “</B><BR>”
16 Response.Write “Sistema de arquivos do drive D:<B> ” & objdrive.FileSystem &
“</B><BR>”
17 Response.Write “Espaço livre em D:<B> “ & objdrive.FreeSpace & “</B><BR>”
18 Response.Write “O drive D: pode ser usado? <B>” & objdrive.IsReady & “</B><BR>”
19 Response.Write “Caminho para o drive D: —><B>” & objdrive.Path & “</B><BR>”
20 Response.Write “Pasta raiz para o drive D: <B>” & objdrive.RootFolder & “</B><BR>”
21 Response.Write “Número Serial do drive D: <B>” & objdrive.SerialNumber & “</B><BR>”
22 Response.Write “Espaço total do drive D: <B>” & objdrive.TotalSize & “ bytes</B><BR>”
23 Response.Write “Nome do drive D: <B>” & objdrive.VolumeName & “</B><BR>”
24 %>
25 <HR>
26 </BODY>
27 </HTML>
636
Capítulo 11 – Os Objetos FileSystemObject, Drive, Folder e File
Com isso encerramos o estudo do objeto Drive. Agora vamos ao estudo do objeto Folder.
O Objeto Folder
Para criar um objeto do tipo Folder, utilizamos o método GetFolder ou o método
GetSpecialFolder do objeto FileSystemObject, conforme descrito anteriormente. Um objeto
do tipo Folder também é retornado pela propriedade RootFolder do objeto Drive.
Agora podemos ter acesso a todas as propriedades e métodos do objeto folderobj. Então vamos
ao estudo destas propriedades e métodos.
637
Criando Sites Dinâmicos com ASP 3.0
Propriedade Descrição
Attributes Pode ser utilizada para definir ou retornar os atributos
para a pasta. Os valores possíveis são os seguintes:
0 - Arquivo normal, sem nenhum atributo definido;
1 - Somente leitura; 2- Arquivo oculto; 4 - Arquivo de
sistema; 8 - Label do drive; 16 - Pasta ou subpasta;
32 - Indica se o arquivo foi alterado desde o último
backup; 64 - Link ou atalho e 128 - Arquivo compactado.
DateCreated Retorna a data e a hora de criação da pasta.
DateLastAccessed Retorna a data e a hora da última vez que a pasta foi
acessada.
DateLastModified Retorna a data e a hora da última vez que a pasta foi
modificada.
Drive Retorna a letra do drive onde está a pasta.
Files Retorna uma coleção, a qual contém todos os arquivos
existentes no objeto Folder.
IsRootFolder Retorna True se a pasta for a raiz do drive e False caso
contrário.
Name Pode ser utilizada para definir ou retornar o nome da pasta.
ParentFolder Retorna um objeto Folder que é o objeto de nível
superior para a pasta, isto é, é a pasta dentro da qual a
pasta atual encontra-se. Por exemplo, para a pasta
C:\documentos\cartas, a pasta de nível superior é
C:\documentos. Em inglês o termo é conhecido como
“Parent Folder”.
Path Retorna o caminho completo para a pasta, inclusive
utilizando nomes longos.
ShortName Retorna o nome no formato antigo 8.3 da época do DOS.
638
Capítulo 11 – Os Objetos FileSystemObject, Drive, Folder e File
Propriedade Descrição
ShortPath Retorna o caminho completo no formato antigo da
época do DOS, sem a utilização de nomes longos.
Size Retorna o tamanho total da pasta, incluindo todos os
seus arquivos e subpastas.
SubFolders Retorna uma coleção, a qual contém todas as subpastas,
inclusive as subpastas ocultas e de sistema.
Type Retorna uma String que é a descrição do tipo da pasta.
7 <%
8 ‘ O primeiro passo é a criação do objeto FileSystemObject.
9 Set fileobj=Server.CreateObject(“Scripting.FileSystemObject”)
10 %>
11 <HR>
12 <%
13 Set objfolder=fileobj.GetFolder(“C:\meus documentos”)
14 Response.Write “Atributos de C:\Meus documentos:<B> ” & objfolder.Attributes &
“</B><BR>”
15 Response.Write “Data e hora de criação de C:\Meus documentos:<B> ” & objfolder.
DateCreated & “</B><BR>”
16 Response.Write “Data e hora do último acesso à C:\Meus documentos:<B> ” &objfolder.
DateLastAccessed & “</B><BR>”
17 Response.Write “Data e hora da última modificação em C:\Meus documentos:<B> ” &
objfolder.DateLastModified & “</B><BR>”
639
Criando Sites Dinâmicos com ASP 3.0
27 Response.Write “<HR>”
28 Response.Write “SUBPASTAS DA PASTA C:\MEUS DOCUMENTOS <HR>”
32 Response.Write “<HR>”
33 Response.Write “ARQUIVOS DA PASTA C:\MEUS DOCUMENTOS <HR>”
37 %>
38 </BODY>
39 </HTML>
A Figura 11.9 mostra a parte inicial do resultado desta página ao ser carregada no Internet
Explorer.
640
Capítulo 11 – Os Objetos FileSystemObject, Drive, Folder e File
Na Figura 11.10 vemos uma parte do resultado, onde são exibidos os elementos da coleção Files.
641
Criando Sites Dinâmicos com ASP 3.0
Se o destino termina com o caractere “\”, o método Copy considera que o destino representa
o nome de uma pasta já existente, para a qual deve ser copiada a pasta representada pelo
objeto Folder. Caso contrário o método assume que o parâmetro destino especifica o nome
completo de uma nova pasta que deve ser criada.
O parâmetro substituir pode assumir os valores True ou False. O valor padrão é True. Se a
pasta especificada no parâmetro destino já existe e o parâmetro substituir estiver definido em
False, ocorrerá um erro.
Considere o exemplo:
<%
Set fileobj=Server.CreateObject(“Scripting.FileSystemObject”)
Set folderobj = fileobj.GetFolder(“D:\meus documentos”)
folderobj.copy(“E:\meus documentos”,true)
%>
➥ O método CreateTextFile(nomearquivo,substituir,unicode): Este método cria o arquivo
de texto especificado pelo parâmetro nomearquivo e retorna um objeto do tipo
TextStream, o qual pode ser utilizado para gravar informações no arquivo e ler
informações do arquivo.
O parâmetro substituir pode assumir os valores True ou False. Quando este parâmetro tiver o
valor True, se o arquivo já existir o mesmo será eliminado e um novo arquivo será criado. O
padrão para o parâmetro substituir é False. Este parâmetro é opcional.
O parâmetro unicode pode assumir os valores True ou False. Se este parâmetro tiver o valor
True, o texto será salvo com caracteres unicode, os quais utilizam 2 bytes por caractere, ao
invés de 1 byte por caractere como é o caso do padrão ASCII. O valor padrão para o parâmetro
unicode é False. Este parâmetro é opcional.
642
Capítulo 11 – Os Objetos FileSystemObject, Drive, Folder e File
arqtexto.writeline(“LINHA 1 DO TEXTO”)
arqtexto.writeline(“LINHA 2 DO TEXTO”)
arqtexto.writeline(“LINHA 3 DO TEXTO”)
arqtexto.writeline(“*************************”)
%>
Este fragmento de código cria um objeto do tipo TextStream, o qual é associado à variável
arqtexto. Depois utilizamos o método writeline para escrever linhas de texto no arquivo
C:\teste.txt.
Na Figura 11.11 temos o conteúdo do arquivo teste.txt, após a execução do código do nosso
exemplo.
➥ O método Delete(force): Este método elimina a pasta associada com o objeto Folder e
todo o seu conteúdo, isto é, arquivos e subpastas. O parâmetro force pode assumir os
valores True ou False. Se o parâmetro force for definido como True, a pasta será
eliminada mesmo se a mesma ou qualquer um de seus arquivos ou subpastas, tiver o
atributo de Somente leitura marcado. O valor padrão do atributo force é False.
Considere o exemplo:
folderobj.Delete(True)
➥ O método Move destino: Move a pasta e todo o seu conteúdo, para a pasta especificada
no parâmetro destino.
Se o destino termina com o caractere “\”, o método Move considera que o destino representa
o nome de uma pasta já existente, para a qual deve ser movida a pasta. Caso contrário o
método assume que o parâmetro destino especifica o nome de uma nova pasta que deve ser
criada e para a qual deve ser movido o conteúdo da pasta de origem.
643
Criando Sites Dinâmicos com ASP 3.0
Considere o exemplo:
folderobj.Move “C:\copia de seguranca\documentos”
Com isso, encerramos o estudo do objeto Folder. Agora vamos ao estudo do objeto File.
O Objeto File
Para criar um objeto do tipo File, utilizamos o método GetFile do objeto FileSystemObject,
conforme descrito anteriormente.
Agora podemos ter acesso a todas as propriedades e métodos do objeto arqobj. Então vamos
ao estudo destas propriedades e métodos.
Propriedade Descrição
Attributes Pode ser utilizada para definir ou retornar os atributos
para o arquivo. Os valores possíveis são os seguintes:
0 - Arquivo normal, sem nenhum atributo definido;
1 - Somente leitura; 2- Arquivo oculto; 4 - Arquivo de
sistema; 16 - Pasta ou subpasta; 32 - Indica se o arquivo
foi alterado desde o último backup; 1024 - Link ou
atalho e 2048 - Arquivo compactado.
DateCreated Retorna a data e a hora de criação do arquivo.
DateLastAccessed Retorna a data e a hora da última vez que o arquivo foi
acessado.
DateLastModified Retorna a data e a hora da última vez que o arquivo foi
modificado.
644
Capítulo 11 – Os Objetos FileSystemObject, Drive, Folder e File
Propriedade Descrição
Drive Retorna a letra do drive onde está o arquivo.
Name Pode ser utilizada para definir ou retornar o nome do
arquivo.
ParentFolder Retorna um objeto Folder que é o objeto de nível
superior para o arquivo, ou seja, é a pasta dentro da
qual o arquivo encontra-se. Por exemplo, para o arquivo
C:\documentos\nwind.mdb, a pasta de nível superior é
C:\documentos. Em inglês o termo é conhecido como
“Parent Folder”.
Path Retorna o caminho completo para o arquivo, inclusive
utilizando nomes longos.
ShortName Retorna o nome no formato antigo 8.3 da época do DOS.
ShortPath Retorna o caminho completo no formato antigo da
época do DOS, sem a utilização de nomes longos.
Size Retorna o tamanho total do arquivo em bytes.
Type Retorna uma String que é a descrição do tipo do arquivo,
como por exemplo Documento do Word para um
arquivo .doc.
6 <BODY>
7 <%
645
Criando Sites Dinâmicos com ASP 3.0
10 %>
11 <HR>
12 <%
13 Set arqobj=fileobj.GetFile(“C:\meus documentos\nwind.mdb”)
26 Response.Write “<HR>”
27 %>
28 </BODY>
29 </HTML>
646
Capítulo 11 – Os Objetos FileSystemObject, Drive, Folder e File
O parâmetro substituir pode assumir os valores True ou False. O valor padrão é True. Se o
arquivo especificado no parâmetro destino já existe e o parâmetro substituir estiver definido
em False, ocorrerá um erro.
Considere o exemplo:
<%
Set fileobj=Server.CreateObject(“Scripting.FileSystemObject”)
Set arqobj = fileobj.GetFile(“C:\meus documentos\nwind.mdb”)
arqobj.copy(“E:\backup\nwind.mdb”,true)
%>
647
Criando Sites Dinâmicos com ASP 3.0
➥ O método Delete(force): Este método elimina o arquivo associado com o objeto File. O
parâmetro force pode assumir os valores True ou False. Se o parâmetro force for definido
como True, o arquivo será eliminado mesmo que tenha o atributo de Somente leitura.
O valor padrão do atributo force é False.
Considere o exemplo:
arqobj.Delete(True)
➥ O método Move destino: Move o arquivo para a pasta especificada no parâmetro destino.
Se o destino termina com o caractere “\”, o método Move considera que o destino representa o
nome de uma pasta já existente, para a qual deve ser movido o arquivo. Caso contrário o método
assume que o parâmetro destino especifica o nome de um novo arquivo que deve ser criado.
Considere o exemplo:
arqobj.Move “C:\copia de seguranca\”
➥ O método OpenAsTextStream (iomode,format): Abre o arquivo associado ao objeto
File. Este método retorna um objeto do tipo TextStream que faz referência ao arquivo
ligado ao objeto File.
O parâmetro iomode determina o tipo de acesso que teremos ao arquivo. Os valores permitidos
para este parâmetro são os seguintes:
1 – ForReading: Somente para leitura. Este é o valor padrão.
2 – ForWriting: Somente para escrita. Não podemos ler o conteúdo já existente.
8 – ForAppending: Abre o arquivo e grava informações no final do mesmo.
Considere o exemplo:
<%
Set fileobj=Server.CreateObject(“Scripting.FileSystemObject”)
Set arqobj = fileobj.GetFile(“C:\testfile.txt”)
arqobj.OpenAsTextStream(1,0)
%>
Este exemplo abre o arquivo C:\testfile.txt como somente leitura e no formato ASCII.
648
Capítulo 11 – Os Objetos FileSystemObject, Drive, Folder e File
Com isso encerramos o estudo do objeto File. Agora vamos a um exemplo prático de aplicação
do que nos aprendemos neste capítulo.
Exemplo Prático
Neste exemplo vamos considerar o problema a seguir.
Temos uma pasta virtual no servidor IIS chamada informativos. Dentro desta pasta colocamos
diariamente informativos, que são numerados: inf01.htm, inf02.htm e assim por diante. Dentro
da pasta informativos existe, também, um arquivo index.asp que apresenta uma tabela com
todos os informativos disponíveis. Porém não queremos atualizar esta tabela manualmente.
Desejamos que cada vez que um novo arquivo seja salvo na pasta informativos, o mesmo,
automaticamente apareça na tabela de informativos do arquivo index.asp. O nosso trabalho
será construir a página index.asp, de tal maneira que a mesma seja capaz de ler e identificar
os arquivos inf01.htm, inf02.htm, etc. existentes, e criar uma tabela com um link para todos
estes arquivos. Além disso esta tabela deve exibir um máximo de seis colunas. Então, mãos à
obra, vamos pôr os objetos que aprendemos neste capítulo para funcionar.
5 <BODY>
10 <%
11 ‘Crio um objeto do tipo FileSystemObject.
12 Set fileobj=Server.CreateObject(“Scripting.FileSystemObject”)
649
Criando Sites Dinâmicos com ASP 3.0
18 linha=0
19 Response.Write “<TABLE border=1>”
21 If arquivo.name<>“index.asp” then
22 If linha=0 Then
23 Response.Write “<TR>”
24 End If
25 Response.Write “<TD><A HREF=http://servidor/informativos/” & arquivo.name
& “>” & Left(arquivo.name,5) & “</TD>”
26 linha=linha+1
27 If linha=6 Then
28 Response.Write “</TR>”
29 linha=0
30 End If
31 End If
32 Next
33 Response.Write “</TABLE>”
34 %>
35 </BODY>
36 </HTML>
Depois, utilizamos a coleção Files do objeto Folder, para acessar todos os arquivos desta pasta.
Também fizemos uso de uma variável auxiliar – linha. Está variável é utilizada para que possamos
exibir seis links por linha. Além disso fizemos uso da propriedade nome para cada um dos
arquivos, de tal maneira que sejam exibidos apenas os nomes dos arquivos, e não o caminho
completo. Por exemplo, ao invés de exibirmos E:\inetpub\wwwroot\informativos\inf01.htm,
650
Capítulo 11 – Os Objetos FileSystemObject, Drive, Folder e File
utilizando a propriedade name, exibimos apenas inf01.htm. Mas, além disso, fizemos uso da
função Left(arquivo.nome,5), de tal maneira que fosse exibido apenas o nome do arquivo (cinco
primeiros caracteres), sem a extensão. Desta forma é exibido apenas inf01.
651
Criando Sites Dinâmicos com ASP 3.0
Agora toda vez que um novo informativo for gravado na pasta informativos, o usuário, ao
carregar a página index.asp, já verá o link para o novo informativo. Por exemplo, vamos
supor que foram adicionados os informativos inf21.htm e inf22.htm. Bastaria recarregar a
página index.asp que o link para os dois novos informativos já seriam, automaticamente,
exibidos, conforme indicado na Figura 11.15.
Conclusão
Neste capítulo fizemos um estudo completo do objeto FileSystemObject e de seus derivados,
tais como os objetos Drive, Folder e File.
Com certeza o objeto FileSystemObject é um dos mais complexos devido ao grande número
de métodos e objetos derivados que o mesmo apresenta. Porém, conforme podemos constatar
no decorrer deste capítulo, é extremamente simples sua utilização.
652
Capítulo 11 – Os Objetos FileSystemObject, Drive, Folder e File
Alguns cuidados devem ser tomados, principalmente, com métodos que movem ou eliminam
arquivos, pois se ocorrem erros, o método terá a execução suspensa na ocorrência do primeiro
erro e modificações que já tenham sido feitas não serão revertidas.
Por exemplo, se estivermos movendo uma pasta e todas as suas subpastas de uma localização
para outra e ocorrer um erro no meio do processo, alguns arquivos terão sido movidos e outros
não. Aqueles que foram movidos não serão restaurados ao local de origem. Por isso, sempre é
uma boa idéia testar a página ASP que utiliza estes métodos em um ambiente de testes, para
somente depois colocá-las em produção. Aliás, ter um ambiente específico para testes é uma
excelente idéia não só no desenvolvimento para a Web, mas em qualquer tipo de desenvolvimento
de software.
No capítulo final deste livro estudaremos uma série de técnicas adicionais que auxiliam e
facilitam a criação e a padronização no desenvolvimento de páginas ASP.
653
Capítulo 12 – Tratamento de Erros, Transações e Outros Assuntos
Capítulo 12
Tratamento de Erros,
Transações e Outros Assuntos
655
Criando Sites Dinâmicos com ASP 3.0
O tratamento de erros é uma das partes mais importantes de qualquer aplicação. Porém,
muitas vezes, é simplesmente ignorado, ou não é feito como deveria ser. Sem um tratamento
de erro adequado, a aplicação retorna mensagens pouco elucidativas, ou simplesmente pára
de funcionar. Com o tratamento de erros, tratamos situações de exceção, procurando prever o
maior número possível de casos que podem gerar erros. Além de prever estas situações,
escrevemos código para tratá-las adequadamente.
NOTA
Implementamos esta técnica de validação de campos em um formulário, em um exemplo do
Capítulo 6.
Com isso podemos notar que um correto tratamento de erros torna os nossos aplicativos Web
mais “amigáveis” e fáceis de trabalhar. Sempre que possível devemos evitar situações onde o
usuário recebe mensagens de erro técnicas, enviadas pelo servidor. Sempre que possível
devemos introduzir código para tratamento destes erros, de tal forma que os mesmos possam
ser interceptados e, se não corrigidos a tempo, pelo menos possamos enviar uma mensagem
mais “amigável”, para que o usuário saiba onde está o problema.
656
Capítulo 12 – Tratamento de Erros, Transações e Outros Assuntos
Na parte final do capítulo estaremos tratando de assuntos diversos, tais como a utilização da
diretiva #include e também o uso de diretivas como @CODEPAGE e @TRANSACTION.
O Objeto ASPError
O objeto ASPError é uma das novidades da versão 3.0 do ASP. Para obtermos um objeto do
tipo ASPError, utilizamos o método GetLastError do objeto Server. O objeto ASPError, através
de suas diversas propriedades, nos fornece uma série de informações a respeito do último
erro ocorrido em nossa aplicação Web.
NOTA
Quando o IIS encontrar um erro ao compilar ou executar um arquivo .asp, ele gerará um erro
personalizado 500;100. Por padrão, todos os aplicativos e sites da Web irão transferir o
processamento de um erro personalizado 500;100 para o arquivo .asp padrão. Após a geração
de um erro personalizado 500;100, o IIS também criará uma instância do objeto ASPError que
descreverá a condição de erro.
Propriedade Descrição
ASPCode Retorna um número inteiro, correspondente ao número do
erro gerado pelo IIS.
ASPDescription Retorna uma descrição mais detalhada a respeito do erro.
Category Retorna a origem do erro. Por exemplo, se foi o código ASP,
a linguagem de Script ou um determinado objeto.
Column Retorna a coluna exata onde ocorreu o erro, na linha
do erro.
657
Criando Sites Dinâmicos com ASP 3.0
Propriedade Descrição
Description Retorna uma descrição resumida do erro.
File Retorna o nome do arquivo que estava sendo processado
quando ocorreu o erro.
Line Retorna um número inteiro indicando a linha de
ocorrência do erro.
Number Retorna um código de erro do padrão COM.
Source Retorna, quando possível, o código da linha que causou
o erro.
Erros de Sintaxe
Este é um dos tipos de erro mais comuns. Considere o comando a seguir:
Response.Write “Informativos da empresa ABC Ltda!
658
Capítulo 12 – Tratamento de Erros, Transações e Outros Assuntos
Observe que nesta linha o desenvolvedor esqueceu de fechar aspas. Este pequeno engano é
suficiente para gerar o erro indicado na Figura 12.1.
Observe que na própria mensagem de erro já existe um indicativo da linha e do comando que
está gerando o erro. Estas informações facilitam enormemente a correção do problema. Sem
a menor sombra de dúvida, os erros de sintaxe são os mais fáceis de corrigir, principalmente
pelo fato que a página simplesmente não é carregada se houverem erros de sintaxe.
Para corrigir o nosso problema, bastaria fechar aspas, conforme indicado a seguir:
Response.Write “Informativos da empresa ABC Ltda!”
659
Criando Sites Dinâmicos com ASP 3.0
Dim arrayinteiros(9)
arrayinteiros(10)=25
%>
Neste exemplo estamos criando um array com 10 elementos: índice 0 até o índice 9, porém
estamos tentando utilizar o índice 10. Este código irá gerar um erro em tempo de execução,
conforme indicado na Figura 12.2.
Observe que a mensagem de erro informa que existe um índice fora do intervalo permitido.
Também devemos salientar que a detecção deste tipo de erro é mais difícil do que os erros de
sintaxe. Muitas vezes o erro pode estar ainda mais disfarçado, como no exemplo a seguir:
<%
Dim arrayinteiros(9)
For i=1 to 10
arrayinteiros(i)=5*i+10
Next
%>
660
Capítulo 12 – Tratamento de Erros, Transações e Outros Assuntos
Observe que agora a mensagem não é tão indicativa de onde está o problema. Agora imagine
em aplicações maiores. Se o programador não for disciplinado, pode ser gerado código de
difícil depuração.
Erros Lógicos
Este, com certeza, é o pior tipo de erro. O código executa aparentemente sem problemas, a
página é carregada, porém os resultados obtidos não são os esperados. Este tipo de erro acontece
porque o programador utilizou um algoritmo incorreto.
Se o programador simplesmente trocar o Or por um And, não irá retornar nenhum registro, pois
cada pedido é somente para um país. Porém, este tipo de erro ainda não seria dos piores, pois em
não retornando nenhum registro o desenvolvedor irá “desconfiar” de que algo está errado.
O pior tipo de erro lógico é aquele que retorna um resultado, porém um resultado incorreto.
661
Criando Sites Dinâmicos com ASP 3.0
Vamos supor que você queira calcular os valores de uma aplicação utilizando a seguinte fórmula:
Total= Empréstimo multiplicado pelos juros mais adicional de risco e tudo isso
dividido por 1.33.
Esta fórmula irá efetuar os cálculos porém de maneira incorreta. Primeiro o empréstimo será
multiplicado pelos juros. Depois o risco dividido por 1.33 e os dois resultados somados.
Porém não é isso que queremos. Para fazer com que a fórmula seja calculada corretamente,
podemos fazer o uso de parênteses, conforme indicado a seguir:
Total =((emp*juros)+risco)/(1.33)
Desta maneira garantimos a ordem correta das operações e deixamos o código mais fácil de ler.
Este é apenas um pequeno exemplo de erro lógico. Existe uma infinidade de armadilhas e
situações possíveis de ocorrência de erros lógicos. Em muitas delas é difícil a detecção do erro
se o programador não for disciplinado e o processo como um todo não estiver bem documentado.
662
Capítulo 12 – Tratamento de Erros, Transações e Outros Assuntos
➥ Use indentação do código. Isto facilita muito a leitura do código e demonstra quais
linhas de código pertencem a cada estrutura de controle. Observe o exemplo a seguir:
<%
If criar=“Sim” Then
total = total+juros
Response.Write “Valor devido: ” & total
Else
total = total-juros
Response.Write “Valor devido: ” & total
End If
%>
A indentação deixa o código mais legível e facilita na hora de procurar e corrigir erros.
➥ Se você tiver uma determinada rotina de cálculo ou acesso a banco de dados, que é
utilizada em diversos locais na sua aplicação, pense em escrevê-la e salvá-la em um
arquivo separado e depois utilizar a diretiva #include para incluir este código nos
locais onde o mesmo é necessário. Isto evita que você tenha que escrever o mesmo
código em diversos locais e principalmente que o escreva de maneira diferente. Além
disso se forem necessárias modificações, basta fazê-las no arquivo original e não em
diversos lugares. Isto minimiza a possibilidade de estar utilizando algoritmos diferentes
para a mesma rotina.
NOTA
Estaremos aprendendo a utilizar a diretiva #include ainda neste capítulo.
663
Criando Sites Dinâmicos com ASP 3.0
O Conceito de Transação
Na era da Internet e do Comércio Eletrônico temos questões bastante complexas a serem
tratadas no desenvolvimento de aplicações Web. Uma destas questões é sobre a integridade
das bases de dados. Existem determinadas operações que envolvem entrada e atualização de
informações em diversas tabelas ou até mesmo em diversos bancos de dados.
Para que possamos entender exatamente o conceito de transação, vamos fazer uso de um
exemplo clássico: “O usuário que utiliza o site do seu banco na Internet para fazer uma
transferência entre contas correntes.”
Para que a transferência ocorra com sucesso, as seguintes ações devem ser executadas:
➥ Debitar da conta do usuário o valor a ser transferido.
➥ Creditar o valor que está sendo transferido na conta do destinatário.
Estas duas operações devem ser finalizadas com sucesso e de maneira única, ou seja, ou as
duas operações são executadas com sucesso ou nenhuma delas. Por exemplo, se a operação
de debitar da conta do usuário aconteceu com sucesso e na hora de creditar na conta do
destinatário houve algum problema, a operação de débito da conta do usuário deve ser
revertida, ou seja, a conta do usuário deve ter creditado o valor anteriormente debitado.
Neste caso a operação falha como um todo e as duas contas continuam com o saldo que
tinham antes da operação.
Este exemplo serve para que possamos definir exatamente o que é uma transação.
“Uma transação é um conjunto de uma ou mais operações que devem acontecer como um
todo, ou seja, ou todas as operações são realizadas com sucesso ou nenhuma das operações é
realizada. Se ocorrer algum problema depois que algumas operações já foram efetuadas, as
mesmas deverão ser revertidas, de tal maneira que a situação dos dados retorne ao seu estado
original antes das modificações efetuadas pela transação.”
664
Capítulo 12 – Tratamento de Erros, Transações e Outros Assuntos
Uma transação deve apresentar as características conhecidas como ACID, onde temos o
seguinte: A – Atomicidade; C – Consistência; I – Isolamento; D – Durabilidade.
➥ Atomicidade: Esta propriedade define que a transação deve acontecer como um todo, ou
seja, todas as ações embutidas na transação devem ocorrer com sucesso ou falhar como
um todo. Se algum erro acontecer, o sistema deve retornar ao seu estado anterior à transação.
➥ Consistência: Esta propriedade garante que ao final da transação o sistema estará em
um estado consistente. Se todas as ações da transação forem executadas com sucesso,
as alterações serão salvas no banco de dados e o sistema estará disponível para uso. Se
ocorrer algum problema as alterações serão desfeitas e o sistema também estará
disponível para uso.
➥ Isolamento: Esta propriedade muitas vezes é conhecida como Serialização. Cada transação
é executada como se não houvesse outras transações. Isso é feito para que, quando a
transação estiver executando, a mesma não acesse dados inconsistentes, isto é, dados
que estão sendo alterados por outra transação. Com isso é garantido que o sistema estará
em um estado consistente e pronto para ser utilizado ao final de cada transação.
➥ Durabilidade: Este princípio garante que, uma vez completada a transação, as alterações
que a mesma efetuou serão permanentemente gravadas no banco de dados, mesmo
que aconteça alguma falha no sistema. No exemplo da transferência entre contas, temos
que garantir que o valor será realmente debitado da conta do usuário e creditado na
conta do destinatário.
665
Criando Sites Dinâmicos com ASP 3.0
<%
.
‘End transaction.
Server.Transfer(“/Capitulo10/segunda.asp”)
%>
No entanto, o script abaixo chama um outro script que também inicializa uma transação:
<%@ TRANSACTION=Required %>
<%
‘Instancia um componente do Microsoft Transaction Services.
A diretiva @TRANSACTION deverá estar na primeira linha da página; caso contrário, será
gerado um erro. Você deve adicionar a diretiva a cada página a ser executada em uma transação.
A transação atual é finalizada quando o processamento do script termina.
A maioria dos aplicativos requer o contexto de transação somente para determinadas operações.
Por exemplo, o site de uma companhia aérea pode usar scripts transacionais para operações de
666
Capítulo 12 – Tratamento de Erros, Transações e Outros Assuntos
compra de passagem e reserva de assento. Todos os demais scripts podem ser executados de
maneira segura sem um contexto de transação.
IMPORTANTE
Visto que as transações devem ser utilizadas apenas para páginas que necessitam de
processamento de transação, você não pode declarar o arquivo global.asa de um aplicativo
como transacional.
IMPORTANTE
A transação também será anulada se a página exceder o tempo limite antes da conclusão da
transação.
667
Criando Sites Dinâmicos com ASP 3.0
NOTA
Observe o exemplo a seguir, retirado da documentação do IIS 5.0. Nele estamos utilizando um
componente chamado MyExample.BankComponent. Este é um componente que foi registrado
e pode ser gerenciado através do Microsoft Transaction Services. Existe uma infinidade de
componentes comerciais que podem ser adquiridos e instalados de tal forma que os mesmos
possam ser utilizados em nossas páginas ASP.
</BODY>
</HTML>
<%
Response.Flush()
668
Capítulo 12 – Tratamento de Erros, Transações e Outros Assuntos
End Sub
%>
<%
‘Mostra esta página se a transação falhar.
Sub OnTransactionAbort()
Response.Clear()
%>
<HTML>
<BODY>
</BODY>
</HTML>
<%
Response.Flush()
End Sub
%>
669
Criando Sites Dinâmicos com ASP 3.0
Para que você possa usar o Gerenciador de serviços de componente, é necessário que os
Serviços de componente estejam instalados.
670
Capítulo 12 – Tratamento de Erros, Transações e Outros Assuntos
671
Criando Sites Dinâmicos com ASP 3.0
NOTA
Para maiores informações sobre a instalação de Aplicativos e componentes COM, consulte a
ajuda do Windows 2000.
Escopo de Objeto
Normalmente, você não deve armazenar objetos criados a partir de um componente do COM
nos objetos ASP Application ou Session. Os objetos COM serão desativados quando a transação
for concluída. Como os objetos Session e Application se destinam a instâncias de objeto que
podem ser utilizadas em múltiplas páginas ASP, você não deverá utilizá-los para manter
objetos que serão liberados ao final de uma transação.
Um script ASP é a raiz, ou o início, de uma transação declarada. Qualquer objeto COM utilizado
em uma página ASP transacional será considerado parte da transação. Quando a transação
estiver concluída, os objetos COM utilizados na página serão desativados, incluindo objetos
armazenados no objeto Session ou Application. Tentativas posteriores de chamar o objeto
com o escopo Session ou Application de outra página transacional falharão.
672
Capítulo 12 – Tratamento de Erros, Transações e Outros Assuntos
que as atualizações sejam enviadas ao servidor remoto, mesmo que a rede não esteja disponível
no momento. O seu aplicativo receberá uma mensagem de confirmação e poderá continuar a
transação. Para o enfileiramento de mensagens podemos utilizar o Microsoft Queue Server.
NOTA
Para maiores detalhes sobre o Microsoft Queue Server consulte a ajudo do Windows 2000 ou o
site da Microsoft (www.microsoft.com).
Para solucionar este tipo de problema, podemos colocar o código que deve ser utilizado por
diversas páginas em um arquivo com a extensão .inc e depois utilizar a diretiva #include
para inserir este código nos diversos locais onde ele seja necessário.
Por exemplo:
<—! #include file=“conexao.inc” —>
Ao encontrar esta diretiva em uma página ASP, o IIS substitui a diretiva pelo texto do arquivo
conexao.inc. É como se o código do arquivo conexao.inc tivesse sido digitado diretamente na
página ASP. Somente depois que a substituição é feita, é que o script é executado.
Por exemplo, o nosso arquivo conexao.inc poderia conter o código necessário para estabelecer
uma conexão com o banco de dados nwind.mdb. Com isso teríamos o seguinte código no
arquivo conexao.inc:
<%
‘O primeiro passo é criar a conexão com o banco de dados
‘Para isto crio um objeto do tipo Connection
‘Cria um objeto do tipo ADODB.Connection
673
Criando Sites Dinâmicos com ASP 3.0
Set conn=Server.CreateObject(“ADODB.Connection”)
‘Agora abro uma conexão com a fonte ODBC “nwind”
‘criada anteriormente.
conn.ConnectionString = “PROVIDER=MICROSOFT.JET.OLEDB.4.0;
DATA SOURCE=c:\meus documentos\nwind.mdb”
conn.Open
%>
Cada vez que uma página precisasse estabelecer uma conexao com o banco de dados Nwind
é só incluir a diretiva a seguir, na primeira linha, logo abaixo da tag <BODY>:
<—! #include file=“conexao.inc” —>
Se por algum motivo o arquivo nwind.mdb tivesse que ser movido para outro drive, a string
de conexão teria que ser reconfigurada. Utilizando a diretiva #include, somente precisaríamos
alterar em um único lugar: no arquivo conexao.inc. A partir deste momento, todas as páginas
que acessam o arquivo conexao.inc passarão a ter acesso às modificações efetuadas no arquivo
conexao.inc. Veja o quanto esta técnica facilita a manutenção de nossas páginas ASP, evitando
que uma mudança simples como esta, tivesse que ser feita em dezenas de páginas.
IMPORTANTE
A conta com a qual o usuário está fazendo acesso ao site deve ter permissões para acessar o
arquivo .inc. Caso contrário ocorrerá um erro. Por exemplo, se o usuário está autenticado
como usuário anônimo, a conta IUSR_NOME_DO_COMPUTADOR deve ter permissões NTFS
sobre os arquivos que forem acessados via diretiva #include, caso contrário o usuário receberá
uma mensagem de erro.
674
Capítulo 12 – Tratamento de Erros, Transações e Outros Assuntos
Os arquivos incluídos podem ter qualquer extensão de nome de arquivo, mas recomenda-se
fornecer a extensão .inc.
Exemplos:
<!—O arquivo incluído está no mesmo diretório que o arquivo pai. —>
<!— #include file = “meu_arquivo.inc” —>
<!— O arquivo incluído está no diretório virtual Scripts. —>
<!— #include virtual = “/scripts/tools/global.inc” —>
As Diretivas @
Nesta seção aprenderemos um pouco mais sobre as chamadas Diretivas de processamento ou
diretivas @. Utilizamos as Diretivas de processamento @ em scripts para enviar informações
ao IIS sobre como processar um arquivo .asp. Por exemplo, o script a seguir usa a Diretiva de
processamento @LANGUAGE para definir a linguagem de script como VBScript.
<%@LANGUAGE=VBScript %>
IMPORTANTE
Estas diretivas devem aparecer na primeira linha do arquivo .asp, antes que qualquer entrada
tenha sido enviada para o navegador do cliente.
675
Criando Sites Dinâmicos com ASP 3.0
Por exemplo, a página de código ANSI 1252 é usada para o inglês americano e a maioria dos
idiomas europeus; a página de código OEM 932 é usada para o Kanji japonês.
Uma página de código pode ser representada em uma tabela como um mapeamento de
caracteres para valores de byte único ou valores de vários bytes. Por exemplo, quando
utilizamos caracteres Unicode, cada caractere utiliza 2 bytes.
Também podemos substituir a página de código definida pela diretiva @CODEPAGE com a
propriedade Session.CodePage, conforme aprendemos no Capítulo 8. No entanto, essa ação
se aplicará somente a scripts em execução dentro do escopo da sessão.
Sintaxe:
<%@ CODEPAGE = página_de_código%>
Onde: página_de_código é um número inteiro que representa uma página de código válida
para o sistema que está executando o interpretador ASP.
Na Tabela 12.2, temos o valor para alguns dos principais Códigos de Página.
676
Capítulo 12 – Tratamento de Erros, Transações e Outros Assuntos
677
Criando Sites Dinâmicos com ASP 3.0
Sintaxe:
<%@ LANGUAGE = nome_interpretador %>
Sintaxe
<%@ LCID = identificador_de_local %>
678
Capítulo 12 – Tratamento de Erros, Transações e Outros Assuntos
Em muitas tabelas com a relação dos LCIDs, o valor é fornecido em hexadecimal. Por exemplo,
o valor de LCID para o Brasil é fornecido como 0416. Na verdade este valor deve ser convertido
para decimal. Convertendo 0416 de hexadecimal para decimal, obteremos 1046. Aí podemos
utilizar o seguinte comando:
<% @LCID=1046 %>
NOTA
Também podemos alterar o código LCID utilizando a propriedade LCID do objeto Session,
conforme descrito no Capítulo 8.
Onde:
Valor é uma cadeia de caracteres que indica o tipo de suporte de transação. Os valores possíveis são:
➥ Required – O script iniciará uma transação.
➥ Requires_New – O script iniciará uma transação.
➥ Supported – O script não iniciará uma transação.
➥ Not_Supported – O script não iniciará uma transação.
Se um script contiver a diretiva @TRANSACTION, ela deverá ser a primeira linha do arquivo .asp,
caso contrário, será gerado um erro. Você deve adicionar a diretiva a cada página a ser executada em
uma transação. A transação atual é finalizada quando o processamento do script termina.
Se o script que contém a diretiva @TRANSACTION foi chamado pelo método Server.Transfer
ou Server.Execute e o valor foi especificado como Required, o mesmo continuará a transação
do arquivo .asp de chamada, se essa transação tiver sido criada. Se a transação do arquivo
.asp de chamada não tiver sido criada, o arquivo .asp chamado criará uma nova transação.
679
Criando Sites Dinâmicos com ASP 3.0
ASP1
<%@ TRANSACTION=Required %>
<%
Server.Transfer(“asp2.asp”)
%>
ASP2
<%@ TRANSACTION=Required%>
<%
Server.CreateObject(“MeuComponente.Closeout”)
%>
Conclusão
Neste capítulo analisamos uma miscelânea de assuntos a respeito de ASP.
Depois passamos ao conceito de transações. Vimos o que significa cada uma das letras da
sigla ACID. Aprendemos a utilizar a diretiva @TRANSACTION para inserir uma página ASP
no contexto de uma transação.
Com isso, estamos encerrando este trabalho. Procurei colocar informações úteis para usuários
desde o iniciante até o usuário mais experiente. Obviamente que este trabalho não esgota o
assunto, pois o mesmo é muito extenso.
680
Apêndice – Referência Rápida da Linguagem VBScript
Apêndice
Referência Rápida
da Linguagem VBScript
681
Criando Sites Dinâmicos com ASP 3.0
Lembrando que nos diversos exemplos apresentados neste livro, estivemos utilizando a
linguagem VBScript. Optamos pela utilização deesta linguagem devido a facilidade de
aprendizagem aliada a sua versatilidade e poder. Mesmo sendo uma linguagem de Script, é
incrível o número de recursos que a mesma oferece. Além disso, por ser derivada do Visual
Basic, sendo classificada inclusive como um subconjunto do Visual Basic, é de fácil assimilação
para quem já trabalha com Visual Basic ou VBA – Visual Basic for Applications.
Podemos ter código VBScript que roda no cliente ou que roda no servidor.
Para declarar um bloco de código que roda no cliente, utilizamos a seguinte sintaxe:
<SCRIPT LANGUAGE=vbscript>
<!—
Comando1
Comando2
...
Comandon
—>
</SCRIPT>
Para declarar um bloco de código que roda no servidor, utilizamos a seguinte sintaxe:
<SCRIPT LANGUAGE=vbscript RUNAT=Server>
Comando1
Comando2
...
Comandon
</SCRIPT>
Também podemos utilizar o VBScript dentro de qualquer trecho de código ASP. Nos exemplos
deste livro, sempre utilizamos a diretiva @LANGUAGE, para definir que o interpretador
VBScript é que devia ser utilizado para executar os comandos dentro dos trechos de código
ASP. Para definir que o VBScript deve ser utilizado, podemos usar o seguinte comando:
<%@ Language=VBScript %>
NOTA
Lembre que as diretivas de processamento (diretivas @) devem ser o primeiro comando da
página, antes que tenha sido enviada qualquer saída para o navegador do cliente.
682
Apêndice – Referência Rápida da Linguagem VBScript
Outra opção que teríamos seria a utilização de Java Script, que na versão da Microsoft é
conhecido como JScript. Conforme descrito anteriormente, optamos pela utilização de
VBScript, que no ponto de vista deste autor parece ser a escolha mais indicada quando
trabalhamos com páginas ASP.
O primeiro comando declara três variáveis sem tipo definido, ou melhor, do tipo Variant. No
VBScript, diferente do Visual Basic nós não declaramos o tipo da variável. Por padrão, todas
as variáveis são do tipo Variant, isto é, podem conter qualquer valor. Para que possamos ter
um tratamento mais refinado em relação as variáveis são definidos os chamados subtipos de
Variant, os quais estão descritos na Tabela A.1.
Subtipo Descrição
Empty É uma variável não inicializada.
NULL A variável intencionalmente não contém um valor válido.
Boolean Pode conter True ou False.
Byte Pode conter um inteiro de 0 a 250.
Integer Pode conter um inteiro entre –32.768 e 32.767.
Currency de –922.337.203.685.477,5808 até 922.337.203.685.447,5807.
Long Pode conter um inteiro de –2.147.483.648 até 2.147.483.647.
Single Pode conter um número de precisão simples, na faixa de
–3,402823E38 até –1,402398E-45 para valores negativos e
1.401298E-45 até 3.402823E38 para valores positivos.
Double Pode conter um número de precisão dupla na faixa de
–1,79769313486232E308 até –4,94065645841247E-324 para
valores negativos e de 4,94065645841247E-324 até
1,79769313486232E308 para valores positivos.
683
Criando Sites Dinâmicos com ASP 3.0
Subtipo Descrição
Date(Time) Contém um número, o qual representa a data entre 01 de
Janeiro do ano 100 e 31 de Dezembro de 9999.
String Contém uma String de tamanho variável com no máximo 2
bilhões de caracteres.
Object Contém um objeto.
Error Contém um número de erro.
O segundo comando – Dim nomes(20), declara um array com 21 elementos. Isto mesmo, são
21 e não 20 elementos. Não esqueça que o primeiro elemento é o de índice 0 (zero) e não o de
índice 1 (um).
IMPORTANTE
Embora não seja obrigatória a declaração das variáveis em VBScript, sempre é uma boa prática
de programação declarar e comentar todas as variáveis que utilizamos em nosso código.
ou até mesmo arrays de múltiplas dimensões. Por exemplo, podemos criar uma Matriz-array
de duas dimensões, utilizando o seguinte comando:
Dim produção(4,10).
Operadores
Para realizar desde operações bastante simples, até operações mais complexas, VBScript nos
disponibiliza uma série de operadores, os quais estão descritos na Tabela A.2.
Operador Descrição
+ Adição
- Subtração
684
Apêndice – Referência Rápida da Linguagem VBScript
Operador Descrição
* Multiplicação
/ Divisão
& Operador And em expressões lógicas e também
operador de concatenação de Strings.
^ Exponenciação
\ Retorna o valor inteiro da divisão de dois números.
MOD Retorna o resto da divisão entre dois números.
OR Operador lógico OU.
Operador Descrição
> Maior do que.
< Menor do que.
>= Maior ou igual à.
<= Menor ou igual à.
<> Diferente de.
685
Criando Sites Dinâmicos com ASP 3.0
Neste caso, assim que um dos testes lógicos for verdadeiro, os comandos respectivos são
executados e a estrutura é abandonada. Por exemplo, se o teste_lógico1 for verdadeiro, os
comandos respectivos serão executados e os demais testes nem sequer serão avaliados.
O Laço For...Next
Este laço executa um bloco de código um número determinado de vezes.
For i=1 to 10
i=i+1
msgbox i
Next
686
Apêndice – Referência Rápida da Linguagem VBScript
Loop
Nesta estrutura, enquanto a condição for Verdadeira, o código dentro do laço é executado.
Quando a condição tornar-se Falsa, o primeiro comando após o final do laço será executado.
Neste caso, se a condição for Falsa já na primeira vez, o laço não será executado nenhuma vez.
687
Criando Sites Dinâmicos com ASP 3.0
IMPORTANTE
O código dentro do laço deve ser capaz de alterar a condição para Falso, quando for necessário,
pois caso contrário a condição será sempre Verdadeira, e os comandos dentro do laço ficarão
em execução, infinitamente, ou até o programa travar. A criação de laços infinitos, devido a
erros de programação, é uma causa comum de erros e travamentos.
Considere o exemplo:
<SCRIPT LANGUAGE=vbscript>
<!—
Dim x
x=10
Contador=1
Soma=0
—>
</SCRIPT>
688
Apêndice – Referência Rápida da Linguagem VBScript
Nesta estrutura, enquanto a condição for Verdadeira, o código dentro do laço é executado.
Quando a condição tornar-se Falsa, o primeiro comando após o final do laço será executado.
Neste caso, se a condição for Falsa já na primeira vez, o laço será executado uma única vez.
IMPORTANTE
O código dentro do laço deve ser capaz de alterar a condição para Falso, quando for necessário,
pois caso contrário a condição será sempre Verdadeira, e os comandos dentro do laço ficarão
em execução, infinitamente, ou até o programa travar. A criação de laços infinitos, devido a
erros de programação, é uma causa comum de erros e travamentos.
Considere o exemplo:
<SCRIPT LANGUAGE=vbscript>
<!—
Dim x
x=10
Contador=1
Soma=0
Do
Soma = Soma + Contador
Contador = Contador + 1
Loop While Contador <= x
MsgBox “Valor da Soma = ” & Soma
—>
</SCRIPT>
689
Criando Sites Dinâmicos com ASP 3.0
Nesta estrutura, enquanto a condição for Falsa, o código dentro do laço é executado. Quando a
condição tornar-se Verdadeira, o primeiro comando após o final do laço será executado. Neste
caso, se a condição for Verdadeira, já na primeira vez, o laço não será executado nenhuma vez.
IMPORTANTE
O código dentro do laço deve ser capaz de tornar a condição Verdadeira, quando for necessário,
pois caso contrário a condição será sempre Falsa, e os comandos dentro do laço ficarão em
execução, infinitamente, ou até o programa travar. A criação de laços infinitos, devido a erros
de programação, é uma causa comum de travamentos e erros.
Considere o exemplo:
<SCRIPT LANGUAGE=vbscript>
<!—
Dim x
x=10
Contador=1
Soma=0
‘ Faz a soma dos 10 primeiros números maiores do que zero
690
Apêndice – Referência Rápida da Linguagem VBScript
...
Comandon
Loop Until condição
Nesta estrutura, enquanto a condição for Falsa, o código dentro do laço é executado. Quando a
condição tornar-se Verdadeira, o primeiro comando após o final do laço será executado. Neste
caso, se a condição for Verdadeira, já na primeira vez, o laço será executado uma única vez.
IMPORTANTE
O código dentro do laço deve ser capaz de tornar a condição Verdadeira, quando for necessário,
pois caso contrário a condição será sempre Falsa, e os comandos dentro do laço ficarão em
execução, infinitamente, ou até o programa travar. A criação de laços infinitos, devido a erros
de programação, é uma causa comum de erros e travamentos.
Considere o exemplo:
<SCRIPT LANGUAGE=vbscript>
<!—
Dim x
x=10
Contador=1
Soma=0
Do
Soma = Soma + Contador
Contador = Contador + 1
Loop Until Contador > x
MsgBox “Valor da Soma = ” & Soma
—>
</SCRIPT>
Comentários em VBScript
Em blocos de código VBScript podemos utilizar a palavra Rem para criar uma linha de
comentário:
Rem Esta linha é um comentário.
691
Criando Sites Dinâmicos com ASP 3.0
Já em blocos de código ASP podemos utilizar o apóstrofe para criar uma linha de comentário.
<%
‘Esta linha é de comentário.
%>
Funções no VBScript
A linguagem VBScript nos oferece uma grande quantidade de funções. Temos funções para
conversão de tipos de valores, outras para trabalhar com datas, com Strings para formatação
de números e assim por diante.
ASC(String)
Retorna o valor numérico do código ANSI para o primeiro caractere da String passada como
parâmetro.
Asc(“G”)
Retorna: 71
Chr(número)
Retorna o caractere ASCII correspondente ao número passado como parâmetro.
Chr(65)
Retorna: A
CBool(expressão)
Retorna Verdadeiro ou Falso, dependendo da expressão que foi passada como parâmetro.
Cbool(2>3)
692
Apêndice – Referência Rápida da Linguagem VBScript
Cbool(2<3)
CByte(expressão)
Converte a expressão passada como parâmetro para um Variant do subtipo Byte.
Cbyte(20)
Retorna: 20
Cbyte(300)
Retorna: Um erro
Tipo de erro:
Erro de tempo de execução do Microsoft VBScript (0x800A0006)
Sobrecarga: ‘Cbyte’
CCur(expressão)
Converte a expressão passada como parâmetro para um Variant do subtipo Currency.
Observe o exemplo:
Valor = 543.214588
Response.Write valor*2
Retorna: 1086,429176
Retorna: 1086,4292
CDate(data)
Converte a data passada como parâmetro para um Variant do subtipo Date. Onde data é
qualquer expressão de data válida.
CDate(“Novembro 10,1991”)
Retorna: 10/11/1991
693
Criando Sites Dinâmicos com ASP 3.0
CDbl(data)
Converte a expressão passada como parâmetro para um Variant do subtipo Double.
Observe o exemplo:
Dim Moeda, ValorDouble
Moeda = CCur(234.456784) ‘ Moeda é igual a Currency (234.4567).
ValorDouble = CDbl(CCurr * 8.2 * 0.01) ‘ Converte o resultado para Double
(19.2254576).
CInt(expressão)
Converte a expressão passada como parâmetro para um Variant do subtipo Integer.
CInt(30/7)
Retorna: 4
CLng(expressão)
Converte a expressão passada como parâmetro para um Variant do subtipo Long.
Considere o exemplo:
Dim MyVal1, MyVal2, MyLong1, MyLong2
MyVal1 = 25427.45
MyVal2 = 25427.55 ‘ MyVal1, MyVal2 são do tipo Double
MyLong1 = CLng(MyVal1) ‘ MyLong1 contém 25427.
MyLong2 = CLng(MyVal2) ‘ MyLong2 contém 25428.
CSng(expressão)
Converte a expressão passada como parâmetro para um Variant do subtipo Single.
Considere o exemplo:
Dim MyDouble1, MyDouble2, MySingle1, MySingle2
‘ MyDouble1, MyDouble2 conterão valores do tipo Double.
MyDouble1 = 75.3421115
MyDouble2 = 75.3421555
MySingle1 = CSng(MyDouble1) ‘ MySingle1 contém 75.34211.
MySingle2 = CSng(MyDouble2) ‘ MySingle2 contém 75.34216.
694
Apêndice – Referência Rápida da Linguagem VBScript
CStr(expressão)
Converte a expressão passada como parâmetro para um Variant do subtipo String.
CStr(233)
Fix(expressão)
Retorna a parte inteira do número.
Fix(30/7)
Retorna: 4
Hex(expressão)
Retorna uma String representando o valor hexadecimal do número.
Hex(1562)
Retorna: 61A
Int(expressão)
Converte a expressão passada como parâmetro para um Variant do subtipo Integer.
Int(30/7)
Retorna: 4
Oct(expressão)
Retorna uma String representando o valor octal do número.
Oct(1562)
Retorna: 3032
Round(expressão,numcasasdecimais)
Retorna um número com a quantidade de casas decimais definidas pelo parâmetro
numcasasdecimais.
Round(235.3658,2)
Retorna: 235,37
695
Criando Sites Dinâmicos com ASP 3.0
Sgn(expressão)
Retorna um número inteiro indicando o sinal do número.
Sgn(-23)
Retorna: -1
Sgn(23)
Retorna: 1
Date( )
Esta função retorna a data do sistema.
Date ( )
Retorna: 21/08/2000.
DateAdd(intervalo,numerodeintervalos,data)
Esta função é utilizada para retornar uma data a partir de um intervalo que foi adicionado.
Utilizamos a seguinte sintaxe:
DateAdd(intervalo,numerodeintervalos,data)
onde, o parâmetro intervalo especifica o tipo de intervalo que deve ser adicionado. Na Tabela
A.3 temos os valores possíveis para este parâmetro.
Valor Descrição
yyyy Ano
q Trimestre
m Mês
d Dias
696
Apêndice – Referência Rápida da Linguagem VBScript
Valor Descrição
w Dia de semana
ww Semanas
h Horas
m Minutos
s Segundos
Por exemplo, para saber que data teremos contados 10000 dias a partir da data atual,
podemos utilizar:
DateAdd(“d”,10000,Date())
Para saber em que data terá transcorrido um milhão de dias após 01/01/1900, podemos utilizar
o seguinte comando:
DateAdd(“d”,1000000,01/01/1900)
Esta função é utilizada para calcular a diferença entre duas datas. Esta diferença pode ser
calculada em intervalos de tempo conforme definido pelo parâmetro intervalo. Os valores
possíveis para o parâmetro intervalo estão indicados na tabela A.3.
Por exemplo, para saber o número de dias entre a data atual e a data do Descobrimento do
Brasil, podemos utilizar o seguinte comando:
DateDiff(“d”,22/04/1500,Date())
DatePart(intervalo,data)
Esta função retorna apenas uma parte da data. A parte que será retornada é definida pelo parâmetro
intervalo. Os valores possíveis para o parâmetro intervalo estão indicados na tabela A.3.
DatePart (“yyyy”,“01/05/2000”)
Retorna: 2000.
697
Criando Sites Dinâmicos com ASP 3.0
DateSerial(ano,mês,dia)
Esta função retorna uma variante do subtipo Data.
DateSerial (1990+10,12-4,31)
Retorna: 31/08/2000.
DateValue(String)
Esta função retorna uma variante do subtipo Data. A String deve conter um formato de data válida.
DateValue (“Novembro 23,1997”)
Retorna: 23/11/1997.
Day(data)
Retorna apenas o dia da data que foi passada como parâmetro.
Day(“25/02/2000”)
Retorna: 25.
Hour(tempo)
Retorna apenas a hora do tempo passado como parâmetro.
Hour(“18:22:31”)
Retorna: 18.
Minute(tempo)
Retorna apenas os minutos do tempo passado como parâmetro.
Minute(“18:22:31”)
Retorna: 22.
Month(data)
Retorna apenas o mês da data que foi passada como parâmetro.
Month(“25/02/2000”)
Retorna: 02.
698
Apêndice – Referência Rápida da Linguagem VBScript
MonthName(data)
Retorna uma String referente ao mês da data.
MonthName(02)
Retorna: fevereiro.
Retorna: fev.
Now( )
Esta função retorna a data e a hora do sistema.
Now ()
Second(tempo)
Retorna apenas os segundos do tempo passado como parâmetro.
Second(“18:22:31”)
Retorna: 31.
Time( )
Esta função retorna um Variant do subtipo Date, a qual indica a hora do sistema.
Time ( )
TimeSerial(hora,minuto,segundo)
Esta função retorna um Variant do subtipo Date, a qual representa os parâmetros passados.
TimeSerial (12+3,23,45-8)
Retorna: 15:23:37.
699
Criando Sites Dinâmicos com ASP 3.0
TimeValue(String)
Esta função retorna um Variant do subtipo Date, de acordo com a String passada como
parâmetro. A String deve ser um formato de hora válido.
TimeValue(“12:23:45”)
Retorna: 12:23:45.
WeekDay(data)
Retorna um número indicativo do dia da semana.
WeekDay(“21/08/2000”)
WeekDayName(número)
Retorna uma String com o nome do dia da semana.
WeekDayName(2)
Retorna: segunda-feira.
WeekDayName(4)
Retorna: quarta-feira.
WeekDayName(2,true)
Retorna: seg.
O True como segundo parâmetro indica que é para retornar o nome abreviado.
Year(data)
Retorna apenas o ano da data que foi passada como parâmetro.
Year(“25/02/2000”)
Retorna: 2000.
Funções Matemáticas
Estas funções são utilizadas para facilitar os cálculos matemáticos.
700
Apêndice – Referência Rápida da Linguagem VBScript
Atn(número)
Esta função retorna Arco tangente de um número. O número representa um valor em radianos.
Atn(3.14)
Retorna: 1,26248066459947.
Cos(número)
Esta função retorna o coseno de um número. O número representa um valor em radianos.
Cos(3.14)
Retorna: -1.
Exp(número)
Retorna o logaritmo neperiano e elevado ao número passado como parâmetro.
Exp(1)
Retorna: 2,71828182845905.
Log(número)
Esta função retorna o logaritmo natural do número passado como parâmetro. É o logaritmo
na base e.
Log(1000)
Retorna: 6,90775527898214.
Randomize( )
Inicializa o gerador de números aleatórios.
Randomize( )
Rnd(número)
Esta função gera um número aleatório entre 0 e 1.
Randomize
Rnd(100)
701
Criando Sites Dinâmicos com ASP 3.0
Sin(número)
Esta função retorna o seno de um número. O número representa um valor em radianos.
Sin(3.14)
Retorna: 0.
Sqr(número)
Esta função retorna a raiz quadrada do número passado como parâmetro.
Sqr(25)
Retorna: 5.
Tan(número)
Esta função retorna a tangente de um número. O número representa um valor em radianos.
Tan(3.14)
Retorna: 0.
FormatCurrency(expressão)
Retorna uma String formatada com o símbolo de Moeda definido nas Opções regionais do
Painel de controle.
FormatCurrency(1000.25)
Retorna: R$ 1.000,25
FormatDateTime(expressão,opção)
Retorna uma String formatada como data e hora. O parâmetro opção não é obrigatório. Este
parâmetro pode conter os valores 0, 1, 2, 3 ou 4 e é utilizado para definir o formato de retorno,
conforme indicado pelos exemplos a seguir:
702
Apêndice – Referência Rápida da Linguagem VBScript
Retorna: 10/1/2000.
FormatDateTime(“10-01-2000 3:12:45”,3) & “<BR>”
Retorna: 03:12:45.
FormatDateTime(“10-01-2000 3:12:45”,4) & “<BR>”
Retorna: 03:12.
FormatNumber(expressão,numdigitos)
Retorna o resultado da expressão com uma String, com o número de casas decimais definidos
pelo parâmetro numdigitos.
FormatNumber(1235.36258,3)
Retorna: 1235,362.
FormatPercent(expressão,numdigitos)
Retorna o resultado da expressão com uma String formatada como porcentagem (multiplicada
por 100) e com o sinal de %, com o número de casas decimais definidos pelo parâmetro
numdigitos.
FormatPercent(25.32/100,2)
Retorna: 25,32%.
InStr(String1,String2)
Retorna a posição da primeira ocorrência de String2 em String1.
InStr(“Antônio Cândido da Silva”,“Silva”)
Retorna: 20.
703
Criando Sites Dinâmicos com ASP 3.0
LCase(string)
Converte uma String para minúsculas.
LCase(“José da Silva”)
Left(string,número)
Retorna um número especificado de caracteres a partir do início da String. Espaços em branco
também contam como caractere.
Left(“José da Silva”,4)
Retorna: José.
Left(“José da Silva”,7)
Len(string)
Retorna o tamanho da String ou o número de bytes necessários para armazenar a variável.
Len(“José da Silva”)
Retorna: 13.
LTrim(string)
Retorna uma cópia da String sem espaços em branco à esquerda da String.
LTrim(“ José da Silva”)
Mid(string,start,número)
Retorna um número especificado de caracteres (número) de uma String, a partir de uma
posição especificada (start).
Mid(“José da Silva”,6,8)
Retorna: da Silva.
704
Apêndice – Referência Rápida da Linguagem VBScript
Replace(string,ocorrência,substituição)
Retorna uma String onde uma determinada String (definida pelo parâmetro ocorrência) foi
substituída por outra (definida pelo parâmetro substituição).
Replace(“Jose da Silva”,“e”,“é”)
Right(string,número)
Retorna um número especificado de caracteres a partir do final da String. Espaços em branco
também contam como caractere.
Right(“José da Silva”,5)
Retorna: Silva.
Right(“José da Silva”,8)
Retorna: da Silva.
RTrim(string)
Retorna uma cópia da String sem espaços em branco à direita da String.
RTrim(“José da Silva ”)
Space(número)
Retorna uma String com o número de espaços em branco especificados pelo parâmetro numero.
Space(10)
StrComp(String1,String2)
Retorna o resultado da comparação de duas Strings. O resultado pode ser um dos seguintes valores:
➥ String1 é menor do que String2: -1
➥ String1 é igual a String2: 0
705
Criando Sites Dinâmicos com ASP 3.0
Retorna: 0.
StrComp(“Jose”,”Zeze”)
Retorna: -1.
StrComp(“Zeze”,”Jose”)
Retorna: 1.
StrComp(“Zeze”,Null)
Retorna: Null.
String(número,caractere)
Retorna uma String formada pelo caractere definido no parâmetro caractere, tantas vezes
quantas definidas pelo parâmetro numero.
String(30,”*”)
Retorna: ******************************
StrReverse(string)
Retorna uma String em ordem reversa da original.
StrReverse(“José da Silva)
Trim(string)
Retorna uma cópia da String sem espaços em branco, nem à direita, nem à esquerda da String.
Trim(“ José da Silva ”)
UCase(string)
Converte uma String para maiúsculas.
UCase(“José da Silva”)
706
Índice Remissivo
Índice
Remissivo
707
Criando Sites Dinâmicos com ASP 3.0
708
Índice Remissivo
709
Criando Sites Dinâmicos com ASP 3.0
710
Índice Remissivo
711
Criando Sites Dinâmicos com ASP 3.0
712
Índice Remissivo
713
Criando Sites Dinâmicos com ASP 3.0
714
Índice Remissivo
715
Criando Sites Dinâmicos com ASP 3.0
Métodos Métodos
AddHeader, 220 Abandon, 501
AppendToLog, 220 Remove, 502
BinaryWrite, 221 RemoveAll, 502
Clear, 222 Propriedades
End, 223 CodePage, 503
Flush, 224 LCID, 504
Redirect, 225 SessionID, 504
Write, 226 TimeOut, 504
Propriedades Usando variáveis, 490
Buffer, 211 ODBC
CacheControl, 212 Criando uma fonte
CharSet, 213 Microsoft Access, 276
ContentType, 214 SQL Server, 282
Expires, 215 File DSN, 277
Expires Absolute, 216 System DSN, 277
IsClientConnected, 217 User DSN, 277
PICS, 218
Objeto Server, 564 P
Métodos
Permissões NTFS
CreateObject, 566
Arquivos
Execute, 568
Controle total, 529
GetLastError, 570
Gravar, 528
HTMLEncode, 575
Leitura, 528
MapPath, 573
Ler e executar, 529
Transfer, 574
Modificar, 529
URLEncode, 571
Avançadas, 531-532
Propriedade ScriptTimeOut, 565
Definindo, 529
Objeto Session
Pastas
Coleções
Controle total, 528
Contents, 496
Gravar, 528
StaticObjects, 497
Leitura, 528
Definição, 486
Ler e executar, 528
Definindo objetos a nível de Sessão, 492
Listar conteúdo de pastas, 528
Eventos
Modificar, 528
Definindo Variáveis, 489
Plug-in, 55
OnEnd, 488
OnStart, 487
716
Índice Remissivo
R-S If Then, 96
If Then Else, 96
Registrando componentes, 669 If Then ElseIf Else, 97
Segurança Select Case, 99
Autenticação de usuários, 512 Eventos no, 157
Acesso anônimo, 512 Do objeto Documento, 162
Autenticação básica, 539 Do objeto Element, 164
Integrada do Windows, 540 Do objeto Form, 163
Utilizando Certificados, 541 Do objeto Windows, 159
Banco de dados, 557 Principais eventos,
Introdução, 510 Funções de conversão de tipos, 127
Funções de Data e Hora,140
T Funções de Tipo de dados, 112
Transações Funções de Tratamento de String, 136
Abortando Script, 667 Funções para cálculos matemáticos, 149
Conceito, 28-663 Inserindo Código, 78
Eventos de, 667 Operadores de comparação, 87
Fila de, 672 Resultados de, 91
Microsoft Transaction Services – MTS, 28 Operadores matemáticos, 83
Páginas como Transações, 665 O que é?, 54
Procedimentos e Funções, 151
V Referência, 681
Visual Basic, 54
VBA, 54
VPN, 3
VBScript, 12
Criando Funções, 154
Criando Sub-rotinas, 151
W-X
Declarando Variáveis, 78 Windows 2000 Server, 2-3-4
Declaração obrigatória, 81 XML, 12
Escopo de, 91
Subtipos, 82
Tipo de uma variável, 79
Estruturas de Controle, 95
Do Loop Until, 107
Do Loop While, 103
Do Until Loop, 106
Do While Loop, 102
For Next, 100
717