Documente Academic
Documente Profesional
Documente Cultură
CRIANDO SITES
DINMICOS COM
ASP 3.0
Jlio Battisti
E-mail:
editora@axcel.com.br
Visite nossa Home Page
http://www.axcel.com.br
II
Sumrio
Crditos
Produo
Alexandre Ramires
Carlos Alberto S Ferreira
Reviso
Vanessa Garcia
Arte e Diagramao
Ingo Bertelli
Supervisor de Produo
Carlos Alberto S Ferreira
Capa
Ingo Bertelli
Editora de Produo
Gisella Narcisi
Editor Responsvel
Ricardo Reinprecht
III
Agradecimentos
Embora este seja o meu segundo livro, a emoo e a satisfao de concluir mais esse trabalho
talvez at maior do que no lanamento do primeiro. Foram meses de trabalho rduo,
escrevendo captulos 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 no pode ser realizado sem que vrias pessoas contribuam,
formando uma verdadeira equipe. Devo citar e agradecer, mais uma vez, a pacincia, o amor, a
dedicao e o apoio de minha esposa Lu, diante de mais este desafio. Sei que no foi fcil ficar ao
meu lado, um final de semana aps o outro, apenas escutando o barulho das teclas do computador.
Sem o seu apoio e compreenso, tudo seria muito mais difcil, para no dizer impossvel. Prometo
que o prximo trabalho ter somente umas 200 pginas.
Gostaria tambm de agradecer o amor e apoio da minha me Dona Lucy. Pessoa que sempre
me incentivou, apoiou, acreditou no meu trabalho e fez despertar em mim o amor pelos
livros. Me, mais uma vez agradeo por tudo o que fizestes e continuas fazendo por mim.
Agradeo mais do que tudo, o amor que sempre me deste, fazendo com que eu crescesse com
a certeza de estar sendo amado e querido.
Tambm quero agradecer a equipe da Axcel Books, pela sua pacincia em corrigir e revisar
mais este trabalho, sempre com sugestes para a melhoria do mesmo, de tal forma que o
amigo leitor possa obter uma obra de qualidade.
Devo citar ainda minhas irms: Rose, Lacy e Sandra que sempre renovam minhas foras com
seus elogios sinceros e verdadeiros. Os momentos que passamos juntos, embora poucos, so
verdadeiros e profundos. Uma simples conversa, um almoo, um passeio; so momentos de
parada e reflexo. Momentos que nos mostram o quanto a vida vale a pena. Espero podermos
passar mais tempo juntos.
IV
Sumrio
Sobre o Autor
Jlio Battisti profissional certificado da Microsoft, tendo sido aprovado em 16 Exames da
Microsoft, com os quais obteve certificaes 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 verso. Tambm autor de artigos de informtica e trabalha com o desenvolvimento
e administrao de Web sites. Autor do livro: Srie Curso Bsico & Rpido Microsoft Windows
2000 Server, publicado pela Editora Axcel Books. Atua como instrutor de cursos de
informtica na Secretaria da Receita Federal, em outros cursos particulares e tambm para
turmas em Universidades.
VI
Sumrio
Sumrio
Introduo ........................................................................................................................................ 1
Sites Dinmicos com ASP 3.0 ......................................................................................................... 1
Equipamento e Software Necessrio ............................................................................................... 3
Instalando e Testando o IIS 5.0 ........................................................................................................ 4
Novidades e Melhorias do IIS 5.0 .................................................................................................. 10
Administrao e Servios .............................................................................................................. 11
Desenvolvimento de Aplicaes Internet/Intranet ................................................................. 12
Hora de Comear ......................................................................................................................... 13
Viso Geral dos Captulos do Livro ........................................................................................ 13
Ento, Mos obra ............................................................................................................... 14
Captulo 1 Uma Introduo Tecnologia ASP ......................................................................... 15
Era uma Vez uma Internet com Contedo Esttico ....................................................................... 16
Um Comeo Quase sem Querer .............................................................................................. 16
Uma Viso Geral da Internet e de Seus Elementos ................................................................ 17
Contedo Dinmico na Internet .................................................................................................... 19
A Era do Comrcio Eletrnico ....................................................................................................... 23
Aplicaes Para a Web ................................................................................................................... 29
A Complexidade de Gerenciamento do Modelo
Cliente/Servidor e Aplicaes em Duas Camadas .................................................................. 29
Aplicaes em Duas Camadas ................................................................................................ 30
Aplicaes em Trs Camadas ................................................................................................. 31
Aplicaes em Quatro Camadas ............................................................................................. 33
Questes a Considerarmos nos Modelos em Trs 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 Prticos ...................................................................................................... 44
O Tradicional Hello World ................................................................................................... 44
Um Exemplo de Pgina Dinmica .......................................................................................... 48
Captulo 2 Uma Introduo ao VBScript .................................................................................. 53
Introduo ...................................................................................................................................... 54
O que VBScript ............................................................................................................................ 54
Uma Reviso Rpida de HTML...................................................................................................... 56
Estrutura Bsica de uma Pgina HTML .................................................................................. 56
Tags Para a Criao de Formulrios HTML ............................................................................. 60
Criando o Formulrio a tag <FORM> </FORM> ....................................................... 60
Criando uma Caixa de Texto a Tag <INPUT TYPE=TEXT> ................................... 62
Criando uma Caixa de Texto Para a Digitao
de Senhas a tag <INPUT TYPE=PASSWORD> ....................................................... 64
Criando um Check Box a tag <INPUT TYPE=CHECKBOX> ............................... 66
VII
VIII
Sumrio
IX
Sumrio
XI
XII
Sumrio
XIII
XIV
Sumrio
XV
XVI
Sumrio
XVII
Introduo
Sites Dinmicos
com ASP 3.0
Neste livro vamos abordar diversos assuntos relacionados com a criao de sites dinmicos.
Desta forma, o leitor ter condies de aprofundar os seus conhecimentos em contedos de
grande importncia para a criao de aplicativos para a Web. Iremos apresentar, juntamente
com conceitos tericos, um grande nmero de exemplos e aplicaes prticas em detalhes,
para que o leitor tenha condies de entender com clareza os assuntos abordados.
O trabalho de criar sites e aplicaes para Intranet/Internet tornou-se bastante complexo. O
profissional da Web precisa conhecer um nmero cada vez maior de ferramentas e tecnologias.
A criao de sites, simplesmente atravs da utilizao de pginas HTML, j no capaz de
gerar os resultados necessrios. Hoje, um site na Internet ou na Intranet de uma empresa,
deve apresentar as caractersticas destacadas a seguir:
Gerao dinmica de contedo.
Conexo de pginas com banco de dados.
Personalizao do contedo, de acordo com as preferncias de cada usurio.
Segurana no acesso a reas restritas do site, somente para usurios autorizados e com
nvel de acesso adequado.
Criptografia dos dados transmitidos, ofererecendo garantia de autenticidade e integridade
das informaes, principalmente para sites de Comrcio Eletrnico, onde o usurio deve
digitar informaes importantes, tais como o nmero do carto de crdito.
Servios como envio de mensagens ou grupos de discusso, diretamente atravs do site.
Mecanismos de pesquisa rpidos e precisos.
Layout atraente e funcional, de tal forma que o internauta possa, rapidamente, localizar
o contedo desejado.
Bom contedo e atualizao constante.
Desenvolver um site, que contenha essas caractersticas, no uma tarefa simples. Exige o
uso de diversas tecnologias e ferramentas de apoio, alm, claro, de profissionais competentes
e adequadamente treinados.
Com a utilizao da tecnologia ASP 3.0 Active Server Pages podemos obter bons resultados
na criao de sites com este nvel de complexidade. Ao estudar os captulos 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 desenvolvimento para o Microsoft Office). Em vrias situaes, o cdigo bastante semelhante.
A tecnologia est disponvel atravs da utilizao do Internet Information Services 5.0, como
servidor Web, o qual pode ser instalado juntamente com o Windows 2000 Server. Podemos
notar uma mudana no nome do servidor Web da Microsoft. A verso anterior era denominada
Internet Information Server 4.0 IIS 4.0; e a nova, Internet Information Services 5.0 IIS 5.0.
Observe que o Server foi substitudo por Services. No tpico sobre as novidades do IIS 5.0,
irei explicar o que significa, na prtica, esta mudana.
Durante a instalao do Windows 2000 Server, podemos optar por instalar, ou no, o Internet
Information Services 5.0. Ao longo deste livro estarei utilizando a abreviatura IIS 5.0 (para
manter coerncia com o padro utilizado pela Microsoft no Resource Kit do Windows 2000
Server), ao fazer referncia ao Internet Information Services 5.0. Caso no tenhamos instalado
o IIS 5.0 na instalao do Windows 2000 Server, podemos adicion-lo quando for necessrio.
Para isso, utilizamos o cone Adicionar ou remover programas, no Painel de controle. No
prximo tpico desta introduo, veremos como instalar o IIS 5.0.
importante salientar que o IIS 5.0, somente est disponvel no Windows 2000 Server. Isso
significa que no possvel voc continuar utilizando o Windows NT Server 4.0 (com o qual
est disponvel o IIS 4, atravs da instalao do Option Pack 4.0) e apenas fazer o upgrade do
IIS 4.0 para o IIS 5.0. Tambm importante destacar que as novas caractersticas do ASP 3.0,
somente esto disponveis no IIS 5.0. Em outro tpico desta introduo estarei abordando
essas novas caractersticas.
DICA
Instale somente os servios realmente necessrios. No uma boa idia instalar todos os servios
disponveis, j que somente alguns sero utilizados. Quanto mais servios instalados, maiores
as possibilidades de ataque e quebra da segurana do site, por parte de um hacker.
11. Clique no boto Detalhes.
12. Na lista de opes disponveis, certifique-se de que somente as seguintes esto marcadas:
Arquivos comuns.
Documentao.
Extenses de servidor do FrontPage 2000.
Gerenciador de Internet Services (HTML).
Servidor File Transfer Protocol (FTP).
Servidor World Wide Web.
Snap-In do Internet Information Services.
13. Observe que, aps ter selecionado os componentes a serem instalados, o Windows
2000 Server, exibe o espao em disco necessrio, conforme indicado pela Figura 1.5.
IMPORTANTE
Caso voc no tenha acesso a um computador com o Windows 2000 Server no tem problema.
Voc pode acompanhar a maioria dos exemplos deste livro, utilizando o Windows 2000 Professional. 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 Personal Web Server, que acompanha o Windows 98, pode ser utilizado. Porm no Personal Web
Server, no existem os conceitos de Transao e segurana disponveis no IIS 5.0.
Agora que j temos o IIS 5.0 instalado, vamos testar se o mesmo est funcionando corretamente.
Para testar se o IIS 5.0 foi instalado com sucesso:
1. Abra o Internet Explorer.
2. Digite o seguinte endereo: http://localhost.
10
Administrao e Servios
Os novos recursos do IIS 5.0 aumentaram a sua estabilidade e segurana. Novos assistentes
foram introduzidos para facilitar as tarefas mais comuns de administrao e segurana. Eis
algumas das novidades:
Reinicializao de download: Agora o servio de FTP capaz de reinicializar um download que tenha sido interrompido, a partir do ponto em que a interrupo ocorreu, isso
evita que tenhamos que comear do zero. Caracterstica de grande utilidade, principalmente para arquivos grandes, uma vez que a velocidade da Internet ainda no
nenhuma maravilha.
Compactao HTTP: Toda a informao, enviada via HTTP, pode ser compactada. Para
arquivos de texto (arquivos com cdigo HTML, por exemplo), o ganho considervel
na maioria dos casos, acima de 70 %. Podemos utilizar compactao tambm com
arquivos de imagens (.jpg, .gif), ou qualquer outro tipo de arquivo transmitido via
HTTP. O browser deve ser capaz de descompactar a informao (Internet Explorer e o
Netscape Navigator em verso 4.x, dentre outros).
Assistentes de segurana: Novos assistentes facilitam a execuo de tarefas relacionadas
com a segurana. Por exemplo, o Assistente de Permisses (Permissions Wizard) facilita
a tarefa de atribuir permisses de acesso de arquivo. Esta era uma tarefa complicada
em verses anteriores, uma vez que a permisso efetiva, depende da combinao entre
as permisses estabelecidas no Sistema Operacional (permisses NTFS) e as do IIS.
Temos tambm um assistente para gerenciar Certificados.
Contabilidade de processos (Process Accounting): Modificaes introduzidas no kernel do Windows 2000 Server, permitem um controle bastante refinado nos processos
que esto 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 possvel determinar se um dos sites est consumindo, desproporcionalmente, tempo do processador. Por exemplo, pode ser que uma pgina ASP mal
implementada, esteja elevando a carga no processador. Esta caracterstica tambm pode
ser utilizada por provedores de contedo, os quais hospedam sites de outras empresas,
como um parmetro para a cobrana do servio de hospedagem do site.
Melhor administrao atravs do browser: Administrar o IIS 5.0, remotamente, atravs
do browser ficou bem mais fcil. Alm disso, a maioria das tarefas podem ser executadas
atravs dele, o que no era possvel em verses anteriores. O administrador tambm
pode criar Contas Administrativas (conhecidas como Operadores), com permisses
11
limitadas a determinadas tarefas, por exemplo, criar diretrios virtuais. Com isso
possvel distribuir a administrao do IIS entre diversos Administradores.
Web Distributed Authoring and Versioning (WebDAV): Permite que o autor de pginas, possa
remotamente editar, mover ou eliminar arquivos. Tambm possvel editar as propriedades
de arquivos e diretrios, remotamente, atravs de uma coneco HTTP. Com WebDAV, o
autor est utilizando o HTTP como um protocolo de compartilhamento de arquivo.
Autenticao Digest: Aumenta a segurana e a confiabilidade da autenticao dos usurios.
Com a Autenticao Digest, feito um hash das informaes de senha antes da transmisso.
Informaes ligadas sesso e a hora do sistema so adicionadas ao hash. Com isso, mesmo
que a senha seja interceptada, no poder ser decifrada. Os demais tipos de autenticao
continuam existindo: HTTP Basic, Windows NT Challenge/Response e NTLM authentication (conhecida como integrated Windows authentication).
12
Hora de Comear
Bem, j estamos com o IIS instalado e funcionando, conhecemos as novidades desta verso e
estamos ansiosos para comear a trabalhar com pginas ASP, em sua verso 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 pginas e aplicaes para Web, com diversos
recursos e funcionalidades.
Abaixo apresento uma pequena descrio do contedo de cada captulo deste livro. Caso
voc esteja iniciando os estudos sobre ASP, aconselho que leia os captulos na seqncia
apresentada. Caso j trabalhe com ASP, sinta-se a vontade para ler os captulos na ordem que
julgar mais adequada. Cada captulo apresenta exemplos completos, os quais ilustram os
conceitos tericos apresentados.
Em todos os exemplos, estou utilizando a linguagem VBScript, devido a sua funcionalidade
e facilidade de aprendizado. Caso o leitor queira utilizar Java Script (agora formalmente ECMA
Script), sinta-se vontade.
13
drivers ODBC, at mtodos mais atuais, como a utilizao de ADO (ActiveX Data Objects) e OLE-DB Providers.
Captulo 6: Neste captulo trataremos de aspectos avanados de conexo de pginas ASP
com bancos de dados. Veremos como implementar pesquisas avanadas, efetuar
atualizaes e alteraes em bancos de dados. Analisaremos algumas situaes usuais do
dia-a-dia. Tambm sero abordados aspectos ligados segurana no acesso s informaes.
Captulo 7: Abordaremos a conexo de pginas ASP com banco de dados. Vamos realizar
um estudo completo do objeto Command e aprender a utiliz-lo para enviar parmetros
para consultas Parametrizadas do Microsoft Access.
Captulo 8: Veremos os conceitos de sesso e estado da conexo. Ser apresentado o
conceito de aplicao Web. Aprenderemos, em detalhes, a utilizar os objetos Application e Session. Tambm aprenderemos sobre a funo e como utilizar o arquivo global.asa.
Captulo 9: Trataremos de aspectos de segurana envolvendo pginas ASP.
Captulo 10: Estudaremos diversos componentes que j vem junto com o IIS e fornecem
funcionalidades adicionais, bastante teis na criao de aplicaes Web.
Captulo 11: Neste captulo faremos um estudo completo sobre um dos objetos mais
complexos do ASP: FileSystemObject. Estudaremos todos os seus mtodos, bem como
os objetos derivados: Drive, Folder e File.
Captulo 12: Neste captulo apresentaremos o objeto ASP Error. Tambm aprenderemos
sobre o conceito de Transaes, alm de aprendermos a utilizar a diretiva #include e
as diretivas @.
Apndice A: Teremos uma listagem dos comandos e funes mais utilizados na
linguagem VBScript, que poder ser usada como uma referncia.
14
Captulo 1
Uma Introduo
Tecnologia ASP
15
A Internet faz parte da vida de um nmero cada vez maior de pessoas. Fazer compras, sem
sair de casa; receber, diretamente no seu computador, as ltimas notcias; comprar e vender
aes; procurar emprego pela rede. Todos so exemplos de facilidades oferecidas pelo uso da
Internet. Talvez seja mais simples enunciar o que no possvel de se fazer pela rede, do que
listar todas suas possibilidades. Mas nem sempre foi assim. Para chegar ao nvel que nos
encontramos hoje, com a disponibilizao dos mais variados servios via Internet, muita
evoluo ocorreu. Desde os tempos de contedo meramente informativo, at a possibilidade
de escutar rdio e fazer compras pela rede, muitas tecnologias novas surgiram. E o ritmo de
evoluo no pra, pelo contrrio, parece acelerar cada vez mais.
Neste captulo veremos um pouco sobre esta evoluo da Internet. Passaremos pelas diversas
fases, desde a criao de sites com contedo esttico, at os aplicativos de n-camadas atuais.
Tambm veremos como a tecnologia ASP, contribui para a criao de sites dinmicos. Com
isso voc ver em que situaes indicada a utilizao de pginas ASP.
16
passaram a fazer uso da Internet para fins comerciais. Desde ento a rede expandiu-se
enormemente, atingindo, hoje, milhes de pessoas em todo o mundo.
A popularizao definitiva da rede veio com a criao de uma interface grfica. Com a criao
da linguagem HTML, servidores HTTP, e programas para acessar as pginas HTML
armazenadas nos servidores (tambm 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 traduo para World Wide Web seja: Teia de Alcance Mundial.
Esta a idia que temos de Internet. Uma rede (teia) que conecta computadores do mundo
inteiro (alcance mundial), proporcionando a troca de informaes e uma infinidade de servios
e facilidades para as empresas e para o cidado comum.
Com certeza, os criadores da ARPANET, e depois da Internet, no imaginavam uma expanso
e popularizao to rpida da rede. Hoje, vemos anncios de sites na televiso, durante o
Telejornal e na transmisso de partidas de futebol. A maioria dos jornais possui um caderno
de informtica, quase totalmente dedicado a assuntos relacionados com a Internet. Vemos
reportagens sobre a rede em todas as revistas, e no somente nas especializadas em Informtica,
que agora dedicam quase a totalidade de suas matrias 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 compem.
Internet
Usurio
Servidor Web
Pginas HTML estticas
17
Antes de continuar com as explicaes, considere o diagrama indicado na Figura 1.1. Nesta
figura, temos representados os elementos mais comuns da Internet, conforme descrito a seguir.
Usurio: Representamos um usurio residencial. Normalmente este tipo de usurio faz
a conexo atravs da linha telefnica comum. Para isso preciso a utilizao de um
provedor de acesso, que fornece a conexo com a Internet. O usurio utiliza um programa
conhecido como navegador (browser), para acessar o contedo da Internet. Os dois
navegadores mais conhecidos so o Internet Explorer da Microsoft, e o Netscape Navigator da Netscape. Quando o usurio acessa um determinado contedo, dizemos que ele
est acessando um site (tambm encontramos o uso da palavra pgina, ao invs de
site). Por exemplo, quando o usurio acessa o endereo http://www.microsoft.com/brasil,
dizemos que ele est acessando a pgina, ou o site, da Microsoft Brasil. Quando o usurio
acessa o endereo http://wwww.microsoft.com/vbasic, dizemos que o usurio est
acessando a pgina do Visual Basic, no site da Microsoft. Durante este livro, estarei
utilizando a palavra pgina, significando que o usurio est acessando um determinado
contedo na Internet, ou na Intranet da empresa.
Internet: Pelo fato de ser formada por um grande nmero de equipamentos servidores,
hubs, switch, linhas de comunicao, satlites, etc. , representamos a Internet como
uma nuvem. Esta a representao que voc encontrar na maioria dos livros.
O servidor Web: Neste caso o servidor que contm a informao solicitada pelo usurio.
Por exemplo, ao digitar www.axcel.com.br, no campo endereo do navegador, o usurio
est solicitando que seja carregado o contedo da pgina inicial do site da Editora
Axcel Books. Observe que o servidor tambm est conectado Internet, isto , faz
parte da Internet. As pginas armazenadas no servidor so desenvolvidas utilizandose a linguagem HTML Hypertext Markup Language. Voc pode encontrar muita
informao sobre HTML na prpria Internet. O rgo responsvel pela padronizao
da linguagem HTML o w3. No site www.w3.org, voc pode encontrar um grande
volume de informaes sobre HTML.
Na Figura 1.1, representamos a primeira gerao de contedo da Internet. Conforme indicado
pela seta maior, a informao trafegava, basicamente, em um nico sentido. O usurio solicita
um determinado contedo, e o mesmo entregue e exibido no seu navegador. Observe que o
usurio no tem a possibilidade de enviar informaes para o servidor. Alm disso, nesta
primeira fase o contedo das pginas esttico.
Uma vez criada a pgina (atravs da utilizao do HTML), a mesma no modificada. Cada
vez que o usurio se conectar pgina, ver o mesmo contedo. A nica maneira de alterar o
contedo, alterando o cdigo HTML. Com isso, da prxima vez que o usurio se conectar
pgina, ver a nova verso da mesma. Porm esta metodologia de modificao de pginas
trabalhosa e pouco produtiva. Imagine que voc esteja publicando um catlogo de produtos,
com informaes diversas sobre vrios produtos, tais como: cdigo do produto, descrio e
18
preo. Uma das maneiras de criar este catlogo atravs da utilizao do cdigo HTML, para
criar na pgina uma tabela com informaes sobre os diversos produtos. Porm cada vez que
houver uma modificao em um dos produtos, voc ter que editar a pgina e salvar a nova
verso da mesma. Convenhamos que um processo bastante trabalhoso.
Embora trabalhoso, era assim que funcionavam os primeiros sites, no incio da era WWW. O
contedo era esttico, ou seja, alteraes nas pginas, implicavam em alteraes, diretamente
no cdigo HTML das mesmas. Imagine o trabalho para a manuteno de grandes sites, com
diversas reas de informaes, onde o nmero de pginas pode facilmente chegar na casa dos
milhares. Com isso a evoluo para a criao de contedo mais dinmico, foi um processo
natural e necessrio.
Usurio
Usurio domstico
conectado a Internet atravs
da linha telefnica.
Servidor Web
Pginas HTML dinmicas
19
20
Internet
21
22
23
24
25
A descrio do pargrafo anterior representa uma situao ideal; claro que os sistemas de
CRM ainda no so perfeitos. Porm novas tcnicas esto sendo introduzidas, atravs da
possibilidade de atendimentos via Internet, acessando o site da empresa. Com a melhoria dos
sistemas de telecomunicaes, poderemos tornar realidade um atendimento de alta qualidade
e conclusivo, atravs da Internet. Por exemplo, o cliente est pesquisando o catlogo de
produtos. Na pgina com os dados do produto, existe um link Outras dvidas. Ao clicar
neste link, o cliente entra numa seo de bate-papo com um atendente da empresa. O cliente
pode colocar as suas dvidas, que sero respondidas em tempo real. Tendo as dvidas
solucionadas, h maior probabilidade de ser feito um pedido. Alm disso as dvidas do
cliente podem ser armazenadas no banco de dados. Quando uma determinada dvida comear
aparecer com certa freqncia, os dados que a solucionam podem ser disponibilizados no
catlogo. Assim, os prximos clientes que tiverem a mesma dvida, no precisaro entrar em
contato com o atendimento. Vejam que novamente estamos em um processo de aquisio de
informaes, atravs do prprio site, e utilizao destas informaes para melhorar a qualidade
dos servios e produtos oferecidos.
No B2B tambm existem muitas questes a serem gerenciadas. Para entendermos a
complexidade destas situaes imagine o seguinte exemplo, ilustrado pela Figura 1.6.
Fornecedores
Concessionrias
Servidor
Servidor
Servidor
Servidor
Servidor
Servidor
26
O cliente vai na concessionria para comprar uma determinada pea. O atendente efetua a
venda e o estoque atualizado. Se a pea atingir o nvel mnimo, previamente estabelecido,
um pedido ser automaticamente gerado. Este pedido contm informaes sobre a
concessionria, bem como sobre as peas que esto sendo encomendadas.
As informaes sobre o pedido so criptografadas para garantir a segurana, e o pedido
enviado, via Internet, para o fornecedor da pea. Dentro de um prazo preestabelecido, a pea
entregue, evitando que a mesma fique com estoque zerado.
Observe que, neste caso, existe uma troca de informaes entre as concessionrias e os
fornecedores. Para que possa haver esta troca de informaes, os sistemas das duas
empresas devem ser capazes de trocar dados em um formato comum, efetuando negcios
atravs da Internet.
Vamos introduzir algumas questes que complicam um pouco mais a infra-estrutura necessria
para a realizao do B2B. Por exemplo, ao invs de comprar uma determinada pea sempre do
mesmo fornecedor, o sistema deve ser capaz de enviar o pedido para vrios fornecedores, e
selecionar aquele que fizer a melhor oferta, tanto em termos de preo quanto de prazo de
entrega. Neste caso, a concessionria lana o pedido no seu site e aguarda as propostas dos
fornecedores. Aps recebidas as respostas, uma delas selecionada. Este parece ser um sistema
de leilo ao contrrio, ou seja, o comprador anuncia que est precisando de um determinado
produto, e os fornecedores esforam-se para fazer a melhor proposta. Esta forma de fazer compras
conhecida como e-procurement. Em determinados casos, a lista de propostas est disponvel
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 perodo de tempo estipulado pelo comprador, no nosso caso, a concessionria.
Vejam que mesmo no sistema de B2B, a lgica tem sido revertida em favor do cliente, isto ,
os fornecedores que disputam o cliente, atravs de boas ofertas, preos competitivos e
prazos adequados de entrega.
Porm a criao de sistemas deste tipo uma tarefa complexa. A todo o momento temos
acesso a informaes de bancos de dados, questes de segurana no acesso a essas informaes,
alm de uma lgica bastante complicada. Em diversos pontos do processo podemos fazer uso
da tecnologia ASP, para criar solues bem interessantes. O uso de pginas ASP, em conjunto
com outras tecnologias, possibilita a criao de solues complexas como as exemplificadas
neste captulo.
27
Vamos inserir mais alguns detalhes no nosso exemplo. Pode ser que alm de fazer o pedido,
uma vez aprovada a compra, a concessionria deva fazer o pagamento do mesmo, por meio
de uma transao on-line. O pagamento pode ser feito, por exemplo, atravs de uma
transferncia da conta corrente da concessionria para a conta corrente do fornecedor. Neste
ponto, precisamos introduzir o conceito de transao, o qual ser bastante detalhado no
Captulo 12, Conceitos Avanados: Transaes e o Microsoft Transaction Services.
Uma transao, de maneira bastante simples, um conjunto de aes que deve acontecer
como um todo, ou seja, todas as aes contidas na transao tm que ser finalizadas com
sucesso, ou nenhuma delas deve ser realizada. Caso uma das aes, contida na transao,
falhe, as que ainda estiverem pendentes devem ser canceladas; e as aes j realizadas devem
ser revertidas. Com isso garantimos que a transao acontece como um todo, ou que nenhuma
das suas aes so realizadas.
Para entender, na prtica, o conceito de transaes, vamos voltar ao exemplo anterior. Ao
efetuar um pagamento, o sistema deve transferir valores da conta corrente da concessionria,
para a conta corrente do fornecedor. Estas duas aes devem acontecer no contexto de uma
transao, conforme indicado abaixo:
Incio da Transao
Ao 1: Debita o valor da conta corrente da concessionria.
Ao 2: Credita o valor na conta corrente do fornecedor.
Final da Transao
A primeira ao efetua o dbito na conta corrente da concessionria. Suponhamos que a
Ao 1 ocorra com sucesso, porm na hora de fazer o crdito na conta corrente do fornecedor,
ocorra um problema, o que devemos fazer? O valor deve ser estornado para a conta da
concessionria, ou seja, a Ao 1 deve ser cancelada, uma vez que nem todas as aes dentro
da transao puderem ser concludas com xito. Vejam a importncia do conceito de transao,
pois neste caso, se no usssemos transao, o valor seria debitado da conta corrente da
concessionria e no teria sido creditado na conta corrente do fornecedor.
Poderamos entrar em nveis cada vez mais profundos, sobre os aspectos tecnolgicos
necessrios realizao do Comrcio Eletrnico. Porm estas questes 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, atravs de exemplos prticos e
detalhadamente explicados.
28
Clientes
Clientes
Bancos de Dados
Clientes
Outros Servidores
Clientes
Clientes
29
Cliente
Cliente
Cliente
Cliente
Cliente
30
Lgica do Negcio: As regras que definem a maneira como os dados sero acessados e
processados, so conhecidas como Lgica do Negcio. Fazem parte da Lgica do Negcio
desde funes simples de validao da entrada de dados, como o clculo do dgito
verificador de um CPF, at funes mais complexas, como descontos escalonados para
os maiores clientes, de acordo com o volume da compra. Questes relativas legislao
fiscal e escrita contbil tambm fazem parte da Lgica do Negcio. Por exemplo, um
programa para gerncia de Recursos Humanos, desenvolvido para a legislao dos EUA,
no pode ser utilizado, sem modificaes, por uma empresa brasileira. Isso acontece
porque a legislao dos EUA diferente da legislao brasileira. Em sntese, as regras
para o sistema de Recursos Humanos so diferentes. Alteraes nas regras do negcio
so bastante freqentes em funo das constantes mudanas na legislao do nosso
pas. Com isso, faz-se necessria a gerao de uma nova verso 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 verso anterior devem
receber a nova verso, para que o usurio possa ter acesso s alteraes. Aqui temos
mais um problema do modelo em duas camadas: qualquer alterao nas regras do negcio
suficiente para gerar a necessidade de atualizar a aplicao em centenas ou milhares
de computadores. O gerenciamento desta tarefa algo extremamente complexo.
Com a evoluo do mercado e as alteraes da legislao, mudanas nas regras do negcio
so bastante freqentes. Por isso o modelo de duas camadas, demonstrou-se de difcil
manuteno e gerenciamento, alm de apresentar um TCO muito elevado, conforme
comentado na Introduo deste livro.
A outra camada, vem a ser o banco de dados, o qual fica armazenado em servidor da rede.
Uma aplicao desenvolvida em Visual Basic, a qual acessa um banco de dados em um servidor
Microsoft SQL Server, um tpico exemplo de uma aplicao em duas camadas.
Em busca de solues para os problemas do modelo em duas camadas, que surge a proposta
do modelo em trs camadas, conforme analisaremos a seguir.
31
Servidor de Aplicaes
Cliente
Cliente
Cliente
Cliente
Cliente
32
Servidor Web
Cliente
Cliente
Cliente
Cliente
Cliente
33
atualizada da aplicao. A nica coisa que o cliente precisa ter instalado na sua mquina,
o navegador. O acesso ao banco de dados feito atravs do servidor de Aplicaes.
Lgica: So as regras do negcio, as quais determinam de que maneira os dados sero
utilizados. Esta camada est no servidor de Aplicaes. Desta maneira, quando uma regra do
negcio for alterada, basta atualiz-la no servidor de Aplicaes. Aps a atualizao, todos
os usurios passaro a ter acesso nova verso, sem que seja necessrio reinstalar o programa
em cada um dos computadores da rede. Vejam que, ao centralizar as regras do negcio em
um servidor de Aplicaes, estamos facilitando a tarefa de manter a aplicao atualizada.
Dados: Nesta camada temos o servidor de banco de dados, no qual reside toda a
informao necessria para o funcionamento da aplicao.
Com o deslocamento da camada de apresentao para um servidor Web, resolvemos o problema
de termos que atualizar a aplicao em centenas ou milhares de computadores, cada vez que
uma regra do negcio for alterada. Neste ponto a atualizao das aplicaes uma tarefa mais
gerencivel, muito diferente do que acontecia no caso do modelo em duas camadas.
Os servidores de Aplicao, Web e Banco de Dados no precisam ser necessariamente
servidores separados, isto , uma mquina para fazer o papel de cada um dos servidores. O
conceito de servidor de Aplicao, Web ou Banco de Dados um conceito relacionado com a
funo que o servidor desempenha. Podemos ter, em um mesmo equipamento, um servidor
de Aplicaes, um servidor Web e um servidor de Banco de Dados. Claro que questes de
desempenho devem ser levadas em considerao, conforme analisaremos no prximo tpico.
34
Neste modelo de desenvolvimento para a Web, em trs ou mais camadas, existem diversos
pontos nos quais podemos utilizar a tecnologia ASP. Ao desenvolver a interface da aplicao,
pode-se combinar cdigo HTML com cdigo ASP. Utilizando ASP, podemos desenvolver
pginas que acessam o banco de dados, atravs do servidor de Aplicaes. Questes como
autenticao de usurios, determinao do nvel de acesso e segurana da aplicao podem
ser desenvolvidas com a utilizao de ASP.
Para que voc possa utilizar a tecnologia ASP da melhor maneira, com o objetivo de atender
s necessidades da sua aplicao, importante que voc conhea o modelo de desenvolvimento
para a Web, bem como a utilizao de ASP, para a criao das aplicaes. No decorrer deste
livro, estaremos abordando diversos tpicos relacionados criao de aplicaes Web.
O que ASP?
Definir exatamente o que ASP uma tarefa que pode gerar controvrsias. Eu, particularmente,
gosto de definir ASP, como sendo: Uma tecnologia que permite a criao de pginas dinmicas,
nas quais alm de cdigo HTML, temos cdigo ASP. justamente este cdigo, que fornece a
funcionalidade, que torna os sites dinmicos, possibilitando a criao de aplicaes Web.
No defino ASP como uma linguagem de Script porque, para a criao de pginas ASP, podemos
utilizar diferentes linguagens, tais como VBScript e Java Script. Neste livro, estaremos
utilizando o VBScript. Teremos os Captulos 2 e 3 dedicados linguagem VBScript.
Melhor do que definies formais, entender como funciona uma pgina ASP. Vamos nos
basear na Figura 1.11.
Internet
http://www.abc.com/cep.asp
Servidor Web
www.abc.com
35
36
o Personal Web Server instalado. Porm, com o Personal Web Server, alguns dos exemplos
deste livro, principalmente os que utilizam as novas caractersticas do ASP 3.0, no iro
funcionar corretamente.
Na Introduo, voc aprendeu a instalar o IIS 5.0. No prximo item, aprenderemos a criar um
diretrio no servidor do IIS e salvar nossas pginas neste local, para depois podermos testlas. Sugiro que voc tambm crie este diretrio para salvar nossos exemplos. Iremos criar um
diretrio para cada captulo 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 disponveis no seu
computador.
Agora vamos fazer com que a pasta livro (e conseqentemente, todas as suas subpastas)
passe a fazer parte do servidor IIS www.groza.com.
37
38
39
Figura 1.15: Criando uma nova pasta virtual, no servidor IIS 5.0.
7. Esta pasta virtual ser associada pasta livros, criada anteriormente.
8. Ser exibida a primeira tela do Assistente para a criao de pasta virtual. D um clique
no boto Avanar, passando segunda etapa do assistente.
9. Nesta segunda etapa, voc precisa definir um nome (Alias) para esta pasta virtual.
Utilizaremos o mesmo nome da pasta: livro. No obrigatrio que seja utilizado o
mesmo nome. Por questo de facilidade de administrao e gerenciamento, sempre
utilizo nomes iguais para o nome da pasta no disco rgido e o nome no IIS 5.0.
10. Digite livro, conforme indicado pela Figura 1.16.
40
41
42
A resposta para a questo acima bastante simples, basta que entendamos como so formados
os endereos em um servidor como o IIS. No nosso exemplo, o endereo do servidor
www.groza.com. Ao digitarmos este endereo, estamos acessando a pgina principal do
servidor. Vamos supor que dentro do diretrio livro fosse colocada uma pgina chamada
index.asp. Como faramos para acessar esta pgina, atravs do navegador? O endereo da
pgina em questo, seria o seguinte: www.groza.com/livro/index.asp.
A Figura 1.20, descreve em detalhes a formao deste endereo.
www.groza.com/livro/index.asp
Nome do servidor.
Nome da pgina a
ser acessada
Nome da subpasta
www.groza.com/livro/Capitulo1/cep.asp
Nome da pgina a
ser acessada
Nome do servidor
43
Com isso, podemos ver que existe uma lgica bem definida para a formao dos endereos.
Apenas para confirmar, vamos dar mais alguns exemplos de formao de endereos. Considere
os casos abaixo indicados:
Qual o endereo de uma pgina chamada teste.htm, gravada no diretrio Capitulo6?
Resposta: www.groza.com/livro/Capitulo6/teste.htm.
Qual o endereo de uma pgina chamada cadastro.asp, gravada no diretrio Capitulo10?
Resposta: www.groza.com/livro/Capitulo10/cadastro.asp.
importante que voc entenda bem a maneira como o servidor IIS constri os endereos de acesso
para as pginas gravadas em seus diretrios virtuais. Observe que o diretrio virtual, simplesmente
um nome que nos leva at o diretrio real, gravado no disco. Podemos criar diversos diretrios
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 tpico para acompanhar os exemplos deste livro.
Voc tambm pode optar pela criao de uma estrutura diferente, neste caso, lembre-se de
utilizar a estrutura correta quando estiver acompanhando os nossos exemplos.
NOTA
As listagens de cdigo deste livro, apresentam numerao de linhas. Porm, ao criar o cdigo,
no devem ser digitados os nmeros das linhas. Os nmeros so utilizados, apenas para
facilitar a explicao dos cdigos de exemplo.
44
<HTML>
<HEAD>
</HEAD>
<BODY>
<%
10
11
12
13
%>
14
</BODY>
15
</HTML>
IMPORTANTE
No digite o nmero das linhas. A numerao apenas aparece na listagem, para servir como
referncia na hora de explicarmos o cdigo ASP.
Salve este documento na subpasta Capitulo1, da pasta livro. Salve o arquivo com o nome de
exemplo1.asp. Se voc tambm estiver utilizando o Bloco de notas, importante digitar a
extenso .asp, pois caso contrrio o Bloco de notas, colocar a extenso .txt.
Antes de explicarmos o cdigo da Listagem 1.1, vamos test-lo. Para testar o cdigo faa o seguinte:
1. Abra o Internet Explorer.
2. No campo endereo digite o seguinte: www.groza.com/livro/Capitulo1/exemplo1.asp
3. Tecle Enter.
Se no foram cometidos erros na hora da digitao da Listagem 1.1, o Internet Explorer mostra
o resultado da pgina exemplo1.asp, conforme indicado na Figura 1.22.
45
46
IMPORTANTE
Todo trecho de cdigo ASP, inicia com um <% e deve ser finalizado com um %>. Podemos
ter mais do que um trecho de cdigo ASP, dentro de um mesmo documento. Com isso podemos
ir mesclando trechos de cdigo HTML, com trechos de cdigo ASP. Essa possibilidade nos d
uma grande flexibilidade na hora de construir aplicaes para a Web. Sempre que for necessrio
algum tipo de processamento em uma pgina, podemos inserir cdigo ASP para fazer o
processamento desejado, e depois retornar o resultado no formato HTML.
As linhas 14 e 15 so tags HTML, que aparecem no final de uma pgina. 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 Bsico & Rpido,
da editora Axcel Books.
Conforme descrito anteriormente, o cdigo ASP processado pelo IIS, e o resultado deste
processamento retornado para o navegador do cliente no formato HTML. Podemos facilmente
comprovar isto.
Comprovando que o que retorna somente o cdigo HTML:
1. Se voc no estiver com a pgina exemplo1.asp aberta, abra-a conforme descrito no
exemplo anterior.
2. No menu Exibir, clique na opo Cdigo fonte.
3. Ser exibida uma janela, conforme indicado pela Figura 1.23.
47
4. Observe que o cdigo retornado para o cliente, cdigo HTML puro, sem nenhum
sinal do cdigo ASP. Isso impede com que o usurio possa ter acesso ao cdigo dos
aplicativos desenvolvidos em ASP. Alm disso qualquer navegador pode ser utilizado
para acessar uma pgina ASP, uma vez que o que , efetivamente, enviado para o
cliente cdigo HTML.
5. Feche a janela indicada na Figura 1.23.
Nesse exemplo, criamos a nossa primeira pgina ASP. Onde aprendemos alguns detalhes
importantes e confirmamos outros, anteriormente apresentados. Apenas para revisar, vamos
enunciar os principais tpicos abordados:
Uma pgina pode conter um ou mais trechos com cdigo ASP.
Cada trecho de cdigo ASP, inicia com <% e termina com %>.
Uma pgina ASP identificada pela sua extenso, que deve ser .asp, caso contrrio o
cdigo ASP ser ignorado pelo servidor IIS.
O cdigo ASP processado pelo servidor IIS, e o resultado desse processamento que
retornado para o navegador do cliente, no formato de cdigo HTML. Voc pode,
facilmente, comprovar este fato, selecionando a opo Cdigo fonte, do menu Exibir,
do Internet Explorer.
Pelo fato do resultado do processamento de uma pgina ASP ser cdigo HTML, qualquer
navegador est habilitado para acessar pginas ASP, e no somente o Internet Explorer.
Para encerrarmos este captulo, vamos a mais um exemplo prtico. Na pgina exemplo1.asp,
no temos nenhuma vantagem em utilizar cdigo ASP. Poderamos utilizar cdigo HTML,
que obteramos o mesmo resultado, sem maiores problemas.
No prximo exemplo, veremos como a utilizao de ASP pode facilitar a criao de pginas
dinmicas e aplicativos para a Web. Por enquanto no se preocupe em entender todos os
comandos do ASP e do VBScript. Teremos todo este livro para aprend-los. O objetivo do
prximo exemplo salientar a natureza dinmica do ASP na gerao de pginas.
NOTA DO AUTOR
Estou utilizando Boqueiro do Leo, 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
Poderamos criar esta pgina utilizando HTML, porm todos os dias, no final do dia, teramos
que editar a pgina para alterar a data, uma vez que a mesma no ser atualizada
automaticamente. Utilizando cdigo ASP, podemos fazer com que a pgina acesse a data do
servidor IIS e exiba a data sempre atualizada, na pgina ASP. Com isso, cada vez que a pgina
for acessada pelo usurio, o cdigo ASP ir determinar a data do servidor e enviar uma pgina
com a data atualizada. Este um exemplo, bastante simples, de uma pgina dinmica; pois a
data dinamicamente determinada pelo cdigo ASP.
A pgina da Listagem 1.2 soluciona o problema proposto.
Abra o Bloco de Notas (Iniciar/Programas/Acessrios/Bloco de notas) e digite o texto indicado
na Listagem 1.2.
Listagem 1.2 Pgina dinmica O exemplo da determinao da data.
1
<HTML>
<HEAD>
</HEAD>
<BODY>
<%
data_atual=Date()
mes_atual=Month(data_atual)
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
Case 1
mes_desc=Janeiro
Case 2
mes_desc=Fevereiro
Case 3
mes_desc=Maro
Case 4
mes_desc=Abril
Case 5
mes_desc=Maio
Case 6
mes_desc=Junho
Case 7
mes_desc=Julho
Case 8
mes_desc=Agosto
49
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
35
36
%>
37
38
</BODY>
39
</HTML>
IMPORTANTE
No digite o nmero das linhas. A numerao apenas aparece na listagem para servir como
referncia na hora de explicarmos o cdigo ASP. Esta orientao vlida 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 extenso .asp, pois caso contrrio o Bloco de notas,
colocar a extenso .txt.
Antes de explicarmos o cdigo da Listagem 1.2, vamos test-lo. Para testar o cdigo faa o seguinte:
1. Abra o Internet Explorer.
2. No campo endereo digite: www.groza.com/livro/Capitulo1/exemplo2.asp.
3. Tecle Enter.
4. Se no foram cometidos erros na hora da digitao da Listagem 1.2, o Internet Explorer
mostra o resultado da pgina exemplo2.asp, conforme indicado na Figura 1.24.
50
51
Comprovando, mais uma vez, que o que retorna somente o cdigo HTML.
1. Se voc no estiver com a pgina exemplo2.asp aberta, abra-a conforme descrito no
exemplo anterior.
2. No menu Exibir, clique na opo Cdigo fonte.
3. Ser exibida uma janela, conforme indicado pela Figura 1.25.
52
Captulo 2
Uma Introduo
ao VBScript
53
Introduo
Neste captulo aprenderemos o bsico a respeito de VBScript. Veremos exatamente o que
VBScript, e onde utiliz-lo. Aprenderemos que possvel executar cdigo VBScript, tanto no
navegador do cliente, quanto no servidor Web. Depois apresentaremos os aspectos bsicos da
linguagem, tais como a declarao de variveis, operadores e laos de controle. medida em
que os conceitos forem sendo apresentados, iremos trabalhando com exemplos prticos, para
que os conceitos possam ser melhor entendidos. Tambm aprenderemos a criar sub-rotinas e
funes. Na parte final do captulo, desenvolveremos alguns exemplos prticos de utilizao
de VBScript, na criao de pginas. Ao completar este captulo, voc ter uma noo bsica
de VBScript, e ser capaz de criar solues simples utilizando esta linguagem.
NOTA
Os exemplos apresentados nas listagens deste captulo, podem ser criados utilizando-se um
redator de texto, como o Bloco de notas, e salvando os arquivos com a extenso .htm. Depois
s abrir os mesmos no Internet Explorer e testar. Os nmeros das linhas que aparecem nas
listagens, no devem ser digitados. Os mesmos foram includos, nas respectivas listagens,
apenas para facilitar o acompanhamento das explicaes de cada exemplo.
O que VBScript
VBScript uma linguagem de criao de scripts, a qual derivada do Visual Basic (VB) e do
VBA (Visual Basic for Applications). O Visual Basic o ambiente de desenvolvimento grfico
mais utilizado para o desenvolvimento de aplicaes para o ambiente Windows. Como o
nome sugere, a programao em Visual Basic baseada na linguagem de programao 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 cdigo 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 bsicos, como estruturas de controle, declaraes de variveis, operadores e
funes, so idnticos. Na verdade alguns artigos definem VBScript como sendo um
subconjunto do VB.
Devemos considerar alguns fatos importantes, dentre os quais podemos destacar:
VBScript uma linguagem para a criao de scripts. Um script no compilado para
gerar um programa executvel, ao invs disso, cada linha do script interpretada, e
executada.
54
O cdigo escrito juntamente com uma pgina HTML. A pgina enviada para o
navegador, o qual interpreta e executa o cdigo VBScript, uma linha por vez. O suporte
VBScript nativo no Internet Explorer, j no Netscape Navigator o suporte VBScript
se d atravs da instalao 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
cdigo VBScript.
Com a utilizao do VBScript, podemos ampliar as capacidades de uma pgina HTML,
tornando-a mais funcional e interativa. Podemos realizar clculos, exibir mensagens
em janelas pop-up, detectar eventos tais como o clique em um link ou em um boto de
comando, criar menus interativos, etc. Podemos utilizar cdigo VBScript para fazer a
validao dos dados de um formulrio. Caso exista erro em algum campo, ou caso
algum campo obrigatrio no tenha sido preenchido, podemos retornar uma mensagem
para o usurio, com os dados que o mesmo preencheu, indicando qual ou quais campos esto com problema. Com isso o usurio corrige os problemas, antes que os dados
sejam enviados para o servidor, reduzindo as possibilidades de erro e agilizando o
processamento das informaes. So muitas as possibilidades.
A linguagem VBScript foi desenvolvida tendo-se a segurana como uma de suas
diretrizes. Atravs do uso de VBScript, no possvel criar uma pgina, por exemplo,
que tenha acesso ao sistema de arquivos do computador e possa apagar ou modificar
informaes. Evidentemente que a criatividade de hackers mal intencionados no tem
limites. Porm diversos cuidados foram tomados, pela Microsoft, para tornar a VBScript
uma linguagem segura.
Pela semelhana com o Visual Basic, VBScript uma linguagem de fcil aprendizado.
Se voc j programa em Visual Basic, aprender VBScript ser simplesmente uma questo
de saber o que possvel fazer com VBScript e quais so as suas limitaes.
Conforme podemos concluir, VBScript uma linguagem para a criao de scripts, os quais
ampliam a funcionalidade das pginas HTML.
No prximo item faremos uma reviso rpida os principais elementos de uma pgina HTML.
Como o cdigo VBScript que roda no cliente escrito dentro da prpria pgina HTML,
importante que saibamos identificar seus principais elementos. Alm disso, conforme veremos
a partir do Captulo 4, uma pgina ASP mistura as tags HTML com elementos de cdigo ASP.
Por isso importante que saibamos reconhecer os principais elementos de uma pgina HTML.
Para maiores informaes sobre HTML, consulte o livro HTML 4 Curso Bsico & Rpido, da
editora Axcel Books.
55
<HTML>
<HEAD>
</HEAD>
<BODY>
</BODY>
</HTML>
IMPORTANTE
Cabe novamente ressaltar, que os nmeros de linha, no fazem parte do cdigo HTML. Apenas
foram colocados na listagem para facilitar a explicao da mesma. Esta recomendao vlida
para todas as listagens apresentadas neste livro. Com isso, se voc for digitar esta listagem,
no digite o nmero das linhas. Este fato pode ser comprovado pela Figura 2.1.
56
As maioria das tags HTML so formadas por pares. Conforme podemos ver na Listagem 2.1,
todo documento HTML, comea com a tag <HTML> e termina com uma tag </HTML>
(linhas 1 e 9, respectivamente).
Logo aps a tag <HTML>, temos a tag <HEAD>. Dentro das tags <HEAD> e </HEAD>
podemos colocar diversas informaes, muitas vezes chamadas de Metainformao. Contida
nesta seo do documento est a informao a respeito do prprio documento, como por
exemplo: qual o programa utilizado para gerar o documento, nome do autor, data de criao,
etc. As informaes contidas nesta seo do documento, so 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 ttulos do navegador. Este fato pode
ser comprovado pela Figura 2.1.
57
Aps o par de tags <HEAD> </HEAD>, temos a tag <BODY>. A partir da tag <BODY>, na
linha 6, que comea a parte do documento que ser exibida pelo navegador. Tudo o que
estiver entre o par de chaves <BODY> </BODY> contedo que deve ser exibido pelo
navegador. Neste nosso exemplo, muito simples, temos apenas um pargrafo de texto sendo
exibido. A tag que define uma pargrafo de texto <P> </P>, conforme indicado na linha 7.
Esta a estrutura bsica de todo documento HTML.
Cada tag do HTML pode conter um ou mais atributos. Um atributo modifica a maneira como
o navegador exibe o contedo da pgina. Por exemplo, na Listagem 2.2, estamos utilizando o
atributo color da tag <FONT>, para modificar as caractersticas da fonte do texto a ser exibido.
Listagem 2.2 Utilizando atributos da tag <FONT> </FONT>.
1
<HTML>
<HEAD>
</HEAD>
<BODY>
</BODY>
</HTML>
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 pargrafo, para modificar as caractersticas da fonte deste pargrafo. Tambm utilizamos a
tag <B></B>, para fazer com que o texto fosse exibido em negrito. Ao visualizar este
documento, no navegador, o texto Uma Pgina 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 Bsico & Rpido, da editora Axcel Books, para
maiores informaes sobre a linguagem HTML. Apenas como um exemplo de uma pgina
mais completa, considere a Listagem 2.3, onde utilizamos as tags para criao de tabelas.
<TABLE> e </TABLE>, para criar a tabela; <TR> e </TR> para criar novas linhas; <TD>
e </TD>, para criar as clulas dentro de uma linha da tabela.
Listagem 2.3 Uma pgina HTML com diversas tags.
1
<HTML>
<HEAD>
58
</HEAD>
<BODY>
9
10
11
<TR>
<TD align=middle>Ano de Produo</TD>
<TD align=middle>Produo em Toneladas</TD>
12
</TR>
13
<TR>
14
15
<TD align=middle>1996</TD>
<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
23
<TD align=middle>1998</TD>
<TD align=middle>33000</TD>
24
</TR>
25
<TR>
26
27
<TD align=middle>1999</TD>
<TD align=middle>32560</TD>
28
</TR>
29
</TABLE>
30
31
</BODY>
32
</HTML>
59
60
<HTML>
<HEAD>
</HEAD>
<BODY>
<P>Cadastro de Clientes:<BR>
<P>
10
11
</FORM>
12
</BODY>
13
</HTML>
O atributo mais importante da tag <FORM> o action. No atributo action, devemos informar
o endereo de uma pgina ASP, um script CGI, ou qualquer outro elemento capaz de processar
os dados digitados em um formulrio. O usurio preenche os campos do formulrio, e, ao
clicar no boto Enviar, chamada a pgina ou programa indicados no atributo action, o qual
responsvel por processar as informaes do formulrio.
Na Listagem 2.5, temos um exemplo em que uma pgina ASP responsvel por processar os
dados enviados pelo formulrio.
Listagem 2.5 O atributo action contm o endereo de uma pgina ASP.
1
<HTML>
<HEAD>
</HEAD>
<BODY>
<P>
10
61
</FORM>
12
</BODY>
13
</HTML>
Banco de
Dados
Cliente
Servidor Web
Figura 2.3: A Pgina ASP armazena os dados digitados no formulrio, em um banco de dados.
Neste caso, a pgina ASP recebe os dados do formulrio 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. Aps armazenar os dados no banco de dados, a
pgina ASP envia cdigo HTML puro, de volta para o cliente. Normalmente a pgina 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 possvel causa do problema.
A partir do Captulo 4, estaremos aprendendo a criar pginas ASP para tratar com formulrios
e armazenar os dados enviados em bancos de dados, bem como para fazer pesquisas em
banco de dados.
62
Descrio
TYPE
SIZE
MAXSIZE
NAME
VALUE
ID
Na Listagem 2.6, temos um exemplo de criao de um formulrio com dois campos para
entrada de texto. Um para o nome, outro para o endereo.
Listagem 2.6 Um formulrio com dois campos de texto.
1
<HTML>
<HEAD>
<TITLE></TITLE>
</HEAD>
<BODY>
63
10
11
</FORM>
12
</BODY>
13
</HTML>
Nas linhas 9 e 10, temos o cdigo HTML, que cria os dois campos do formulrio. A Figura
2.4 mostra este formulrio, sendo visualizado no Internet Explorer, com os dados digitados
pelo usurio.
Descrio
TYPE
64
Atributo
Descrio
SIZE
MAXSIZE
NAME
VALUE
ID
<HTML>
<HEAD>
<TITLE></TITLE>
</HEAD>
<BODY>
10
11
12
</FORM>
13
</BODY>
14
</HTML>
Na linha 11, temos o cdigo HTML, que cria o campo para a digitao de senha. A Figura 2.5,
mostra este formulrio, sendo visualizado no Internet Explorer, j com os dados digitados
pelo usurio.
65
Descrio
TYPE
CHECKED
NAME
ID
VALUE
66
<HTML>
<HEAD>
<TITLE></TITLE>
</HEAD>
<BODY>
10
11
12
<P>Certificaes:
13
14
15
16
17
</FORM>
18
</BODY>
19
</HTML>
Nas linhas de 13 a 16, temos o cdigo HTML que cria os diversos Check Box. Quando o
usurio 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 pgina ASP, responsvel pelo processamento dos dados do formulrio. A Figura
2.6 mostra este formulrio, sendo visualizado no Internet Explorer, onde o usurio digitou
dados nos campos e marcou alguns dos Check Box disponveis. Observe que mais do que um
Check Box pode ser marcado.
67
Descrio
TYPE
NAME
68
Atributo
Descrio
ID
VALUE
<HTML>
<HEAD>
<TITLE></TITLE>
</HEAD>
<BODY>
10
11
12
<P>Certificaes:
13
14
15
16
17
18
<P>
19
20
21
22
</P>
23
</FORM>
24
</BODY>
25
</HTML>
69
Nas linhas de 19 a 21, temos o cdigo HTML que cria os diversos Radio Buttons. Quando o
usurio 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 pgina ASP responsvel pelo processamento dos dados do formulrio.
A Figura 2.7 mostra este formulrio, sendo visualizado no Internet Explorer, onde o usurio
digitou dados nos campos e marcou uma das opes disponveis para o carto de crdito.
Nunca demais lembrar que o usurio somente conseguir marcar uma das opes.
70
Descrio
NAME
ID
WRAP
<HTML>
<HEAD>
<TITLE></TITLE>
</HEAD>
<BODY>
10
11
12
<P>Certificaes:
13
14
15
16
17
18
<P>
19
20
71
21
22
</P>
23
24
</FORM>
25
</BODY>
26
</HTML>
Na linha 23, temos o cdigo HTML, que cria o campo para a digitao do texto, para as
crticas e sugestes. A Figura 2.8 mostra este formulrio, sendo visualizado no Internet Explorer,
com as crticas e sugestes digitadas pelo usurio.
72
lista de valores, dentre os quais o usurio pode clicar selecionando uma ou mais opes. Cada
opo (definida pela tag <OPTION></OPTION>) possui um valor que exibido na lista, e um
valor associado, caso esta opo seja selecionada. Este valor associado que ser armazenado
no banco de dados, pela pgina ASP. Veja os principais atributos da tag <SELECT></SELECT>.
Tabela 2.6 Atributos da tag <SELECT></SELECT>.
Atributo
Descrio
NAME
ID
MULTIPLE
Pode ser True ou False. Caso seja True, permite que sejam
selecionados mltiplo itens.
Na Listagem 2.11, temos um exemplo de um formulrio com a criao de uma lista bairro,
com trs valores possveis.
Listagem 2.11 Um formulrio com uma Caixa de combinao bairro.
1
<HTML>
<HEAD>
<TITLE></TITLE>
</HEAD>
<BODY>
10
11
12
<P>Selecione o bairro:
13
14
15
<OPTION value=CAMOBI>CAMOBI</OPTION>
16
17
<OPTION value=DORES>DORES</OPTION>
</SELECT>
18
</P>
19
<P>Certificaes:
20
21
73
22
23
24
25
<P>
26
27
28
29
</P>
30
31
</FORM>
32
</BODY>
33
</HTML>
Nas linhas 13 a 17, temos o cdigo HTML que cria a Caixa de combinao. Na primeira opo
<OPTION selected value=CENTRO>CENTRO</OPTION>, a palavra selected, indica que
esta opo deve estar selecionada por padro. A Figura 2.9 mostra este formulrio, com a
opo DORES sendo selecionada na Caixa de combinao bairros.
74
Descrio
TYPE
NAME
ID
VALUE
Embora no seja de uso obrigatrio, bastante comum termos um boto do tipo Reset. Ao
clicar neste boto, todos os campos do formulrio so apagados. O projetista da aplicao
Web quem ir definir a necessidade, ou no, da utilizao de um boto do tipo Reset. Na
Tabela 2.8, temos os atributos para um boto do tipo Reset.
Tabela 2.8 Atributos da tag <INPUT TYPE=RESET>.
Atributo
Descrio
TYPE
NAME
ID
VALUE
<HTML>
<HEAD>
75
<TITLE></TITLE>
</HEAD>
<BODY>
10
11
12
<P>Selecione o bairro:
13
14
15
<OPTION value=CAMOBI>CAMOBI</OPTION>
16
17
<OPTION value=DORES>DORES</OPTION>
</SELECT>
18
</P>
19
<P>Certificaes:
20
21
22
23
24
25
<P>
26
27
28
29
</P>
30
31
<P>
32
76
33
34
</P>
35
</FORM>
36
</BODY>
37
</HTML>
Nas linhas 32 e 33, temos o cdigo HTML que cria os botes Enviar dados e Limpar dados,
respectivamente. A Figura 2.10, mostra o nosso formulrio de exemplo, j completo.
77
NOTA
Observe a utilizao do atributo LANGUAGE. Este atributo define qual a linguagem de script
que ser utilizada. Alm do VBScript, poderamos utilizar o JavaScript. Neste livro, estaremos
utilizando VBScript.
NOTA
A utilizao de <! , no incio do cdigo, e de >, no final do cdigo, no obrigatria. Estas
so as tags para comentrios em pginas HTML. No entanto, recomendvel que se utilize
estas tags. Os navegadores mais antigos, tais como Internet Explorer 1.0, no reconhecem
VBScript; se no utilizarmos as tags de comentrio, o cdigo VBScript ser exibido como se
78
fosse texto, o que no desejvel. Com a utilizao das tags de comentrio, garantimos que os
navegadores que no entendem VBScript, simplesmente ignorem o cdigo.
<HTML>
<HEAD>
</HEAD>
<BODY>
<SCRIPT LANGUAGE=vbscript>
<!
x=Date()
9
10
MsgBox x
>
11
</SCRIPT>
12
13
</BODY>
14
</HTML>
Nas linhas 8 e 9, que temos o cdigo VBScript, propriamente dito. No se preocupe com o
cdigo, neste momento. Neste e no prximo captulo, veremos detalhes sobre a utilizao de
funes, tais como Date( ) e MsgBox. Ao abrir esta pgina no Internet Explorer, ser aberta
uma janela, na qual exibida a data do sistema, conforme indicado na Figura 2.11.
79
Dim x
Dim nome
Dim teste
O formato geral para o comando Dim : Dim nome_da_varivel. Tambm podemos declarar
mais do que uma varivel, com um nico comando Dim. Para isto, basta separar as variveis,
com vrgula, conforme exemplificado a seguir:
Dim x,y,z
Dim nome
Dim teste1,teste2
IMPORTANTE
Observe que definimos o tipo de cada varivel. O tipo define quais dados podem ser
armazenados em uma varivel. Por exemplo, variveis que armazenam valores numricos, no
devem aceitar caracteres de texto. Variveis que armazenam datas, no devem aceitar datas
invlidas, como por exemplo 30/02/2000. Toda varivel no VBScript do tipo Variant, isto significa
que a varivel pode ser de qualquer tipo. O que define o tipo da varivel o valor que est
armazenado no momento. Existem funes de converso de tipo, conforme veremos mais adiante.
Tambm podemos utilizar variveis que no foram, explicitamente, declaradas com o comando
Dim. Com isso, a varivel criada na memria, no momento da sua utilizao.
Na Listagem 2.14, temos um exemplo simples de utilizao de variveis no declaradas
explicitamente.
Listagem 2.14 Utilizao de variveis no declaradas.
1
<HTML>
<HEAD>
</HEAD>
<BODY>
<SCRIPT LANGUAGE=vbscript>
<!
a=5
b=2
10
c=a+b
11
12
>
13
</SCRIPT>
14
80
15
</BODY>
16
</HTML>
Ao abrir esta pgina no Internet Explorer, ser aberta uma janela, conforme indicado na
Figura 2.12.
<HTML>
<HEAD>
</HEAD>
<BODY>
<SCRIPT LANGUAGE=vbscript>
<!
Option Explicit
a=5
11
b=2
12
c=a+b
13
14
>
15
</SCRIPT>
16
17
</BODY>
18
</HTML>
81
Ao abrir esta pgina no Internet Explorer, no ser exibida a janela indicada na Figura 2.12;
isto porque as variveis a, b e c no foram declaradas. Uma vez que a declarao tornou-se
obrigatria, com a adio do comando Option Explicit, as variveis simplesmente no existem.
O Internet Explorer exibir somente o texto Exemplo de utilizao de variveis, conforme
indicado pela Figura 2.13.
Descrio
Empty
Null
Boolean
Byte
Integer
Currency
82
Subtipo
Descrio
Long
Date(Time)
String
Object
Error
Smbolo
Descrio
Adio
Subtrao
Multiplicao
Diviso
Inteiro da Diviso
83
Operador
Smbolo
Descrio
Exponenciao
Mdulo
Mod
<HTML>
<HEAD>
</HEAD>
<BODY>
<SCRIPT LANGUAGE=vbscript>
<!
Option Explicit
Dim a
10
Dim b
11
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
21
22
23
MsgBox Soma: & som & Chr(13)& Subtrao: & subtr & Chr(13)
24
MsgBox Diviso: & divis & Chr(13)& Multiplicao: & mult & Chr(13)
25
MsgBox Diviso inteira: & intdivs & Chr(13)& Exponenciao: & expo & Chr(13)
26
84
27
>
28
</SCRIPT>
29
30
</BODY>
31
</HTML>
Neste exemplo, nas linhas de 14 a 20, utilizamos os operadores aritmticos, para realizar
uma srie de operaes com os valores atribudos s variveis a e b. Depois, da linha 22
at a 26, utilizamos a funo MsgBox, para exibir os resultados obtidos. O uso da funo
MsgBox merece alguns comentrios. Primeiro, utilizamos a funo MsgBox para exibir
mensagens em uma pequena janela, chamada de janela pop-up. Podemos exibir texto e tambm
valores de variveis. Quando temos que exibir diversos componentes, como um pouco de
texto, em seguida o valor de uma varivel, depois mais texto, e assim por diante, devemos
utilizar o operador de concatenao &. Este operador permite que as diversas partes sejam
exibidas como uma nica mensagem. Considere o exemplo da linha 22:
22
Neste exemplo, primeiro, exibido o texto Os nmeros so: , logo em seguida o valor da
varivel a. Observe que as duas partes so concatenadas com o operador &. Depois concatenamos
o valor da varivel b, e finalmente utilizamos a funo Chr(13). A funo Chr(nmero) envia o
caractere correspondente ao nmero digitado entre parnteses. Este nmero o nmero do
caractere no padro ASCII (American Standard Caracter Interchange Information). No cdigo
ASCII, cada caractere possui um nmero associado; o nmero 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 no saiam todos emendados, na mesma linha. Ao abrir a pgina da Listagem 2.16,
no Internet Explorer, o cdigo da linha 22, produz a mensagem da Figura 2.14.
85
86
Conforme podemos ver, a estrutura If Then Else bastante simples. Fazemos um teste no
incio da estrutura. Se o valor do teste for verdadeiro, executamos os comandos na seqncia,
caso contrrio, executamos os comandos aps o Else. Note que utilizamos o operador de
comparao maior do que >, no caso x>y, estamos testando se x maior do que y. Observe
que no exemplo acima, no sero executados comandos, caso x seja igual a y. Podemos utilizar
laos 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
Else
Comandos a serem executados quando x for menor do que y
End If
87
Smbolo
Descrio
Igualdade
igual a.
Desigualdade
<>
diferente de.
Maior que
>
maior do que.
Menor que
<
menor do que.
Maior ou igual
>=
maior ou igual a.
Menor ou igual
<=
menor ou igual a.
<HTML>
<HEAD>
</HEAD>
<BODY>
<SCRIPT LANGUAGE=vbscript>
<!
Option Explicit
Dim x,y,z,k
10
x=12
11
y=15
12
z=20
13
k=15
14
If x<y Then
15
16
Else
88
17
18
End If
19
If y<x Then
20
21
22
23
End If
24
If y<=k Then
25
26
27
28
End If
29
If x<>z Then
30
31
MsgBox x e z so diferentes
End If
32
>
33
</SCRIPT>
34
35
</BODY>
36
</HTML>
89
Ao clicar em OK, uma nova mensagem exibida, devido a funo MsgBox da linha 22. Como
o teste y<x falso, no executada a linha 20, mas sim a linha 22. O cdigo da linha 22
produz a mensagem da Figura 2.20.
90
Resultado
Comparao normal.
91
NOTA
Um procedimento um bloco de cdigo que pode ser chamado em qualquer ponto do script.
Ao chamarmos um procedimento, a execuo deslocada para dentro do procedimento. Aps
concludo o procedimento, a execuo segue com a linha seguinte que chamou o procedimento.
Veremos maiores detalhes sobre procedimentos e funes no final deste captulo.
Vamos analisar o exemplo da Listagem 2.18, para entendermos melhor este conceito de escopo
de uma varivel. Neste exemplo, tambm estaremos introduzindo um conceito muito
importante, o conceito de evento e procedimentos que executam cdigo em resposta a eventos.
Listagem 2.18 Exemplo para anlise do escopo de variveis.
1
<HTML>
<HEAD>
<!
Sub analisar_onclick
9
10
Call proc1
End Sub
11
>
12
</SCRIPT>
13
</HEAD>
14
<BODY>
15
<SCRIPT LANGUAGE=vbscript>
16
<!
17
18
92
19
Dim x, y
20
x=10
21
y=20
22
23
24
25
26
Sub proc1()
27
Dim a, b
28
a=5
29
b=7
30
31
End Sub
32
33
34
35
36
37
aux1=a+b
38
39
>
40
</SCRIPT>
41
42
43
44
</BODY>
45
</HTML>
93
94
resposta ao evento onclick, do boto analisar. Quando o usurio clicar no boto analisar,
este evento gerado e o cdigo da linha 9 executado. Este cdigo chama o
procedimento proc1. Dentro do procedimento proc1, so definidas as variveis a e b
(linhas 27 a 29). Depois utilizado o comando MsgBox para exibir os valores das
variveis x, y, a e b. Como as variveis x e y foram declaradas em nvel de script, isto ,
fora de qualquer procedimento, as mesmas so acessveis 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 Captulo 4.
Estruturas de Deciso
Em um primeiro grupo, temos as chamadas estruturas de deciso. So estruturas que realizam
um teste lgico, 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 deciso, disponveis no VBScript.
95
A Estrutura If...Then
A estrutura If...Then uma das estruturas de deciso mais conhecidas. Toda linguagem
implementa esta estrutura. utilizada para executar determinados comandos, caso uma
condio seja verdadeira. A forma geral desta estrutura a seguinte:
If condio Then
Comandos a serem executados, caso a condio seja verdadeira.
End If
Uma condio testada; caso a condio seja verdadeira, um ou mais comandos podem ser
executados. Considere o exemplo da Listagem 2.19.
Listagem 2.19 Um exemplo simples da estrutura If...Then.
1
<SCRIPT LANGUAGE=vbscript>
<!
Dim x, y
x=10
y=15
If x<y Then
End If
>
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 atribudos s variveis 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 condio seja verdadeira, ou um conjunto
diferente de comandos, caso a condio seja falsa. A forma geral desta estrutura a seguinte:
If condio Then
Comandos a serem executados, caso a condio seja verdadeira.
Else
Comandos a serem executados, caso a condio seja falsa.
End If
96
<SCRIPT LANGUAGE=vbscript>
<!
Dim x, y
x=15
y=10
If x<y Then
Else
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 atribudos s variveis x e y.
A Estrutura If...Then...ElseIf...Else
A estrutura If...Then...ElseIf...Else nos d um poder maior, para testarmos diversas possibilidades. utilizada quando precisamos realizar mais do que um teste lgico. Neste caso, para cada
novo teste que se faa necessrio, utilizamos um ElseIf. A forma geral desta estrutura a seguinte:
If condio Then
Comandos a serem executados, caso a condio seja verdadeira.
ElseIf condio 2
Comandos a serem executados, caso a condio2 seja verdadeira.
ElseIf condio 3
Comandos a serem executados, caso a condio3 seja verdadeira.
...
ElseIf condio n
Comandos a serem executados, caso a condio n seja verdadeira.
Else
Comandos a serem executados, caso nenhuma das condies anteriores seja
verdadeira.
End If
97
<SCRIPT LANGUAGE=vbscript>
<!
Dim x, y
Dim z, k
Dim w, p
x=35
y=30
z=25
k=20
10
w=15
11
p=10
12
If x<y Then
13
14
MsgBox
ElseIf
15
16
MsgBox
ElseIf
17
18
ElseIf
21
22
Then
x menor do que p
Else
23
24
Then
x menor do que w
x<p
MsgBox
Then
x menor do que k
x<w
MsgBox
Then
x menor do que z
x<k
MsgBox
ElseIf
19
20
x menor do que y
x<z
MsgBox
End If
25
>
26
</SCRIPT>
Neste exemplo, a mensagem x maior dos nmeros ser exibida, uma vez que todos os testes
falham (pois x o maior nmero). Ser executado o comando da linha 23, logo abaixo do Else.
Mas o que acontece, quando um dos ElseIf verdadeiro?
98
Os teste vo sendo feitos. Quando o teste de um dos ElseIf for verdadeiro, os comandos abaixo
do ElseIf verdadeiro, sero executados e o lao ser encerrado. Em resumo, quando um dos
ElseIf apresentar um teste verdadeiros, os comandos relacionados sero executados, e os demais
no sero avaliados, seguindo a execuo para o primeiro comando, aps o End If.
A Estrutura Select...Case
Quando precisamos realizar uma srie de testes, mais eficiente utilizarmos uma estrutura
Select...Case, do que utilizarmos uma srie de testes utilizando a estrutura If...Then...ElseIf.
O funcionamento da estrutura Select...Case bastante intuitivo. Considere o exemplo da
Listagem 2.22.
Listagem 2.22 Um exemplo simples da estrutura Select...Case.
1
<SCRIPT LANGUAGE=vbscript>
<!
Dim x
x=10
Select Case x
Case 2
7
8
MsgBox x vale 2 !
Case 4
9
10
MsgBox x vale 4 !
Case 6
11
12
MsgBox x vale 6 !
Case 8
13
14
MsgBox x vale 8 !
Case 10
15
16
MsgBox x vale 10 !
Case Else
17
18
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 sero 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
O uso da estrutura Select...Case torna o cdigo mais eficiente e de mais fcil leitura.
Estruturas de Repetio
Em determinadas situaes, precisamos repetir um ou mais comandos, um nmero especfico
de vezes, ou at que uma determinada condio torne-se verdadeira ou falsa. Para isso,
utilizamos as chamadas estruturas de repetio, ou laos. A partir de agora, estaremos
analisando as estruturas de repetio disponveis.
A Estrutura For...Next
Utilizamos o lao For...Next para repetir um segmento de cdigo, um nmero determinado de
vezes. Utilizamos esta estrutura, quando j sabemos o nmero de vezes que uma determinada
seo de cdigo deve ser repetida. Neste tipo de estrutura, normalmente, utilizamos uma
varivel 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 incio a varivel contador tem o valor definido para um determinado valor. Em cada
passagem do lao, a varivel contador incrementada pelo valor definido em incremento.
Caso no seja definido o incremento, ser utilizado o padro 1.
Considere o exemplo da Listagem 2.23.
Listagem 2.23 Um exemplo simples da estrutura For...Next.
1
<SCRIPT LANGUAGE=vbscript>
<!
Dim x
x=10
Soma=0
For i=1 to x
Soma = Soma +i
100
Next
10
11
>
12
</SCRIPT>
Neste exemplo, a varivel i inicia com o valor 1. Em cada passo, o valor de i acrescentado
varivel Soma. Como o incremento no foi definido, ser utilizado o padro que 1. Com
isso, ao final do lao For...Next, a varivel Soma ter armazenado o valor da soma dos dez
primeiros nmeros inteiros, conforme indicado pela Figura 2.26.
<SCRIPT LANGUAGE=vbscript>
<!
Dim x
x=10
Soma=0
Faz a soma dos cinco primeiros nmeros mpares maiores do que zero
Soma = Soma +i
Next
10
11
>
12
</SCRIPT>
101
A Estrutura Do...Loop
Esta estrutura pode ser utilizada para repetir um trecho de cdigo, enquanto uma determinada
condio for verdadeira, ou at que uma determinada condio 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 incio ou no final do lao. Com
isso temos quatro situaes distintas; vamos analisar cada uma delas a partir de agora.
Nesta estrutura, enquanto a condio for verdadeira, o cdigo dentro do lao executado.
Quando a condio tornar-se falsa, o primeiro comando aps o final do lao ser executado.
Neste caso, se a condio for falsa j na primeira vez, o lao no ser executado nenhuma vez.
IMPORTANTE
O cdigo dentro do lao deve ser capaz de alterar a condio para Falso, quando for necessrio,
pois caso contrrio a condio ser sempre verdadeira, e os comandos dentro do lao ficaro
em execuo infinitamente, ou at o programa travar. A criao de laos infinitos, devido a
erros de programao, uma causa comum de travamentos.
102
<SCRIPT LANGUAGE=vbscript>
<!
Dim x
x=10
Contador=1
Soma=0
10
Contador = Contador + 1
11
Loop
12
13
>
14
</SCRIPT>
103
final, e continuar sendo executado, enquanto a condio for verdadeira. O formato geral,
neste caso o seguinte:
Do
Comando1
Comando2
...
Comandon
Loop While condio
Nesta estrutura, enquanto a condio for verdadeira, o cdigo dentro do lao executado.
Quando a condio tornar-se falsa, o primeiro comando aps o final do lao ser executado.
Neste caso, se a condio for falsa j na primeira vez, o lao ser executado uma nica vez.
IMPORTANTE
O cdigo dentro do lao deve ser capaz de alterar a condio para Falso, quando for necessrio,
pois caso contrrio a condio ser sempre verdadeira, e os comandos dentro do lao ficaro
em execuo, infinitamente, ou at o programa travar. A criao de laos infinitos, devido a
erros de programao, uma causa comum de travamentos.
<SCRIPT LANGUAGE=vbscript>
<!
Dim x
x=10
Contador=1
Soma=0
Do
10
Contador = Contador + 1
11
12
13
>
14
</SCRIPT>
104
<SCRIPT LANGUAGE=vbscript>
<!
Dim x
x=10
Contador=11
Soma=0
Do
10
11
Contador = Contador + 1
12
13
14
>
15
</SCRIPT>
105
Nesta estrutura, enquanto a condio for falsa, o cdigo dentro do lao executado. Quando a
condio tornar-se verdadeira, o primeiro comando aps o final do lao ser executado. Neste
caso, se a condio for verdadeira, j na primeira vez, o lao no ser executado nenhuma vez.
IMPORTANTE
O cdigo dentro do lao deve ser capaz de tornar a condio Verdadeira, quando for necessrio,
pois caso contrrio a condio ser sempre Falsa, e os comandos dentro do lao ficaro em
execuo, infinitamente, ou at o programa travar. A criao de laos infinitos, devido a erros
de programao, uma causa comum de travamentos.
<SCRIPT LANGUAGE=vbscript>
<!
Dim x
x=10
Contador=1
106
Soma=0
10
Contador = Contador + 1
11
Loop
12
13
>
14
</SCRIPT>
107
Nesta estrutura, enquanto a condio for Falsa, o cdigo dentro do lao executado. Quando a
condio tornar-se Verdadeira, o primeiro comando aps o final do lao ser executado. Neste
caso, se a condio for Verdadeira, j na primeira vez, o lao ser executado uma nica vez.
IMPORTANTE
O cdigo dentro do lao deve ser capaz de tornar a condio Verdadeira, quando for necessrio,
pois caso contrrio a condio ser sempre Falsa, e os comandos dentro do lao ficaro em
execuo, infinitamente, ou at o programa travar. A criao de laos infinitos, devido a erros
de programao, uma causa comum de travamentos.
<SCRIPT LANGUAGE=vbscript>
<!
Dim x
x=10
Contador=1
Soma=0
Do
10
Contador = Contador + 1
11
12
13
>
14
</SCRIPT>
108
Vamos modificar um pouco o nosso exemplo. Considere o que mostrado na Listagem 2.30.
Listagem 2.30 Outro exemplo simples da estrutura de lao Do... Loop Until Condio.
1
<SCRIPT LANGUAGE=vbscript>
<!
Dim x
x=10
10
Contador=11
Soma=0
Do
10
11
Contador = Contador + 1
12
13
14
>
15
</SCRIPT>
109
Concluso
Neste captulo apresentamos diversos conceitos importantes, os quais sero utilizados ao
longo de todo livro.
Primeiro, definimos o que VBScript e fizemos uma reviso de HTML, principalmente das
tags para a criao de formulrios com HTML.
Depois, passamos a analisar os aspectos bsicos do VBScript. Vimos declarao de variveis,
o comando Option Explicit. Passamos a estudar questes como operadores aritmticos e
operadores lgicos de comparao. Tambm falamos sobre o escopo de variveis. Depois
passamos a tratar de estruturas de controle, onde vimos estruturas como If...Then,
If...Then...Else, Select....Case, etc.
Diversos exemplos foram apresentados com o objetivo de ilustrar os conceitos, facilitando a
compreenso.
No prximo captulo, estaremos analisando alguns aspectos mais avanados do VBScript,
tais como a utilizao de funes internas do VBScript, alm da criao de procedimentos.
110
Captulo 3
Funes, Procedimentos
e Eventos com VBScript
111
Neste captulo, veremos uma srie de aspectos que vo alm do bsico do VBScript. Iniciaremos
falando um pouco mais sobre tipos de dados e funes para converso de tipos. Este tpico de
grande importncia, principalmente quando criamos pginas que efetuam clculos.
Depois passaremos a analisar uma srie de funes internas do VBScript. So funes que
fazem parte do VBScript, como por exemplo a funo Date( ), que retorna a data do sistema.
Na seqncia, aprenderemos a criar nossas prprias funes e sub-rotinas. Aprenderemos as
diferenas entre uma sub-rotina e uma funo, e quando utilizar uma ou outra.
Em seguida, trataremos de um assunto muito importante: a utilizao de eventos e o modelo de
eventos do Internet Explorer. Tambm falaremos sobre a diferena entre os modelos de eventos
dos dois principais navegadores do mercado o Internet Explorer e o Netscape Navigator.
Ento, mos obra. hora de aprendermos um pouco mais sobre VBScript, para, a partir do
Captulo 4, comearmos a tratar de ASP 3.0, utilizando os conhecimentos apresentados nestes
captulos iniciais.
NOTA
Os exemplos apresentados nas listagens deste captulo podem ser criados utilizando-se um
redator de texto, como o Bloco de notas, e salvando os arquivos com a extenso .htm. Depois
s abrir os mesmos no Internet Explorer e testar. Os nmeros das linhas, que aparecem nas
listagens, no devem ser digitados. Os mesmos foram includos, apenas para facilitar o
acompanhamento das explicaes de cada exemplo.
112
A Funo IsArray
Um Array um tipo especial de varivel, a qual pode armazenar diversos valores em uma
nica varivel. De uma forma simples, um Array um conjunto. Cada valor armazenado no
Array um elemento do conjunto. Por exemplo, poderamos criar um Array para armazenar
os nomes dos meses do ano. Com isso teramos um Array de 12 elementos.
Cada elemento de um Array acessado atravs do nome da varivel Array e de um ndice. O
ndice inicia em zero, e no em um. Por isso, se tivermos um Array de dez elementos, teremos
o elemento 0, o elemento 1, o elemento 2, e assim por diante, at o elemento 9. O fato do
ndice comear com 0 influencia na hora de declarar um Array. Para declarar um Array
chamado produtos, com 20 elementos, utilizaramos a seguinte declarao:
Dim produtos(19)
O 19 significa que temos 20 elementos (sempre um a mais do que o nmero que aparece na
declarao), isto , do elemento 0, indicado por produtos(0), at o elemento 20, indicado por
produtos(19).
Na Listagem 3.1, temos um exemplo simples de utilizao de Array.
Listagem 3.1 Utilizando um Array para armazenar os dias da semana.
1
<HTML>
<HEAD>
</HEAD>
<BODY>
<SCRIPT LANGUAGE=vbscript>
<!
10
11
12
13
Dim Dias(6)
14
113
15
Dias(0)= Segunda-feira
16
Dias(1)= Tera-feira
17
Dias(2)= Quarta-feira
18
Dias(3)= Quinta-feira
19
Dias(4)= Sexta-feira
20
Dias(5)= Sbado
21
Dias(6)= Domingo
22
23
24
Do Array Dias.
25
For i=0 to 6
26
mensagem = mensagem & Dia: & i+1 & & Dias(i)& Chr(13)
27
Next
28
29
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
Utilizamos a funo IsArray, para determinar se uma varivel do tipo Variant (lembre que
todas as variveis do VBScript so do tipo Variant) est armazenando um Array.
Utilizamos a seguinte sintaxe:
IsArray(NomeDaVarivel)
A funo IsArray retorna verdadeiro se a varivel for um Array, e falso em caso contrrio.
Por exemplo, se adicionssemos, Listagem 3.1, o comando:
MsgBox IsArray(Dias)
A Funo VarType
Podemos utilizar a funo VarType para determinar o subtipo de uma varivel. Como todas as
variveis so do tipo Variant, o subtipo pode ser utilizado para determinar o tipo de dado
armazenado na varivel. Passamos, para a funo, o nome de uma varivel ou expresso. A
funo retorna um nmero inteiro que indica o subtipo da varivel.
A sintaxe da funo a seguinte:
VarType(NomeDaVarivel)
ou
VarType(expresso)
Descrio
115
Valor
Descrio
Inteiro
Inteiro longo
Monetrio
Data
Texto
Objeto de automao
10
Erro
11
Boleano
12
13
17
Byte
8192
Array
<HTML>
<HEAD>
</HEAD>
<BODY>
<SCRIPT LANGUAGE=vbscript>
<!
Dim x,y,z
116
10
Dim a, b
11
Dim c(20)
12
x=12
13
y=23.456
14
y=123456789
15
16
17
b=Date( )
18
19
20
21
22
23
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
Observe, principalmente, no tipo da varivel z, o qual retornou 0. Isto significa que a varivel
z est vazia, ou seja, no foi inicializada. Este resultado est coerente com a Tabela 3.1. Tambm
podemos salientar o retorno para a varivel b, o qual retornou 7, indicando que o valor
armazenado nesta varivel do tipo Data. Portanto, tambm est coerente com a Tabela 3.1,
uma vez que usamos a funo Date( ), para armazenar a data do sistema, na varivel b.
Finalmente observe o valor de retorno para a varivel c, o qual retornou 8192, indicando que
a varivel c um Array. Este resultado est coerente com a Tabela 3.1, e com a declarao da
linha 11 Dim c(20), a qual declarou a varivel c como sendo um Array.
Muitas so as aplicaes prticas para a funo VarType, dentre as quais podemos destacar a
validao dos dados digitados em um formulrio.
A Funo IsDate
A funo IsDate recebe uma varivel ou expresso como argumento, e determina se a varivel
ou expresso uma data vlida, ou pode ser convertida para uma data vlida. Caso o argumento
passado seja uma data vlida, a funo retorna Verdadeiro, caso contrrio, retorna Falso.
Podemos utilizar esta funo, por exemplo, para verificar se o usurio digitou uma data vlida,
em um campo de um formulrio.
A sintaxe da funo IsDate a seguinte:
IsDate(NomeDaVarivel)
ou
IsDate(expresso)
<HTML>
<HEAD>
<!
Sub verifica_onclick
If IsDate(Window.dataen.value) Then
8
9
10
11
118
12
window.dataen.focus
13
End If
14
End Sub
15
>
16
</SCRIPT>
17
</HEAD>
18
<BODY>
19
20
21
22
</P>
23
24
25
</BODY>
26
</HTML>
119
Aps digitar a data, o usurio clica no boto Verificar data, para testar se a data vlida.
Esta ao do usurio, gera o evento onclik deste boto. Observe que das linhas 6 a 13, definimos
um procedimento que responde ao evento onclick do boto verifica. O que define que este
procedimento atua em resposta ao evento onclick, do boto verifica, o nome do procedimento:
Sub verifica_onclick
Esta definio faz parte do modelo de objetos e eventos do Internet Explorer, a qual
analisaremos em maiores detalhes mais adiante, ainda neste captulo.
Dentro do procedimento verifica_onclick, utilizamos a funo IsDate, para verificar se a data
digitada pelo usurio valida. Se a data for vlida, simplesmente exibimos uma mensagem,
notificando que a data digitada vlida, conforme indicado na Figura 3.5.
120
A Funo IsEmpty
A funo IsEmpty recebe uma varivel ou expresso como argumento, e determina se, em
algum momento, foi atribudo algum valor para a varivel ou expresso. Caso tenha sido
atribudo algum valor, a funo retorna Verdadeiro, caso contrrio, retorna Falso. Podemos
utilizar esta funo, por exemplo, para verificar se um campo de digitao obrigatria, como
por exemplo o nome, no foi deixado em branco.
A sintaxe da funo IsEmpty a seguinte:
IsEmpty(NomeDaVarivel)
ou
IsEmpty(expresso)
<HTML>
<HEAD>
<SCRIPT LANGUAGE=vbscript>
<!
Dim a, b, c
Dim x
10
a=10
11
b=23
12
c=a+b
13
If IsEmpty(x) Then
14
15
16
>
17
</SCRIPT>
18
</HEAD>
121
19
<BODY>
20
21
<P>
22
23
</P>
24
</BODY>
25
</HTML>
Ao abrir este documento, no Internet Explorer, voc recebe a mensagem indicada na Figura 3.7.
A Funo IsNull
A funo IsNull recebe uma varivel ou expresso como argumento, e determina se, em
algum momento, foi atribudo o valor Null para a varivel ou expresso. Se tiver sido atribudo
o valor Null, a funo retorna Verdadeiro, caso contrrio, retorna Falso. Para atribuirmos Null
para uma varivel, utilizamos a seguinte sintaxe:
NomeDaVarivel = Null
IMPORTANTE
Uma varivel com valor Null, no a mesma coisa que uma varivel com valor zero, ou uma
varivel de texto com tamanho zero. Quando atribudo o valor Null para a varivel, a mesma
continua existindo na memria, porm sem nenhum valor definido.
ou
IsNull(expresso)
122
<HTML>
<HEAD>
<SCRIPT LANGUAGE=vbscript>
<!
Dim x
x = Null
10
If IsNull(x) Then
11
12
13
>
14
</SCRIPT>
15
</HEAD>
16
<BODY>
17
18
</BODY>
19
</HTML>
Ao abrir este documento, no Internet Explorer, voc recebe a mensagem indicada na Figura 3.8.
123
A Funo IsNumeric
A funo IsNumeric recebe uma varivel ou expresso como argumento, e determina se o
valor atribudo varivel ou expresso numrico, ou pode ser convertido para numrico.
Se o valor for numrico, ou puder ser convertido, a funo retorna Verdadeiro, caso contrrio,
retorna Falso.
A sintaxe da funo IsNumeric a seguinte:
IsNumeric(NomeDaVarivel)
ou
IsNumeric(expresso)
<HTML>
<HEAD>
<SCRIPT LANGUAGE=vbscript>
<!
Dim x,y,z
x=123
para numrico
10
y= Riachuelo - 80
124
11
z = Date()
12
13
mensagem = mensagem & Valor de y: & y & numrico? & IsNumeric(y)& Chr(13)
14
15
MsgBox mensagem
16
>
17
</SCRIPT>
18
</HEAD>
19
<BODY>
20
21
</BODY>
22
</HTML>
Ao abrir este documento, no Internet Explorer, voc recebe a mensagem indicada na Figura 3.9.
A Funo IsObject
A funo IsObject recebe uma varivel como argumento, e determina se o valor atribudo
varivel um objeto ActiveX. Se for, a funo retorna Verdadeiro, caso contrrio, retorna Falso.
Para exemplificarmos esta funo, faremos uso de uma pgina ASP, e iremos utilizar um dos
objetos do ASP. Falaremos mais sobre os objetos do ASP no Captulo 4.
125
ou
IsObject(expresso)
<HTML>
<HEAD>
</HEAD>
<BODY>
<%
If IsObject(tiponav) Then
10
11
12
13
End If
14
%>
15
</BODY>
16
</HTML>
IMPORTANTE
Como este um arquivo .asp, o mesmo no pode ser aberto localmente no Internet Explorer.
Toda pgina .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 endereo para a pgina .asp.
Ao abrir este documento, no Internet Explorer, obtemos o resultado indicado na Figura 3.10.
126
Funo Cbool
A funo Cbool converte uma varivel ou resultado de uma expresso para o subtipo Boolean.
Qualquer nmero, com exceo do zero, automaticamente convertido para Verdadeira. O
valor zero sempre convertido para Falso. O argumento desta funo no pode ser texto, caso
contrrio ser gerado um erro em tempo de execuo.
Observe esta linha de cdigo:
MsgBox Cbool(10>25) & Chr(13) & Cbool(3)
127
Funo CByte
A funo CByte converte uma varivel ou resultado de um expresso para o subtipo Byte. O
valor a ser convertido, deve estar na faixa aceitvel para o tipo byte, que vai de 0 a 255. Caso
o nmero esteja fora desta faixa, ser gerada uma mensagem de erro; e, se o argumento desta
funo for texto tambm ser gerada uma mensagem de erro, em tempo de execuo.
Observe esta linha de cdigo:
MsgBox CByte(10+34) & Chr(13) & CByte(35)
128
Funo CCur
A funo CCur converte uma varivel, ou resultado de um expresso, para o subtipo Currency.
O argumento desta funo no pode ser Texto, caso contrrio ser gerado um erro.
Observe esta linha de cdigo:
MsgBox CCur(250.335677+324.3333) & Chr(13) & CCur(1250.326582)
Figura 3.14: Erro gerado ao passar um texto como argumento para CCur.
129
Funo CDate
A funo CDate converte uma varivel ou resultado de um expresso para o subtipo Date. O
argumento desta funo deve estar em um formato que seja aceitvel para datas, caso contrrio
ser gerada uma mensagem de erro, em tempo de execuo.
Observe esta linha de cdigo:
MsgBox CDate(31/10/1980) & Chr(13) & CDate(23-01-2007)
Figura 3.16: Erro gerado ao passar um argumento com uma data invlida.
130
Funo CDbl
A funo CDbl converte uma varivel ou resultado de um expresso para o subtipo Double. O
argumento desta funo no pode ser do tipo texto, caso contrrio ser gerada uma mensagem
de erro, em tempo de execuo.
Observe esta linha de cdigo:
MsgBox CDbl(4.940651247E-17)
Figura 3.18: Erro gerado ao passar um argumento de tipo invlido para a funo Cdbl.
131
Funo CInt
A funo CInt converte uma varivel ou resultado de um expresso para o subtipo Integer. O
argumento desta funo no pode ser do tipo texto, caso contrrio ser gerada uma mensagem
de erro, em tempo de execuo.
Observe esta linha de cdigo:
MsgBox CInt(32.36) & Chr(13) & CInt(20.35+40.45)
Figura 3.20: Erro gerado ao passar um argumento de tipo invlido para a funo CInt.
132
Funo CLng
A funo CLng converte uma varivel ou resultado de um expresso para o subtipo Long. O
argumento desta funo no pode ser do tipo texto, caso contrrio ser gerada uma mensagem
de erro, em tempo de execuo. O argumento tambm no pode estar fora da faixa admitida
pelo subtipo Long, caso contrrio ser gerada uma mensagem de erro, em tempo de execuo.
Observe esta linha de cdigo:
MsgBox CLng(3462315)
Figura 3.22: Erro gerado ao passar um argumento de tipo invlido para a funo CLng.
133
Funo CSng
A funo CSng converte uma varivel ou resultado de um expresso para o subtipo Single. O
argumento desta funo no pode ser do tipo texto, caso contrrio ser gerada uma mensagem
de erro, em tempo de execuo. O argumento tambm no pode estar fora da faixa admitida
pelo subtipo Single, caso contrrio ser gerada uma mensagem de erro, em tempo de execuo.
Observe esta linha de cdigo:
MsgBox CSng(3.1418256927)
Figura 3.24: Erro gerado ao passar um argumento de tipo invlido para a funo CSng.
134
Funo CStr
A funo CStr converte uma varivel ou resultado de um expresso para o subtipo String.
Observe esta linha de cdigo:
MsgBox CStr(12345 & hectares de terra)
135
Com isso, terminamos a nossa apresentao sobre as principais funes para a converso de
tipos de dados. No prximo item, estaremos analisando mais algumas funes do VBScript,
para operaes com dados do tipo String e do tipo Data/Hora.
Funo Asc
A funo Asc retorna o valor numrico do cdigo ASCII, para a primeira letra de uma String.
Considere o exemplo:
Asc(Ainda chovia)
Este exemplo de uso da funo retorna o valor 65, o qual o cdigo ASCII para a letra A
maiscula. Caso fosse a letra a minscula, o cdigo retornado seria 97.
Funo Chr
A funo Chr(nmero), recebe um nmero como parmetro, e retorna o caractere ASCII,
correspondente. Considere o exemplo:
Chr(65)
136
NOTA
At agora, utilizamos a funo 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.
Funo Len
Esta funo determina o tamanho da String que foi passada como parmetro para a funo.
Considere o exemplo:
MsgBox Len(Este um exemplo de uso da funo Len!!)
Este exemplo de uso da funo, retorna 41, conforme indicado na Figura 3.27.
Funo LCase
Esta funo converte para minsculas a String que foi passada como parmetro para a funo.
Considere o exemplo:
MsgBox Lcase(ESTE UM EXEMPLO DE USO DA FUNO LCASE)
Este exemplo de uso da funo converte, o parmetro passado, para letras minsculas,
conforme indicado na Figura 3.28.
137
Funo UCase
Esta funo converte para maisculas a String que foi passada como parmetro para a funo.
Considere o exemplo:
MsgBox Ucase(este um exemplo do uso da funo ucase!!)
Este exemplo de uso da funo converte, o parmetro passado, para letras maisculas, conforme
indicado na Figura 3.29.
Funo Left
Esta funo retorna um nmero especificado de caracteres, a partir do incio (Left Esquerda)
de uma String. importante salientar que espaos em branco tambm devem ser considerados.
O formato geral da funo o seguinte:
Left(String, n)
Este exemplo de uso da funo, retorna as cinco primeiras letras da String passada, neste
caso, retornar Jlio.
Vamos alterar um pouco o nosso exemplo:
MsgBox Left(Jlio Cesar Fabris Battisti,7)
Funo Right
Esta funo retorna um nmero especificado de caracteres, a partir do final (Right Direita)
de uma String. importante salientar que espaos em branco tambm devem ser considerados.
138
Este exemplo de uso da funo, retorna as seis ltimas letras da String passada, neste caso,
retornar ttisti.
Vamos alterar um pouco o nosso exemplo:
MsgBox Right(Jlio Cesar Fabris Battisti,10)
Funo Mid
Esta funo retorna um nmero especificado de caracteres, a partir de uma posio especificada
dentro da String. importante salientar que espaos em branco tambm devem ser
considerados.
O formato geral da funo o seguinte:
Mid(String, posicao_inicio, n)
Este exemplo de uso da funo, retorna, a partir da posio 7, cinco caracteres, neste caso,
retornar Cesar.
Mid(SANTA MARIA,3,7)
139
Funo String
Esta funo retorna um determinado caractere, um nmero especificado de vezes.
O formato geral da funo o seguinte:
String(n, Caracter)
Funo Date
Retorna a data corrente do sistema. No precisamos passar parmetros para esta funo.
Considere o exemplo abaixo:
MsgBox Data do Sistema: & Date( )
140
Funo Time
Retorna a hora corrente do sistema. No precisamos passar parmetros para esta funo.
Considere o exemplo abaixo:
MsgBox Hora do Sistema: & Time( )
Funo Day
Recebe como parmetro uma data, e retorna um nmero entre 1 e 31, indicando o dia do ms.
O formato geral o seguinte:
Day(data)
141
Funo Month
Recebe como parmetro uma data, e retorna um nmero entre 1 e 12, indicando o ms do
ano. O formato geral o seguinte:
Month(data)
Funo Now
Retorna a hora e a data corrente do sistema. No precisamos passar parmetros para esta
funo. Considere o exemplo abaixo:
MsgBox Data e Hora do Sistema: & Now( )
142
Funo MonthName
Recebe como parmetro um nmero, indicativo do ms do ano (1 Janeiro, 2 Fevereiro, e assim
por diante), e um segundo parmetro que pode ser Verdadeiro ou Falso. Se o segundo parmetro
for Verdadeiro, o nome do ms ser exibido abreviadamente. O formato geral o seguinte:
MonthName(nmero_do_ms, abreviar)
Funo Hour
Recebe como parmetro uma hora, e retorna um nmero entre 0 e 23, indicando o hora do
dia. O formato geral o seguinte:
Hour(horrio)
143
A funo DateDiff
Esta funo pode ser utilizada para determinar o nmero de intervalos (em dias, trimestres,
semestres, anos, etc.), entre duas datas. A sintaxe desta funo o seguinte:
DateDiff(intervalo, data1, data2)
O parmetro intervalo uma String que diz que tipo de intervalo vamos calcular. Por exemplo,
este parmetro que define se queremos calcular o nmero de dias, ou o nmero de meses
entre duas datas. Na Tabela 3.2, temos os valores possveis para o parmetro intervalo.
Tabela 3.2 Valores para o parmetro intervalo.
Valor
Descrio
yyyy
Anos
Trimestres
Meses
Dias
Semanas
ww
144
Valor
Descrio
Horas
Minutos
Segundos
A Funo DateAdd
Esta funo pode ser utilizada para determinar uma data futura, com base em uma data
fornecida, o tipo de perodo a ser acrescentado (dias, meses, anos, etc.), e o nmero de perodos
a serem acrescentados. A sintaxe desta funo a seguinte:
145
O parmetro intervalo uma String que diz que tipo de intervalo vamos acrescentar. Por
exemplo, este parmetro que define se queremos acrescentar um nmero especificado de
dias, meses, anos, etc. Na Tabela 3.3, temos os valores possveis para o parmetro intervalo.
Tabela 3.3 Valores para o parmetro intervalo.
Valor
Descrio
yyyy
Anos
Trimestres
Meses
Dias
Semanas
ww
Horas
Minutos
Segundos
A ttulo de exemplo, vamos calcular a data em que tivemos um perodo de 1.000 meses, aps
o descobrimento do Brasil. Para isso, utilizaramos o seguinte comando:
MsgBox Mil meses aps o descobrimento foi em: & DateAdd(m,1000,22/04/1500)
146
Funo Year
Recebe como parmetro uma data, e retorna um nmero indicativo do ano. O formato geral
o seguinte:
Year(data)
Funo WeekDay
Recebe como parmetros uma data, e um parmetro opcional, que indica qual o primeiro dia da
semana. Se este parmetro for omitido, o primeiro dia da semana ser considerado domingo. O
valor para o primeiro dia da semana numrico: 1 domingo, 2 segunda-feira, e assim por diante.
WeekDay(data, prim_dia_semana.)
147
Funo WeekDayName
Recebe como parmetro um nmero, indicativo do dia da semana, e um segundo parmetro
que pode ser Verdadeiro ou Falso. Se o segundo parmetro for Verdadeiro, o nome do dia da
semana ser exibido abreviadamente. O formato geral o seguinte:
WeekDayName(nmero_do_dia, abreviar)
148
Descrio
Abs(n)
Atn(n)
Cos(n)
Exp(n)
Log(n)
Rnd(n)
Sgn(n)
149
Funo
Descrio
Sin(n)
Sqr(n)
Tan(n)
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 utilizao das funes matemticas do VBScript.
Tabela 3.5 Alguns exemplos de utilizao das funes matemticas.
Exemplo
Valor de retorno
Abs(-2350)
2350
Atn(2)
1,1071487177
Cos(0)
Exp(1)
2,71828182845905
Log(1000)
6,90775527898214
Rnd*10
Sgn(-235)
Sin(0)
Retorna 0
Sqr(400)
Retorna 20
Tan(0)
Retorna 0
Com isso, encerramos a apresentao das principais funes do VBScript. Para uma referncia
completa, voc pode consultar o site http://msdn.microsoft.com/scripting, ou os CDs da
assinatura do MSDN (Microsoft Developer Network). Junto com o Visual Studio 6.0 fornecida
uma cpia do MSDN.
150
NOTA
Um termo que pode aparecer procedimento. Um procedimento um grupo de instrues
que pode ser chamado pelo nome atribudo a ele. Neste contexto, funes e sub-rotinas so
tipos de procedimentos.
151
Uma sub-rotina pode, ou no, conter argumentos. Caso sejam necessrios argumentos, os
mesmos sero 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 funo que ela tem.
Com isso voc torna o entendimento do cdigo mais fcil para quem for utiliz-lo.
Neste caso, declaramos uma Sub-rotina chamada Calcula_imposto, a qual espera receber trs
parmetros: salario, desconto e extras. Os parmetros devem ser fornecidos nesta ordem,
para que a Sub-rotina funcione corretamente.
Uma vez criada a Sub-rotina, podemos cham-la, simplesmente digitando o nome, ou
utilizando a palavra Call, mais o nome da Sub-rotina. Nos exemplos abaixo, temos dois mtodos
de chamada da Sub-rotina Calcula_imposto:
Calcula_imposto(1500,23,125)
ou
Call Calcula_imposto(1500,23,125)
ou
152
Sub Nome_da_Sub-rotina( )
Comando1
Comando2
...
Comandon
End Sub
Por exemplo, poderamos 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.
Sub exibe_data_hora
mes_atual=Month(Date())
mes_nome=MonthName(mes_atual,False)
153
hora_atual = Hour(Time())
minuto_atual = Minute(Time())
segundo_atual = Second(Time())
10
11
12
13
MsgBox mensagem
14
End Sub
Agora, cada vez que for necessrio 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
Uma Funo pode, ou no, conter argumentos. Caso sejam necessrios argumentos, os mesmos
sero passados quando a Funo for chamada, e devem ser passados, na mesma ordem em
que foram definidos.
DICA
Quando voc criar Funo, procure utilizar nomes que descrevam os objetivos da Funo.
Com isso voc torna o entendimento do cdigo mais fcil para quem for utiliz-lo.
Neste caso, declaramos uma Funo chamada Converte_para_dolar, a qual espera receber
dois parmetros: um valor em real e a cotao do dlar.
Uma vez criada a Funo, devemos cham-la, em um comando de atribuio, isto , o valor retornado
pela funo, deve ser atribudo a uma varivel, ou exibido atravs de um comando como MsgBox.
No exemplo abaixo, estamos atribuindo o valor de retorno da funo, varivel valor_dolar.
valor_dolar = Converte_para_dolar (1500,1.81)
Tambm poderamos exibir o valor retornado pela funo, utilizando o comando MsgBox,
conforme indicado a seguir:
MsgBox Valor em dlar: & Converte_para_dolar (1500,1.81)
Observe que os parmetros so passados dentro dos parnteses, e na mesma ordem definida
quando da criao da funo.
Tambm poderamos declarar uma Funo, sem parmetros. Neste caso posso simplesmente
no utilizar os parnteses aps o nome da Funo, ou utilizar um par de parnteses, sem nada
dentro, conforme indicado a seguir:
Function Nome_da_Funo
Comando1
Comando2
...
Comandon
End Function
155
ou
Function Nome_da_Funo( )
Comando1
Comando2
...
Comandon
End Function
Por exemplo, vamos criar uma Funo que converte um valor de um ngulo de graus para
radianos. Depois a utilizaremos dentro de um lao 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 funo CRad, que converte
um valor em graus para radianos. Depois utilizamos um lao For para exibir, atravs de uma
caixa de mensagem, os valores em radianos, para os ngulos de 0 a 20 graus.
Listagem 3.9 A Funo CRad Converte valores de graus para radianos.
1
<HTML>
<HEAD>
</HEAD>
<BODY>
<SCRIPT LANGUAGE=vbscript>
<!
Function CRad(valor_graus)
10
CRad = (valor_graus*3.14)/180
11
End Function
12
For i=0 to 20
13
14
Next
15
MsgBox mensagem
156
16
>
17
</SCRIPT>
18
19
</BODY>
20
</HTML>
Observe que, dentro da Funo, atribumos varivel CRad um determinado valor. isso
que caracteriza uma Funo. Dentro de seu cdigo, devemos atribuir a uma varivel que
tenha o mesmo nome da Funo, um determinado valor. Este valor que ser o valor de
retorno da Funo.
Tambm cabe salientar o uso da funo FormatNumber, dentro do lao For. Essa funo
utilizada para formatar a maneira como um nmero exibido. Neste caso, utilizamos a funo
FormatNumber, para limitar o nmero de casas decimais, a cinco casas depois da vrgula.
Em cada passada do lao For...Next chamamos a funo CRad, para fazer a converso de
graus para radianos. O valor retornado pela funo CRad, passado para a funo
FormatNumber, para ser formatado com apenas cinco casas decimais.
OBSERVAO
A linha 13 est sendo exibida em duas linhas, por questes de espao. Quando for criar este
script, todo o contedo da linha 13, deve ser digitado em uma nica linha.
157
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 padro para o
nome da Sub-rotina : NomeDoObjeto_NomeDoEvento.
Na Listagem 3.10, temos um exemplo de utilizao do evento Onload, do objeto Window.
Este evento, conforme o prprio nome sugere, ocorre quando a pgina carregada. Observe
que o nome da Sub-rotina : Window_onload, o que conforme descrito, significa o evento
Onload do objeto Window.
Listagem 3.10 O evento Onload do objeto Window.
1
<HTML>
<HEAD>
<TITLE>Exemplo de eventos.</TITLE>
<!
Sub Window_onload
End Sub
>
158
10
</SCRIPT>
11
</HEAD>
12
<BODY>
13
14
</BODY>
15
</HTML>
Ao ser carregada esta pgina, o evento Onload do objeto Window disparado, e o cdigo da
Sub-rotina Window_onload executado. Com isso exibida uma caixa de mensagem, conforme
indicado na Figura 3.47.
Descrio
Onbeforeunload
Onblur
Onerror
Onfocus
Onhelp
159
Evento
Descrio
Onload
Onresize
Onscroll
Onunload
<HTML>
<HEAD>
<TITLE>Exemplo de eventos.</TITLE>
<!
Sub Window_onload
End Sub
Sub Window_onhelp
10
11
End Sub
12
Sub Window_onunload
13
14
15
>
16
</SCRIPT>
17
</HEAD>
18
<BODY>
19
20
</BODY>
21
</HTML>
160
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 padro de Ajuda no Windows.
161
Descrio
Onafterupdate
Onbeforeupdate
Onclick
Ondblclick
Ondragstart
Onhelp
OnKeyDown
OnKeyPress
OnKeyUp
Onmousedown
Onmousemove
Onmouseup
Onselectstart
162
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 disponveis para o objeto
Form, conforme descrito na Tabela 3.8.
Tabela 3.8 Os eventos do objeto Form.
Evento
Descrio
Onafterupdate
Onbeforeupdate
Onclick
Ondblclick
Ondragstart
Onhelp
OnKeyDown
OnKeyPress
OnKeyUp
Onmousedown
Onmousemove
Onmouseout
Onmouseover
163
Evento
Descrio
Onmouseup
Onselectstart
Onsubmit
Onreset
Agora vamos listar os principais eventos do objeto Element. O objeto Element, representa
qualquer controle ou elemento visvel que possa ser colocado em uma pgina. Podemos ter
mais do que um objeto Element em um documento, sendo que cada objeto identificado pelo
seu nome. No podemos ter dois elementos com o mesmo nome. Existem diversos eventos
disponveis para o objeto Element, conforme descrito na Tabela 3.9.
Tabela 3.9 Os eventos do objeto Element.
Evento
Descrio
Onafterupdate
Onbeforeupdate
Onblur
Onchange
Onclick
Ondblclick
Ondragstart
164
Evento
Descrio
Onfocus
Onhelp
OnKeyDown
OnKeyPress
OnKeyUp
Onmousedown
Onmousemove
Onmouseout
Onmouseover
Onmouseup
Onresize
Onselectstart
Onsubmit
Onselect
Apenas para exemplificar a utilizao de eventos, vamos criar uma pgina onde temos uma
caixa de seleo. Nesta caixa de seleo temos trs opes: Axcel Books, Developers Magazine
e Microsoft. Quando o usurio seleciona uma destas opes, o Internet Explorer,
automaticamente, carrega a pgina relacionada.
A Figura 3.50, mostra a pgina de exemplo.
Para tornar esta lista dinmica, utilizamos o modelo de eventos e cdigo VBScript, conforme
indicado na Listagem 3.12.
165
<HTML>
<HEAD>
<TITLE></TITLE>
<!
Sub navega_onchange
window.navigate window.navega.value
End Sub
>
10
</SCRIPT>
11
</HEAD>
12
<BODY>
13
14
<P>
15
16
<OPTION
166
17
<OPTION
18
<OPTION
value=http://www.developers.com.br>Developers Magazine</OPTION>
19
<OPTION
value=http://www.microsoft.com>Microsoft</OPTION>
20
SELECT>
21
</P>
22
</BODY>
23
</HTML>
Para tornar a lista dinmica, utilizamos o evento onchange, do controle Navega. O controle
navega uma caixa de combinao. Para maiores informaes sobre criao de formulrio
com HTML, consulte o Captulo 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 cdigo, tornamos a lista dinmica. A linha de cdigo foi
a seguinte:
window.navigate window.navega.value
A primeira parte utiliza o mtodo Navigate do objeto Window. Este mtodo utilizado para
carregar uma pgina no Internet Explorer. O mtodo Navigate espera receber um nico
parmetro, que o endereo da pgina que deve ser carregada. Este parmetro obtido a
partir da propriedade value do controle Navega. Cada opo da caixa de combinao possui
um valor associado. Por exemplo, quando o usurio seleciona Microsoft, a propriedade value
definida como http://www.microsoft.com, e este parmetro passado para o mtodo
window.navigate, fazendo com que seja carregada a pgina da Microsoft. Este o comportamento desejado para a nossa pgina, ou seja, quando uma opo selecionada, a pgina 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 no funcionar corretamente no Netscape.
Concluso
Neste captulo, abordamos diversos tpicos importantes do VBScript. Iniciamos pelas funes
para determinao do subtipo de uma varivel, bem como funes para converso de subtipos.
Depois passamos a tratar de outras funes, tais como as para tratamento de texto, data e hora
e funes matemticas. Estas funes so utilizadas na criao de aplicaes prticas e so
de grande ajuda.
167
168
Captulo 4
A Tecnologia ASP e o Modelo
de Objetos do ASP 3.0
169
Introduo
Vamos iniciar, a partir deste captulo, a nossa jornada rumo a aprendizagem da tecnologia de
Active Server Pages ASP 3.0. Passaremos ao aprendizado de uma srie de conceitos importantes,
os quais so utilizados na construo de pginas dinmicas e aplicativos para a Web.
Iniciaremos o captulo com uma apresentao detalhada sobre a tecnologia ASP, para que
possam ser solucionadas quaisquer dvidas, que por ventura o leitor ainda tenha a respeito
do que exatamente esta tecnologia e do que necessrio para utiliz-la.
Em seguida, passaremos ao estudo do Modelo de Objetos do ASP 3.0, apresentando uma
viso geral sobre o Modelo de Objetos e a funo de cada um dos objetos existentes.
Feitas as devidas apresentaes, passaremos a estudar alguns objetos do ASP 3.0, sempre
ilustrando os conceitos apresentados com exemplos prticos e de fcil assimilao. Nos
exemplos procuro ilustrar a forma de utilizao de cada um dos objetos, de modo que os
mesmos possam ser facilmente, adaptados para uso nas aplicaes que se esteja desenvolvendo.
NOTA
Os objetos, que no forem tratados neste captulo, sero vistos nos demais captulos deste livro.
Finalizaremos o captulo com alguns exemplos mais elaborados, onde procuro apresentar
diversas utilizaes prticas para os objetos da tecnologia ASP 3.0.
170
o servidor identifica a pgina como sendo uma pgina ASP, devido a extenso .asp.
Uma vez identificada, a pgina ASP processada pelo servidor Web (que pode ser o IIS ou o
Personal Web Server). O servidor, aps identificar a pgina ASP, passa a mesma para uma DLL
chamada ASP.DLL. O cdigo contido nesta DLL analisa toda a pgina ASP, linha por linha, em
busca de linhas de cdigo ASP, o qual executado. Aps executado todo o cdigo existente na
pgina, o resultado, no formato de uma pgina 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
Cliente
1) www.abc.com.br/page2.asp
171
2. O servidor identifica que o pedido para uma pgina que contm cdigo ASP, pois a
extenso da pgina .asp. No exemplo da Figura 4.1 um dos clientes solicita a pgina
page1.asp e o outro a pgina page2.asp.
3. Uma vez identificada como uma pgina ASP, o servidor Web passa o processamento da
pgina para o interpretador ASP (que no caso a DLL ASP.DLL, normalmente instalada
no diretrio winnt\System32\inetsrv, o qual o diretrio de instalao do IIS).
4. O interpretador passa linha por linha da pgina ASP. Sempre que for encontrado cdigo
ASP, o mesmo interpretado e executado.
5. Aps todo o cdigo ter sido executado, o resultado do processamento enviado para o
navegador do cliente, no formato de uma pgina HTML padro. importante detalhar
bastante este ponto, pois existem muitas confuses e interpretaes errneas a respeito
do mesmo. Vamos fazer isso no prximo item.
Com isso podemos responder a pergunta do item: como e onde uma pgina ASP processada?
Uma pgina ASP processada no servidor Web (IIS ou Personal Web Server) pelo interpretador
ASP (ASP.DLL). O interpretador percorre a pgina, linha por linha, interpretando e executando
todo o cdigo existente na pgina.
Agora vamos detalhar um pouco mais sobre o que a pgina ASP retorna para o navegador
do cliente.
172
<HTML>
<HEAD>
</HEAD>
<BODY>
<%
10
11
12
%>
13
</BODY>
14
</HTML>
Ao acessar esta pgina ASP, o servidor Web interpreta e executa todo o cdigo existente. No
nosso exemplo, o cdigo ASP inicia na linha 7 e termina na linha 12. Relembrando o que
vimos no Captulo 1: toda seo de cdigo ASP inicia com <% e termina com %>.
O resultado, gerado pela pgina ASP, cdigo HTML padro, o qual enviado para o navegador
do cliente. A Figura 4.2, mostra a pgina list4-1.asp sendo acessada no Internet Explorer.
173
Esta linha de cdigo HTML resultado da execuo da seguinte linha de cdigo ASP:
Response.Write Toda pgina ASP interpretada <BR>
174
Veja que a possibilidade de alternar trechos de cdigo HTML, com trechos de cdigo ASP,
dentro de uma mesma pgina ASP, nos d uma grande flexibilidade. As partes da pgina que
no apresentam natureza dinmica, podem ser criadas simplesmente utilizando cdigo HTML.
Outras partes que necessitam ser dinamicamente criadas, quer seja atravs da realizao de
clculos ou atravs do acesso a campos de uma tabela de um banco de dados, podem ser
criadas utilizando cdigo ASP. Alm disso podemos ter vrias sees de cdigo ASP dentro
de uma mesma pgina. Para iniciar uma seo utilizo <% e para finalizar a seo utilizo %>.
Posso colocar cdigo HTML entre as diversas sees de cdigo ASP. Com isso vou criando a
pgina utilizando HTML nos pontos estticos e ASP nos pontos que precisam ser dinmicos.
175
corretamente, a mesma precisa estar armazenada em um servidor como o IIS, onde existe o
interpretador ASP. A pgina deve ser acessada utilizando-se o protocolo HTTP, isto , ou voc
digita o endereo da pgina, como por exemplo http://www.abc.com.br/page1.asp, ou clica
em um link que aponta para a pgina ASP gravada no servidor Web.
Uma das novidades da tecnologia ASP 3.0 que podemos ter pginas com a extenso .asp,
sem que as mesmas contenham cdigo ASP. Por exemplo, posso ter uma pgina .asp que
contm apenas cdigo HTML. Quando esta pgina solicitada, o servidor Web passa a
solicitao para o interpretador ASP (ASP.DLL). A primeira coisa que o interpretador faz
verificar se existe algum cdigo a ser interpretado e executado. Caso no exista cdigo ASP, a
pgina enviada de volta para o IIS, o qual retorna a pgina para o navegador do cliente. Com
este procedimento o interpretador no precisa passar a pgina, linha por linha. Isto torna a
execuo das pginas bem mais rpida.
Caso a pgina possua cdigo ASP, o cdigo interpretado e executado, e o resultado do
processamento retornado para o IIS. Ser inserido o cdigo HTML, retornado pelo processador
ASP, nos pontos especficos da pgina, e o IIS enviar, depois, a pgina resultante no formato
HTML para o navegador do cliente. Com isso posso criar todas as pginas com a extenso
.asp, mesmo aquelas que no iro conter cdigo ASP. Caso sejam necessrias mudanas nas
pginas, posso inserir o cdigo ASP, sem que precise alterar os links do site, pois as extenses
das pginas no precisaro ser alteradas (isso aconteceria somente se tivssemos criado as
pginas como .htm e depois trocado a extenso para .asp quando fosse necessrio inserir
cdigo ASP nas pginas).
176
Mtodo
Parmetro
177
Uma propriedade de um objeto define uma caracterstica ou atributo do mesmo. Por exemplo,
temos a propriedade ScriptTimeout, a qual define o tempo mximo em que o cdigo ASP
pode ficar sendo executado em uma pgina, antes que o servidor cancele a execuo e retorne
uma mensagem de erro. O valor padro de 90 segundos. O exemplo seguinte define esta
propriedade para 5 minutos (300 segundos):
Server.ScriptTimeout = 300
Uma coleo contm um ou mais valores, os quais podem ser acessados pelo cdigo ASP. Por
exemplo, a coleo Form, do objeto Request, contm os nomes e valores de todos os controles de
um formulrio cujos dados foram passados para processamento da pgina ASP. Lembre que isto
feito atravs do atributo Action da tag FORM, alm disso o atributo Method deve ser definido
em POST. Para maiores detalhes sobre os atributos Action e Method, consulte o Captulo 2.
178
seja executada. Podemos utilizar este evento para iniciar variveis ou rodar qualquer outro
cdigo que seja necessrio. Voc j deve ter entrado em um site onde necessrio preencher
um formulrio de cadastramento. Da prxima 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 pgina utiliza o evento Session.OnStart
para ler informaes que foram gravadas no seu computador, normalmente na forma de um
Cookie e determinar quem est acessando a pgina.
Na Figura 4.5, temos uma viso geral de todos os Objetos, seus mtodos, colees, eventos e
propriedades. No restante deste captulo, estaremos aprendendo a utilizar os objetos Response
e Request. Os demais objetos sero vistos ao longo do livro.
O Objeto Request
Com o objeto Request podemos ter acesso a diversas informaes fornecidas pelo cliente ao
acessar uma pgina ASP, ou ao preencher dados em um formulrio e envi-los. Podemos ter
acesso a informaes a respeito do navegador que o cliente est utilizando, quais os Cookies
gravados no computador do usurio, qual Certificado Digital o usurio est utilizando e muitas
outras informaes importantes.
A partir de agora passaremos a estudar os principais mtodos, colees e propriedades do
objeto Request. Analisaremos os diversos aspectos deste objeto, atravs da utilizao de alguns
exemplos prticos.
179
<HTML>
<HEAD>
</HEAD>
<BODY>
10
11
12
13
<P>Carto Crdito:
14
15
16
17
<P>
18
19
20
</P>
21
</FORM>
22
</BODY>
23
</HTML>
180
Alm disso o mtodo post permite que mais informaes sejam enviadas, do que se
estivssemos utilizando o mtodo get. Falaremos um pouco mais sobre as diferenas entre os
mtodos post e get, no prximo item.
Ao clicar no boto Enviar, os dados digitados no formulrio so passados para a pgina list42.asp. Precisamos de uma maneira de acessar estes dados. A coleo que nos permite ter
acesso a estes dados a coleo Form do objeto Request.
181
IMPORTANTE
A coleo Form somente utilizada quando o atributo method do formulrio definido como
post. Quando o mtodo for definido como get, conforme veremos mais adiante, devemos utilizar
a coleo QueryString, ao invs da coleo Form.
Na Listagem 4.3, temos um exemplo para a pgina list4-2.asp, a qual simplesmente informa
ao usurio quais os valores que ele digitou em cada um dos campos. Para isso, utilizamos a
coleo Form do objeto Request.
Listagem 4.3 A pgina ASP list4-2.asp.
1
<HTML>
<HEAD>
</HEAD>
<BODY>
<P>Nome:
<%
=Request.Form(nome)
10
%>
11
</P>
12
<p>Rua:
13
<%
14
=Request.Form(rua)
15
%>
16
</p>
17
<p>Cidade:
182
18
<%
19
=Request.Form(cidade)
20
%>
21
</p>
22
<p>E-mail:
23
<%
24
=Request.Form(email)
25
%>
26
</p>
27
<p>Carto de Crdito:
28
<%
29
=Request.Form(cartao)
30
%>
31
</p>
32
33
</BODY>
34
</HTML>
Observe que vamos alternando trechos de cdigo HTML com trechos de cdigo ASP. Vamos
analisar o seguinte trecho de cdigo:
7
<P>Nome:
<%
=Request.Form(nome)
10
%>
11
</P>
Na linha 7, aberta uma tag de pargrafo <P>. Dentro deste pargrafo colocado o texto
Nome:. Na linha 8 aberto um trecho de cdigo ASP, e utilizo a coleo 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 formulrio. Este nome colocado
logo aps Nome:. Finalmente na linha 11 fechado o pargrafo. O resultado deste trecho de
cdigo que retorna para o usurio o seguinte (supondo que no campo nome tenha sido
digitado Jlio Cesar Fabris Battisti):
<P>Nome: Jlio Cesar Fabris Battisti</P>
Na Figura 4.7, temos o retorno da pgina list4-2.asp, para os dados de exemplo indicados na
Figura 4.6.
183
184
Comando2
...
Comandon
Next
Com a estrutura For Each...Next, conseguimos percorrer todos os membros de uma coleo.
Considere o seguinte exemplo:
<%
For Each Item in Request.Form
=Item
Next
%>
Neste caso estaremos listando todos os nomes dos campos do formulrio, atravs da utilizao
da estrutura For Each...Next.
Agora vamos utilizar a estrutura For Each...Next para rescrever a nossa pgina ASP de uma
maneira mais genrica, conforme indicado na Listagem 4.4.
Listagem 4.4 A pgina ASP list4-2-2.asp.
1
<HTML>
<HEAD>
</HEAD>
<BODY>
<%
<P>
10
<%=Item%>
11
12
<%=Request.Form(Item)%>
13
</P>
14
15
16
</BODY>
17
</HTML>
185
Esta pgina produz o mesmo resultado que a pgina ASP da Listagem 4.3, porm vejam como
o cdigo bem menor. Alm disso este cdigo funciona sempre, mesmo que o nome de
algum dos campos do formulrio seja alterado. Para testar este cdigo basta salvar esta listagem
com o nome de list4-2-2.asp e alterar a pgina list4-2.htm. No atributo action da tag <FORM>
troque action=list4-2.asp por action=list4-2-2.asp.
Tambm interessante notar que fomos alternando trechos de cdigo HTML com cdigo
ASP. Por exemplo, as linhas 7 e 8 so cdigo ASP, onde iniciado o lao For Each...Next. Na
linha 9 abrimos uma tag de pargrafo. Na linha 10 exibido o nome do campo, atravs da
utilizao 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
formulrio, cujo atributo nome foi exibido pela linha 10. A linha 13 fecha a tag de pargrafo
e, finalmente, a linha 14 encerra o lao For Each...Next. Observe que o lao foi aberto em uma
seo de cdigo e fechado em outra, o que nos d uma grande flexibilidade.
<HTML>
<HEAD>
</HEAD>
<BODY>
10
11
12
186
13
<P>Carto Crdito:
14
15
16
17
<P>
18
19
20
</P>
21
</FORM>
22
</BODY>
23
</HTML>
187
Para criar o arquivo formget.asp, basta pegar o cdigo da Listagem 4.4 e trocar Request.Form
por Request.QueryString. Com isso teremos o cdigo da Listagem 4.6.
Listagem 4.6 A pgina ASP formget.asp.
1
<HTML>
<HEAD>
</HEAD>
<BODY>
<%
<P>
10
<%=Item%>
11
12
<%=Request.QueryString(Item)%>
13
</P>
14
15
16
</BODY>
17
</HTML>
Esta pgina fornece o retorno indicado na Figura 4.9. Observe que o resultado praticamente
o mesmo da Figura 4.7, porm com a diferena de que os dados foram passados atravs do
endereo de chamada da pgina.
No campo endereo temos o seguinte:
http://servidor/Capitulo4/formget.asp?nome=J%FAlio+Cesar+Fabris+Battisti&rua=Sinimbu++456&cidade=Boqueir%E3o+do+Le%E3o&email=batisti@hotmail.com&cartao=Outros&enviar=Submit
Observe que os dados foram passados dentro da prpria URL. Caracteres especiais, como o u
com acento agudo, so substitudos. Observe que o nome Jlio foi substitudo por J%FAlio,
ou seja, o foi substitudo por %FA. Tambm podemos observar que todo espao em branco
foi substitudo pelo sinal +, e assim por diante. Neste caso a coleo QueryString sabe tratar
estes caracteres especiais e exibi-los corretamente, conforme indicado pela Figura 4.9.
O mtodo get possui limitaes quanto a quantidade de informaes que o mesmo pode
passar para o servidor. Esta limitao est em torno de 1.000 caracteres, conforme definio
188
do protocolo HTTP. Alm disso, toda a informao passada ser visvel na URL, o que em
muitas situaes no desejado.
189
<HTML>
<HEAD>
</HEAD>
<BODY>
10
11
12
13
<P>Carto Crdito:
14
15
16
17
<P>
18
19
20
</P>
21
<P>
22
23
24
25
26
27
</P>
21
</FORM>
22
</BODY>
23
</HTML>
190
191
produziria uma sada com o valor dos Check Box selecionados. Caso mais do que um Check Box
tenha sido selecionado, os valores sero exibidos separados por vrgula, conforme indicado abaixo:
SP, RS, PR
Com isso dizemos que o elemento estado, da coleo QueryString, possui valores mltiplos.
Existem situaes em que pode ser necessrio acessar um destes valores individualmente.
Isto possvel, 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
IMPORTANTE
No caso de um grupo de Check Box, os ndices no so associados ordem com que os Check
Box so apresentados no formulrio, mas sim em relao a quantos so 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 formulrio. O ndice 2 ligado ao prximo
Check Box do grupo que aparecer selecionado, e assim por diante.
Caso quisssemos acessar somente o valor do primeiro Check Box selecionado, utilizaramos
o seguinte cdigo:
<% =Request.QueryString(estado)(1) %>
Observe a utilizao do ndice (1) aps o nome do campo. Com isso estou pedindo para que
seja retornado apenas o valor do primeiro Check Box selecionado. Este cdigo retornaria
somente SP, no nosso exemplo.
NOTA
Estas mesmas consideraes so vlidas para elementos do tipo Caixa de seleo e Caixa de
combinao.
Descrio
ALL_HTTP
ALL_RAW
193
Nome
Descrio
AUTH_TYPE
AUTH_USER
CERT_COOKIE
CERT_FLAGS
PATH_INFO
REMOTE_ADDR
REMOTE_HOST
Na Listagem 4.8, utilizamos o lao For Each...Next, para exibir todos os valores contidos na
coleo ServerVariables.
Listagem 4.8 Exibindo os valores contidos na coleo ServerVariables variables.asp.
1
<HTML>
<HEAD>
</HEAD>
194
<BODY>
<TABLE border=2>
<TR>
<TD>
10
11
=</TD>
12
<TD>
13
14
</TD></TR>
15
<%Next%>
16
</BODY>
17
</HTML>
Com este cdigo simples conseguimos exibir todo o contedo da coleo ServerVariables.
Observe, na Listagem 4.8, que utilizamos algumas tags HTML para a construo de tabelas.
Estas tags foram utilizadas apenas para melhorar a aparncia do documento resultante. Para
cada varivel exibimos o nome da varivel (linha 10) e o valor contido na varivel (linha 13).
Na linha 14, utilizamos  . Este um caractere especial para o HTML e utilizado para
que o navegador do cliente exiba as clulas da tabela, mesmo quando estas estiverem vazias.
O Internet Explorer no exibe os contornos de uma clula, caso no exista nenhum contedo
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
So quatro nmeros separados por um ponto. O valor mximo de cada nmero 249, ou seja,
no posso ter um endereo IP 10.300.210.143. O 300 um valor invlido em termos de nmero
IP. Parte do nmero IP identifica a rede a qual pertence o computador e outra parte identifica
o nmero do computador dentro da rede. Esta fora do escopo deste livro uma discusso mais
ampla sobre o protocolo TCP/IP, mas existem excelentes fontes de referncia na Internet.
Voc pode comear pelos sites da CISCO (www.cisco.com) e 3COM (www.3com.com).
Vamos supor que somente devem acessar a nossa pgina computadores cujo endereo IP
comea com 10.204.123 (que exatamente o nmero da rede que utilizo em minha casa),
sendo que o quarto nmero no importa. Neste caso estamos admitindo que os trs primeiros
nmeros identificam a rede (10.204.123) e o ltimo nmero identifica o computador dentro
da rede. Neste caso, quero construir uma pgina que somente permita acesso a computadores
da rede 10.204.123. Vamos ver como se faz isto?
O algoritmo que utilizaremos o descrito a seguir.
Utilizaremos a varivel REMOTE_ADDR para capturar o nmero IP do computador que est
tentando acessar a nossa pgina.
Depois utilizaremos funes do VBScript para capturar apenas a parte do endereo da rede
(trs primeiros nmeros), e comparo este valor com o valor 10.204.123.
Caso o valor esteja OK, o acesso ao restante da pgina liberado, caso contrrio o usurio ser
direcionado para um outra pgina, a qual contm uma mensagem dizendo que o mesmo no
tem permisso para acessar a pgina desejada.
A cdigo que implementa o nosso algoritmo mostrado na Listagem 4.9.
Listagem 4.9 Um exemplo prtico de uso da coleo ServerVariables filtro.asp.
1
<HTML>
196
<HEAD>
</HEAD>
<BODY>
<%
Dim ip_cliente
Dim num_rede
10
ip_cliente=Request.ServerVariables(REMOTE_ADDR)
11
12
13
14
num_rede=Left(ip_cliente,10)
15
16
17
If num_rede=10.204.123" Then
18
19
20
21
<%=num_rede%>
22
23
<% Else
24
Response.Redirect(erro.htm)
25
End If
26
%>
27
</BODY>
28
</HTML>
Ao acessar esta pgina de um computador que faz parte da rede 10.204.123, receberemos a
pgina indicada na Figura 4.13.
197
198
NOTA
Na linha 24 utilizamos o mtodo Redirect do objeto Response (Response.Redirect) para
redirecionar o usurio para uma outra pgina (erro.htm), caso o mesmo no fizesse parte da
rede 10.204.123. Falaremos mais sobre o objetos Response e seus mtodos ainda neste captulo.
<HTML>
<HEAD>
</HEAD>
<BODY>
<%
10
Response.Cookies(TESTE_COOKIE)(Data)= Date()
11
%>
12
</BODY>
13
</HTML>
A pgina da Listagem 4.10 cria um Cookie chamado TESTE_COOKIE. Dentro deste Cookie
so gravados trs campos ou chaves, conforme indicado na Tabela 4.2.
199
Valor
Nome
Jlio Battisti
Cidade
Boqueiro do Leo
Data
3/7/1999
<HTML>
<HEAD>
</HEAD>
200
<BODY>
</FONT></B>
<%
10
11
12
13
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 mtodo Write do objeto Response.
Na Figura 4.16, temos o resultado do acesso pgina da Listagem 4.11.
201
Tambm 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
<HTML>
<HEAD>
</HEAD>
<BODY>
<%
10
11
12
%>
13
</BODY>
14
</HTML>
202
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 vlido; o campo ValidUntil,
determina a data de expirao do Certificado; e assim por diante. A cdigo da linha
abaixo ir exibir a data de expirao do Certificado do cliente:
Response.Write Seu Certificado expira em:
Response.Write Request.ClientCertificate(ValidUntil)
<HTML>
<HEAD>
</HEAD>
<BODY>
203
<%
Response.Write Request.TotalBytes
%>
10
11
<%
12
13
<P>
14
<%=Item%>
15
16
<%=Request.Form(Item)%>
17
</P>
18
19
20
</BODY>
21
</HTML>
O cdigo da linha 8 informa quantos bytes foram enviados pelo navegador do cliente.
O exemplo abaixo coloca os 100 primeiros bytes enviados pelo cliente, na varivel 100_bytes:
100_bytes = Request.BinaryRead(100)
<HTML>
<HEAD>
</HEAD>
204
<BODY>
<%
Dim vinte_bytes
10
vinte_bytes=Request.BinaryRead(20)
11
12
Nome=Request.Form(Nome)
13
%>
14
</BODY>
15
</HTML>
Ao tentarmos acessar esta pgina, receberemos a mensagem de erro indicada na Figura 4.18.
205
O Objeto Response
Utilizamos o objeto Response para retornar o resultado do processamento de uma pgina ASP,
para o navegador do cliente. Conforme descrito anteriormente, o resultado retornado cdigo
HTML puro. Podemos utilizar o objeto Response para montar uma pgina de retorno, por
exemplo, com os resultados de uma pesquisa em um banco de dados. Nos exemplos do final
deste captulo, teremos uma introduo ao acesso bancos de dados, atravs de pginas ASP.
Tambm podemos utilizar o objeto Response para gravar Cookies no computador do cliente.
A partir de agora passaremos a estudar os principais mtodos, colees e propriedades do
objeto Response. Analisaremos os diversos aspectos do objeto atravs da utilizao de alguns
exemplos prticos.
206
<HTML>
<HEAD>
</HEAD>
<BODY>
<B>
10
11
</B>
12
</P>
13
<%
14
15
16
Response.Cookies(Cliente)(Endereco)=Boqueiro do Leo
17
Response.Cookies(Cliente)(Email)=juliobattisti@hotmail.com
18
Response.Cookies(Cliente)(Cartao)=ABC
19
Response.Cookies(Cliente)(Preferencial)=Sim
20
%>
21
<P><FONT COLOR=BLUE>
207
22
23
24
</FONT></P>
25
<%
26
27
28
29
30
31
%>
32
</BODY>
33
</HTML>
208
Assim, estou dizendo que o Cookie somente deve ser enviado quando o usurio acessar pginas
que esto dentro do seguinte endereo: 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 pgina do site, utilize o seguinte comando:
Response.Cookies(Cliente).path=/
Neste exemplo, estou definindo a data de expirao do Cookie para 31 de Dezembro de 2000.
Se no for definida uma data de expirao para o Cookie, o mesmo ser eliminado quando o
usurio fechar o navegador.
IMPORTANTE
Em verses anteriores do ASP, o cdigo para criar Cookies deveria ser colocado no cabealho
do documento, antes da tag <BODY>. Isso era necessrio, porque o Cookie deveria ser criado,
antes que qualquer contedo fosse enviado para o navegador do cliente. Isso porque, nas
verses anteriores do ASP, o contedo ia sendo enviado para o cliente medida em que a
pgina era processada. No ASP 3.0, o contedo somente enviado quando toda a pgina foi
processada com sucesso, ou quando for utilizado o comando Response.Flush. Este
comportamento pode ser controlado atravs da habilitao ou no de buffer para a pgina,
conforme veremos mais adiante neste captulo.
<HTML>
<HEAD>
</HEAD>
<BODY>
http://servidor/Capitulo4.
http://servidor/Capitulo4, ou um dos
209
10
11
12
</B></P>
13
<%
14
15
16
Response.Cookies(Cliente2).domain=http://servidor
17
Response.Cookies(Cliente2).path=/Capitulo4"
18
Response.Cookies(Cliente2).expires=#31/12/2000#
19
20
Response.Cookies(Cliente2)(Endereco)=Boqueiro do Leo
21
Response.Cookies(Cliente2)(Email)=juliobattisti@hotmail.com
22
Response.Cookies(Cliente2)(Cartao)=ABC
23
Response.Cookies(Cliente2)(Preferencial)=Sim
24
%>
25
<P><FONT COLOR=BLUE>
26
27
28
</FONT></P>
29
<%
30
31
32
33
34
%>
35
</BODY>
36
</HTML>
210
211
<% Response.Buffer=False%>
<HTML>
<HEAD>
</HEAD>
<BODY>
</BODY>
</HTML>
Observe que devemos utilizar as expresses em ingls: True, para Verdadeiro, e False, para
Falso. Tambm no devemos esquecer que, por padro, no ASP 3.0, esta propriedade definida
como True. Em situaes onde devemos efetuar algum processamento, tais como clculos ou
pesquisas em banco de dados, antes de enviar a pgina para o navegador do cliente
interessante mantermos a propriedade Buffer em seu valor padro True. Em situaes onde
no sejam necessrios processamentos deste tipo, podemos desabilitar o Buffer definindo
esta propriedade como False.
212
com rapidez e eficincia aos navegadores. Na prxima vez que algum for acessar esta pgina,
e a mesma estiver no Cache, no existe necessidade de carregar novamente a pgina da Internet.
A cpia que est no Cache enviada para o navegador do cliente. O uso de Cache no servidor
Proxy agiliza o acesso, principalmente, s pginas mais utilizadas.
Por padro, o ASP instrui servidores Proxy a no armazenarem a prpria pgina ASP em cache
(embora imagens, mapas de imagens, miniaplicativos e outros itens aos quais a pgina faz
referncia sejam armazenados em Cache). Voc pode permitir o armazenamento de determinadas
pginas em Cache usando a propriedade Response.CacheControl. Com o uso da propriedade
CacheControl podemos definir se uma pgina ASP deve ou no ser mantida no Cache do servidor
Proxy. Este controle nos oferecido devido natureza dinmica das pginas ASP, as quais
mudam constantemente. Caso uma pgina tenha sido colocada no Cache do servidor Proxy, o
usurio corre o risco de estar recebendo uma verso desatualizada da pgina.
Esta propriedade deve ser definida antes que qualquer contedo tenha sido enviado para o
navegador do cliente. O cdigo da Listagem 4.18 mostra onde o local mais indicado para
definirmos esta propriedade.
Listagem 4.18 Definindo a propriedade CacheControl do objeto Response.
1
<% Response.CacheControl=Public%>
<HTML>
<HEAD>
</HEAD>
<BODY>
</BODY>
</HTML>
213
basta observar as diferenas entre uma pgina desenvolvida para o idioma Portugus e outra
para ser exibida no idioma Chins ou Japons.
Esta propriedade deve ser definida antes que qualquer contedo tenha sido enviado para o
navegador do cliente. O cdigo da Listagem 4.19 mostra onde o local mais indicado para
definirmos esta propriedade.
Listagem 4.19 Definindo a propriedade Charset do objeto Response.
1
<% Response.Charset(ISO-LATIN-1)%>
<HTML>
<HEAD>
</HEAD>
<BODY>
</BODY>
</HTML>
IMPORTANTE
Todas as propriedades que alteram alguma caracterstica do cabealho do documento devem
ser definidas antes que qualquer contedo visvel 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 comea o contedo que compor a pgina a ser enviada.
214
<HTML>
<HEAD>
</HEAD>
<BODY>
</BODY>
</HTML>
NOTA
Se existirem vrias chamadas para Response.Expires em uma nica pgina, o servidor usar
o perodo de tempo mais curto.
Esta propriedade deve ser definida antes que qualquer contedo tenha sido enviado para o
navegador do cliente. O cdigo da Listagem 4.21 mostra onde o local mais indicado para
definirmos esta propriedade.
215
<HTML>
<HEAD>
</HEAD>
<BODY>
</BODY>
</HTML>
Neste exemplo estou definindo em um dia (1.440 minutos) o tempo de expirao para a
pgina. Para forar uma nova requisio para o servidor Web, a cada solicitao da pgina,
podemos utilizar o seguinte cdigo:
<% Response.Expires = 0 %>
Com isso a pgina expira imediatamente. Na prxima requisio do cliente, a pgina ser
novamente carregada a partir do servidor. Isto garante que sempre a ltima verso da pgina
ser enviada do servidor Web para o navegador do cliente.
NOTA
Se essa propriedade for definida mais de uma vez em uma pgina, a data ou hora de expirao
mais prxima atual ser usada. Se tentarmos definir a data de expirao como uma data
que j passou, a data e hora atuais sero utilizadas como de expirao.
Esta propriedade deve ser definida antes que qualquer contedo tenha sido enviado para o
navegador do cliente. O cdigo da Listagem 4.22 mostra onde o local mais indicado para
definirmos esta propriedade.
216
<HTML>
<HEAD>
</HEAD>
<BODY>
</BODY>
</HTML>
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 circunstncias nas quais
o cliente pode ter se desconectado do servidor. Por exemplo, se um longo perodo de tempo tiver
decorrido entre o momento de uma solicitao do cliente e o momento em que o servidor
respondeu, talvez seja benfico 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 contrrio retorna False.
O cdigo da Listagem 4.23 mostra um exemplo de utilizao desta propriedade.
Listagem 4.23 Utilizando a propriedade IsClientConnected do objeto Response.
1
<HTML>
<HEAD>
</HEAD>
217
<BODY>
10
Else
11
12
End If
13
%>
14
</BODY>
15
</HTML>
IMPORTANTE
A propriedade PICS insere qualquer seqncia de caracteres no cabealho, independente dela
representar ou no um rtulo PICS vlido.
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:590000 & chr(34) & ratings (v 0 s 0 l 0 n 0))) %>
218
NOTA
Para maiores informaes sobre a Classificao de Contedo 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 %>
219
determinada ao. Por exemplo, j utilizamos inmeras vezes o mtodo Write do objeto Response.
Este mtodo utilizado para enviar contedo do servidor Web para o navegador do cliente.
NOTA
Este mtodo pouco utilizado, se outro mtodo Response fornecer a funcionalidade necessria,
recomendvel que voc o utilize.
Como o protocolo HTTP requer que os cabealhos sejam enviados antes do contedo, em
geral, voc deve modificar todos os cabealhos enviados antes que seu script ASP gere alguma
sada. No IIS 4.0, isso significava que era necessrio chamar AddHeader no script antes que
alguma sada (como aquela gerada pelo cdigo HTML ou pelo mtodo Write) fosse enviada ao
cliente, normalmente antes da tag <BODY>. No IIS 5.0, com ASP 3.0, o Buffer ativado por
padro, conforme descrito anteriormente. Portanto, voc pode chamar o mtodo AddHeader
em qualquer ponto do script, desde que o Buffer no tenha sido desativado
(Response.Buffer=False) e que ele preceda todas as chamadas para Flush.
O cdigo da Listagem 4.24 mostra um exemplo de utilizao deste mtodo.
Listagem 4.24 Utilizando o mtodo AddHeader do objeto Response.
1
<HTML>
<HEAD>
</HEAD>
<BODY>
</BODY>
</HTML>
220
gerar estatsticas de acesso. No IIS 5.0 podemos configurar quais tipos de informao devem
ser gravadas no Log. Alm disso, temos o mtodo AppendToLog, o qual adiciona uma seqncia
de caracteres ao final da entrada de Log do servidor Web. Voc pode cham-lo vrias vezes
em uma seo do script. Cada vez que o mtodo chamado, ele anexa a seqncia de caracteres
especificada entrada existente.
Este mtodo utiliza a seguinte sintaxe:
Response.AppendToLog seqncia de caracteres
<HTML>
<HEAD>
</HEAD>
<BODY>
7
8
10
</BODY>
11
</HTML>
Este exemplo adiciona os textos Incio da pgina e Final da pgina ao Log do IIS.
221
Onde dados_enviar pode ser um objeto que contm, por exemplo, um trecho de vdeo no
formato .avi.
ou
Response.Clear( )
IMPORTANTE
Esse mtodo causar um erro de tempo de execuo se Response.Buffer no tiver sido definido
para True, isto , se no houver contedo no Buffer, a chamada ao mtodo Response.Clear
causar um erro.
O cdigo da Listagem 4.26 mostra um exemplo de utilizao deste mtodo 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
mtodo Response.Clear.
Listagem 4.26 Utilizando o mtodo Response.Clear ErroClear.asp.
1
<HTML>
<HEAD>
</HEAD>
<BODY>
</BODY>
10
</HTML>
222
ou
Response.End( )
Comentrios
Se Response.Buffer tiver sido definido para True (o que o padro no ASP 3.0), a chamada de
Response.End liberar o Buffer. Se voc no deseja que a sada retorne para o usurio, deve
chamar primeiro Response.Clear, conforme indicado no exemplo abaixo:
<%
Response.Clear
Response.End
%>
223
ou
Response.Flush( )
O cdigo da Listagem 4.27 mostra um exemplo de utilizao deste mtodo 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 mtodo Response.Flush.
<HTML>
<HEAD>
</HEAD>
224
<BODY>
</BODY>
10
</HTML>
Como exemplo, vamos supor que o usurio preencheu um formulrio 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 usurio para uma pgina
personalizada para cada caso. Na listagem 4.28 temos um exemplo de cdigo que soluciona o
problema proposto.
Listagem 4.28 Utilizando o mtodo Response.Redirect.
1
<HTML>
<HEAD>
</HEAD>
<BODY>
<P>Aguarde Redirecionando...</P>
7
8
9
10
<%
Vai_para = Request.Form(Destino)
Select Case Vai_para
Case Brasil
225
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 sada HTML, que enviada para o cliente:
Response.Write Bem vindos tecnologia de Pginas Dinmicas.
No prximo exemplo, alm do texto, enviamos uma tag HTML de quebra de linha:
Response.Write Utilizao do mtodo Write <BR>
O texto Utilizao do mtodo 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 mtodo que mais utilizaremos ao longo deste livro.
Agora encerramos o estudo do objeto Response, do qual estudamos todos os mtodos,
propriedades e a coleo Cookies. A partir de ento, passaremos a analisar alguns exemplos
prticos de utilizao do contedo visto at agora.
226
NOTA
Na prtica os valores preenchidos no formulrio deveriam ser armazenados em um banco de
dados como o Microsoft SQL Server 7.0 ou o Microsoft Access 2000. Como ainda no aprendemos
a trabalhar com banco de dados, vamos apenas validar os dados digitados. Caso o usurio
tenha digitado todos os dados corretamente, apenas informaremos que os dados foram digitados
com sucesso e exibiremos os valores. No prximo captulo estaremos tratando sobre a conexo
de pginas ASP com bancos de dados.
Na Listagem 4.29 temos o formulrio que o usurio dever preencher. Neste formulrio, so
de preenchimento obrigatrio os seguintes campos:
Nome
Rua
Cidade
Bairro
email
CPF
227
<HTML>
<HEAD>
</HEAD>
<BODY>
10
11
12
13
14
15
16
17
</STRONG></FONT></P>
18
<P>Carto Crdito:
19
20
21
22
</P>
23
24
25
<BR>
26
27
</FORM>
28
</BODY>
29
</HTML>
Ao visualizarmos este formulrio 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 pgina exemplo-1.asp, a qual vai processar os dados digitados no
formulrio quando o usurio clicar no boto Enviar. A pgina exemplo-1.asp deve verificar se
todos os campos obrigatrios foram digitados. Em caso afirmativo a pgina informar os
valores digitados pelo usurio, caso contrrio, o formulrio ser enviado de volta, indicando
quais os campos obrigatrios que no foram preenchidos. Alm disso ao enviar o formulrio
de volta para o usurio, os valores digitados pelo usurio sero preservados, evitando que
seja preciso digitar todos os campos novamente.
228
<HTML>
<HEAD>
</HEAD>
<BODY>
<%
10
nome = Request.Form(nome)
11
rua = Request.Form(rua)
12
cidade = Request.Form(cidade)
229
13
email = Request.Form(email)
14
cpf = Request.Form(CPF)
15
16
17
18
If (nome=)Then
19
20
faltou_dado=Sim
21
faltou_nome=Sim
22
End If
23
If (rua=)Then
24
25
faltou_dado=Sim
26
faltou_rua=Sim
27
End If
28
If (cidade=)Then
29
30
faltou_dado=Sim
31
faltou_cidade=Sim
32
End If
33
If (email=)Then
34
35
faltou_dado=Sim
36
faltou_email=Sim
37
End If
38
If (cpf=)Then
39
40
faltou_dado=Sim
41
faltou_cpf=Sim
42
End If
43
44
45
If faltou_dado<>Sim Then
230
46
47
Response.Write <HR>
48
49
<P>
50
51
52
<%=Request.Form(Dado)%>
53
</P>
54
<%Next
55
End If
56
57
58
59
60
61
62
63
64
65
66
67
68
69
If faltou_nome=Sim Then
70
71
End If
72
If faltou_rua=Sim Then
73
74
End If
75
If faltou_cidade=Sim Then
76
77
End If
78
If faltou_email=Sim Then
79
231
80
End If
81
If faltou_cpf=Sim Then
82
83
End If
84
85
%>
86
87
88
89
90
<% Response.Write Caso queira alterar algum dado, digite no formulrio abaixo.
If faltou_nome=Sim Then
91
92
Else
93
94
End If
95
If faltou_rua=Sim Then
96
97
Else
98
99
End If
100
If faltou_cidade=Sim Then
101
102
Else
103
104
End If
232
105
106
If faltou_email=Sim Then
107
108
Else
109
110
End If
111
112
If faltou_cpf=Sim Then
Response.Write <P>CPF: <INPUT id=cpf maxLength=11 name=cpf
size=11>(*)
113
Else
114
115
116
117
118
End If
Response.Write <FONT size=2><B>(Digite sem o ponto e sem o trao)
</B></FONT></P>
Response.Write <P>Carto Crdito:
If Request.Form(cartao)=Visa Then
119
120
Else
121
122
End If
121
122
123
Else
124
125
End If
233
126
If Request.Form(cartao)=Outros Then
127
128
Else
129
130
End If
131
132
133
Response.Write <BR>
134
135
136
%>
137
</FORM>
138
</BODY>
139
</HTML>
devem ser digitadas em uma nica linha. A linha aparece dividida por questes de espao
para exibio, quando for digitar esta linha, digite-a como uma linha nica.
O exemplo foi desenvolvido de maneira que o cdigo fosse de fcil compreenso, alm
disso foram inseridas diversas linhas de comentrio para facilitar o acompanhamento
do exemplo proposto. Cabe lembrar que, para criarmos uma linha de comentrio,
devemos iniciar a mesma com o sinal de apstrofe.
Observe o seguinte fragmento de cdigo:
18
If (nome=)Then
19
20
faltou_dado=Sim
21
22
faltou_nome=Sim
End If
Neste fragmento, estamos testando se o campo obrigatrio nome foi preenchido. Caso o
mesmo no tenha sido preenchido, definimos a varivel faltou_dado como sendo igual a
234
Sim. Tambm definimos a varivel faltou_nome como sendo igual a Sim. Este procedimento
repetido para os demais campos obrigatrios. Desta forma, qualquer campo obrigatrio que
esteja faltando, ir definir a varivel faltou_dado como sendo igual a Sim. Estas variveis
sero utilizadas mais adiante para informar quais campos obrigatrios esto faltando, e caso
nenhum esteja faltando, para informar os valores digitados pelo usurio.
Observe o seguinte fragmento de cdigo:
45
If faltou_dado<>Sim Then
46
47
Response.Write <HR>
48
49
<P>
50
51
52
<%=Request.Form(Dado)%>
53
</P>
54
<%Next
55
End If
If faltou_nome=Sim Then
70
71
Neste caso, se o campo nome no 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 obrigatrios para ver qual ou quais esto faltando. Caso o campo
esteja faltando, emito uma mensagem dizendo que o mesmo deve ser digitado, caso contrrio
crio o campo do formulrio e defino o seu valor conforme digitado pelo usurio. Observe o
fragmento de cdigo abaixo:
90
If faltou_nome=Sim Then
91
92
Else
235
93
94
Primeiro (linha 90), testamos se o nome no foi digitado. Em caso afirmativo criamos o campo
nome, em branco. Isto feito pela linha 91:
91
E este justamente o cdigo HTML que cria o campo nome e define os seus atributos. Veja
que estamos utilizando Response.Write para recriar o formulrio HTML original.
Caso o campo tenha sido preenchido, criamos o campo novamente com o cuidado de j preenchlo com o valor digitado previamente pelo usurio. Isto feito pelo cdigo abaixo:
93
Veja que esta instruo Response.Write um pouco mais complexa. A instruo 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 usurio. Vamos supor que o usurio
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
cdigo 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 cdigo HTML necessrio para criar o campo Nome e definir o seu valor
conforme o valor digitado pelo usurio. Um detalhe importante a salientar a utilizao do
Chr(34) antes e depois do nome do usurio. Precisamos envolver o nome digitado entre aspas,
pois caso contrrio o nome seria truncado no primeiro espao em branco. Se o usurio digitasse
Jos da Silva, sem as aspas seria retornado apenas Jos. Tudo o que vier depois do primeiro espao
em branco ser ignorado, por isso que utilizamos uma sinal de aspas antes e outro depois.
Veja que com a utilizao de cdigo ASP vamos recriando o formulrio original. Alm disso
mesclamos diversos trechos de cdigo ASP com HTML. Perceba que dentro do cdigo ASP podemos
utilizar todos os recursos da linguagem VBScript, ou seja, as possibilidades so variadas.
236
Agora vamos a alguns exemplos de utilizao da nossa aplicao. Na figura 4.24, temos um
exemplo onde o formulrio original foi aberto no Internet Explorer e o usurio preencheu
todos os campos, isto , no deixou de preencher nenhum campo obrigatrio.
237
Alm de informar os valores digitados, a pgina retorna o formulrio com os dados digitados
pelo usurio. Caso o usurio queira alterar algum valor digitado s fazer as alteraes
necessrias e clicar no boto Enviar. O formulrio aparece abaixo da informao dos valores
digitados, mais no final da pgina, conforme indicado na Figura 4.26.
238
Neste caso, ao clicar no boto Enviar, o usurio recebe uma pgina contendo uma mensagem
que avisa que o campo Cidade de preenchimento obrigatrio, e contendo o formulrio
somente com o campo Cidade em branco para que o mesmo seja preenchido, conforme
indicado pela Figura 4.28.
Frete (R$)
Imposto (%)
RS
3,50
12
PR
4,50
11
239
Estado
Frete (R$)
Imposto (%)
SC
4,20
13
SP
5,50
17
RJ
5,50
14
O frete nico para o pedido, independente do nmero 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 trs produtos. Tambm faremos uso de tabelas para
facilitar o layout da pgina.
Na Listagem 4.31 temos o formulrio de pedidos.
Listagem 4.31 Formulrio de pedidos exemplo-2.htm.
1
<HTML>
<HEAD>
<TITLE>Pedido de mercadorias.</TITLE>
</HEAD>
<BODY>
<P><B>FORMULRIO DE PEDIDOS:</B></P>
<P>
10
11
<TR>
12
<TD>Descrio</TD>
13
<TD>Pr. Unit.</TD>
14
<TD>Quant.</TD>
15
<TD>Subtotal</TD>
16
</TR>
17
<TR>
18
19
240
20
21
22
</TR>
23
<TR>
24
25
26
27
28
</TR>
29
<TR>
30
31
32
33
34
</TR>
35
</TABLE>
36
37
38
39
<OPTION value=RS>RS</OPTION>
40
<OPTION value=SC>SC</OPTION>
41
<OPTION value=PR>PR</OPTION>
42
<OPTION value=SP>SP</OPTION>
43
<OPTION value=RJ>RJ</OPTION>
44
</SELECT>
45
</P>
46
</FORM>
47
</BODY>
48
</HTML>
241
<HTML>
<HEAD>
</HEAD>
<BODY>
<%
242
If Request.Form(unit1)<> Then
10
11
12
subtot1=CSng(Request.Form(unit1))*Csng(Request.Form(quant1))
Else
subtot1=0
13
End If
14
If Request.Form(unit2)<> Then
15
16
17
subtot2=CSng(Request.Form(unit2))*Csng(Request.Form(quant2))
Else
subtot2=0
18
End If
19
If Request.Form(unit3)<> Then
20
21
22
subtot3=CSng(Request.Form(unit3))*Csng(Request.Form(quant3))
Else
subtot3=0
23
End If
24
total_inicial=subtot1+subtot2+subtot3
25
26
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
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
48
49
50
os valores calculados.
51
%>
52
53
54
<TR>
55
<TD>Descrio</TD>
56
<TD>Pr. Unit.</TD>
57
<TD>Quant.</TD>
58
<TD>Subtotal</TD>
59
</TR>
60
<TR>
61
62
63
64
65
</TR>
66
<TR>
67
68
244
69
70
71
72
73
74
75
76
77
78
<%
79
80
81
82
83
%>
84
<TR>
85
<TD>TOTAL PROD.->></TD>
86
<TD></TD>
87
88
<TD></TD>
<TD align=right><% =FormatNumber(subtot1+subtot2+subtot3,2)%></TD>
89
</TR>
90
<TR>
91
<TD>IMPOSTO ->></TD>
92
<TD></TD>
93
94
<TD></TD>
<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
100
101 </TR>
102 <TR>
103
104
<TD></TD>
105
106
<TD></TD>
<TD align=right><% =FormatNumber(total_geral,2)%></TD>
107 </TR>
108 </TABLE>
109 <A HREF=exemplo-2.htm>Clique aqui para voltar a pgina de Pedidos.</A>
110 </BODY>
111 </HTML>
devem ser digitadas em uma nica linha. A linha aparece dividida por questes de espao
para exibio; quando for digit-la, digite-a como uma linha nica.
O exemplo foi desenvolvido de maneira que o cdigo fosse de fcil compreenso, alm
disso foram inseridas diversas linhas de comentrio para facilitar o acompanhamento
do exemplo proposto. Cabe lembrar que para criarmos uma linha de comentrio
devemos iniciar a mesma com o sinal de apstrofe.
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 tambm a funo Csng para converter os valores
de Preo Unitrio e Quantidade em valores numricos, de tal forma que fosse possvel
realizar clculos com estes valores. Utilizamos a funo FormatNumber para formatar
os valores calculados, de tal forma a exibir os valores com duas casas decimais, conforme
mostrado no fragmento de cdigo a seguir:
<% =FormatNumber(valor_frete,2)%>
Agora vamos a um exemplo de utilizao da nossa aplicao. Na figura 4.30, temos um exemplo
onde o formulrio de pedidos foi aberto no Internet Explorer e o usurio preencheu o pedido
com trs produtos. O estado selecionado foi SP.
246
247
Com isso comprovamos que a nossa pgina, para clculo do Total do Pedido, est funcionando
corretamente.
Concluso
Neste captulo aprendemos aspectos fundamentais do ASP 3.0.
Primeiro, aprendemos exatamente o que uma pgina ASP, onde a mesma processada e
qual o resultado que retorna para o navegador do cliente. Depois tivemos uma viso geral
sobre o Modelo de Objetos do ASP 3.0.
Em seguida fizemos um estudo completo sobre os objetos Request e Response. Estudamos
todas as colees, mtodos e propriedades destes objetos. Para cada elemento apresentado
foram colocados exemplos de cdigo, facilitando o entendimento.
Na parte final do captulo 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 pginas ASP. Este o assunto do Captulo 5. Ento,
vamos l, sem mais demoras.
248
Captulo 5
Conectando Pginas ASP
com Bancos de Dados
249
Estamos vivendo na Era da Informao. Os aplicativos, quer sejam os tradicionais quer sejam
aplicativos para a Web, so todos ligados informaes de bancos de dados. Quando voc faz
o cadastro em um site de Comrcio Eletrnico, os dados fornecidos so armazenados em um
banco de dados. Da prxima vez que voc visitar o site, estas informaes podero ser
recuperadas a partir deste banco de dados. Quando ligamos para a companhia telefnica
para reclamar, o atendente pede que seja informado o nosso cdigo de cliente. atravs deste
cdigo que as informaes sobre o cliente so recuperadas, a partir do banco de dados da
empresa. Existem incontveis exemplos de aplicaes que usam bancos de dados, no
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
importncia e a necessidade da utilizao de banco de dados para o armazenamento de um
volume cada vez maior de informaes, sendo que estas informaes e sua correta utilizao
so de fundamental importncia para a empresa.
Durante muito tempo, os bancos de dados residiam em computadores de grande porte, os
conhecidos Mainframe. Depois veio uma onda de descentralizao, na qual a grande estrela
eram as Redes Locais de microcomputadores, com bancos de dados em servidores de Rede.
Esta foi a poca da criao das aplicaes em duas camadas, no tradicional modelo ClienteServidor. Com o avano do modelo Web e da Internet, surgiu a necessidade do desenvolvimento
de aplicaes Web com conexo a banco de dados. Hoje esta necessidade est mais do que
justificada: no existe aplicao Web que no faa conexo com bancos de dados. Desde um
simples formulrio para consulta ao CEP at aplicaes mais complexas de cotao eletrnica
de preos, todas necessitam de acesso a bancos de dados.
Neste captulo aprenderemos a utilizar a tecnologia ASP 3.0 para conectar nossas pginas com
banco de dados. Iniciaremos por uma reviso de dois conceitos muito importantes:
Modelo Relacional de dados.
Linguagem SQL Structured Query Language.
Uma vez revistos estes conceitos partiremos para a conexo de pginas ASP com bancos de
dados utilizando os objetos do ASP. Uma vez estabelecida a conexo aprenderemos a utilizar
objetos do ASP que recuperam informaes do banco de dados. Diversos exemplos prticos
sero apresentadospara facilitar o entendimento dos conceitos apresentados. Tambm veremos
como inserir informaes em um Banco de dados, a partir de um formulrio HTML.
Para facilitar o acompanhamento dos exemplos apresentados, estaremos utilizando um banco
de dados do Microsoft Access.
Este captulo fornece a base necessria para conectar pginas ASP com bancos de dados,
alm da reviso dos conceitos bsicos relativos a bancos de dados e linguagem SQL. No
prximo captulo estaremos abordando diversos aspectos avanados em relao a utilizao
de bancos de dados com pginas ASP.
250
Entidades e Atributos
Toda informao de um banco de dados armazenada em Tabelas, que tambm so chamadas
de Entidades. Por exemplo, poderamos ter uma tabela Clientes, onde seriam armazenadas
informaes sobre os diversos clientes.
Sobre cada um dos clientes poderamos armazenar informaes tais como: Nome, Rua, Bairro,
Telefone, CEP, Data de Nascimento, etc. Essas diversas caractersticas de cada cliente so 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 constituda por um conjunto de registros (uma linha completa com
informaes sobre o cliente) e cada registro formado por um conjunto de atributos (Nome,
Endereo, etc.).
Resumindo:
Entidade ou Tabela Conjunto de Registros.
Campos ou Atributos Caractersticas individuais da Entidade.
Considere o exemplo da Figura 5.1, onde temos uma tabela Cliente com os seus diversos
campos (atributos):
251
Chave Primria
O conceito de Chave Primria fundamental para o correto entendimento do funcionamento
de um banco de dados. Vamos procurar entender o que significa um campo ser a chave
primria de uma tabela.
Ao definirmos um campo como sendo uma chave primria, estamos informando ao banco de
dados que no podem existir dois registros com o mesmo valor de chave primria, ou seja, os
valores neste campo precisam ser nicos. Por exemplo, se defino o campo Nmero da
Identidade da tabela Clientes como sendo uma chave primria, estou dizendo ao banco de
dados que no podem existir dois clientes com o mesmo valor neste campo. Na prtica, estou
garantindo que no podem ser cadastrados dois clientes com o mesmo Nmero de Identidade.
Em outras palavras poderamos dizer que o campo chave primria identifica de maneira
nica cada registro de uma tabela, isto , de posse do valor da chave primria somente
localizaremos um registro com determinado valor neste campo.
252
Este um conceito muito importante, pois, conforme veremos mais adiante, os conceitos de
Integridade Referencial e Normalizao esto diretamente ligados ao conceito de chave primria.
Na Figura 5.2 vemos um exemplo da tabela Clientes onde o campo Cdigo do Cliente definido
como uma chave primria. Observe que no existem dois clientes com o mesmo cdigo.
253
254
255
Na prtica no temos como implementar um relacionamento deste tipo, devido a uma srie
de problemas que este procedimento implicaria. Por exemplo, na tabela Pedidos teramos
que repetir o Nmero do Pedido, Nome do Cliente, Nome do Funcionrio, Data do Pedido,
etc. para cada item do Pedido.
Para evitar este tipo de problema bastante comum quebrarmos um relacionamento do tipo
Vrios para Vrios em dois relacionamento do tipo Um para Vrios. Isso feito atravs da criao
de uma nova tabela, a qual fica com o lado Vrios dos relacionamentos. No nosso exemplo
poderamos criar a tabela Detalhes do Pedido, onde ficam armazenadas as informaes sobre os
diversos itens de cada pedido. Ento, ao invs de termos um relacionamento do tipo Vrios para
Vrios, teremos dois relacionamentos do tipo Um para Vrios, conforme indicado na Figura 5.5.
Integridade Referencial
A Integridade Referencial utilizada para garantir a integridade dos dados entre as tabelas
relacionadas, evitando inconsistncias dos dados, bem como repeties desnecessrias.
Por exemplo, existe um relacionamento do tipo Um para Vrios entre a tabela Clientes e a
tabela Pedidos (um cliente pode fazer vrios pedidos). Com a Integridade Referencial, o banco
de dados no permite que seja cadastrado um pedido para um cliente ainda no cadastrado.
Tambm podemos garantir o seguinte:
256
Quando o cdigo de um cliente for alterado na tabela Clientes, o banco de dados atualiza,
automaticamente, todos os Cdigos do Cliente na tabela Pedidos, de tal maneira que
no fiquem registros rfos, isto , registros de Pedidos com um cdigo de cliente que
no existe mais na tabela Clientes. Esta ao conhecida como Propagar atualizao
dos campos relacionados.
Quando um cliente for excludo da tabela Clientes, podemos pedir para que o banco
de dados exclua, na tabela Pedidos, todos os pedidos do cliente que est sendo excludo.
Essa opo conhecida como Propagar excluso dos registros relacionados e pode
ser habilitada ou no, dependendo da especificao do banco de dados. Caso seja
necessrio manter todo o histrico de compras do cliente, por exemplo, esta opo no
deve ser habilitada. Com isso, quando o cliente for eliminado da tabela Clientes, os
seus pedidos continuaro gravados na tabela Pedidos.
Essas opes so definidas no momento da criao das tabelas e dos relacionamentos entre as
tabelas do banco de dados.
A opo de Propagar atualizao dos campos relacionados utilizada na maioria das situaes,
j a opo de Propagar excluso dos registros relacionados deve ser estudada, caso a caso.
Normalizao de Tabelas
O conceito de Normalizao foi criado no incio da dcada de 70.
O objetivo da Normalizao evitar os problemas provocados por falhas no projeto do banco de
dados, bem como eliminar a mistura de assuntos e as correspondentes redundncias de dados.
Uma regra de ouro que devemos observar durante a elaborao do projeto de banco de dados
a de No misturar assuntos em uma mesma tabela.
Por exemplo na tabela Clientes devemos colocar somente campos relacionados com o assunto
Clientes. No devemos misturar campos relacionados com outros assuntos, tais como Pedidos,
Produtos, etc. Essa mistura de assuntos em uma mesma tabela acaba por gerar repetio
desnecessria dos dados bem como inconsistncia dos mesmos.
O processo de Normalizao aplica uma srie de regras sobre as entidades de um banco de
dados, para verificar se as mesmas esto corretamente projetadas. Embora existam cinco Formas
Normais (ou regras de Normalizao), na prtica usamos um conjunto de trs Formas Normais.
Com freqncia, aps a aplicao das regras de Normalizao, algumas tabelas acabam se dividindo
em duas ou mais, o que no final gera um nmero maior de tabelas do que o originalmente existente.
Este processo causa a simplificao dos atributos de uma tabela, colaborando para a estabilidade
do modelo, reduzindo-se consideravelmente as necessidades de manuteno.
257
258
259
NOTA
A distino entre a Segunda e a Terceira Formas Normais, que veremos no prximo item,
muitas vezes confusa. A Segunda Forma Normal, na maioria das vezes, est ligada a ocorrncia
de chaves primrias compostas.
260
IMPORTANTE
Com isso podemos concluir que, como resultado do processo de Normalizao, iremos obter
um nmero maior de tabelas, porm sem problemas de redundncia e inconsistncia dos
dados, ou com estes problemas minimizados.
261
262
Introduo
Na Figura 5.12 temos um exemplo de uma instruo SQL. Embora possa parecer complexa, em
um primeiro momento, veremos que a linguagem SQL bastante simples e de fcil aprendizado.
263
Lembre-se que o SQL um padro genrico para expresses de consulta em banco de dados.
Embora a maior parte das verses do SQL compartilhe elementos bsicos, elas no so
idnticas. O Access SQL usa algumas palavras-chave que voc no encontra em outras verses
do SQL. Tambm existem pequenas diferenas entre o Microsoft Access e o Microsoft SQL
Server, conforme iremos salientar durante este captulo.
Veremos atravs de exemplos a utilizao das principais palavras-chave do SQL para a
construo de expresses SQL para pesquisa em banco de dados.
A Instruo SELECT
Esta com certeza, a instruo SQL mais importante; no existe pesquisa que no utilize esta
instruo. Agora vamos conhec-la em detalhes.
A instruo Select utilizada para especificar quais os campos de quais tabelas faro parte da
consulta, quais critrios de pesquisa sero utilizados, qual a ordem de classificao, etc.
A sintaxe simplificada da instruo conforme indicado abaixo:
SELECT
campo1, campo2, campo3
FROM nome_da_tabela
[WHERE condio ]
[GROUP BY nome_do_campo ]
[HAVING ... ]
[ORDER BY... ]
Descrio
nome_da_tabela
WHERE
GROUP BY
264
Elemento
Descrio
Por exemplo, em um relatrio de vendas anuais,
posso ter os resultados agrupados por ms, com
a soma das vendas do ms logo aps a listagem
de vendas do ms.
HAVING
ORDER BY
Exemplo 1
Criar uma instruo SQL que retorne o campo NmeroDoPedido, o campo DataDoPedido, o
campo Frete e o campo PasDeDestino da tabela Pedidos.
SELECT Pedidos.NmeroDoPedido, Pedidos.DataDoPedido, Pedidos.PasDeDestino,
Pedidos.Frete FROM Pedidos;
Toda instruo SQL deve terminar com um ponto e vrgula (;), conforme indicado no Exemplo 1.
Observe que os nomes dos campos esto separados por vrgula, alm disso estamos utilizando o
nome completo, isto : Nome_da_tabela.Nome_do_campo. Tambm poderamos utilizar o
comando, sem o nome da tabela antes do nome do campo, conforme indicado no seguinte comando:
SELECT NmeroDoPedido, DataDoPedido, PasDeDestino, Frete FROM Pedidos;
IMPORTANTE
Somente obrigatria a utilizao do nome da tabela antes do nome do campo quando o
mesmo campo existir em duas ou mais tabelas que fazem parte da instruo SQL. Por exemplo,
imagine que estejamos escrevendo uma instruo SQL para criar uma listagem com o cdigo
e o nome do cliente, bem como todos os pedidos efetuados pelo cliente. Acontece que o Cdigo
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
Exemplo 2
Alterar a instruo SQL anterior para que os registros sejam classificados em ordem crescente
pelo valor do Frete.
SELECT NmeroDoPedido, DataDoPedido, PasDeDestino, Frete FROM Pedidos
ORDER BY Frete;
Exemplo 3
Agora vamos comear a inserir condies. Muitas vezes as condies so chamadas de filtro;
uma vez estabelecida uma condio, somente os registros que atendem a condio especificada
sero retornados. Desta forma a condio atua como se fosse um filtro. Neste exemplo vamos
alterar a instruo SQL anterior para que sejam exibidos somente os pedidos cujo PasDeDestino
seja Brasil.
SELECT NmeroDoPedido, DataDoPedido, PasDeDestino, Frete FROM Pedidos
WHERE PasDeDestino=Brasil
ORDER BY Frete;
Observe a utilizao da clusula WHERE para filtrar somente os pedidos cujo PasDeDestino seja
Brasil. Como o campo PasDeDestino um campo do tipo texto, o valor do critrio (Brasil) tem
que vir entre aspas. Se fosse um campo do tipo data, o valor do critrio teria que vir delimitado
pelo sinal #, por exemplo #01/01/1995#. Vamos trabalhar um pouco mais com a clusula WHERE.
Exemplo 4
Altere a instruo SQL anterior para que sejam exibidos somente os pedidos para o Brasil ou
Alemanha como PasDeDestino.
SELECT NmeroDoPedido, DataDoPedido, PasDeDestino, Frete FROM Pedidos
WHERE (((Pedidos.PasDeDestino)=Brasil Or (Pedidos.PasDeDestino)=Alemanha))
ORDER BY Frete;
266
Exemplo 5
Altere a instruo SQL anterior, retirando o critrio para PasDeDestino. Adicione um critrio
para NmeroDoPedido maior do que 10500, retire a classificao do campo Frete a classifique
pelo campo NmeroDoPedido.
SELECT NmeroDoPedido, DataDoPedido, PasDeDestino, Frete FROM Pedidos
WHERE NmeroDoPedido>10500
ORDER BY NmeroDoPedido;
Exemplo 6
Alterar a instruo SQL anterior, e adicionar um critrio de tal maneira que somente sejam
exibidos os pedidos para o ano de 1995. Tirar o critrio do campo NmeroDoPedido.
SELECT NmeroDoPedido, DataDoPedido, PasDeDestino, Frete FROM Pedidos
WHERE ((Year([DataDoPedido])=1995))
ORDER BY NmeroDoPedido;
Observe a utilizao da funo Year (Ano) para extrairmos apenas o ano do campo DataDoPedido a
fim de especificarmos como critrio o Ano=1995. Tambm a clusula ORDER BY foi mantida,
classificando a listagem em ordem crescente pelo nmero do pedido. A utilizao de funes junto
com os comando SQL nos fornece inmeras possibilidades de refinamento em nossas consultas.
Exemplo 7
Alterar a instruo SQL anterior, para que sejam exibidos somente os pedidos no perodo de 01/
01/1995 at 31/07/1995 e que tenham como PasDeDestino Brasil, Argentina, Alemanha ou Canad.
SELECT NmeroDoPedido, DataDoPedido, PasDeDestino, Frete FROM Pedidos
WHERE (((DataDoPedido) Between #1/1/95# And #8/31/95#)
AND
((PasDeDestino) In (Brasil,Argentina,Alemanha,Canad)))
ORDER BY Pedidos.NmeroDoPedido;
267
Observe a utilizao de vrios critrios em diferentes campos. Colocamos critrios nos campos
DataDoPedido e PasDeDestino. Os critrios de dois ou mais campos so ligados atravs do
operador AND, indicando que um registro deve atender ambos os critrios para ser selecionado.
Tambm temos a utilizao dos operadores Between (Entre) para selecionar as datas dentre
um determinado intervalo e do operador In (Em) para selecionar o campo PasDeDestino que
seja igual a um dos valores apresentados na lista. Observe tambm que os valores de data
vem delimitados pelos marcadores #, conforme descrito anteriormente. A utilizao dos
parnteses visa facilitar o entendimento da instruo e facilitar a avaliao da expresso.
IMPORTANTE
Algumas destas funcionalidades podem necessitar de pequenas alteraes para funcionar em
nossas pginas ASP, conforme veremos mais adiante neste captulo.
Exemplo 8
Criar uma instruo SQL que retorne os campos NmeroDoPedido, DataDoPedido,
DataDeEntrega, Frete e PasDeDestino da tabela Pedidos. Criar uma coluna adicional que calcula
o nmero de dias entre a DataDeEntrega e a DataDoPedido. Chamar esta coluna de Dias_Ped_Entr.
SELECT NmeroDoPedido, DataDoPedido, DataDeEntrega, PasDeDestino, Frete,
[DataDeEntrega]-[DataDoPedido] AS Dias_Ped_Entr FROM Pedidos
WHERE (((DataDoPedido) Between #1/1/95# And #8/31/95#)
AND
((PasDeDestino) In (Brasil,Argentina,Alemanha,Canad)))
ORDER BY Pedidos.NmeroDoPedido;
Veja que a coluna calculada [DataDeEntrega]-[DataDoPedido] est junto com a listagem dos
campos no incio da instruo SELECT. Alm disso foi utilizada a palavra AS para atribuir
um nome (apelido) para esta coluna calculada. Este nome o que ser utilizado para fazer
referncia coluna, no nosso cdigo ASP.
Voc tambm pode classificar a listagem em ordem crescente ou decrescente de um campo
calculado. Por exemplo, se voc quisesse classificar a listagem do item anterior, em ordem
crescente, do nmero de dias entre a DataDeEntrega e a DataDoPedido, bastaria utilizar a
seguinte instruo SQL:
SELECT NmeroDoPedido, DataDoPedido, DataDeEntrega, PasDeDestino, Frete,
[DataDeEntrega]-[DataDoPedido] AS Dias_Ped_Entr
FROM Pedidos
WHERE (((DataDoPedido) Between #1/1/95# And #8/31/95#)
AND
((PasDeDestino) In (Brasil,Argentina,Alemanha,Canad)))
ORDER BY [DataDeEntrega]-[DataDoPedido];
268
Exemplo 9
Alterar a instruo SQL anterior, eliminando os critrios para a DataDoPedido e para o
PasDeDestino. Colocar um novo critrio para PasDeDestino, onde sejam exibidos apenas os
pedidos cujo PasDeDestino tem a primeira letra na faixa de A at M. Utilize o operador Like.
SELECT NmeroDoPedido, DataDoPedido, DataDeEntrega, PasDeDestino, Frete,
[DataDeEntrega]-[DataDoPedido] AS Dias_Ped_Entr
FROM Pedidos
WHERE ((PasDeDestino) Like [A-M]%))
ORDER BY PasDeDestino;
Observe a utilizao do operador Like (Como) como critrio de pesquisa para esta consulta.
Nunca demais salientar que a utilizao das instrues SQL juntamente com as funes 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 critrio:
WHERE NomeDoCliente Like Joo%
sero retornados todos os registros para Clientes cujo nome inicia com Joo. O caractere
curinga % significa, em termos simples, qualquer coisa, ou seja, o critrio especifica que o
nome inicie com Joo, no importando (qualquer coisa) o que vier depois.
IMPORTANTE
Aqui cabe um aviso importante para os usurios do Microsoft Access. No Microsoft Access, o
caractere curinga o *, j na construo de pginas ASP, utilizamos como caractere curinga o
%, o qual tambm utilizado no Microsoft SQL Server.
At agora estivemos trabalhando com instrues que selecionam registros de uma nica tabela.
Porm bastante comum criarmos instrues SQL baseadas em duas ou mais tabelas. Quando
criamos instrues SQL que buscam dados em duas ou mais tabelas, dizemos que est sendo
feito um Join entre as duas tabelas. Normalmente este Join (ou ligao) feito atravs de um
campo comum s duas tabelas. Por exemplo, NmeroDoPedido na tabela Pedidos e
NmeroDoPedido na tabela Detalhes do Pedido. Outro exemplo, CdigoDoCliente na tabela
Pedidos e CdigoDoCliente na tabela Clientes. Pode acontecer de termos consultas que
trabalham com trs ou mais tabelas, neste caso teremos diversos Joins.
Agora passaremos e explorar na prtica, atravs de exemplos, a construo de instrues
SQL que trabalham com duas ou mais tabelas.
269
Exemplo 10
Criar uma instruo SQL que selecione os seguintes campos:
NmeroDoPedido da tabela Pedidos.
DataDoPedido da tabela Pedidos.
PasDeDestino da tabela Pedidos.
Frete da tabela Pedidos.
CdigoDoProduto, PreoUnitrio e quantidade da tabela DetalhesdoPedido.
Alm disso, as tabelas Pedidos e DetalhesdoPedido esto relacionadas atravs do campo
NmeroDoPedido, atravs de um relacionamento do tipo Um para Vrios. Classificar a listagem
em ordem crescente do NmeroDoPedido.
Para resolver este exemplo podemos utilizar a seguinte instruo SQL:
SELECT Pedidos.NmeroDoPedido, Pedidos.DataDoPedido, Pedidos.PasDeDestino,
Pedidos.Frete, DetalhesdoPedido.CdigoDoProduto, DetalhesdoPedido.PreoUnitrio,
DetalhesdoPedido.Quantidade
FROM Pedidos
INNER JOIN
DetalhesdoPedido
ON Pedidos.NmeroDoPedido=DetalhesdoPedido.NmeroDoPedido
ORDER BY Pedidos.NmeroDoPedido;
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 a utilizao da clusula INNER JOIN, ligando as tabelas Pedidos e DetalhesdoPedido,
atravs do campo NmeroDoPedido, conforme especificado na clusula ON, onde temos o seguinte:
ON Pedidos.NmeroDoPedido=DetalhesdoPedido.NmeroDoPedido
Observe que esta listagem ir trazer vrios registros para cada pedido, tantos quantos forem
os itens de cada pedido.
E se, ao invs do CdigoDoProduto, ns quisermos que seja exibida a descrio do produto?
Em primeiro lugar, esta informao encontra-se na tabela Produtos, logo teremos que adicionar
a tabela nossa consulta, a qual ir se ligar tabela DetalhesDoPedido atravs do campo
CdigoDoProduto. Logo, teremos mais um Join.
Aps adicionar a tabela Produtos e substituir o campo CdigoDoProduto pelo campo
NomeDoProduto, a nossa instruo SQL deve ficar conforme indicado no seguinte comando:
SELECT Pedidos.NmeroDoPedido, Pedidos.DataDoPedido, Pedidos.PasDeDestino, Pedidos.
Frete, Produtos.NomeDoProduto, DetalhesdoPedido.PreoUnitrio,
DetalhesdoPedido.Quantidade
270
FROM Produtos
INNER JOIN (Pedidos INNER JOIN DetalhesdoPedido ON Pedidos.NmeroDoPedido=Detalhesdo
Pedido.NmeroDoPedido) ON Produtos.CdigoDoProduto=DetalhesdoPedido.CdigoDoProduto
ORDER BY Pedidos.NmeroDoPedido;
Observe que neste caso temos um INNER JOIN dentro do outro. Dentro do parnteses feita
a ligao entre as tabelas Pedidos e DetalhesdoPedido, atravs do campo NmeroDoPedido, e
externamente feita a ligao entre as tabelas Produtos e DetalhesdoPedido, atravs do campo
NmeroDoPedido.
Podemos utilizar diversos nveis de INNER JOIN, embora esta no seja uma prtica
recomendada, pois se aumentarmos muito os nveis de INNER JOIN, podemos ter pesquisas
mais lentas, em conseqncia do aumento da complexidade das mesmas. At trs ou quatro
nveis considerado normal, acima disso preciso repensar a maneira de construir a consulta.
Exemplo 11
Alterar a instruo 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 classificao
do campo NmeroDoPedido e classificar em ordem crescente do campo NomeDoProduto.
SELECT Pedidos.NmeroDoPedido, Pedidos.DataDoPedido, Pedidos.PasDeDestino,
Pedidos.Frete, Produtos.NomeDoProduto, DetalhesdoPedido.PreoUnitrio,
DetalhesdoPedido.Quantidade
FROM Pedidos
INNER JOIN (Produtos INNER JOIN DetalhesdoPedido ON
Produtos.CdigoDoProduto=DetalhesdoPedido.CdigoDoProduto)
ON Pedidos.NmeroDoPedido=DetalhesdoPedido.NmeroDoPedido
WHERE (((Produtos.NomeDoProduto) Like [A-J]*))
ORDER BY Produtos.NomeDoProduto;
Observe, alm dos dois INNER JOIN, a utilizao da clusula WHERE com o operador Like
para especificar o critrio desejado.
At este momento estivemos construindo instrues SQL que executam consultas no banco
de dados. Especificamos quais campos sero exibidos, critrios de filtragem para estes campos
e uma ordem de classificao. A partir de agora aprenderemos a utilizar instrues SQL para
a construo de outros tipos de instrues SQL, as quais realizam alteraes e incluses em
tabelas de banco de dados.
271
A Instruo UPDATE
A instruo UPDATE utilizada para alterar informaes em um banco de dados. Podemos
criar um formulrio onde o usurio pode alterar os seus dados cadastrais. Primeiro os dados
so recuperados a partir do banco de dados, em seguida as alteraes so enviadas de volta
para o banco de dados, atravs de uma instruo UPDATE. Vamos estudar esta instruo
atravs de exemplos, assim como fizemos com a instruo SELECT.
Exemplo 1
Criar uma instruo SQL que aumenta o PreoUnitrio em 20 % na tabela DetalhesdoPedido,
devido a um ajuste na moeda e uma desvalorizao em relao ao Dlar.
UPDATE DetalhesdoPedido
SET PreoUnitrio = PreoUnitrio*1.2;
Exemplo 2
Alterar a instruo SQL do item anterior para que somente sejam aumentados os registros
cujo PreoUnitrio for maior ou igual a R$ 20,00.
UPDATE DetalhesdoPedido
SET PreoUnitrio = PreoUnitrio*1.2
WHERE PreoUnitrio>=20;
Apenas foi adicionada uma clusula WHERE, para atualizar apenas os registros cujo
PreoUnitrio seja maior ou igual a R$ 20,00.
Exemplo 3
Alterar a instruo SQL do exemplo anterior para que somente sejam aumentados os registros cujo
PreoUnitrio for maior ou igual a R$ 20,00 e cujo NmeroDoPedido seja menor do que 10500.
UPDATE DetalhesdoPedido
SET PreoUnitrio = PreoUnitrio*1.2
WHERE (((PreoUnitrio)>=20)
AND
((NmeroDoPedido)<10500));
272
Exemplo 4
Alterar a instruo SQL do exemplo anterior para incluir um critrio 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.NmeroDoPedido = DetalhesdoPedido.NmeroDoPedido
SET DetalhesdoPedido.PreoUnitrio = PreoUnitrio*1.2
WHERE (((DetalhesdoPedido.PreoUnitrio)>=20)
AND
((DetalhesdoPedido.NmeroDoPedido)<10500)
AND
(Year([DataDoPedido])=1995));
Temos diversos detalhes interessantes a observar nesta instruo SQL. Primeiro um INNER
JOIN relacionando as tabelas Pedidos e DetalhesdoPedido, atravs do campo NmeroDoPedido.
Isso mostra que perfeitamente possvel utilizar um INNER JOIN dentro de uma consulta de
atualizao. Segundo, temos a utilizao da funo Year para extrair apenas o ano do campo
DataDoPedido e compar-lo com o critrio 1995.
Novamente, a utilizao de operadores e funes nos fornece uma grande flexibilidade em
termos de construo de nossas consultas.
A Instruo INSERT
A instruo INSERT utilizada para gravar registros em uma tabela de um banco de dados. Por
exemplo, quando o usurio preenche os dados de um formulrio de cadastro e os envia para
uma pgina ASP, podemos utilizar a instruo INSERT para os inserir em um banco de dados.
Vamos analisar alguns exemplos.
273
Exemplo 1
Este exemplo cria um novo registro na tabela Funcionrios:
INSERT INTO Funcionrios (Nome, Sobrenome, Cargo) VALUES (Paulo, Braga,
Estagirio);
Exemplo 2
Este exemplo seleciona todos os estagirios de uma tabela Estagirios que tenham sido
contratados h mais de 30 dias e adiciona os registros selecionados tabela Funcionrios.
INSERT INTO Funcionrios
SELECT Estagirios.* FROM Estagirios
WHERE DataDaContratao < Hoje() - 30;
Observe que utilizamos a funo Hoje( ) para capturar a data do sistema e subtramos 30,
para obter apenas os funcionrios contratados a mais do que 30 dias.
A Instruo DELETE
A instruo DELETE utilizada para excluir registros de um banco de dados. Vamos supor
que voc tenha desenvolvido uma aplicao Web para agenda eletrnica, onde o usurio
pode cadastrar contatos, endereos, telefones e compromissos. Podemos criar uma pgina
ASP que permite ao usurio eliminar dados que no sejam mais necessrios na agenda. Neste
caso podemos fazer uso da instruo DELETE. Vamos a um exemplo prtico.
Exemplo 1
Criar uma instruo SQL que elimine todos os pedidos da tabela Pedidos cujo PasDeDestino
seja a Alemanha.
DELETE Pedidos.PasDeDestino
FROM Pedidos
WHERE (((Pedidos.PasDeDestino)=Alemanha));
274
clusula WHERE. Utilizar um DELETE sem uma clusula WHERE significa que estaremos
eliminando todos os registros da tabela.
Agora que j revisamos os aspectos bsicos relacionados a bancos de dados e linguagem SQL,
chegou o momento de aprendermos a conectar nossas pginas ASP com bancos de dados.
275
Gerenciador ODBC
Driver ODBC
SQL Server
Driver ODBC
Microsoft Access
Driver ODBC
Oracle
276
IMPORTANTE
Dependendo da verso do ODBC instalado em seu computador, as telas apresentadas podem
ser um pouco diferentes das aqui apresentadas.
277
NOTA
Para maiores informaes sobre os diferentes tipos de DSN consulte o site http://
msdn.microsoft.com.
4. D um clique na guia System DSN.
5. Surge a janela indicada na Figura 5.15.
278
279
280
NOTA
Estaremos utilizando esta fonte ODBC em diversos exemplos deste livro.
281
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 verso do ODBC instalado em seu computador, as telas apresentadas podem
ser um pouco diferentes das aqui apresentadas.
282
5. D um clique no boto Concluir. aberta a janela Create a New Data Source to SQL
Server, conforme indicado na Figura 5.22.
283
284
285
NOTA
Estaremos utilizando esta fonte ODBC em diversos exemplos deste livro.
286
287
Agora que j sabemos um pouco sobre ODBC vamos falar sobre OLE DB.
288
OLE DB
OLE DB Providers
Jet
Provider
Jet
Provider
Exchange
Server
Provider
Drivers ODBC
Microsoft
Access
Microsoft
SQL
Server
Gerenciador ODBC
Driver ODBC
SQL Server
Driver ODBC
Microsoft Access
Driver ODBC
Oracle
Microsoft
SQL
Server
Microsoft
Access
ORACLE
Microsoft
Exchange
Server
IMPORTANTE
Com isso, terminamos nosso estudo sobre os aspectos tericos necessrios ao entendimento da
conexo de pginas ASP com bancos de dados. A partir do prximo item estaremos aprendendo,
na prtica, a escrever pginas ASP que fazem conexo com banco de dados. Grande parte do
nosso trabalho ser estudar os objetos, mtodos, propriedades e eventos da tecnologia ADO.
Nunca demais salientar que ADO a forma de acesso a dados indicada pela Microsoft. No
289
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. Alm
disso, a Microsoft vem anunciando que as tecnologias mais antigas (como DAO e RDO) sero
descontinuadas, isto , sero substitudas por ADO.
ADO
OLE DB
OLE DB Providers
Jet
Provider
Jet
Provider
Exchange
Server
Provider
Drivers ODBC
Microsoft
Access
Microsoft
SQL
Server
Microsoft
Exchange
Server
Gerenciador ODBC
Driver ODBC
SQL Server
Driver ODBC
Microsoft Access
Driver ODBC
Oracle
Microsoft
SQL
Server
Microsoft
Access
ORACLE
290
Connection
Errors
Error
Properties
Property
Parameters
Parameter
Properties
Property
Command
Recordset
Fields
Field
Properties
Property
Fields
Field
Record
Stream
291
Command: Este objeto pode ser utilizado para executar um comando (uma instruo
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.
Tambm podemos utilizar este objeto para alterar a estrutura de um banco de dados,
desde que tenhamos permisso 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 operao 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 no estruturados, normalmente
organizados em formas de rvores hierrquicas. Pode ser utilizado para acessar
informaes de um sistema de arquivos ou um sistema de correio eletrnico.
Cada um destes objetos apresenta uma srie de mtodos, propriedades, eventos e colees.
Iniciaremos o estudo de cada objeto com uma apresentao rpida de cada um destes
elementos. medida que formos utilizando estes mtodos, propriedades, eventos e colees,
apresentaremos maiores detalhes sobre cada um deles.
IMPORTANTE
Na maioria das situaes utilizamos os objetos Connection e Recordset juntos em uma mesma
pgina. No prximo item iremos estudar o objeto Connection, porm j fazendo uso do objeto
Recordset nos exemplos prticos. No item a seguir ser apresentado apenas o bsico sobre o
objeto Recordset. Na parte final do captulo e nos prximos captulos estudaremos maiores
detalhes sobre o objeto Recordset.
O Objeto Connection
Conforme descrevemos anteriormente, o primeiro passo para conectar uma pgina ASP com
uma fonte de dados, estabelecer uma conexo com a fonte de dados. Para estabelecermos
esta conexo utilizamos o objeto Connection.
Ao estabelecermos uma conexo estamos informando para a nossa pgina ASP uma srie 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
informaes, tais como nome de usurio e senha, caso sejam necessrios.
Na Tabela 5.2 temos uma breve descrio dos principais mtodos do objeto Connection.
292
Descrio
BeginTrans
Cancel
Close
CommitTrans
Execute
Open
OpenSchema
RoolbackTrans
Na Tabela 5.3 temos uma breve descrio das principais propriedades do objeto Connection.
Tabela 5.3 As principais propriedades do objeto Connection.
Propriedade
Descrio
Attributes
CommandTimeout
293
Propriedade
Descrio
ConnectionString
ConnectionTimeout
CursorLocation
DefaultDatabase
Errors
IsolationLevel
Mode
Properties
Provider
State
Version
294
Na Tabela 5.4 temos uma breve descrio dos principais eventos do objeto Connection.
Tabela 5.4 Os principais eventos do objeto Connection.
Evento
Descrio
BeginTransComplete
CommitTransComplete
ConnectComplete
Disconnect
ExecuteComplete
InfoMessage
RollBackTransComplete
WillConnect
WillExecute
O Primeiro Exemplo
Neste item vamos utilizar o conhecimento que j temos para criar uma pgina ASP que conecta
o banco de dados Nwind e mostra uma listagem de clientes com as seguintes informaes:
Cdigo do Cliente (CodigoDoCliente)
Cargo (Cargo)
Endereo (Endereco)
Telefone (Fone)
NOTA
O nome entre parnteses 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
Na Figura 5.33 podemos ver a estrutura da tabela Clientes que est sendo utilizada no nosso
exemplo.
<HTML>
<HEAD>
<TITLE>Listagem de Clientes</TITLE>
</HEAD>
<BODY>
<H1>
</H1>
10
<%
11
12
296
13
14
15
16
criada anteriormente.
17
conn.Open nwind
18
19
20
21
22
23
24
25
26
27
28
29
30
31
no prximo captulo.
32
33
34
35
36
37
resultado da consulta.
38
%>
297
39
<P>
40
<HR>
41
42
<TR>
43
44
45
46
47
</TR>
48
<%
49
50
51
52
53
<TR>
54
55
56
57
58
</TR>
59
<%
60
Clientes.MoveNext
61
Loop %>
62
</TABLE>
63
</P>
64
<HR>
65
</BODY>
66
</HTML>
298
Ao carregar esta pgina no Internet Explorer, o usurio recebe uma listagem conforme indicado
na Figura 5.34.
299
Esta linha cria um objeto Connection chamado conn. Poderamos utilizar qualquer nome
vlido para este objeto. Um ponto importante a salientar a utilizao da instruo Set.
Sempre que formos criar um objeto (Connection, Recordset, etc.), devemos usar a instruo
Set. Se no utilizarmos esta instruo na criao de objetos, obteremos um erro na hora de
carregar a pgina.
Tambm importante observarmos o seguinte:
Server.CreateObject(ADODB.Connection)
Este cdigo cria um objeto no servidor, que do tipo ADODB.Connection, ou seja, uma conexo
ADO para banco de dados.
Aps a execuo deste comando, um objeto Connection foi criado, porm o mesmo ainda no
faz referncia a nenhum banco de dados especfico.
Trecho 2: Considere o seguinte trecho de cdigo:
15
16
criada anteriormente.
17
conn.Open nwind
Na linha 17 estou associando a conexo 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 associao feita atravs do mtodo Open, do objeto Connection.
A partir deste momento, a minha conexo conn est associada ao banco de dados Nwind,
conforme definido pela fonte ODBC nwind.
Uma vez estabelecida a conexo hora de recuperar dados, isto , registros, a partir do banco
de dados. Isto feito pelo seguinte trecho de cdigo:
Trecho 3: Considere o seguinte trecho de cdigo.
20
21
22
23
24
25
300
26
27
28
29
30
31
no prximo captulo.
Na linha 20, criamos uma varivel chamada inst_sql, a qual contm a instruo SQL que ser
executada no banco de dados Nwind. Observe que uma instruo 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 instruo SQL, partimos para a criao de um objeto RecordSet. A criao
do objeto RecordSet, chamado Clientes, feita na linha 26. Poderamos ter escolhido qualquer
nome para este objeto. Observe a utilizao da instruo Set. Como estamos criando um
objeto (do tipo RecordSet), devemos utilizar a instruo Set.
Agora devemos executar a instruo SQL para que o objeto Recordset contenha os registros
retornados pela instruo. Isto feito pelo seguinte cdigo:
29
Neste caso utilizamos o mtodo Open do objeto RecordSet Clientes. O primeiro parmetro
a instruo SQL a ser utilizada inst_sql. O segundo parmetro o nome da conexo a ser
utilizada conn. O terceiro e quatro parmetros definem comportamentos para o objeto
RecordSet, tais como se possvel mover-se para frente e para trs, avanando e voltando
pelos registros, se os registros retornados so apenas para leitura ou para leitura e alteraes
e assim por diante. Estudaremos estas opes no prximo captulo.
Bem, neste momento j temos um objeto RecordSet chamado Clientes, o qual possui uma
srie de registros obtidos a partir da tabela Clientes do banco de dados Nwind. Cada registro
possui quatro campos, conforme foi definido pela nossa instruo SQL que somente retorna
os campos CodigoCliente, Cargo, Endereco e Fone.
Trecho 4: Considere o seguinte trecho de cdigo.
41
42
<TR>
43
301
44
45
46
47
</TR>
52
53
<TR>
54
55
56
TD>
57
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. Comeamos criando a primeira linha da tabela, a qual ir
conter o ttulo das colunas. Isto feito pelo seguinte cdigo:
41
42
<TR>
43
44
45
46
47
Observe que para criar o cabealho da tabela, utilizamos cdigo 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.
A construo do corpo da tabela feita com o seguinte trecho de cdigo:
52
53
54
302
55
56
57
58
59
<%
60
Clientes.MoveNext
61
Loop %>
62
</TABLE>
Na linha 52, iniciamos um lao Do Until Condio... Loop. Como condio utilizamos a propriedade
Eof do objeto Clientes. O lao continua sendo executado at que a condio Clientes.eof se torne
Verdadeira. Esta condio somente ir tornar-se Verdadeira quando o indicador de registro j
estiver alm do ltimo registro. Com isso, o lao 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 cdigo:
53
<TR>
54
55
56
57
58
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
coleo Fields do RecordSet Clientes, a qual nos d acesso aos campos individuais de cada registro.
As linhas seguintes so de grande importncia:
59
<%
60
Clientes.MoveNext
61
Loop %>
62
</TABLE>
Se no colocssemos a linha 60, esta pgina ASP entraria em Loop infinito e somente o primeiro
registro seria exibido repetidamente, at congelar a pgina. Quando criamos um objeto RecordSet,
por padro, o indicador de registro posicionado no primeiro registro. Utilizamos o mtodo
MoveNext para mover o indicador para o prximo registro. Com isso, a cada passagem do lao Do
303
Feita esta alterao, ao acessarmos esta pgina 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
Observe que uma simples modificao na instruo SQL j produz os resultados desejados.
Tambm poderamos sugerir outra alterao. Vamos supor que foi solicitado que retirssemos
o campo Fone e inclussemos o campo Fax. Esta mudana tambm extremamente simples.
Bastaria alterar as seguintes linhas:
A instruo SQL na linha 20 ficaria assim:
20
Na linha 57 basta trocar o nome do campo de Fone para Fax, conforme indicado:
57
Figura 5.36: A listagem de clientes do banco de dados Nwind, com o campo Fax.
Com a utilizao de SQL e ASP fica fcil fazer alteraes em nossas pginas.
A partir do prximo item estudaremos mais detalhes sobre o objeto Connection. Ainda neste
captulo, aprenderemos a criar um formulrio onde o usurio pode digitar um critrio e
pesquisar registros que atendam ao critrio digitado. Conforme descrito, continuaremos
305
fazendo uso de objetos RecordSet, embora somente iremos estudar os mesmos, em detalhes,
no prximo captulo.
<HTML>
<HEAD>
</HEAD>
<BODY>
<H3>
</FONT>
10
</H3>
11
<%
12
13
Set obj_conn=Server.CreateObject(ADODB.Connection)
14
15
criada anteriormente.
16
obj_conn.Open nwind
17
18
306
19
20
21
22
23
24
25
26
%>
27
<P>
28
<HR>
29
30
<TR>
31
32
33
</TR>
34
<TR>
35
36
37
</TR>
38
<TR>
39
40
41
</TR>
42
<TR>
43
44
45
</TR>
46
<TR>
47
48
49
</TR>
307
50
51
52
<TR>
<TD align=middle bgColor=gray>CursorLocation</TD>
<TD align=middle bgColor=gray><%=obj_conn.CursorLocation %></TD>
53
</TR>
54
<TR>
55
56
57
</TR>
58
<TR>
59
60
61
</TR>
62
<TR>
63
64
65
</TR>
66
<TR>
67
68
69
</TR>
70
<TR>
71
72
73
</TR>
74
</TABLE>
75
76
</P>
77
<HR>
78
</BODY>
79
</HTML>
308
309
NOTA
Cuidado! A propriedade ConnectionTimeout deve ser definida antes da conexo ser aberta com
a utilizao do mtodo Open, caso contrrio ser gerado um erro e a pgina no ser carregada.
Observe a propriedade ConnectionString, cujo valor para o nosso exemplo o seguinte:
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;
IMPORTANTE
Uma dvida que muitos usurios tm sobre a obrigatoriedade ou no de utilizarmos ODBC. A
utilizao de uma fonte ODBC no obrigatria, podemos montar uma conexo OLE DB diretamente
para qualquer fonte de dados. Basta, para isso, montar a String de conexo correta e pass-la
como um parmetro para o mtodo Open da conexo, que ir referenciar, diretamente, a fonte de
dados, sem a necessidade de uma fonte ODBC estar configurada.
Agora vamos fazer alguns comentrios sobre os valores padro de algumas propriedades.
A propriedade CursorLocation pode apresentar os valores indicados na Tabela 5.5.
Tabela 5.5 Valores da propriedade CursorLocation.
Valor
Descrio
310
Descrio
Por ltimo gostaria de salientar a utilizao do mtodo Close, para fechar a conexo,
conforme indicado no seguinte trecho de cdigo:
75
Agora vamos explorar mais um exemplo de utilizao da conexo de pginas ASP com banco
de dados.
311
<HTML>
<HEAD>
</HEAD>
<BODY>
<P><FONT color=navy>
<B>PESQUISA DE PRODUTOS.</B>
</FONT>
</P>
10
11
12
13
</B>
14
</FONT></P>
15
<P><B><FONT color=#000080>
16
17
</FONT>
18
</B>
19
</P>
20
</FORM>
21
</BODY>
22
</HTML>
312
NOTA
Estamos pedindo para que seja digitado um nmero entre 1 e 77 pois estes so os dados
existentes para produtos no banco de dados Nwind.mdb. Porm, vamos fazer um teste: iremos
digitar um cdigo 95 e mandar pesquisar. A nossa pgina ASP detectar que no existe nenhum
produto com este cdigo e avisar que nenhum produto foi encontrado para o cdigo digitado.
<HTML>
<HEAD>
</HEAD>
313
<BODY>
<H2>
</H2>
10
<P><FONT color=navy>
11
<B>PESQUISA DE PRODUTOS.</B>
12
</FONT>
13
</P>
14
15
16
17
</B>
18
</FONT></P>
19
<P><B><FONT color=#000080>
20
21
</FONT>
22
</B>
23
</P>
24
</FORM>
25
<%
26
27
28
29
Set conn=Server.CreateObject(ADODB.Connection)
30
31
criada anteriormente.
32
conn.Open nwind
33
34
35
314
36
37
38
39
40
41
42
43
44
no prximo captulo.
45
46
47
%>
48
<HR>
49
<%
50
If Produto.RecordCount = 0 Then
51
52
53
54
Response.Write <HR>
55
Else
56
57
58
59
60
61
62
63
Response.Write <HR>
64
End If
65
%>
66
</BODY>
67
</HTML>
315
Agora vamos testar o nosso exemplo. Na figura 5.39 temos o formulrio de pesquisa carregado,
onde o usurio digitou o cdigo 32.
316
Observe que no prprio formulrio do resultado, colocamos a opo do usurio entrar com
um novo cdigo para fazer outra pesquisa, conforme havamos proposto na apresentao
deste problema.
Agora vamos fazer o seguinte teste: vamos digitar um cdigo para um produto que no existe
e clicar fazer a pesquisa. Por exemplo, digite o cdigo 89 e clique no boto de pesquisa. Voc
obter o resultado indicado na Figura 5.41.
Observe que, alm de informar que o produto no foi encontrado, informado qual o cdigo
que foi digitado.
Agora vamos fazer alguns comentrios sobre a Listagem 5.4.
Nesta construo estamos utilizando a clusula Where para especificar um critrio. Ao executar a
pgina ASP, o cdigo Request.Form(Cdigo) substitudo pelo valor digitado pelo usurio. Vamos
supor que o usurio digitou 32 para o cdigo. Neste caso a nossa instruo SQL ficaria assim:
SELECT * FROM Produtos where ProductID=32
que justamente, a instruo que retorna o produto cujo cdigo igual ao digitado no
formulrio de pesquisa. Esta uma tcnica bastante til, pois inmeras vezes precisamos
construir instrues semelhantes a esta em nossas aplicaes Web.
317
If Produto.RecordCount = 0 Then
51
52
53
54
55
Response.Write <HR>
Else
56
57
58
59
60
61
62
63
Response.Write <HR>
64
End If
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
usurio que nenhum produto foi encontrado.
Caso tenha sido encontrado algum produto, retornamos os dados sobre o Produto, o que
feito na parte Else do lao If..Then...Else.
No prximo captulo iremos tratar de algumas tcnicas mais avanadas de pesquisa.
Concluso
Neste captulo foram apresentados diversos conceitos fundamentais para a utilizao de banco
de dados com pginas ASP.
318
Comeamos com uma reviso do Modelo Relacional de banco de dados, onde vimos conceitos
como Entidades, Atributos, Chave Primria, relacionamentos e Normalizao. Em seguida
fizemos uma rpida reviso da linguagem SQL que, conforme descrito anteriormente, de
fundamental importncia em se tratando de banco de dados.
Na seqncia, vimos as tecnologias para acesso a fontes de dados; conceitos como ODBC, OLE
DB e ADO e a maneira como os mesmos se relacionam. Tambm 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 aplicao vimos como conectar uma pgina ASP para exibir uma listagem a
partir de uma tabela de um banco de dados do Microsoft Access. Tambm aprendemos alguns
detalhes sobre o objeto Recordset, que ser melhor detalhado no prximo captulo.
Para finalizar o captulo foi apresentado um exemplo no qual o usurio digita um critrio e
efetuada uma pesquisa em uma tabela do banco de dados, com base no critrio digitado
pelo usurio.
319
Captulo 6
Bancos de Dados com ASP
Conceitos Avanados Parte I
321
Introduo
Neste captulo veremos uma srie de conceitos avanados sobre a conexo de pginas ASP
com bancos de dados.
Aprenderemos mais detalhes sobre conexes com fontes de dados, inclusive como conectar,
sem a utilizao de ODBC, somente atravs da utilizao do objeto Connection e de sua
propriedade ConnectionString.
Estudaremos, detalhadamente, o objeto Recordset, aprendendo a utilizar suas propriedades,
mtodos e colees. Teremos um item sobre a utilizao de Cursores e sobre Lock em banco de
dados. Estes so conceitos de grande importncia que so, muitas vezes, ignorados. A correta
utilizao de cursores fundamental para a construo de aplicaes Web, utilizando ASP.
Tambm aprenderemos a interagir com fontes de dados, no somente atravs de consultas.
Aprenderemos a inserir, alterar e excluir dados que no sejam mais necessrios. Neste item
continuaremos utilizando, intensamente, as propriedades, mtodos e colees do objeto Recordset.
Sero apresentados alguns exemplos prticos de utilizao, como o clssico exemplo de
construo de uma Caixa de combinao de maneira dinmica. Por exemplo, em um
determinado formulrio, necessito de uma Caixa de combinao que liste todos os Bairros da
cidade de Porto Alegre. Podemos construir esta lista, dinamicamente, a partir de um banco de
dados, onde tenhamos esta informao armazenada em uma tabela.
Veremos exemplos prticos de operaes de insero, alterao e excluso de registros,
utilizando pginas ASP. Tambm aprenderemos a filtrar os registros retornados por um objeto
RecordSet.
Veremos como construir instrues SQL que utilizam funes para gerar campos calculados,
os quais no existem nas tabelas dos banco de dados. Por exemplo, utilizaremos a funo
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 captulo, 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 captulos do livro continuaremos a aprender um pouco mais
sobre ADO, alm de outros assuntos, como gerenciamento de sesses e aplicaes, utilizao
de componentes ASP do servidor, segurana e tratamento de erros dentre outros.
322
OLE DB Providers
Jet
Provider
Jet
Provider
Exchange
Server
Provider
Drivers ODBC
Microsoft
Access
Microsoft
SQL
Server
Microsoft
Exchange
Server
Gerenciador ODBC
Driver ODBC
SQL Server
Driver ODBC
Microsoft Access
Driver ODBC
Oracle
Microsoft
SQL
Server
Microsoft
Access
ORACLE
323
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 configurao para acessar um banco de dados do
Microsoft Access diferente da configurao 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.
A propriedade ConnectionString possui uma srie de comandos no formato:
argumento = valor
onde argumento pode ser a informao sobre o provedor, o nome do usurio, etc. Apenas a
ttulo de exemplo, listamos a seguir a propriedade ConnectionString do exemplo da Listagem
5.2, do captulo 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;
Descrio
Provider
324
Propriedade
Descrio
Data Source
User ID
Password
IMPORTANTE
Por padro, o OLE DB Provider para Microsoft Access (tambm chamado de Jet OLE DB Provider),
abre o banco de dados com permisso de leitura e escrita, isto , os dados tambm 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 conexo 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 mtodo Open, para
abrir esta conexo. Observe que aps o mtodo Open passada uma String de conexo com
o parmetro para o mtodo Open. Este parmetro a propriedade ConnectionString.
Poderamos obter o mesmo resultado de uma maneira diferente: primeiro vamos definir a
propriedade ConnectionString, depois simplesmente chamamos o mtodo Open. Ao chamar
o mtodo 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)
conn.Open
325
OBSERVAO
Utilizamos os nmeros de linha apenas para referncia. Quando criamos nossas pginas ASP
no devemos utilizar nmeros de linhas.
NOTA
A linha 2 aparece quebrada em duas linhas por questes de espao para exibio, mas a
mesma deve ser digitada em uma nica linha.
No exemplo a seguir, temos um caso onde foi fornecido o nome do usurio e a senha para
conexo:
1
Set conn=Server.CreateObject(ADODB.Connection)
conn.Open
Para maiores detalhes sobre segurana de bancos de dados do Microsoft Access, consulte a
documentao do prprio Access.
Descrio
Provider
User ID ou uid
326
Propriedade
Descrio
Password ou pwd
Na Listagem 6.1, temos um exemplo de uma conexo 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
<HTML>
<HEAD>
</HEAD>
<BODY>
<H1>
</H1>
10
<%
11
12
13
14
Set conn=Server.CreateObject(ADODB.Connection)
15
16
criado anteriormente.
17
conn.ConnectionString = PROVIDER=SQLOLEDB;
Data Source=SERVIDOR\SERVIDOR;Initial Catalog=Northwind;
User ID=sa;Password=senha123"
18
conn.Open
19
20
inst_sql=SELECT Orders.OrderID, Orders.OrderDate, Orders.ShipCity,
Orders.ShipCountry FROM Orders ORDER BY Orders.OrderDate
327
21
22
23
24
25
26
27
28
29
30
31
32
33
resultado da consulta.
34
%>
35
<P>
36
<HR>
37
38
<TR>
39
40
41
42
43
</TR>
44
<%
45
46
47
48
328
49
<TR>
50
51
52
53
54
</TR>
55
<% Pedidos.MoveNext
56
Loop %>
57
</TABLE>
58
</P>
59
<HR>
60
</BODY>
61
</HTML>
329
conn.ConnectionString = PROVIDER=SQLOLEDB;
Data Source=SERVIDOR\SERVIDOR;Initial Catalog=Northwind;
User ID=sa;Password=senha123"
18
conn.Open
Valor fornecido
Provider
SQLOLEDB
SERVIDOR\SERVIDOR
Initial Catalog ou
Northwind
User ID ou uid
sa
Password ou pwd
senha123
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 instncia 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 vrias instncias do servidor SQL, isto como se eu
tivesse vrios servidores SQL Server 2000 diferentes no mesmo equipamento, sendo que
cada um deles deve possuir um nome diferente. Assim poderamos ter o seguinte exemplo:
330
SERVIDOR\SERVIDOR
SERVIDOR\PRODUCAO
SERVIDOR\ESPECIAL
Neste caso temos trs instncias do servidor SQL Server 2000 no computador de nome
SERVIDOR. As trs instncias so:
SERVIDOR
PRODUCAO
ESPECIAL
Quando vou definir a String de conexo, preciso definir a qual instncia quero conectar a
pgina ASP.
Se voc estiver utilizando o Microsoft SQL Server 7.0, basta fornecer o nome do servidor.
Neste caso definiramos 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 instruo SQL acessa dados da tabela Orders, conforme
indicado pelo seguinte fragmento de cdigo:
20
Descrio
Provider
Data Source
331
Propriedade
Descrio
User ID
Password
Abaixo temos um exemplo de uma conexo com um banco de dados, utilizando a propriedade
ConnectionString:
1
Set conn=Server.CreateObject(ADODB.Connection)
Primeiro criamos um objeto do tipo Connection. Depois utilizamos o mtodo Open, para
abrir esta conexo. Observe que aps o mtodo Open passada uma String de conexo como
parmetro para o mtodo Open. Este parmetro a propriedade ConnectionString.
Poderamos obter o mesmo resultado de uma maneira diferente: primeiro vamos definir a
propriedade ConnectionString, depois simplesmente chamamos o mtodo Open. Ao chamar
o mtodo 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)
conn.Open
OBSERVAES
Utilizamos os nmeros de linha apenas para referncia. Quando criamos nossas pginas ASP
no devemos utilizar nmeros de linhas.
NOTA
A linha 2 aparece quebrada em duas linhas por questes de espao para exibio, mas a
mesma deve ser digitada em uma nica linha.
IMPORTANTE
Para maiores detalhes sobre o ORACLE, consulte a documentao do produto.
332
Microsoft Access, Microsoft SQL Server e ORACLE so os casos mais comuns de conexes de
pginas ASP com fontes de dados. Porm, conforme descrito no Captulo 5, atravs de OLE
DB podemos estabelecer conexes com qualquer fonte de dados para a qual esteja disponvel
um OLE DB Provider, inclusive fontes de dados no estruturadas no formato de bancos de
dados relacionais. Como exemplos de fontes que no possuem o tradicional formato dos
bancos de dados relacionais, poderamos citar os arquivos de mensagens de correio eletrnico
do Microsoft Exchange ou do Lotus Notes, um catlogo de indexao do Microsoft Index
Server ou, at mesmo, uma fonte de dados residente em um Mainframe.
O Mtodo Close
O mtodo Close utilizado para fechar/encerrar uma conexo e quaisquer outros objetos que
sejam dependentes da conexo. Por exemplo, se criamos um objeto RecordSet que obteve
dados a partir da conexo que est sendo encerrada, o objeto RecordSet tambm ser encerrado.
A sintaxe deste mtodo bastante simples. Vamos supor que tenhamos criado uma conexo
chamada Clientes; para encerr-la, poderamos utilizar o seguinte cdigo:
<% Clientes.Close %>
333
la. No exemplo abaixo, fechamos o objeto Clientes e depois voltamos a abri-lo, utilizando o
mtodo Open.
<%
Clientes.Close
Clientes.Open
%>
Neste caso poderamos voltar a utilizar o objeto Clientes. Para remover um objeto, em definitivo,
da memria, 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 cdigo:
Set Clientes = Server.CreateObject(ADODB.Connection)
Observe que, pelo fato de Clientes ser um objeto (do tipo Connection) e no simplesmente uma
varivel, devemos utilizar o operador Set. Se tentarmos criar ou remover um objeto, sem a
utilizao do operador Set, obteremos uma mensagem de erro e a pgina no ser exibida.
Pool de Conexes
Quando um usurio fecha uma conexo, atravs da utilizao do mtodo Close, conforme
descrito anteriormente, esta conexo mantida na memria e adicionada a um Pool de
conexes inativas. Da prxima vez que o mesmo usurio, ou qualquer outro, for abrir uma
nova conexo, o OLE DB primeiro verifica se, no Pool de conexes inativas, existe uma conexo
exatamente igual ao que o usurio est solicitando. Se for encontrada, a mesma ser utilizada,
caso contrrio uma nova conexo ser criada e enviada para o usurio que solicitou.
O OLE DB mantm um Pool de conexes porque o processo de criar uma conexo o que
mais exige recursos do servidor Web. Sempre que uma conexo puder ser reaproveitada, a
partir do Pool de conexes, estaremos economizando recursos do servidor.
As conexes inativas no permanecem indefinidamente no Pool de conexes. Aps um perodo
padro sem utilizao, as mesmas so removidas, para no onerar os recursos do servidor
Web, sem que estejam sendo utilizadas.
A utilizao de Pool de conexes de grande importncia, principalmente para servidores
Web muito acessados, em que novas conexes esto sendo criadas e fechadas a todo instante.
Neste caso o Pool de conexes representa um alvio na carga de recursos como memria RAM
e processador.
334
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.
O objeto RecordSet contm o resultado de uma instruo SQL executada em um banco de
dados. Contm um conjunto de Registros. como se fosse uma tabela, onde cada linha um
registro, e cada registro formado por um conjunto de campos (colunas da tabela). Por exemplo,
ao executarmos a seguinte instruo SQL:
Select * from Pedidos
Estaremos selecionando todos os registros da tabela Pedidos, os quais podero ser acessados
atravs de um objeto do tipo RecordSet.
Existem detalhes importantes que devemos conhecer a respeito do acesso aos dados. Devemos
considerar questes como:
O acesso deve ser somente para leitura dos dados ou devem ser permitidas alteraes
e inseres de novos dados?
Como tratar questes sobre o acesso simultneo aos dados? Por exemplo, como tratar a
situao em que dois usurios tentam alterar o mesmo registro, ao mesmo tempo?
Estas so questes importantes e devem ser consideradas sempre que formos disponibilizar
acesso aos dados da nossa empresa, para usurios da Internet. Tambm precisamos conhecer
o que so Cursores, quais os tipos disponveis e para que utilizamos. Vamos estudar estes
pontos neste tpico.
Para criar um objeto RecordSet, utilizamos a seguinte sintaxe:
Set Pedidos = Server.CreateObject(ADODB.Recordset)
Neste exemplo estamos criando um RecordSet chamado Pedidos. Uma vez criado o RecordSet,
o prximo passo utilizarmos o mtodo Open. Este mtodo possui a seguinte sintaxe:
recordset.Open Source, ActiveConnection, CursorType, LockType, Options
Considere o exemplo:
Pedidos.Open inst_sql, conn, 3, 3
Os parmetros a serem passados para o mtodo Open esto descritos na Tabela 6.5.
335
Descrio
Source
LockType
Options
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 mtodo Open, por padro, o primeiro registro o Registro Corrente.
Um Cursor tambm 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 manipulao do Record pointer o Cursor. Por isso quando utilizamos os mtodos
MoveNext (mover para o prximo registro), MovePrevious (mover para o registro anterior) ou
qualquer outro mtodo de movimentao, estamos utilizando o Cursor.
O mecanismo do Cursor tambm gerencia situaes em que tentamos avanar alm do ltimo
registro ou voltar alm do primeiro registro, ou quando acessamos o valor de um campo de
336
um registro. De uma maneira simples, podemos afirmar que grande parte da funcionalidade
de um objeto RecordSet fornecida pelo mecanismo do Cursor.
Quando utilizamos o mtodo Open, podemos definir diferentes formas de comportamento
para o mecanismo do Cursor. So estas formas que determinam os tipos de Cursores
disponveis, conforme a Tabela 6. 6. O tipo do Cursor pode ser definido com um valor numrico
ou atravs de uma constante.
Tabela 6.6 Tipos de Cursores disponveis.
Valor/Constante
Tipo/Descrio
3
adOpenStatic
0
Cria um Cursor do tipo Forward Only. Este o valor
adOpenForwardOnly padro que ser utilizado caso no seja definido nenhum
outro tipo. Somente podemos utilizar o mtodo MoveNext.
Se tentarmos utilizar um outro mtodo de movimentao,
ser gerado um erro e a pgina no ser carregada. Tambm
um Cursor do tipo Static, com a diferena que somente
podemos nos movimentar para a frente.
2
adOpenDynamic
1
adOpenKeyset
337
Valor/Constante
Tipo/Descrio
RecordSet deste tipo. Caso algum registro seja
eliminado por outros usurios, o respectivo registro
estar inacessvel. podemos nos movimentar em
ambas as direes dentro do RecordSet.
O tipo de Cursor a ser utilizado depende da aplicao que estamos desenvolvendo. Por
exemplo, se estamos desenvolvendo uma pgina 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 estao do cliente ou no servidor Web, dependendo da localizao do Cursor. Veremos
como definir a localizao do Cursor atravs da utilizao da propriedade CursorLocation,
no prximo item.
Agora alguns exemplos de utilizao do mtodo Open.
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 prximo 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,
%>
338
Localizao 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 servios de Cursor
no servidor. O Microsoft Access no oferece servios de Cursor e, com isso, o mesmo fica
localizado no cliente. Quando acessamos fontes de dados, utilizando OLE DB, podemos utilizar
o servio de Cursor oferecido pelo prprio OLE DB. A opo padro, caso no seja definido
nada em contrrio, que o Cursor esteja no servidor.
Para definir a localizao do cursor, devemos utilizar a propriedade CursorLocation, do objeto
RecordSet. Definimos esta propriedade antes da utilizao do mtodo Open deste objeto. A
Tabela 6.7 descreve os valores possveis para esta propriedade.
Tabela 6.7 Valores para a propriedade CursorLocation.
Valor/Constante
Tipo/Descrio
3
adUseClient
1
adUseNone
2
adUseServer
339
IMPORTANTE
A propriedade CursorLocation deve ser definida antes da utilizao do mtodo 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
340
Lembrando que no necessrio definir o Cursor no servidor, pois essa a definio padro,
ou seja, se no 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 utilizao do Lock garantimos que um mesmo registro no esteja sendo
alterado, simultaneamente, por mais do que um usurio. Quando um usurio acessa um registro
para fazer alguma alterao, o mesmo bloqueado, de tal forma que outros usurios no possam
ter acesso a ele. O acesso ao registro somente ser liberado aps as alteraes 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.
Tabela 6.8 Tipos de Lock.
Valor/Constante
Tipo/Descrio
1
adLockReadOnly
2
adLockPessimistic
341
Valor/Constante
Tipo/Descrio
3
adLockOptimistic
4
Cria um Lock do tipo Batch Optimistic. Este tipo de
adLockBatchOptimistic Lock permite que vrios registros sejam modificados.
Os registros somente sero bloqueados quando for
chamado o mtodo UpdateBatch do objeto RecordSet.
-1
adLockUnspecified
IMPORTANTE
A propriedade LockType deve ser definida antes da utilizao do mtodo Open. Ao tentarmos
definir a propriedade CursorLocation, com o RecordSet aberto, obteremos a seguinte
mensagem de erro:
342
Tipo de erro:
ADODB.Recordset (0x800A0E79)
Operation is not allowed when the object is open.
/Capitulo6/pubs_sql.asp, line 40
Ao invs de utilizarmos o valor 3, podemos utilizar a constante correspondente, adLockOptimistic, conforme o exemplo:
<%
inst_sql=Select * from Clientes
Set Clientes = Server.CreateObject(ADODB.Recordset)
Clientes.LockType = adLockOptimistic
Clientes.Open inst_sql, conn, adOpenStatic, 3
%>
Agora que j discutimos um pouco sobre Cursores, localizao do Cursor e Lock de registros,
podemos partir para o estudo de mais alguns detalhes do objeto RecordSet.
Descrio
AbsolutePage
AbsolutePosition
343
Propriedade
Descrio
ActiveCommand
BOF
Bookmark
CacheSize
CursorLocation
CursorType
EditMode
EOF
344
Propriedade
Descrio
Filter
LockType
MaxRecords
PageCount
PageSize
RecordCount
Sort
Source
State
345
%>
Descrio
AddNew
Cancel
CancelBatch
CancelUpdate
Clone
Close
Delete
Find
GetRows
GetString
Move
MoveFirst
MoveLast
MoveNext
MovePrevious
Open
Requery
346
Mtodo
Descrio
Resync
Save
Update
Agora vamos aprender a executar algumas operaes bastante comuns em aplicaes Web.
Aprenderemos a inserir, excluir e alterar um determinado registro.
NOTA
Eu, por exemplo, utilizo uma aplicao deste tipo para fazer a avaliao dos treinamentos que
ministro em todo o pas. Ao final do treinamento, os usurios, sem se identificar, preenchem
um formulrio com as opinies sobre o treinamento, o material e o desempenho do instrutor.
Estes dados so armazenados diretamente em um banco de dados do Microsoft Access, a
partir do qual fao uma srie de estatsticas.
Na Listagem 6.2 temos o cdigo HTML para a criao do formulrio de cadastro, no qual o
usurio poder digitar os dados.
Listagem 6.2 O formulrio para digitao dos dados cadastro.htm.
1
<HTML>
<HEAD>
347
</HEAD>
<BODY bgColor=#c0c0c0>
<P>
</FONT>
10
</P>
11
<P>
12
13
14
</FONT>
15
</P>
16
<P>
17
18
19
</FONT>
20
</P>
21
<P>
22
<TR>
25
<TD>Nome:</TD>
26
27
28
29
<FONT color=red><B>(*)</B></FONT></TD>
</TR>
<TR>
30
<TD>Rua:</TD>
31
32
33
<FONT color=red><B>(*)</B></FONT></TD>
</TR>
348
34
<TR>
35
<TD>Bairro:</TD>
36
37
38
39
<FONT color=red><B>(*)</B></FONT></TD>
</TR>
<TR>
40
<TD>Cidade:</TD>
41
42
<FONT color=red><B>(*)</B></FONT></TD>
43
44
</TR>
<TR>
45
<TD>CEP:</TD>
46
47
48
49
50
</FONT><B>(*)</B></FONT></TD>
</TR>
<TR>
52
<TD>Fone:</TD>
53
54
55
</TR>
<TR>
56
57
58
<TD>Fax:</TD>
<TD><INPUT id=fax maxLength=20 name=fax></TD></TR>
<TR>
59
<TD>Carto:</TD>
60
<TD>
61
62
Card
63
64
<FONT color=red><B>(*)</B></FONT>
65
</TD>
66
</TR>
67
<TR>
68
<TD colSpan=2>
349
69
70
71
</TD>
72
</TR>
73
</TABLE>
74
</FORM>
75
</P><BR>
76
<FONT color=red><B>(*)
77
78
</BODY>
79
</HTML>
350
351
mantendo os campos que j haviam sido preenchidos, para que o usurio possa
preencher somente os campos que esto faltando.
Na Listagem 6.3 temos o cdigo para a pgina cadastro.asp.
Listagem 6.3 Pgina ASP para processamento dos dados cadastro.asp.
1
<HTML>
<HEAD>
</HEAD>
<BODY>
<%
10
11
Set conn=Server.CreateObject(ADODB.Connection)
12
13
14
conn.ConnectionString = PROVIDER=MICROSOFT.JET.OLEDB.4.0;
15
conn.Open
16
17
18
19
20
21
22
**************************************************
23
24
**************************************************
352
25
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
33
34
35
If (nome=)Then
36
37
faltou_dado=Sim
38
faltou_nome=Sim
39
End If
40
If (rua=)Then
41
42
faltou_dado=Sim
43
faltou_rua=Sim
44
End If
45
If (bairro=)Then
46
47
faltou_dado=Sim
48
faltou_bairro=Sim
49
End If
50
If (cidade=)Then
51
52
faltou_dado=Sim
53
faltou_cidade=Sim
54
End If
55
If (cep=)Then
56
57
faltou_dado=Sim
58
faltou_cep=Sim
353
59
End If
60
If (cartao=)Then
61
62
faltou_dado=Sim
63
faltou_cartao=Sim
64
End If
65
66
67
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
81
82
83
84
Response.Write <HR>
End If
85
86
87
88
89
90
91
92
354
93
94
95
96
97
98
If faltou_nome=Sim Then
99
100
End If
101
If faltou_rua=Sim Then
102
103
106
End If
107
If faltou_bairro=Sim Then
108
109
End If
110
If faltou_cep=Sim Then
111
112 End If
113
If faltou_cartao=Sim Then
114
115
End If
116
%>
117 <%
118 Comeo a reenviar o formulrio para o usurio, utilizando Response.Write.
119 Caso esteja faltando algum dado, envio o formulrio
120 para o usurio preencher os campos que esto faltando.
121 Os valores j digitados, so preservados.
122 %>
123 <% If faltou_dado=Sim Then
355
356
If Request.Form(cartaotipo)=Visa Then
Response.Write <TD><INPUT id=cartaotipo name=cartaotipo type=radio
CHECKED>Visa
Else
Response.Write <TD><INPUT id=cartaotipo name=cartaotipo
type=radio>Visa
169
End If
170
171
172
173
174
End If
175
If Request.Form(cartaotipo)=Outros Then
176
177
178
179
357
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 esto exibidas em duas ou
mais linhas apenas por questo de espao.
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
81
82
83
Response.Write <HR>
84 End If
358
Neste cdigo, utilizamos o mtodo AddNew do objeto RecordSet Cadastro. Depois vamos
preenchendo cada novo campo do registro, com o respectivo valor preenchido pelo usurio
no formulrio. No final, utilizamos o mtodo Update para salvar o registro na tabela.
O mtodo Close utilizado para fechar o RecordSet Cadastro e, por fim, tiramos o objeto
Cadastro da memria. 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 contrrio obteremos uma mensagem de erro.
Tambm gostaria de observar a situao em que o usurio deixa de preencher algum
campo obrigatrio. Neste caso, o usurio informado a respeito de qual ou quais campos no foram preenchidos. O formulrio retornado para o usurio, juntamente com
os valores j digitados, para que o usurio no precise redigitar todos os valores
novamente. Observe que todo o cdigo HTML que gera o formulrio retornado
utilizando-se Response.Write da linha 124 linha 189.
Vamos testar o funcionamento da pgina cadastro.asp.
Na Figura 6.5, o usurio preencheu alguns campos, porm no preencheu os campos
obrigatrios Bairro e Rua.
359
Figura 6.6: O usurio informado que alguns campos obrigatrios no foram preenchidos.
Agora o usurio preenche os campos obrigatrios que esto faltando, conforme indicado na
Figura 6.7.
360
NOTA
Existem maneiras mais simples para executar este procedimento. Optei pela utilizao de trs
pginas, para que os passos envolvidos ficassem bem claros. O cdigo ASP tambm foi
desenvolvido de uma maneira didtica, visando facilitar o entendimento do mesmo.
361
<HTML>
<HEAD>
</HEAD>
<BODY>
<%
10
11
Set conn=Server.CreateObject(ADODB.Connection)
12
13
14
conn.ConnectionString = PROVIDER=MICROSOFT.JET.OLEDB.4.0;
15
conn.Open
16
17
18
da tabela Produtos
19
20
21
22
23
%>
362
24
25
26
27
28
<%
29
30
31
32
na lista.
33
34
35
Produtos.MoveNext
36
Loop
37
%>
38
</SELECT>
39
<BR>
40
<BR>
41
<HR>
42
43
</FORM>
44
</BODY>
45
</HTML>
Para esta listagem vamos comentar apenas o cdigo ASP que constri a lista com os nomes de
produtos disponveis.
Lembrando da nossa reviso de HTML, o cdigo para construir uma Caixa de combinao
o seguinte:
<SELECT id=select1 name=Item1>
<OPTION value=Item1>Item1</OPTION>
<OPTION value=Item2>Item2</OPTION>
363
<OPTION value=Item3>Item3</OPTION>
</SELECT>
Neste exemplo temos uma lista com trs 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, teramos que criar a seguinte opo:
<OPTION value=Alice Mutton>Alice Mutton</OPTION>
A primeira vez que aparece o nome value=Alice Mutton a designao do nome associado
com cada opo. Na segunda vez que aparece o nome, a definio do texto que ser exibido
na lista. Para construir esta lista dinamicamente, utilizamos o seguinte cdigo ASP:
33
34
35
36
Produtos.MoveNext
Loop
IMPORTANTE
Observe que utilizamos Chr(34) antes e depois de Produtos.Fields(ProductName), na definio
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 espao em branco no nome. Se
no utilizssemos 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, no iramos encontr-lo na tabela Produtos.
Ao carregarmos a pgina produto.asp, obteremos o resultado indicado na Figura 6.9.
Nesta pgina o usurio seleciona o produto a ser alterado, conforme indicado na Figura 6.10,
onde o usurio selecionou o produto Camembert Pierrot. Aps selecionar o produto, o usurio
clica no boto Localizar Produto. Ao fazer isso, chamada a pgina localiza.asp, que ir
carregar o registro correspondente ao produto selecionado.
364
365
<HTML>
<HEAD>
</HEAD>
<BODY>
<%
10
11
Set conn=Server.CreateObject(ADODB.Connection)
12
13
14
conn.ConnectionString = PROVIDER=MICROSOFT.JET.OLEDB.4.0;
15
conn.Open
16
17
18
da tabela Produtos
19
20
21
Produtos.Open inst_sql,conn,3,3
22
23
24
%>
25
26
<P><I><B><FONT size=4>
Depois clique no boto Atualizar Produto</FONT>.</B></I></P>
366
27
28
<%
29
30
31
32
%>
33
<TABLE>
34
<%
35
36
37
38
40
41
42
43
367
44
45
46
%>
47
</TABLE>
48
<BR>
49
<HR>
50
51
</FORM>
52
</BODY>
53
</HTML>
NOTA
Algumas linhas aparecem divididas em duas ou mais linhas. Nunca demais lembrar que as
mesmas devem ser digitadas como uma linha nica; apenas esto exibidas, em duas ou mais
linhas, por questo de espao.
Esta uma instruo SQL, que utiliza a clusula WHERE para pesquisar apenas o registro
cujo nome do produto foi selecionado na lista de produtos. Vamos supor que o usurio tenha
selecionado o produto Geitost. A instruo SQL para localizar o registro para este produto,
deve ser a seguinte:
Select * from Produtos WHERE Produtos.ProductName=Geitost
Observe no cdigo da linha 20 que colocamos o apstrofe logo aps o sinal de igual (=), depois
utilizamos Request.Form(listaprodutos), para capturar o valor do produto que o usurio
selecionou na lista de produtos e, finalmente, anexamos o apstrofe final ( ). Com isso o cdigo
ASP monta a instruo SQL correta, seja qual for o produto selecionado na lista de produtos.
Um detalhe importante a ser observado que o critrio, quando for um campo de texto, deve vir
entre os sinais de apstrofe. J para um campo do tipo data, o critrio deve vir entre os sinais #.
368
Uma vez montada a instruo SQL corretamente, a mesma passada como parmetro para o
mtodo Open do RecordSet Produtos. Com isso, apenas o registro para o produto selecionado,
ser retornado pelo banco de dados.
Aps termos recuperado o registro para o produto selecionado, passamos a montar um
formulrio, onde so exibidos os diversos campos do produto selecionado. Observe
que utilizamos uma tabela para facilitar o posicionamento e o alinhamento dos campos. Cada uma das linhas da tabela, possui duas colunas: uma onde vai a descrio 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>Cdigo:</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 usurio selecionou o produto Queso Cabrales.
369
<HTML>
<HEAD>
</HEAD>
<BODY>
<%
370
10
11
Set conn=Server.CreateObject(ADODB.Connection)
12
13
14
conn.ConnectionString = PROVIDER=MICROSOFT.JET.OLEDB.4.0;
DATA SOURCE=c:\meus documentos\nwind.mdb
15
conn.Open
16
17
18
19
20
21
Produtos.Open inst_sql,conn,3,3
22
23
Produtos.Fields(ProductName)= Request.Form(ProductName)
24
Produtos.Fields(SupplierID)= Request.Form(SupplierID)
25
Produtos.Fields(CategoryID)= Request.Form(CategoryID)
26
Produtos.Fields(QuantityPerUnit)= Request.Form(QuantityPerUnit)
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
32
Produtos.Fields(Discontinued)= Cbool(Request.Form(Discontinued))
Atualizo o registro, utilizando o mtodo Update.
33
Produtos.Update
34
Response.Write PRODUTO :
35
Response.Write Request.Form(ProductName)
36
37
Response.Write <HR>
38
%>
39
40
</BODY>
41
</HTML>
Produtos.Fields(ProductName)= Request.Form(ProductName)
24
Produtos.Fields(SupplierID)= Request.Form(SupplierID)
25
Produtos.Fields(CategoryID)= Request.Form(CategoryID)
26
Produtos.Fields(QuantityPerUnit)= Request.Form(QuantityPerUnit)
371
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
33
Cada campo do registro recebe o valor contido no campo respectivo do formulrio da Figura
6.12. Depois utilizamos o mtodo Update para atualizar o registro. No momento que chamamos
o mtodo Update que as atualizaes so gravadas no banco de dados.
372
373
e apresenta um link para que o usurio possa voltar para a pgina produto.asp para selecionar
um outro produto a ser atualizado, conforme indicado na Figura 6.16.
IMPORTANTE
Veja que atravs da utilizao de ASP podemos construir aplicaes Web com as mesmas
funcionalidades de banco de dados existentes em aplicaes tradicionais. Podemos inserir, pesquisar
e alterar registros. No prximo item aprenderemos a eliminar registros, utilizando ASP.
374
<HTML>
<HEAD>
</HEAD>
<BODY>
<%
375
10
11
Set conn=Server.CreateObject(ADODB.Connection)
12
13
14
conn.ConnectionString = PROVIDER=MICROSOFT.JET.OLEDB.4.0;
15
conn.Open
16
17
18
19
20
21
Produtos.Open inst_sql,conn,3,3
22
23
24
Response.Write existe mais do que um <BR> produto com este nome: </B>
25
26
Response.Write Request.Form(ProductName)
Else
27
Produtos.Delete
28
Response.Write PRODUTO:
29
Response.Write Request.Form(ProductName)
30
31
32
Response.Write <HR>
33
%>
34
35
</BODY>
36
</HTML>
NOTA
Algumas linhas aparecem divididas em duas ou mais linhas. Nunca demais lembrar que
estas devem ser digitadas como uma linha nica. As mesmas esto exibidas em duas ou mais
linhas apenas por questo de espao.
376
24
25
26
Response.Write existe mais do que um <BR> produto com este nome: </B>
Response.Write Request.Form(ProductName)
Else
27
Produtos.Delete
28
Response.Write PRODUTO:
29
Response.Write Request.Form(ProductName)
30
31
Neste cdigo utilizamos o mtodo RecordCount para verificar se no foi encontrado nenhum
produto (RecordCount = 1) ou foi encontrado mais do que um produto (RecordCount>1).
Nestas duas situaes informamos que o produto no existe ou existe mais do que um produto
com o nome selecionado. Em ambos os casos no podemos utilizar o mtodo Delete.
Caso tenha sido encontrado somente um registro (RecordCount = 1), utilizamos o mtodo
Delete do objeto Produtos, para eliminar o registro encontrado.
Neste exemplo, utilizamos o mtodo Delete sem nenhum parmetro, o que faz com que seja
eliminado somente o registro atual. Podemos passar um parmetro para o mtodo Delete, o
qual altera o comportamento do mesmo. Para isso utilizaramos a seguinte sintaxe:
RecordSet.Delete parmetro
Na Tabela 6.11, descrevemos os valores mais utilizados para o parmetro do mtodo Delete.
Tabela 6.11 Valores de parmetro para o mtodo Delete.
Valor
Descrio
377
378
Os dados do produto Filo Mix so exibidos para que o usurio confira se este realmente o
produto a ser excludo no banco de dados. Para excluir o produto selecionado s clicar no
boto Excluir Produto.
Ao clicar no boto Excluir Produto, chamada a pgina exclui.asp, que exclui o produto
selecionado, e exibe uma mensagem de que a excluso foi realizada com sucesso e apresenta
um link para que o usurio possa voltar para a pgina produto.asp para selecionar um outro
produto a ser excludo, conforme indicado na Figura 6.20.
379
IMPORTANTE
Veja que atravs da utilizao de ASP podemos construir aplicaes Web com as mesmas
funcionalidades de banco de dados existentes em aplicaes tradicionais. Podemos inserir,
pesquisar, alterar e excluir registros.
<HTML>
<HEAD>
</HEAD>
<BODY>
<%
10
11
Set conn=Server.CreateObject(ADODB.Connection)
12
380
13
14
15
conn.Open
16
17
18
da tabela Orders.
19
20
21
22
23
24
%>
25
26
27
</I></B>
28
<HR>
29
</P>
30
<%
31
32
33
34
Pedidos.Filter = AnoPedido=1994
35
36
%>
381
37
<%
38
<TABLE>
39
<TR>
40
<TD>Cdigo</TD>
41
<TD>Data</TD>
42
<TD>Cidade</TD>
43
<TD>Pas</TD>
44
<TD>Ano</TD>
45
</TR>
46
<%
47
Pedidos.MoveFirst
48
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)
55
%></TD>
</TR>
56
<%
57
Pedidos.MoveNext
58
Loop
59
%>
60
</TABLE>
61
</BODY>
62
</HTML>
382
Observe que na instruo SQL, utilizamos a funo Year(NomeDoCampo), para criar um campo
chamado AnoPedido, o qual contm apenas o ano da data do Pedido. Esta construo mostra o
poder e a simplicidade da linguagem SQL, motivo pelo qual foi colocado anteriormente sobre a
importncia de aprendermos a utilizar com eficincia a linguagem SQL.
Agora vamos observar a utilizao da propriedade Filter, no seguinte fragmento de cdigo:
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 necessrio exibir apenas os pedidos para o ano de 1994 e cujo pas 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
Este comando deve ser digitado em uma nica linha, alm disso os espaos devem ser
rigorosamente respeitados. Aps fechar parnteses, apenas um espao, aps o OR mais um
espao e assim por diante. Na Figura 6.24 temos o resultado desta pesquisa, na qual so
exibidos apenas os pedidos para o Brazil e para a Germany, no ano de 1994.
Observe que, com a correta utilizao 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
Neste caso o % funciona como um caractere curinga, isto , a primeira letra do nome deve ser
J e o que vem depois no importa. Neste caso seriam retornados registros tais como:
Jos da Silva
Juvenal Pereira
Jlio Battisti
Concluso
No incio do captulo aprendemos a estabelecer conexes com banco de dados, sem utilizar
ODBC. Fizemos isto, definimos a propriedade ConnectionString do objeto Connection,
385
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.
Neste captulo tambm fizemos um estudo detalhado do objeto RecordSet.
Saber utilizar o objeto RecordSet de fundamental importncia para a criao de aplicaes
Web com acesso a bancos de dados. Estudamos os diversos mtodos, propriedades e eventos
deste objeto.
Aprendemos a criar pginas ASP que fazem operaes bastante comuns em aplicaes Web,
tais como:
Pesquisar registros em um banco de dados.
Alterar registros.
Eliminar registros.
Fazer a validao dos dados digitados em um formulrio.
Filtrar os registros retornados por um objeto RecordSet.
386
Captulo 7
Bancos de Dados com ASP
Conceitos Avanados Parte II
387
Neste captulo sero apresentados mais alguns tpicos 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 operaes que envolvem diversos
registros como, por exemplo, atualizar o campo PreoUnitrio em todos os registros da
tabela Produtos. O objeto Command tambm pode ser utilizado para passar parmetros para
uma Consulta Parametrizada.
Faremos um exemplo completo sobre a passagem de parmetros para uma Consulta
Parametrizada do Microsoft Access. Com a utilizao de Consultas Parametrizadas podemos
criar pginas ASP bastante flexveis, que nos permitem executar consultas de maneira interativa
com o banco de dados. O usurio seleciona um valor para um ou mais parmetros e executa
a consulta. Caso deseje uma nova consulta s selecionar novos valores para os parmetros
e executar novamente a consulta. Com isso podemos obter uma srie de resultados de maneira
simples e prtica.
Veremos exemplos de acesso a banco de dados com a utilizao dos mtodos e propriedades
do objeto Command. Sero apresentadas tabelas com a descrio dos principais mtodos e
propriedades deste objeto. A utilizao do objeto Command especialmente indicada para
situaes onde temos que passar parmetros para Consultas Parametrizadas ou para Stored
Procedures. Atravs da utilizao do objeto Command e de seus mtodos, propriedades e
colees, podemos criar os diversos parmetros necessrios, pass-los para o banco de dados
e, at mesmo, receber valores de retorno de Stored Procedures em parmetros definidos para
o objeto Command.
Tambm estudaremos o objeto Parameter, utilizado na criao e definio dos parmetros a
serem utilizados pelo objeto Command. Veremos como criar e definir um determinado
parmetro.
Tambm sero apresentadas tabelas com a descrio dos principais mtodos e propriedades
dos diversos objetos estudados.
Na seqncia, analisaremos mais alguns exemplos de pesquisa em banco de dados, utilizando
pginas ASP. Trataremos um pouco mais sobre a construo de instrues SQL avanadas, as
quais utilizam o operador Like e funes de agregao como Sum, Avg, Min e Max. Tambm
trataremos, diretamente em uma instruo SQL, da utilizao dos operadores And e Or, bem
como de funes como Year, Month e Day.
Como exemplo de aplicao, no final do captulo, criaremos um formulrio que permite que
o prprio usurio defina a pesquisa a ser realizada. No formulrio, o usurio poder fazer
pesquisa na tabela Orders do banco de dados Nwind. O usurio poder decidir se deseja
fazer a pesquisa por Pas de destino, Pas de destino e Cidade, por Ano da Data do Pedido ou
388
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 execuo de
comandos que necessitem de parmetros, 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 parmetros). Os valores recebidos so utilizados, normalmente, como critrios
de pesquisa, de tal forma que somente sero retornados os registros que atenderem os critrios
especificados. Por exemplo, poderamos ter um parmetro no campo ShipCountry da tabela
Orders do banco de dados nwind.mdb. Se passarmos para este parmetro o valor Germany,
sero 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
contrrio obteremos um erro quando a pgina for carregada.
Para iniciarmos o estudo do objeto Command, vamos analisar o exemplo da Listagem 7.1.
389
<HTML>
<HEAD>
</HEAD>
<BODY>
<%
10
11
Set conn=Server.CreateObject(ADODB.Connection)
12
13
14
conn.ConnectionString = PROVIDER=MICROSOFT.JET.OLEDB.4.0;
15
conn.Open
16
17
18
19
20
com_orders.ActiveConnection = conn
21
22
mtodo Execute.
23
24
chamado Ped.
25
26
Set Ped=com_orders.Execute
390
27
%>
28
<HR>
29
<TABLE>
30
<TR>
31
<TD>Cdigo</TD>
32
<TD>Data
33
</TD>
</TR>
34
35
<%
36
Do Until Ped.EOF
37
%>
38
<TR>
39
<TD><%=Ped.Fields(OrderID)
40
%> </TD>
<TD><%=Ped.Fields(OrderDate)%> </TD>
41
</TR>
42
<%
43
Ped.MoveNext
44
Loop
45
%>
46
</TABLE>
47
<HR>
48
</BODY>
49
</HTML>
391
Em seguida definimos a conexo 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 sero executados na conexo
conn, que est ligada ao banco de dados nwind.mdb.
Agora criamos um objeto do tipo RecordSet chamado Ped:
25
O ltimo passo utilizar o mtodo Execute do objeto com_orders. Ao utilizarmos este mtodo,
executada a instruo contida na propriedade CommandText. O resultado retornado para
o objeto RecordSet especificado no comando, conforme indicado abaixo:
26
Set Ped=com_orders.Execute
392
Neste caso aps a execuo do mtodo Execute, os registros retornados estaro 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 mtodo 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 mtodo Open do objeto RecordSet, como j fizemos nos captulos anteriores?.
A resposta simples. Estamos estudando o objeto Command porque existem determinadas
operaes que somente podem ser executadas com este objeto, como por exemplo, passar
parmetros para um Stored Procedure ou uma Consulta Parametrizada.
Agora que j fizemos um estudo preliminar do objeto Command, vamos apresentar as demais
propriedades e mtodos deste objeto.
Descrio
Cancel
CreateParameter
Execute
393
Descrio
ActiveConnection
CommandText
CommandTimeout
CommandType
Name
Parameters
Prepared
Properties
State
394
Na Tabela 7.3, temos uma relao dos tipos de comandos possveis, os quais so definidos
pela propriedade CommandType.
Tabela 7.3 Valores possveis para a propriedade CommandType.
Valor/Constante
Tipo de comando
-1/adCmdUnspecified
1/adCmdText
2/adCmdTable
4/adCmdStoredProc
8/adCmdUnknown
256/adCmdFile
512/adCmdTableDirect
ou
Objeto.CommandType = constante
Observe que podemos utilizar o valor numrico 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
Existe um grande nmero de constantes predefinidas para os objetos ADO. Estas constantes
esto localizadas nos seguintes arquivos:
adovbs.inc: Constantes para a linguagem VBScript.
adojavas.inc: Constantes para a linguagem JScript.
Estes arquivos esto localizados, normalmente, em uma das seguintes pastas:
Para o Windows 2000 em Portugus: Arquivos de programas\Arquivos comuns\System\ADO.
Para o Windows 2000 em Ingls: Program Files\Common Files\system\ado.
Para que possamos utilizar estas constantes, devemos utilizar uma diretiva include para incluir
estes arquivos, ou definir uma referncia utilizando a tag a seguir:
<!- -METADATA TYPE=typelib uuid={00000205-0000-0010-8000-00AA006D2EA4} ->
Esta tag deve ser includa dentro da seo <HEAD></HEAD> de cada pgina ASP que
utilizar as constantes ou no arquivo global.asa. Ao serem includas no arquivo global.asa, as
constantes estaro disponveis para qualquer pgina ASP que faa parte da aplicao Web.
NOTA
Voltaremos a falar sobre o arquivo global.asa.
Agora vamos ver alguns exemplos de cdigo para o objeto Command, alguns de seus mtodos
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)
Agora abro uma conexo com o arquivo nwind.mdb
utilizando OLE DB.
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
Uma vez criado o objeto Command, vamos definir qual a conexo 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 invs do valor numrico 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 execuo deste objeto Command,
utilizando a propriedade CommandTimeout:
com_orders.CommandTimeout= 120
Agora vamos criar um objeto RecordSet e utilizar o mtodo 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 criao de consultas no Microsoft Access, consulte a documentao do
produto ou consulte o livro Microsoft Access 2000 Curso Bsico e Rpido, da editora Axcel Books.
Na Figura 7.2 temos uma consulta do Microsoft Access. A consulta baseada na tabela Orders
e foram includos os seguintes campos:
OrderID
OrderDate
ShipName
397
ShipCity
ShipCountry
398
Podemos definir um critrio de filtragem. Por exemplo, queremos que sejam exibidos os pedidos
apenas para a Argentina. Para isso poderamos especificar um critrio para o campo
ShipCountry, conforme indicado na Figura 7.4.
399
Observe que somente foram exibidos os pedidos para a Argentina, o que confirma o correto
funcionamento do critrio que foi especificado.
Porm esta maneira de especificar critrios pouco flexvel, pois cada vez que quisermos
alterar o critrio, teremos que digitar o novo critrio, salvar a consulta e execut-la novamente.
Podemos obter uma maior flexibilidade especificando um parmetro para a consulta. Depois,
colocamos este parmetro como critrio no campo ShipCountry. Ao especificarmos um
parmetro como critrio para este campo, cada vez que a consulta for executada, o Microsoft
Access nos pergunta o valor do parmetro. Ns digitamos o valor desejado que passa a servir
como critrio de filtragem.
Para definir um parmetro, selecione o menu Consulta -> Parmetros. Na janela que surge
digite Pais (sem acento) para o nome do parmetro e selecione Texto para o tipo do parmetro,
conforme indicado na Figura 7.6.
400
Figura 7.9: Execuo da consulta com o valor do parmetro definido como France.
401
Utilizando parmetros, cada vez que a consulta executada, podemos fornecer um valor
diferente para o parmetro, valor esse que serve para filtrar os resultados. Podemos definir
parmetros em mais do que um campo da consulta, com isso, ao executar a consulta, sero
pedidos valores para cada um dos parmetros definidos.
O nosso objetivo poder, a partir de uma pgina ASP, executar uma Consulta Parametrizada
do Microsoft Access. Para isso, precisamos passar, a partir da pgina ASP, os valores para os
parmetros definidos na consulta. Isso possvel de ser feito com a utilizao do objeto
Parameter e a propriedade Parameters do objeto Command.
Na seqncia deste captulo estudaremos o objeto Parameter, bem como a passagem de
parmetros utilizando o 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 captulo.
O Objeto Parameter
O objeto Parameter representa parmetros associados com Consultas Parametrizadas ou
argumentos de entrada e valores de retorno para Stored Procedures. Com a utilizao do
objeto Parameter podemos definir, detalhadamente, os parmetros que sero enviados para
uma Consulta Parametrizada, ou os argumentos de entrada enviados para um Stored Procedure.
Na Tabela 7.4, temos uma descrio das principais propriedades do objeto Parameter.
Tabela 7.4 Principais propriedades do objeto Parameter.
Propriedade
Descrio
Attributes
Direction
Name
NumericScale
402
Propriedade
Descrio
Precision
Size
Type
Value
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 ms 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 tambm pode retornar valores aps a sua
execuo. Podemos utilizar o objeto Parameter para enviar argumentos de entrada e tambm
para receber os valores calculados pelo Stored Procedure.
Para cada parmetro, que o objeto Command precisa tratar, criado um objeto Parameter.
Todos os objetos Parameter podem ser acessados atravs da coleo Parameters do objeto
Command. Para criar um objeto do tipo Parameter, podemos utilizar o mtodo CreateParameter
do objeto Command.
403
command2.asp
procurapais.asp
nwind.mdb
Consulta:
con_pedidos
<HTML>
<HEAD>
</HEAD>
<BODY>
<%
10
11
Set conn=Server.CreateObject(ADODB.Connection)
12
13
14
conn.ConnectionString = PROVIDER=MICROSOFT.JET.OLEDB.4.0;
DATA SOURCE=c:\meus documentos\nwind.mdb
15
conn.Open
16
17
18
da tabela Produtos
19
404
22
23
pedidos efetuados.
24
%>
25
26
27
28
29
<%
30
31
32
33
na lista.
34
35
36
Paises.MoveNext
37
Loop
38
%>
39
</SELECT>
40
<BR>
41
<HR>
42
43
</FORM>
44
</BODY>
45
</HTML>
405
Agora precisamos construir a pgina procurapais.asp. Esta pgina receber o valor selecionado
na lista, passar este valor para o parmetro Pais da consulta con_pedidos, a qual ir retornar
somente os pedidos para o pas selecionado. A pgina procurapais.asp tambm exibir os
resultados obtidos.
Na Listagem 7.3 temos o cdigo que cria a pgina procurapais.asp.
Listagem 7.3 Passando um valor para o parmetro Pais da consulta con_pedidos.
1
<HTML>
<HEAD>
</HEAD>
<TITLE>Resultados da pesquisa.</TITLE>
<BODY>
<%
10
11
Set conn=Server.CreateObject(ADODB.Connection)
12
13
14
conn.ConnectionString = PROVIDER=MICROSOFT.JET.OLEDB.4.0;
DATA SOURCE=c:\meus documentos\nwind.mdb
15
conn.Open
16
17
18
19
20
21
22
23
406
24
25
26
27
28
adCmdStoredProc
29
30
com_paises.ActiveConnection = conn
31
com_paises.CommandType = 4
32
33
34
nome_par = Pais
35
36
37
na lista de pases.
38
valor_par= Request.Form(listapaises)
39
40
caractersticas do parmetro.
41
42
43
dire_par = 1
44
45
Set pais_par=com_paises.CreateParameter
(nome_par,tipo_par,dire_par,tama_par,valor_par)
46
47
com_paises.Parameters.Append pais_par
48
407
49
da consulta con_pedidos
50
com_paises.CommandText = con_pedidos
51
52
53
54
55
56
57
58
%>
59
60
61
62
63
64
<%
65
66
67
68
na lista.
69
70
71
72
Response.Write SELECTED
73
End If
74
75
Paises.MoveNext
76
Loop
77
%>
408
78
</SELECT>
79
80
</FORM>
81
<%
82
83
con_pedidos.
84
%>
85
86
<HR>
87
88
<TABLE border=1>
89
<TR>
90
<TD><B>Cdigo</B></TD>
91
<TD><B>Data</B></TD>
92
<TD><B>Cidade</B></TD>
93
<TD><B>Pas</B></TD>
94
95
</TR>
<%
96
97
98
<TR>
99
<TD><% =Resultados.Fields(OrderID)
%></TD>
100
<TD><% =Resultados.Fields(OrderDate)
%></TD>
101
<TD><% =Resultados.Fields(ShipCity)
%></TD>
102
103
</TR>
409
107 </TABLE>
108 <BR>
109 <HR>
110 </BODY>
111 </HTML>
A Listagem 7.3 salienta diversos pontos importantes na utilizao do objeto Command para a execuo
de Consultas Parametrizadas, atravs da passagem de parmetros utilizando o objeto Parameter.
Vamos detalhar alguns trechos desta listagem. Observe o seguinte trecho de cdigo:
29
30
com_paises.ActiveConnection = conn
31
com_paises.CommandType = 4
NOTA
Na Tabela 7.3 esto listados os valores e respectivas constantes para a propriedade
CommandType.
Em seguida comeo a definir as caractersticas do parmetro que ser criado e passado para a
consulta. Isto feito com o seguinte trecho de cdigo:
32
33
34
nome_par = Pais
35
36
37
na lista de pases.
410
38
valor_par= Request.Form(listapaises)
39
40
caractersticas do parmetro.
41
42
43
dire_par = 1
Primeiro definimos o nome do parmetro, que deve ser o mesmo utilizado para a definio
do parmetro, quando da criao da consulta no Microsoft Access. Neste caso criamos uma
varivel chamada nome_par e definimos o seu valor como Pais.
Logo em seguida criamos a varivel valor_par, a qual ir conter o valor que ser passado para
o parmetro Pais. Este valor o selecionado na lista de pases da pgina command2.asp,
conforme indicado pelo cdigo abaixo:
38
valor_par= Request.Form(listapaises)
Seguindo as definies, criamos uma varivel para o tipo do parmetro tipo_par. A esta
varivel foi atribudo o valor 129. Ao invs do valor 129 poderamos ter utilizado a constante
adChar, que define o parmetro 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 parmetro.
Tabela 7.5 Principais Valores/Constantes para definio do tipo do parmetro.
Valor/Constante
Descrio
0x2000/adArray
20/adBigInt
128/adBibary
11/adBoolean
8/sdBSTR
129/adChar
411
Valor/Constante
Descrio
6/adCurrency
7/adDate
134/adDBTime
135/adDBTimeStamp
14/adDecimal
5/adDouble
0/adEmpty
10/adError
72/adGUID
3/adInteger
4/adSingle
Em seguida definimos um tamanho mximo em bytes para o parmetro, que no nosso exemplo
foi definido para 50, conforme indicado pelo seguinte comando:
42
Finalmente definimos uma varivel para conter o valor de definio para a propriedade
Direction do parmetro. Este valor foi definido em 1, o que significa um parmetro de entrada,
isto , um parmetro que envia um valor para a consulta do Microsoft Access. Esta definio
est indicada no cdigo a seguir:
43
dire_par = 1
Ao invs do valor 1, poderamos 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.
Tabela 7.6 Valores/Constantes para a propriedade Direction.
Valor/Constante
Descrio
1/adParamImput
2/adParamOutput
412
Valor/Constante
Descrio
3/adParamInputOutput
4/adParamReturnValue
0/adParamUnknown
NOTA
Criamos variveis para conter estes valores. Depois passaremos estas variveis para o mtodo
CreateParameter. Ao invs de criarmos as variveis, poderamos passar os valores diretamente para
o mtodo CreateParameter. Adotamos este procedimento para facilitar o entendimento do cdigo.
45
Set pais_par=com_paises.CreateParameter
(nome_par,tipo_par,dire_par,tama_par,valor_par)
Onde temos:
Name: O nome do parmetro.
Type: O tipo do parmetro. Os principais valores de tipo possveis esto listados na
Tabela 7.5.
Direction: Definio da direo do parmetro. Os principais valores de direo possveis,
esto listados na Tabela 7.6.
Size: Define o tamanho mximo para o parmetro.
Value: Define o valor do parmetro. No nosso caso o valor que ser enviado para a
consulta con_pedidos, e que servir como critrio de filtragem para o campo
ShipCountry.
Uma vez criado o parmetro hora de adicion-lo coleo Parameters do objeto Command.
Para fazer isso, utilizamos o mtodo Append da coleo Parameters, conforme indicado a seguir:
46
47
com_paises.Parameters.Append pais_par
413
Observe que passamos para o mtodo Append o nome do objeto Parameter a ser adicionado
a coleo Parameters. Utilizando Append, podemos adicionar novos parmetros.
Agora preciso definir a propriedade CommandText do objeto com_paises. Como definimos a
propriedade CommandType como 4 (Stored Procedure), vamos passar para o objeto
CommandText o nome da consulta a ser executada, que no nosso exemplo con_pedidos.
Isto feito com o seguinte cdigo:
50
com_paises.CommandText = con_pedidos
O passo final criar um objeto RecordSet utilizando o mtodo Execute do objeto Command.
Isto feito com o seguinte cdigo:
54
55
Assim, o valor selecionado na lista de pases passado para a consulta con_pedidos. A consulta
executada e somente so retornados os registros em que o campo ShipCountry contm o
valor selecionado na lista de pases.
Com a utilizao do objeto Command e do objeto Parameter foi possvel executar uma Consulta
Parametrizada no Microsoft Access, passando o valor do parmetro para a consulta.
414
Vamos supor que o usurio selecionou Norway, na lista de pases. Ao clicar no boto Pesquisar
sero exibidos apenas os pedidos para o pas selecionado, conforme indicado na Figura 7.12.
415
416
IMPORTANTE
Estaremos utilizando exemplos que acessam bancos de dados do Microsoft Access. Para o
acesso a outros bancos de dados, podem existir pequenas diferenas, dependendo do OLE DB
Provider para cada caso. Caso voc esteja utilizando outro banco de dados, consulte a
documentao do padro SQL do mesmo.
417
NOTA
Estamos tomando como base a tabela Customers do banco de dados nwind.mdb.
Esta instruo 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 diferena importante em relao a critrios de texto. Quando
utilizamos o Microsoft Access, todo critrio de texto deve vir entre aspas (), j no caso de
pginas ASP, todo critrio de texto deve vir entre apstrofes ().
<HTML>
<HEAD>
</HEAD>
418
<BODY>
<%
Set conn=Server.CreateObject(ADODB.Connection)
10
11
conn.ConnectionString = PROVIDER=MICROSOFT.JET.OLEDB.4.0;
12
13
conn.Open
14
15
16
17
Cust.Open inst_sql,conn,3,3
18
%>
19
<P>
20
21
22
</B></FONT>
23
</P>
24
<HR>
25
<TABLE>
26
<TR>
27
<TD><B>Cdigo</B></TD>
28
<TD><B>Nome </B></TD>
29
<TD><B>Cidade
30
</TR>
31
<%
</B></TD>
419
32
Do Until Cust.EOF
33
%>
34
<TR>
35
<TD><%=Cust.Fields(CustomerId)
36
<TD><%=Cust.Fields(CompanyName)%> </TD>
37
38
%> </TD>
<TD><%=Cust.Fields(City)%> </TD>
</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.
420
utilizao do operador Like facilita a nossa vida. Para obter o resultado desejado, bastaria
alterar a instruo SQL da Listagem 7.4. A instruo deve ficar da seguinte maneira:
inst_sql=Select * from Customers where CompanyName Like %La%
Bastou colocar mais um caractere % antes do La. Com isso sero retornados todos os registros que
contiverem La em qualquer parte do campo CompanyName, conforme indicado na Figura 7.16.
Na Figura 7.17 temos a listagem obtida aps esta alterao da instruo SQL.
421
NOTA
Ao invs de digitar a instruo SQL diretamente no cdigo ASP, a mesma pode ser construda
a partir de valores digitados ou selecionados em um formulrio. No final do captulo, criaremos
um formulrio genrico para pesquisas, onde o usurio poder definir por qual ou quais critrios
deseja fazer a pesquisa e selecionar um valor para os critrios. Ao clicar em um boto Pesquisar,
os dados so enviados para uma pgina ASP, que monta a instruo SQL de acordo com as
opes selecionadas pelo usurio.
Com estes exemplos, podemos comprovar a versatilidade e facilidade de uso do operador Like.
422
O Operador And
Quando utilizamos o operador And para ligar dois critrios, somente sero selecionados os
registros que atenderem, ao mesmo tempo, aos dois critrios. Caso o registro somente atenda
a um dos critrios, no ser selecionado. Considere o seguinte exemplo:
inst_sql=Select * from Orders where ShipCountry = France and ShipCity = Lyon
Neste caso somente sero selecionados os registros em que o pas for France e a cidade Lyon,
isto , somente os registros que atenderem aos dois critrios.
Podemos utilizar mais do que um operador And. Com isso podemos especificar trs ou mais
critrios. Mas, a regra se mantm: para que um registro seja selecionado, ele precisa atender
423
a todos os critrios ligados pelos operadores And. Se um nico critrio falhar, o registro no
ser selecionado.
O Operador Or
Quando utilizamos o operador Or para ligar dois critrios, somente sero selecionados os
registros que atenderem, pelo menos, a um dos dois critrios. O registro somente no ser
selecionado se no atender a nenhum dos dois critrios. Considere o seguinte exemplo:
inst_sql=Select * from Orders where ShipCountry = France Or ShipCity = Lyon
Neste caso sero selecionados todos os registros que atenderem a pelo menos um dos critrios,
isto , se o pas for igual a France, o registro ser selecionado, independente da cidade. Se a
cidade for igual a Lyon, o registro ser selecionado, independente do pas. Caso o registro
atenda aos dois critrios tambm ser selecionado. A nica situao em que o registro no ser
selecionado quando no atender a nenhum dos dois critrios ligados pelo operador Or.
Podemos utilizar mais do que um operador Or. Com isso podemos especificar trs ou mais
critrios. Mas a regra se mantm, para que um registro seja selecionado, ele precisa atender a
pelo menos um dos critrios ligados pelos operadores Or. Somente se todos os critrios falharem
que o registro no ser selecionado.
Observe que quando formos definir um critrio para um campo do tipo Data, devemos colocar
o valor entre os sinais de #.
Na figura 7.19, temos o resultado da execuo da instruo SQL do nosso exemplo.
424
425
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. Poderamos utilizar vrios critrios ligados pelo operador Or, porm
existe uma maneira mais simples de fazer isso, que atravs da utilizao 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 critrios para um determinado
campo. A lista de critrios vem entre parnteses, cada critrio deve ser colocado entre
apstrofes e separados por vrgula.
Exemplo 5: Vamos inverter um pouco o exemplo anterior: criar uma listagem de todos os
pedidos, com exceo dos pedidos enviados para os seguintes pases:
Argentina
Brazil
France
Germany
Podemos utilizar a mesma instruo 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 exceo daqueles em que
o campo ShipCountry contiver os valores especificados como parmetros do operador In.
A utilizao de operadores nos permite criar consultas bastante avanadas, combinando
critrios, e utilizando critrios mltiplos. Tambm podemos utilizar as chamadas funes de
agregao, que ser o assunto do prximo item.
426
Descrio
Count( )
AVG( )
Sum( )
Max( )
Min( )
Na Listagem 7.5, temos um exemplo de uma pgina ASP, excount.asp, que faz uso desta
instruo SQL.
Listagem 7.5 Utilizando a funo de agregao Count( ) excount.asp.
1
<HTML>
<HEAD>
</HEAD>
427
<BODY>
<%
10
11
Set conn=Server.CreateObject(ADODB.Connection)
12
13
14
conn.ConnectionString = PROVIDER=MICROSOFT.JET.OLEDB.4.0;
DATA SOURCE=c:\meus documentos\nwind.mdb
15
conn.Open
16
17
18
19
20
Ped.Open inst_sql,conn,3,3
21
%>
22
<P>
23
24
25
</B></FONT>
26
</P>
27
<HR>
28
<TABLE border=1>
29
<TR>
428
30
<TD><B>Pas</B></TD>
31
32
<TD><B>Pedidos
</B></TD>
</TR>
33
<%
34
Do Until Ped.EOF
35
%>
36
<TR>
37
<TD>
38
<TD><B><%=Ped.Fields(Totais)
39
<%=Ped.Fields(ShipCountry)
%>
</TD>
%> </B></TD>
</TR>
40
<%
41
Ped.MoveNext
42
Loop
43
%>
44
</TABLE>
45
<HR>
46
</BODY>
47
</HTML>
429
Exemplo 2: Vamos supor que devssemos alterar a nossa listagem, para classific-la em ordem
descendente do nmero de pedidos, isto , devem ser listados primeiro os pases com o
maior nmero de pedidos. Para obter este resultado, bastaria alterar a instruo SQL, deixandoa 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 ordenao, utilizando a clusula Order By, no podemos utilizar o
alis do campo. O alis o nome que damos ao campo que est sendo calculado. No nosso
exemplo, chamamos o campo com o total de pedidos de Totais. Um alis criado com a
palavra As. Se utilizarmos um alis na clusula Order By, obteremos um erro e a pgina no
ser carregada. A instruo a seguir comete este erro.
430
Figura 7.22: Erro causado pelo uso de um alis na clusula Order By.
Exemplo 3: Agora vamos utilizar a funo Sum para retornar a soma do valor do Frete (Freight)
para cada pas. 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 pgina ASP, exsum.asp, que faz uso desta
instruo SQL.
Listagem 7.6 Utilizando a funo de agregao Sum ( ) exsum.asp.
1
<HTML>
<HEAD>
</HEAD>
<BODY>
431
<%
10
11
Set conn=Server.CreateObject(ADODB.Connection)
12
13
14
conn.ConnectionString = PROVIDER=MICROSOFT.JET.OLEDB.4.0;
DATA SOURCE=c:\meus documentos\nwind.mdb
15
conn.Open
16
17
18
19
20
Ped.Open inst_sql,conn,3,3
21
%>
22
<P>
23
24
25
</B></FONT>
26
</P>
27
<HR>
28
<TABLE border=1>
29
<TR>
30
31
32
<TD><B>Pas</B></TD>
<TD><B>Soma do Frete </B></TD>
</TR>
432
33
<%
34
Do Until Ped.EOF
35
%>
36
<TR>
37
<TD>
38
<TD align=Right><B><%=FormatNumber(Ped.Fields(SomFrei),2)
39
40
<%=Ped.Fields(ShipCountry)
%>
</TD>
%> </B></TD>
</TR>
41
<%
42
Ped.MoveNext
43
Loop
44
%>
45
</TABLE>
46
<HR>
47
</BODY>
48
</HTML>
433
Apenas um comentrio sobre a utilizao da funo FormatNumber: esta funo foi utilizada
para delimitar o resultado da soma em duas casas decimais.
Exemplo 3: Ao invs da funo Sum, vamos utilizar a funo Avg, para retornar a mdia
aritmtica do valor do Frete (Freight) para cada pas. 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
Observe que nesta instruo utilizamos algumas elementos novos, como por exemplo:
434
A clusula Having: quando utilizamos a clusula Group By, devemos utilizar a clusula
Having ao invs da clusula Where.
Utilizamos a funo Davg, que uma funo chamada de domnio. A funo Davg foi
utilizada para calcular a mdia geral do frete na tabela Orders. Utilizamos a seguinte sintaxe:
Davg(Nome_campo,Nome_da_tabela)
<HTML>
<HEAD>
</HEAD>
435
<BODY>
<%
10
11
Set conn=Server.CreateObject(ADODB.Connection)
12
13
14
conn.ConnectionString = PROVIDER=MICROSOFT.JET.OLEDB.4.0;
15
conn.Open
16
17
18
19
20
Ped.Open inst_sql,conn,3,3
21
%>
22
<P>
23
24
25
</B></FONT>
26
</P>
27
<HR>
28
<TABLE border=1>
29
<TR>
30
<TD><B>Mximo</B></TD>
31
<TD><B>Mnimo</B></TD>
32
</TR>
33
<TR>
34
<TD>
<%=Ped.Fields(MaiorFrete)
%>
436
</TD>
35
<TD>
36
</TR>
37
</TABLE>
38
<HR>
39
</BODY>
40
</HTML>
<%=Ped.Fields(MenorFrete)
%>
</TD>
A Figura 7.26 mostra o resultado da pgina exmaxmin.asp, ao ser carregada no Internet Explorer.
Figura 7.26: Resultados obtidos com a utilizao das funes Max( ) e Min( ).
Agora vamos ao nosso exemplo final, no qual iremos construir um formulrio genrico, onde
o usurio poder selecionar por qual campo e por qual critrio deseja fazer a pesquisa.
437
O formulrio permite que sejam feitas pesquisa utilizando um ou mais destes critrios. Na
Figura 7.27 temos um exemplo do formulrio geral.asp, onde o usurio pode selecionar por
quais campos deseja pesquisar a tabela Orders e qual o valor para cada campo.
Figura 7.27: O formulrio onde o usurio define os critrios a serem utilizados geral.asp.
Na Listagem 7.8, temos o cdigo para a pgina geral.asp.
Listagem 7.8 O formulrio para definio dos critrios de pesquisa geral.asp.
1
<HTML>
<HEAD>
</HEAD>
<BODY bgColor=silver>
<HR>
438
<B>
10
tabela de Pedidos.<BR>
11
<FONT color=White>
12
13
<BR>
14
15
<HR>
16
<%
17
18
19
20
Set conn=Server.CreateObject(ADODB.Connection)
21
22
23
conn.ConnectionString = PROVIDER=MICROSOFT.JET.OLEDB.4.0;
24
conn.Open
25
26
27
28
29
30
31
32
33
34
%>
439
35
36
37
38
39
</FONT></B></FONT>
40
41
<%
42
43
44
45
46
Paises.MoveNext
47
Loop
48
%>
49
</SELECT>
50
51
<B>
52
<HR>
53
54
55
56
<BR>
57
</FONT>
58
</B>
59
</FONT>
60
61
<%
440
62
63
64
65
na lista.
66
67
68
Anos.MoveNext
69
Loop
70
%>
71
</SELECT>
72
73
<B>
74
<HR>
75
76
77
78
<BR>
79
80
81
<HR>
82
83
</FORM>
84
</BODY>
85
</HTML>
Observe que mais uma vez as listas com os nomes dos pases e os anos, para os quais existem
pedidos, foram construdas dinamicamente, a partir dos dados da tabela Orders. Ao construir
as listas dinamicamente, evitamos que o usurio tente pesquisar, por exemplo, os pedidos
para um pas que no existe na tabela Orders. Com isso o usurio no perde tempo e faz as
pesquisas apenas para os pases para os quais realmente existem pedidos cadastrados. O
mesmo vlido para a lista com os anos para os quais existem pedidos cadastrados.
441
O prximo passo construir a pgina pesquisa.asp. Esta pgina ir montar uma instruo
SQL de acordo com as opes selecionadas pelo usurio na pgina geral.asp. Por exemplo, se
o usurio marcar Sim somente para a lista de pases e selecionar Argentina, a pgina
pesquisa.asp ter que montar uma instruo SQL que pesquise a tabela Orders e retornar
somente os pedidos em que o campo ShipCountry for igual a Argentina.
Ento vamos construo da pgina pesquisa.asp. O ponto central da pgina pesquisa.asp
a montagem da instruo SQL com base nas opes selecionadas pelo usurio. O usurio
possui trs opes para definir parmetros de pesquisa:
Pas
Data
Endereo
O usurio poder selecionar uma ou mais opes. Com isto teremos oito possibilidades a
serem consideradas; o usurio est pesquisando:
Apenas pelo nome do pas.
Apenas pelo ano da data do pedido.
Apenas pelo endereo ou parte do endereo.
Pelo nome do pas e pelo ano da data do pedido.
Pelo nome e pelo endereo ou parte do endereo.
Pelo ano da data do pedido e pelo endereo ou parte do endereo.
Com base nos trs critrios.
Ou ainda:
O usurio no especificou nenhum critrio de pesquisa.
A pgina pesquisa.asp ter que analisar essas oito possibilidades e montar uma instruo
SQL diferente para cada uma delas.
Na Listagem 7.9, temos o cdigo para a pgina pesquisa.asp.
Listagem 7.9 O formulrio para definio dos critrios de pesquisa pesquisa.asp.
1
<HTML>
<HEAD>
</HEAD>
<BODY bgColor=silver>
442
<%
10
11
Set conn=Server.CreateObject(ADODB.Connection)
12
13
14
conn.ConnectionString = PROVIDER=MICROSOFT.JET.OLEDB.4.0;
15
conn.Open
16
17
**************************************************
18
19
20
Request.Form(pesqend)=Nao) Then
21
22
23
End If
24
**************************************************
25
26
27
28
29
30
End If
31
**************************************************
32
33
443
34
35
36
37
End If
38
**************************************************
39
40
41
42
43
44
45
46
47
End If
48
**************************************************
49
50
51
52
53
54
55
56
57
End If
58
**************************************************
59
60
61
62
63
64
444
65
66
67
End If
68
**************************************************
69
70
71
72
73
74
75
End If
76
**************************************************
77
78
79
80
81
82
83
84
85
End If
86
87
88
89
90
os resultados da pesquisa.
91
*************************************************
92
93
94
%>
95
96
<HR>
97
<TABLE BORDER=1>
445
98
<TR>
99
<TD><B>Cdigo
</B></TD>
100
<TD><B>Data
</B></TD>
101
<TD><B>Endereo</B></TD>
102
<TD><B>Pas
</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 pgina pesquisa.asp no tem nada de especial. Apenas testamos as oito
possibilidades descritas anteriormente. Para cada uma das possibilidades montamos a instruo
SQL correspondente e informamos os critrios de pesquisa especificados pelo usurio.
446
447
Agora vamos clicar no link Clique aqui para fazer outra pesquisa, com isso voltaremos para a
pgina geral.asp, onde poderemos definir outros critrios de pesquisa.
Vamos refinar um pouco mais a nossa pesquisa. Selecione Austria na lista Pas e 1994 na lista
Ano. No esquea de marcar a opo Sim ao lado de cada critrio selecionado, caso contrrio o
critrio ser ignorado. O formulrio de pesquisa dever estar igual ao indicado na Figura 7.30.
448
Figura 7.32: Pesquisando os pedidos para Brazil, no ano de 1994 e com o endereo contendo a palavra Rua.
449
Ao clicar no boto Pesquisar, so obtidos os resultados indicados na Figura 7.33. Observe que foram
encontrados seis registros para Brazil, no ano de 1994, com o endereo contendo a palavra Rua.
Figura 7.33: Listagem de pedidos para Brazil, no ano de 1994, com o endereo contendo a palavra Rua.
Veja que, atravs deste exemplo, conseguimos criar um formulrio de pesquisa extremamente
verstil. Podemos definir de um a trs critrios de pesquisa, alm de definir o valor para cada
critrio. Este exemplo demonstra as possibilidades na utilizao de ASP para a construo de
sites dinmicos.
Concluso
Neste captulo aprendemos uma srie de tcnicas teis na construo de aplicaes Web
profissionais.
Iniciamos pelo estudo dos objetos Command e Parameter, os quais facilitam a execuo de
Consultas Parametrizadas, bem como o envio de parmetros e o recebimento de valores de
retorno dos Stored Procedures. Alm disso, utilizando os mtodos e propriedades dos objetos
450
Command e Parameter podemos ter um controle bastante apurado sobre tipo, tamanho e
outras caractersticas dos parmetros a serem passados para consultas e Stored Procedures.
Foram apresentados exemplos prticos de utilizao destes dois objetos.
Depois passamos a estudar alguns conceitos avanados na utilizao da linguagem SQL.
Aprendemos a utilizar os operadores Like, And e Or, In e Not. Tambm aprendemos a utilizar
as funes de agregao e a funo de domnio Davg. Foram apresentados exemplos prticos de
utilizao dos conceitos avanados da linguagem SQL.
Por fim, apresentamos um exemplo prtico que salienta a natureza dinmica e as capacidades
do ASP 3.0, na construo de sites dinmicos, principalmente no que se refere a conexo e
pesquisas em bancos de dados.
Os exemplos deste captulo foram baseados no arquivo nwind.mdb, o qual fornecido
juntamente com o Microsoft Access. O nome dos campos esto em ingls. Caso voc esteja
utilizando uma verso do nwind.mdb que esteja com o nome dos campos em portugus,
utilize os nomes de campos da sua verso.
No prximo captulo falaremos um pouco mais sobre o que uma aplicao Web e sobre os
conceitos de Sesso e Aplicao, alm de aprendermos o conceito de componentes ASP.
451
Captulo 8
Aplicativos Web
e Componentes
453
Introduo
Neste captulo veremos o que significa uma Aplicao Web criada em ASP, que fica
armazenada no servidor IIS. Veremos exatamente quais os componentes que formam uma
aplicao Web. Revisaremos o conceito de estado e os problemas oriundos do fato do protocolo
HTTP no manter uma conexo aberta aps o carregamento da pgina.
Iremos conhecer a utilizao e o funcionamento do arquivo global.asa, o qual de grande
importncia para o gerenciamento de aplicaes Web no IIS. Em seguida passaremos a estudar
o objeto Session. Com o objeto Session, podemos manter valores para um determinado usurio,
enquanto o mesmo estiver acessando uma aplicao Web.
Por exemplo, quando um usurio passa de uma pgina para outra, a pgina acessada no teria
como acessar as opes selecionadas pelo usurio e os dados da pgina anterior, a no ser que
tivessem sido armazenados em um banco de dados. Ento, a pgina que est sendo acessada,
recuperaria estas informaes a partir deste banco de dados. Porm, trabalhar intensivamente
com o banco de dados pode degradar o desempenho da aplicao.
Com o objeto Session podemos armazenar informaes utilizadas em uma sesso do usurio.
As variveis armazenadas no objeto Session no sero perdidas quando o usurio acessar
outras pginas da nossa aplicao Web. Estas variveis somente sero descartadas quando o
usurio sair da aplicao, ou quando a sesso for encerrada por TimeOut.
O objeto Application pode ser utilizado para compartilhar informaes entre todos os usurios
que esto acessando uma determinada aplicao Web. Enquanto o objeto Session permite
que um usurio tenha acesso variveis armazenadas nele; o objeto Application permite que
todos os usurios que esto acessando a aplicao Web tenham acesso s informaes
armazenadas neste objeto.
Veremos exemplos de cdigo que utilizam os objetos Session e Application, bem como os
diversos mtodos, propriedades e eventos destes objetos.
454
NOTA
Para maiores detalhes sobre os modelos de aplicao de duas ou mais camadas, consulte o
Captulo 1.
Controle de verso: Garantir que todas as estaes de trabalho estejam com a ltima verso
da aplicao uma tarefa nada fcil, a qual, dependendo do nmero de estaes da rede
da empresa, pode exigir uma equipe de Help Desk praticamente dedicada a esta tarefa.
Problemas de conflitos de DLL e padronizao de ambiente tornam a manuteno e o
gerenciamento destas aplicaes uma tarefa difcil e de custo elevado.
455
Estes problemas surgem para cada aplicao 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 aplicaes. A situao torna-se insustentvel, alm do custo de
manuteno e suporte atingir patamares impraticveis.
Para resolver estes e outros problemas das aplicaes Cliente/Servidor tradicionais que
comearam a ser desenvolvidas aplicaes para a Web, das quais vamos falar um pouco mais.
456
NOTA
No Captulo 10 voltaremos a falar de componentes e do Microsoft Transaction Services.
457
No IIS, o ponto de partida para criar uma aplicao Web criar uma pasta. O prximo 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 Captulo 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 diretrio voc criou uma pgina ASP chamada index.asp,
a qual ser a pgina inicial da aplicao Web. Voc lembra como seria o endereo para acessar
a pgina index.asp do diretrio virtual WebApl do servidor www.abc.com.br?
O endereo seria o seguinte:
http://www.abc.com.br/WebApl/index.asp
Dentro da pasta WebApl poderamos criar outras pastas, conforme a necessidade da nossa
aplicao Web. As pastas criadas dentro de uma pasta virtual, j passam a ser acessveis para
o servidor Web. Por exemplo, dentro da pastas WebApl criamos uma pasta chamada Seguranca.
Dentro dela colocamos um arquivo chamado login.asp. O endereo para acessar o arquivo
login.asp seria o seguinte:
http://www.abc.com.br/WebApl/Seguranca/login.asp
Todos as subpastas da pasta WebApl tambm faro parte da aplicao Web. Com isso podemos
concluir, em um primeiro momento, que uma aplicao Web do IIS est ligada criao de
uma pasta virtual no servidor IIS.
O prximo passo configurar as propriedades da aplicao Web. Para isso utilizamos o
Gerenciador do Internet Services, conforme ilustrado nos passos a seguir.
Para configurar as propriedades de uma aplicao Web faa o seguinte:
1. Faa o logon no Windows 2000 Server, com permisses de administrador.
2. Abra o Gerenciador do Internet Services: Iniciar/Programas/Ferramentas administrativas/
Gerenciador do Internet Services.
3. Surge a janela indicada na Figura 8.1.
458
459
460
461
Figura 8.6: A DLL asp.dll responsvel pelo processamento das pginas ASP.
15. No iremos alterar nenhuma opo nesta guia.
16. D um clique na guia Opes de aplicativo.
17. Nesta segunda guia, temos diversas configuraes importantes, conforme indicado na
Figura 8.7.
462
IMPORTANTE
Se voc ativar essa opo, no fornea acesso de execuo aos diretrios pai, caso contrrio,
um script poder tentar executar um programa no autorizado em um diretrio pai.
Linguagem ASP padro: Por padro definida como sendo VBScript. Caso deseje,
pode alterar para JScript. Tambm podemos especificar o nome de qualquer outra
linguagem para a qual tenhamos o interpretador instalado no servidor IIS, como por
exemplo Perl. Esta opo define a linguagem que ser utilizada para interpretar os
comandos dentro das tags <% e %>.
463
Tempo limite do script ASP: Especifica o perodo de tempo durante o qual o ASP
permitir a execuo de um script. Se a execuo do script no terminar ao final do
perodo de tempo limite, o ASP ir par-lo e gravar um evento no arquivo de log de
eventosYdo Windows 2000. Voc pode definir o perodo de tempo limite como um
valor entre 1 e 2147483647, alm de poder substituir essa opo em uma pgina ASP
usando o mtodo Server.ScriptTimeout.
18. No iremos alterar nenhuma opo nesta guia.
19. D um clique na guia Depurao de aplicativo.
20. Na guia Depurao de aplicativo, temos diversas configuraes relacionadas com a
depurao de erros em pginas ASP, conforme indicado na Figura 8.8.
464
Ativar a depurao de script ASP do lado do cliente: Essa caixa de seleo est reservada
para uso futuro e no tem efeito sobre a verso atual do ASP (esta a informao
contida na prpria documentao do IIS 5.0).
Enviar mensagens de erro do ASP detalhadas para o cliente: Selecione essa opo para
enviar informaes especficas de depurao (incluindo o nome do arquivo, a mensagem
de erro e o nmero da linha) para o navegador. Principalmente quando estamos
desenvolvendo nossas aplicaes importante que esta opo esteja selecionado, pois
ao testarmos uma pgina, se a mesma contiver um erro, o navegador informa o nmero
da linha onde est o erro, o que facilita a correo do script.
Enviar mensagem de erro de texto para o cliente: Selecione esta opo para enviar
uma mensagem de erro padro ao navegador quando algum erro impedir o servidor
Web de processar a pgina ASP. Uma mensagem de erro especfica gravada no log de
erros. Voc pode alterar a mensagem de erro padro digitando uma nova mensagem na
caixa de texto. No recomendada a utilizao desta opo no ambiente de
desenvolvimento, pelos motivos descritos no pargrafo anterior.
21. No iremos alterar nenhuma opo nesta guia.
22. D um clique no boto OK para fechar a janela de configurao.
23. D um clique no boto 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 aplicao Web do IIS e quais os elementos que a
compem. Um ltimo elemento, porm no menos importante, um arquivo chamado
global.asa. No prximo item iremos aprender o que este arquivo.
O Arquivo Global.asa
O arquivo global.asa um arquivo opcional, porm bastante comum a utilizao do mesmo
em nossas aplicaes Web residentes no IIS. A extenso .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 informaes de estado de cada usurio que
acessa a aplicao.
No arquivo global.asa possvel especificar scripts de eventos e declarar os objetos que tm
escopo de sesso (Session) ou de aplicao (Application).
No se trata de um arquivo de contedo exibido para os usurios; em vez disso, o arquivo
armazena informaes 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
466
Sub Session_OnStart
End Sub
EventName
Description
Session_OnStart
Runs the first time a user runs any page in your application
Session_OnEnd
Application_OnStart
10
Application_OnEnd
11
</SCRIPT>
12
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>
467
O Objeto Application
Conforme descrito anteriormente, podemos utilizar o objeto Application para compartilhar
informaes entre todos os usurios de um determinado aplicativo. Um aplicativo Web baseado
no ASP definido como todos os arquivos .asp em uma pasta virtual e seus subdiretrios. Como
o objeto Application pode ser compartilhado por mais de um usurio, existem os mtodos Lock e
Unlock para garantir que vrios usurios no tentaro alterar uma propriedade ao mesmo tempo.
Itens do objeto Application podem ser variveis necessrias para todos os usurios que acessam
uma aplicao, como a cotao do dlar ou o ndice da poupana. Tambm podemos utilizar
o objeto Application para criar uma instncia de um componente que fornece uma determinada
funcionalidade utilizada pela nossa aplicao Web.
Uma aplicao Web inicializada quando qualquer uma de suas pginas ASP for acessada. A
partir do momento em que a primeira pgina ASP for acessada, o objeto Application estar
disponvel e quaisquer valores que tenham sido definidos por este objeto, estaro disponveis
para todos os usurios que acessarem a aplicao.
O diagrama da Figura 8.9, demonstra a relao entre o objeto Application, o servidor Web e as
diversas aplicaes Web hospedadas no servidor.
Usurio 1
Aplicao: web1
objeto Application
Usurio 2
Usurio 3
Aplicao: web2
objeto Application
Usurio 4
Usurio 5
Servidor Web
Aplicao: web3
objeto Application
Usurio 6
Figura 8.9: Relao entre o objeto Application, o servidor Web e as diversas aplicaes.
Cada aplicao Web possui seu prprio objeto Application e informaes disponveis no
objeto Application podem ser acessadas por quaisquer usurio que estiverem acessando a
468
aplicao. Tambm podemos notar, na Figura 8.9, que em um mesmo servidor Web podemos
ter vrias aplicaes Web.
Agora passaremos a estudar os eventos, colees e mtodos do objeto Application.
Descrio
OnStart
OnEnd
O cdigo para os eventos OnStart e OnEnd deve ser colocado no arquivo global.asa. Agora
passaremos a estudar a utilizao destes dois eventos.
Evento Application_OnStart
A seguir mostrada a sintaxe para este evento.
469
A seguir temos um exemplo de definio de cdigo para o evento OnStart. Neste exemplo so
criadas duas variveis de nvel de aplicao. Uma com a estao do ano e outra com cotao
do dlar.
<SCRIPT LANGUAGE=VBScript RUNAT.= Server>
Sub Application_OnStart
Application(EstacaoAno) = Inverno
Application(CotDolar) = 1.77
End Sub
</SCRIPT>
As variveis EstacaoAno e CotDolar podem ser acessadas por qualquer usurio, em qualquer
pgina ASP da aplicao Web, pois so variveis de nvel de aplicao, tecnicamente falando,
diramos que so variveis de nvel do objeto Application.
Um detalhe importante a ser lembrado que no apenas no evento Application_OnStart
que podemos definir variveis de nvel de aplicao. Em qualquer pgina ASP podemos
definir uma varivel que estar disponvel para todos os usurios da aplicao. Para isso
utilizamos a mesma sintaxe utilizada no arquivo global.asa, conforme indicado abaixo:
Application(Nome_da_Varivel) = Valor_da_Varivel
Para acessar os valores das variveis do objeto Application muito simples, basta utilizar a
sintaxe:
<% = Application(Nome_da_Varivel) %>
470
Vamos a um exemplo prtico. Suponhamos que tenham sido definidas trs variveis no evento
Application_OnStart da aplicao Web denominada Capitulo8, conforme indicado na Listagem
8.2, onde temos o arquivo global.asa para a aplicao Capitulo8.
Listagem 8.2 Arquivo global.asa onde so definidos trs variveis de nvel de aplicao.
1
Sub Application_OnStart
Application(CotAM)= 1.50
Application(CotPM)= 2.00
End Sub
</SCRIPT>
<HTML>
<HEAD>
</HEAD>
<BODY>
471
<%
hora_dia = hour(Time())
10
If hora_dia<12 Then
11
Response.Write <HR>
12
13
14
Response.Write Application(Mensagem)
15
Response.Write <HR>
16
Else
17
Response.Write <HR>
18
19
20
Response.Write Application(Mensagem)
21
Response.Write <HR>
22
End If
23
%>
24
</BODY>
25
</HTML>
Observe que utilizamos a funo hour(Time( )); como parmetro para a funo hour, passamos
a funo Time. A funo Time captura a hora do servidor Web e a funo hour retira apenas
o valor numrico da hora.
Observe que, para ter acesso a uma varivel do objeto Application, s utilizar a sintaxe:
Application(Nome_da_Varivel)
472
473
Se, por algum motivo, for necessria a alterao das propriedades da conexo, basta
alterar a String de conexo em um nico local (no arquivo global.asa), e no em todas
as pginas que fazem uso da conexo que est sendo alterada.
Na Listagem 8.4, temos um exemplo de conexo criada no evento Application_OnStart.
Listagem 8.4 Criando uma conexo no evento Application_OnStart.
1
Sub Application_OnStart
Application(CotAM)= 1.50
Application(CotPM)= 2.00
C:\Meus documentos\nwind.mdb
10
11
pginas da aplicao.
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 conexo do objeto Application, e com isso disponvel para
todas as pginas da aplicao, devemos utilizar a sintaxe indicada na Listagem 8.4, ou seja:
12
Set Application(conn)=Server.CreateObject(ADODB.Connection)
474
Agora que criamos uma conexo no evento OnStart, podemos utilizar esta conexo em qualquer
pgina da aplicao. Vamos a um exemplo de pgina ASP que utiliza esta conexo.
Na Listagem 8.5 temos uma pgina ASP que utiliza a conexo criada no evento OnStart.
Observe que estamos criando um objeto RecordSet que utiliza esta conexo como parmetro
para o mtodo Open do objeto RecordSet.
Listagem 8.5 Utilizando a conexo criada no evento OnStart usa_appcon.asp.
1
<HTML>
<HEAD>
</HEAD>
<BODY>
<%
10
Application_OnStart.
11
12
13
14
15
16
17
%>
18
19
20
<TR>
21
<TD><B>Cdigo</B></TD>
22
<TD><B>Data</B></TD>
23
<TD><B>Cidade</B></TD>
24
<TD><B>Pas</B></TD>
25
</TR>
26
<%
475
27
28
29
Pedidos.MoveFirst
30
31
%>
32
<TR>
33
<TD><% =Pedidos.Fields(OrderID)
%></TD>
34
<TD><% =Pedidos.Fields(OrderDate)
%></TD>
35
<TD><% =Pedidos.Fields(ShipCity)
%></TD>
36
37
</TR>
38
<%
39
Pedidos.MoveNext
39
Loop
40
%>
41
</TABLE>
42
<BR>
43
<HR>
44
</BODY>
45
</HTML>
IMPORTANTE
No evento Application_OnStart no 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
Figura 8.12: Pgina que utiliza uma conexo criada no arquivo global.asa.
477
Evento Application_OnEnd
Embora possamos criar variveis e objetos no evento Application_OnEnd isto no teria
utilidade prtica. Normalmente utilizamos o evento OnEnd para funes administrativas,
tais como gravar informaes em um log de auditoria ou parar um determinado servio para
manuteno.
A seguir mostrada a sintaxe para este evento.
Sintaxe para o evento Application_OnEnd:
<SCRIPT LANGUAGE=Linguagem_de_script RUNAT=Server>
Sub Application_OnEnd
Cdigo para o evento OnEnd. . .
End Sub
</SCRIPT>
A seguir temos um exemplo de definio de cdigo para o evento OnEnd. Neste exemplo
estamos retirando o objeto conn da memria.
<SCRIPT LANGUAGE=VBScript RUNAT.= Server>
Sub Application_OnEnd
Set Application(conn) = Nothing
End Sub
</SCRIPT>
NOTA
Uma situao especial em que o evento Application_OnEnd ocorre quando o arquivo global.asa
precisa ser novamente interpretado e carregado na memria. Isto acontece quando este arquivo
alterado e as alteraes so salvas.
478
Descrio
Contents
A Coleo Contents
Para acessarmos um item da coleo Contents, utilizamos a seguinte sintaxe:
Application.Contents(Chave)
479
& <BR>
Considere a Listagem 8.6, onde fazemos uso do operador For Each...Next para exibir o nome
de todos os itens da coleo Contents do objeto Application.
Listagem 8.6 Acessando os elementos da coleo Contents contents.asp.
1
<HTML>
<HEAD>
</HEAD>
<BODY>
<HR>
<%
10
11
12
Next
13
Response.Write <HR>
14
%>
15
</BODY>
16
</HTML>
Ao carregarmos esta pgina no Internet Explorer, obtemos o resultado indicado na Figura 8.14.
480
Figura 8.14: Usando For Each...Next para exibir o nome dos elementos da coleo Contents.
NOTA
Neste caso a pgina contents.asp faz parte da aplicao 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 coleo Contents.
Poderamos modificar a Listagem 8.6, para que, alm de exibir o nome de cada elemento, a mesma
exibisse o valor de cada um dos elementos. Esta alterao est indicada na Listagem 8.7.
Listagem 8.7 Exibindo o nome e o contedo dos elementos da coleo Contents.
1
<HTML>
<HEAD>
</HEAD>
<BODY>
<HR>
9
10
<TR>
<TD><B>Elemento</B></TD>
481
11
<TD><B>Valor</B></TD>
12
13
</TR>
<%
14
15
16
<TR>
17
18
<TD><% =Application.Contents(elemento)%></TD>
19
</TR>
20
<%
21
Next
22
Response.Write <HR>
23
%>
24
</TABLE>
25
</BODY>
26
</HTML>
Ao carregarmos esta nova verso da pgina, no Internet Explorer, obtemos o resultado indicado
na Figura 8.15.
482
A Coleo StaticObjects
Para acessarmos um item da coleo StaticObjects, utilizamos a seguinte sintaxe:
Application.StaticObjects(Chave)
Agora que j conhecemos os eventos e colees do objeto Application, vamos ao estudo dos
mtodos deste objeto.
Descrio
Contents.Remove
483
Mtodo
Descrio
Lock
Unlock
Agora vamos analisar alguns exemplos de cdigo que utilizam os mtodos do objeto Application.
A sintaxe para o mtodo Contents.Remove a seguinte:
Application.Contents.Remove(Nome_da_Varivel)
= Request.Form(idade)
Application(ValorDolar)
= 1.72
Application.Contents.Remove(Idade)
%>
= Request.Form(idade)
484
Application(ValorDolar)
= 1.72
Application.Contents.RemoveAll( )
%>
No exemplo a seguir, o mtodo Lock impede que mais de um cliente acesse a varivel
NumVisitantes ao mesmo tempo. Se o aplicativo no tivesse sido bloqueado, dois clientes
poderiam tentar incrementar a varivel NumVisitantes simultaneamente.
<%
Application.Lock
Application(NumVisitantes) = Application(NumVisitantes) + 1
Application(DataUltimaVisita) = Now()
Application.Unlock
Response.Write Esta aplicao j foi visitada:
%>
<%
= Application(NumVisitantes)
%>
<%
Response.Write Vezes!!!
%>
Vezes !!!
No exemplo a seguir, o mtodo Unlock libera o objeto bloqueado para que o prximo cliente
possa incrementar NumVisitantes.
<%
Application.Lock
Application(NumVisitantes ) = Application(NumVisitantes ) + 1
Application(DataUltimaVisita ) = Now()
Application.Unlock
%>
IMPORTANTE
O mtodo Lock do aplicativo cumulativo, significando que se o mesmo script chamar Lock
vrias vezes, ele tambm dever chamar Unlock o mesmo nmero de vezes para liberar
totalmente o aplicativo. Se isso no ocorrer, o bloqueio do aplicativo ser mantido at que o
script termine de executar.
485
Com isso encerramos o estudo do objeto Application. Conforme estudamos, podemos criar
variveis que estaro acessveis para todos os usurios da aplicao (semelhante ao conceito
de varivel global nas aplicaes tradicionais); podemos criar objetos, como por exemplo um
objeto Connection, de tal forma que qualquer pgina ASP da aplicao utilize-o sem que para
isso o mesmo tenha que ser criado em cada pgina.
Agora passaremos ao estudo do objeto Session.
O Objeto Session
Podemos usar o objeto Session para armazenar as informaes necessrias para uma
determinada sesso de usurio. As variveis armazenadas no objeto Session no so
descartadas quando o usurio alterna entre as pginas do aplicativo; em vez disso, essas
variveis persistem durante toda a sesso de usurio.
O servidor Web cria automaticamente um objeto Session quando uma pgina da Web de um
aplicativo solicitada por um usurio que no tem uma sesso. O servidor descarta o objeto
Session quando a sesso expira (por TimeOut) ou abandonada.
Um uso comum para o objeto Session para armazenar as preferncias do usurio. Por exemplo,
se um usurio indicar que prefere no visualizar elementos grficos, voc dever armazenar
essa informao no objeto Session.
O diagrama da Figura 8.16 demonstra a relao entre o objeto Application, os diversos objetos
Session, o servidor Web e as diversas aplicaes Web hospedadas no servidor.
Cada aplicao Web possui seu prprio objeto Application e informaes disponveis neste
objeto podem ser acessadas por qualquer usurio que estiver acessando a aplicao. Para
cada usurio que acessa a aplicao Web criado um objeto Session, onde ficam armazenadas
as informaes relacionadas a ele. Tambm podemos notar, na Figura 8.16, que em um mesmo
servidor Web podemos ter vrias aplicaes Web.
Informaes armazenadas no objeto Session do usurio podem ser acessadas em qualquer
pgina da aplicao Web, desta forma possvel passar informaes entre as diversas pginas
da aplicao Web durante a existncia do objeto Session.
IMPORTANTE
O objeto Session baseado em Cookies, por isso o estado da sesso s mantido para
navegadores que suportam Cookies.
486
Usurio 1
Aplicao: web1
objeto Application
Sesso1
Sesso2
Sesso3
Usurio 2
Usurio 3
Aplicao: web2
objeto Application
Sesso4
Sesso5
Usurio 4
Usurio 5
Aplicao: web3
objeto Application
Sesso6
Usurio 6
Descrio
OnStart
487
Evento
Descrio
OnEnd
O Evento Session_OnStart
A seguir mostrada a sintaxe para este evento:
<SCRIPT LANGUAGE=Linguagem_de_script RUNAT=Server>
Sub Session_OnStart
Cdigo para o evento Session_OnStart. . .
End Sub
</SCRIPT>
As variveis EstacaoAno e CotDolar podem ser acessadas, pelo usurio conectado, em qualquer
pgina ASP da aplicao Web, pois so variveis de nvel de sesso, tecnicamente falando,
diramos que so variveis de nvel do objeto Session, as quais esto disponveis, em qualquer
pgina, para o usurio ligado sesso.
488
Para acessar os valores das variveis do objeto Session muito simples, basta utilizar a sintaxe:
<%
= Session(Nome_da_Varivel)
%>
Sub Session_OnStart
Session(CotAM)= 1.50
Session(CotPM)= 2.00
End Sub
</SCRIPT>
489
Agora vamos criar uma pgina ASP que faz uso destas variveis. A pgina usa_sessionvar.asp
ir detectar a hora do dia. At s 11:59 ser apresentada a mensagem Bom Dia e ser
informado a cotao do dlar armazenada na varivel CotAM. A partir de 12:00 ser
apresentada a mensagem Boa Tarde e ser informada a cotao do dlar armazenada na
varivel CotPM. Em ambos os casos ser emitida a mensagem contida na varivel Mensagem.
Na Listagem 8.9 temos o cdigo para a pgina usa_sessionvar.asp.
Listagem 8.9 Utilizando variveis do objeto Session.
1
<HTML>
<HEAD>
</HEAD>
<BODY>
<%
hora_dia = hour(Time())
10
11
12
Response.Write <HR>
13
14
15
Response.Write Session(Mensagem)
16
Response.Write <HR>
17
Else
18
Response.Write <HR>
19
20
21
Response.Write Session(Mensagem)
22
Response.Write <HR>
23
End If
24
%>
25
</BODY>
26
</HTML>
Observe que utilizamos a funo hour(Time( )); como parmetro para a funo hour, passamos
a funo Time ( ). A funo Time( ) captura a hora do servidor Web e a funo hour retira
apenas o valor numrico da hora.
490
Observe que para ter acesso a uma varivel do objeto Session s utilizar a seguinte sintaxe:
Session(Nome_da_Varivel).
491
Sub Session_OnStart
492
C:\Meus documentos\nwind.mdb
10
11
pginas da aplicao.
12
13
14
Session(conexao).Open
15
End Sub
16
</SCRIPT>
IMPORTANTE
Para que o objeto conexao seja uma conexo do objeto Session, e com isso esteja disponvel
para todas as pginas que o usurio acessar dentro da aplicao, devemos utilizar a sintaxe
indicada na Listagem 8.10, ou seja:
12
Set Session(conexao)=Server.CreateObject(ADODB.Connection)
Agora que criamos uma conexo no evento Session_OnStart, podemos utilizar esta conexo
em qualquer pgina da aplicao. Vamos a um exemplo de pgina ASP que utiliza esta conexo.
Na Listagem 8.11 temos uma pgina ASP que utiliza a conexo criada no evento
Session_OnStart. Observe que estamos criando um objeto RecordSet que utiliza esta conexo
como parmetro para o mtodo Open do objeto RecordSet.
Listagem 8.11 Utilizando a conexo criada no evento OnStart usa_sessioncon.asp.
1
<HTML>
<HEAD>
</HEAD>
<BODY>
493
<%
10
Session_OnStart.
11
12
13
14
15
16
17
%>
18
19
20
<TR>
21
<TD><B>Cdigo</B></TD>
22
<TD><B>Data</B></TD>
23
<TD><B>Cidade</B></TD>
24
<TD><B>Pas</B></TD>
25
</TR>
26
<%
27
28
29
Pedidos.MoveFirst
30
31
%>
32
33
<TR>
<TD><% =Pedidos.Fields(OrderID)
494
%></TD>
34
<TD><% =Pedidos.Fields(OrderDate)
%></TD>
35
<TD><% =Pedidos.Fields(ShipCity)
%></TD>
36
37
</TR>
38
<%
39
Pedidos.MoveNext
39
Loop
40
%>
41
</TABLE>
42
<BR>
43
<HR>
44
</BODY>
45
</HTML>
Figura 8.19: Pgina que utiliza uma conexo criada no evento Session_OnStart.
495
Evento Session_OnEnd
Embora possamos criar variveis e objetos no evento Application_OnEnd isto no teria
utilidade prtica. Normalmente utilizamos o evento OnEnd para funes administrativas,
tais como gravar informaes em um log de auditoria ou para gravar escolhas feita pelo usurio
em um banco de dados.
A seguir mostrada a sintaxe para este evento.
Sintaxe para o evento Session_OnEnd:
<SCRIPT LANGUAGE=Linguagem_de_script RUNAT=Server>
Sub Application_OnEnd
Cdigo para o evento OnEnd. . .
End Sub
</SCRIPT>
A seguir temos um exemplo de definio de cdigo para o evento OnEnd. Neste exemplo
estamos retirando o objeto conexao da memria, para liberar recursos no servidor Web.
<SCRIPT LANGUAGE=VBScript RUNAT.= Server>
Sub Application_OnEnd
Set Application(conexao) = Nothing
End Sub
</SCRIPT>
Descrio
Contents
496
Coleo
Descrio
Agora passaremos a estudar a sintaxe e alguns exemplos de utilizao das colees do objeto
Session.
A Coleo Contents
Para acessarmos um item da coleo Contents, utilizamos a seguinte sintaxe:
Session.Contents(Chave)
& <BR>
497
<%
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 coleo Contents do objeto Session.
Listagem 8.12 Acessando os elementos da coleo Contents contents2.asp.
1
<HTML>
<HEAD>
</HEAD>
<BODY>
<HR>
<%
10
11
12
Next
13
Response.Write <HR>
14
%>
15
</BODY>
16
</HTML>
Ao carregarmos esta pgina no Internet Explorer, obtemos o resultado indicado na Figura 8.20.
498
Figura 8.20: Usando For Each...Next para exibir o nome dos elementos da coleo Contents.
Poderamos modificar a Listagem 8.11, para que alm de exibir o nome de cada elemento, a
mesma exibisse o valor de cada um dos elementos. Esta alterao est indicada na Listagem 8.12.
Listagem 8.12 Exibindo o nome e o contedo dos elementos da coleo Contents.
1
<HTML>
<HEAD>
</HEAD>
<BODY>
<HR>
<TR>
10
<TD><B>Elemento</B></TD>
11
<TD><B>Valor</B></TD>
12
13
</TR>
<%
499
14
15
16
<TR>
17
18
<TD><% =Session.Contents(elemento)%></TD>
19
</TR>
20
<%
21
Next
22
Response.Write <HR>
23
%>
24
</TABLE>
25
</BODY>
26
</HTML>
Ao carregarmos esta nova verso da pgina, no Internet Explorer, obtemos o resultado indicado
na Figura 8.21.
Figura 8.21: Usando For Each...Next para exibir o nome e o contedo dos
elementos da coleo Contents.
500
A Coleo StaticObjects
Para acessarmos um item da coleo StaticObjects, utilizamos a seguinte sintaxe:
Session.StaticObjects(Chave)
Agora que j conhecemos os eventos e colees do objeto Session, vamos ao estudo dos
mtodos deste objeto.
Descrio
Abandon
501
Mtodo
Descrio
Contents.Remove
= Request.Form(idade)
Session (ValorDolar)
= 1.72
Session.Contents.Remove(Idade)
%>
= Request.Form(idade)
502
Session (ValorDolar)
= 1.72
Session.Contents.RemoveAll( )
%>
Observe o exemplo a seguir, onde utilizamos o mtodo Session.Abandon, porm aps termos
utilizado este mtodo, definimos e exibimos uma varivel em nvel de sesso. Esta varivel ser
exibida pois, conforme descrito anteriormente, a sesso somente ser destruda aps todas as
linhas de Script da pgina que chamou o mtodo Session.Abandon terem sido executadas.
<%
Session.Abandon
Session(NomeUsuario) = Jos da Silva
Response.Write Nome do usurio: & Session (NomeUsuario)
%>
NOTA
O servidor cria um novo objeto Session quando voc abre uma pgina subseqente da aplicao
Web depois de abandonar uma sesso. Voc pode armazenar variveis e objetos nesse novo
objeto Session.
Descrio
CodePage
503
Propriedade
Descrio
outros hierglifos. Diferentes idiomas e locais podem usar
diferentes pginas de cdigo. Por exemplo, a pgina de cdigo
ANSI 1252 usada para o ingls americano e a maioria dos
idiomas europeus; a pgina de cdigo OEM 932 usada para
o Kanji japons.
LCID
SessionID
TimeOut
Descrio
437
MS-DOS / EUA
850
MS-DOS / Internacional
1251
Windows / Rssia
504
Nmero
Descrio
1252
Windows/ ANSI
1253
Windows/ Grcia
10000
Macintosh/ Padro
NOTA
As configuraes de localidade definem diversas configuraes, como por exemplo o smbolo da
moeda, o nmero de casas decimais, o formato da data e da hora, etc. So as opes configuradas
atravs do cone Opes regionais do Painel de Controle. Para maiores detalhes sobre a
configurao das Opes regionais, consulte o Captulo 2 do livro Microsoft Windows 2000
Server Curso Bsico & Rpido, de minha autoria e publicado pela editora Axcel Books.
O nmero varia, pois para cada sesso este nmero gerado automaticamente pelo servidor IIS.
505
IMPORTANTE
Voc no deve usar a propriedade SessionID para gerar valores de chave primria para um
aplicativo de banco de dados. Isso porque se o servidor Web for reinicializado, alguns valores
de SessionID podero ser os mesmos daqueles gerados antes do servidor ser parado. Em vez
disso, voc deve usar os campos de auto-incremento do prprio banco de dados.
Concluso
Neste captulo estudamos alguns conceitos fundamentais, tais como:
O que uma aplicao Web no IIS.
Quais os componentes de uma aplicao Web no IIS.
O problema de manter o estado de uma conexo.
Aprendemos sobre quais elementos que compes uma aplicao Web no servidor IIS. Tambm
tratamos sobre as configuraes de uma aplicao Web, utilizando o Gerenciador do Internet
Services. Aprendemos sobre diversas propriedades que podem ser configuradas para uma
aplicao Web.
Na seqncia aprendemos sobre o arquivo global.asa. Vimos que toda aplicao Web pode
conter um arquivo global.asa, no qual podem ser definidas variveis de inicializao, tanto em
nvel de aplicao quanto em nvel de sesso. Para isso utilizamos, basicamente, quatro eventos
para os quais podemos escrever cdigo no arquivo global.asa. Os eventos so os seguintes:
Application_OnStart
Application_OnEnd
Session_OnStart
Session_OnEnd
506
507
Captulo 9
Segurana de Aplicaes
Web com IIS e ASP
509
Quando se fala de Internet nos dias de hoje, o assunto mais tratado, sem nenhuma dvida,
Segurana. Muitos relatos, alguns verdadeiros e outros mais fantasiosos, sobre invases
mirabolantes, roubo de nmero de cartes de crditos, acesso a informaes sigilosas de
rgos governamentais e assim por diante.
No podemos negar que o problema de segurana existe e crtico, principalmente hoje
quando o Comrcio Eletrnico , mais do que uma realidade, uma necessidade e um diferencial
competitivo para as empresas. O diferencial competitivo no entrar ou no no mundo do ebusiness, e sim criar servios agregados ao Comrcio Eletrnico, capazes de gerar diferenciais
competitivos. Assuntos como fidelizao do cliente, melhorias nos sistemas de CRM
Customer Relationship Management (Gerenciamento das Relaes com o Cliente), B2B
Bussines to Bussines, B2C Bussines to Consumer e outros, esto em evidncia.
Porm, sistemas de Comrcio Eletrnico, CRM e assemelhados, exigem acesso a um conjunto
de dados estratgicos da empresa. Uma vez que estes sistemas esto acessveis na Internet, os
dados empresariais precisam estar protegidos. Neste ponto que a questo segurana de
fundamental importncia.
Existem os mais variados tipos de ataques pela Internet. Um engano comum pensar que
nico tipo ataque capaz de causar prejuzos aquele que rouba ou destri dados. No caso de
um site de Comrcio Eletrnico, qualquer ataque que torne o site indisponvel por um
determinado perodo de tempo causa prejuzos incalculveis. Isso porque, alm das compras
que deixaram de ser realizadas no perodo de indisponibilidade, tem a questo da imagem da
empresa, e da possibilidade de o cliente ter feito a compra no site do concorrente, gostar, e
passar a fazer as prximas compras l.
Por todos estes motivos que a questo de segurana fundamental e deveria ser prioritria
quando tratamos de aplicaes Web. Outro fato importante a ser mencionado que a maioria
dos ataques, ao contrrio do que muitos pensam, originado na Intranet da prpria empresa.
Pode ser um funcionrio descontente ou desonesto, ou um usurio com permisses de acesso
indevidas que causa algum prejuzo por impercia tcnica. O fato que a Segurana no deve
ser tratada apenas como uma questo de proteo contra as foras do mal que vem da Internet.
O que precisa-se definir uma poltica de segurana que permita que todos possam realizar
o seu trabalho, porm com os nveis de permisso adequados.
Alm de definir uma poltica de segurana, necessria a ampla divulgao da mesma.
alarmante constatar que muitas empresas no possuem uma poltica de segurana definida e
amplamente divulgada.
Outro erro bastante comum achar que a questo de segurana responsabilidade somente
da equipe de desenvolvimento ou do administrador da rede. Na verdade o item segurana
510
NOTA
Para acompanhar este captulo o usurio deve conhecer alguns aspectos bsicos do Windows
2000 Server, tais como: Permisses NTFS; Contas de Usurios e Grupos de Usurios; Utilizao
do MMC Microsoft Management Console e de Snap-in.
DICA
Para informaes sobre estes itens, consulte o livro Windows 2000 Server Curso Bsico & Rpido,
de minha autoria, publicado pela editora Axcel Books.
511
O Acesso Annimo
Um tipo de autenticao bastante comum o que permite o acesso annimo. O IIS permite
que seja configurado um tipo de acesso chamado Acesso Annimo, no qual no necessrio
que o usurio fornea um username e senha para ter acesso ao site. Este acesso annimo est
ligado a uma nica conta de usurio do Windows 2000 Server. Todo o usurio que acessar
um site configurado para permitir acesso annimo, ser identificado como se estivesse
autenticado usando a conta de usurio configurada para este tipo de acesso.
A conta de usurio para acesso annimo automaticamente criada quando instalamos o
Internet Information Services 5.0. Por padro esta conta possui o seguinte nome:
IUSR_NOME_DO_COMPUTADOR
Por exemplo, ao instalarmos o IIS em um servidor chamado SERVER02SP, ser criada a seguinte
conta para permitir o acesso annimo:
IUSR_SERVER02SP
A autenticao annima fornece aos usurios acesso a reas pblicas do seu site, sem solicitar
um nome de usurio ou uma senha.
512
NOTA
Veremos sobre os outros mtodos de autenticao ainda neste captulo.
Na Figura 9.1, temos uma representao desta seqncia para o acesso annimo.
513
IUSR_SERVER02SP
tem permisses
NTFS, ento acesso OK.
Usurio
IUSR_SERVER02SP
no tem permisses
NTFS, acesso negado.
Autenticado:
IUSR_SERVER02SP
Servidor: SERVER02SP
NOTA
As contas IUSR_NOME_DO_COMPUTADOR em controladores de domnio no so adicionadas
ao grupo Convidados do domnio, por padro, e devem ser alteradas para Efetuar logon
localmente a fim de permitir logon annimo.
514
DICA
Para informaes mais detalhadas sobre estes itens, consulte o livro Windows 2000 Server
Curso Bsico & Rpido de minha autoria, publicado pela editora Axcel Books.
515
516
517
518
IMPORTANTE
A sincronizao de senhas deve ser usada somente com contas de usurio annimas definidas
no computador local e no com contas annimas de computadores remotos.
19. Aps ter configurado as informaes para a conta de acesso annimo, d um clique em OK.
20. Voc estar de volta janela Mtodos de autenticao, d um clique em OK para fech-la.
21. Voc estar de volta janela Propriedades do site da Web padro, 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 annimo diferente para uma das aplicaes Web do site, ou
at mesmo para uma subpasta de uma aplicao Web, basta repetir os passos indicados.
519
NOTA
Se o servidor que voc estiver utilizando for um controlador de domnio, voc deve abrir o
console para Gerenciamento do Active Directory. As opes que surgem podem ser um pouco
diferentes das apresentadas neste exemplo.
3. Surge a janela indicada na Figura 9.8.
520
521
DICA
Para informaes mais detalhadas sobre Controladores de domnio e Active Directory, consulte
o livro Windows 2000 Server Curso Bsico & Rpido, de minha autoria, publicado pela editora
Axcel Books.
10. Quando o IIS instalado, a conta IUSR_SERVIDOR criada e automaticamente
adicionada ao grupo Convidados.
11. Muito cuidado ao adicionar a conta IUSR_SERVIDOR a outros grupos. Quando uma
conta de usurio adicionada a um grupo, ela herda as permisses atribudas ao grupo
e com isso passa a ter acesso aos recursos que o grupo tem acesso. A maior insanidade
que o administrador Web poderia cometer seria adicionar a conta IUSR_SERVIDOR ao
grupo Administradores. Com isso estaria dando permisses mximas aos usurios que
fazem acesso annimo. Seria caso de internao do seu administrador Web.
12. Clique no boto OK para fechar a janela com as propriedades da conta IUSR_SERVIDOR.
13. Voc estar de volta ao Gerenciador do computador, feche-o.
522
Agora precisamos verificar se a conta IUSR_SERVIDOR tem a permisso para efetuar logon local.
Para verificar isso:
1. Faa o logon no Windows 2000 Server, com permisses de administrador.
2. Abra o Console Configuraes locais de segurana/Programas/Ferramentas administrativas/Diretivas de segurana local.
NOTA
Se o servidor que voc estiver utilizando for um controlador de domnio, voc deve abrir o
console para Gerenciamento do Active Directory. As opes que surgem podem ser um pouco
diferentes das apresentadas aqui.
3. Surge a janela indicada na Figura 9.12.
523
524
525
definimos permisses NTFS. Isso refora o fato de que a segurana tanto responsabilidade
do grupo de desenvolvimento, quanto do administrador da rede.
No exemplo do acesso annimo, o usurio identificado para o Windows 2000, como se
fosse o usurio IUSR_NOME_DO_COMPUTADOR. Este usurio somente ter acesso s pastas
e arquivos para os quais o usurio IUSR_NOME_DO_COMPUTADOR tiver permisses de
acesso e com os nveis de permisses definidos.
Antes de aprendermos a definir permisses NTFS vamos aprender um pouco mais sobre as mesmas.
526
O sistema de arquivos NTFS utilizado no Windows NT Server 4.0 e foi mantido e melhorado
no Windows 2000 Server, por questes de compatibilidade, j que uma nova verso do NTFS
foi introduzida com o Windows 2000 NTFS 5. um sistema bem mais eficiente do que FAT
e FAT32, alm de permitir uma srie de recursos avanados, tais como:
Permisses a nvel de arquivos e pastas.
Compresso.
Auditoria de acesso.
Parties 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 permisses
de acesso a nvel de arquivo e de pastas, isto , posso ter arquivos em uma mesma pasta, com
permisses diferentes para usurios diferentes. Alm disso, as permisses NTFS tm efeito
localmente, isto , mesmo que o usurio faa o logon no computador onde um determinado
arquivo existe, se o usurio no tiver as permisses NTFS necessrias, ele no poder acessar
o arquivo. Isso confere um alto grau de segurana, desde que as permisses NTFS sejam
configuradas corretamente.
No Windows 2000 Server, conforme descrito anteriormente, temos tambm o NTFS 5, o qual
apresenta diversas melhorias em relao ao NTFS, tais como:
Criptografia de arquivos e pastas (a criptografia uma maneira de embaralhar a
informao de tal forma que mesmo que um arquivo seja copiado, o mesmo se torna
ininteligvel, a no ser para a pessoa que possui a chave para descriptograf-lo).
Cotas de usurio, fazendo com que seja possvel limitar o espao em disco que cada
usurio pode utilizar.
Gerenciamento e otimizao melhorados.
Um inconveniente do NTFS 5 que ele no reconhecido pelas verses anteriores, tais como
o Windows NT Server 4.0. Caso voc possua uma rede na qual esto presentes servidores
com o Windows 2000 Server e com o Windows NT Server 4.0, planeje com bastante cuidado
a utilizao do NTFS 5.
Conforme descrito anteriormente, podemos definir permisses de acesso a nvel da pasta ou
arquivo, mas somente em unidades formatadas com o sistema de arquivos NTFS (seja na verso
do NT Server 4.0 ou o NTFS 5 do Windows 2000 Server). Portanto, aconselhvel instalar o
Windows 2000 Server sempre em unidades formatadas com NTFS, pois isso melhora a segurana.
Com relao s permisses NTFS, temos um conjunto diferente de permisses quando tratamos
de pastas ou arquivos. Nas Tabelas 9.1 (para pastas) e 9.2 (para arquivos), so apresentadas as
permisses e o nvel de acesso para cada uma delas.
527
Nvel de acesso
Leitura
Gravar
Ler e executar
Modificar
Controle total
Nvel de acesso
Leitura
Gravar
528
Permisso
Nvel de acesso
Ler e executar
Modificar
Controle total
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
usurios e grupos para os quais foi garantido acesso para o recurso, bem como o nvel de
acesso de cada um deles.
Existem alguns detalhes que devemos observar sobre permisses NTFS:
Permisses NTFS so cumulativas, isto , se um usurio pertence a mais de um grupo,
o qual tem diferentes nveis de permisso para um recurso, a permisso efetiva do
usurio a soma das permisses.
Permisses NTFS para um arquivo tm prioridade sobre permisses NTFS para pastas.
Por exemplo se um usurio tm permisso NTFS de escrita em uma pasta, mas somente
permisso NTFS de leitura para um arquivo dentro desta pasta, a sua permisso efetiva
ser somente a de leitura, pois a permisso para o arquivo tem prioridade sobre a
permisso para a pasta.
Negar uma permisso NTFS tem prioridade sobre Permitir. Por exemplo, se um usurio
pertence a dois grupos diferentes. Se para um dos grupos foi dada permisso de leitura
para um arquivo e para o outro grupo foi negada, o usurio no ter o direito de leitura,
pois Negar tem prioridade sobre Permitir.
Agora que j conhecemos um pouco mais sobre permisses NTFS, podemos aprender como
configurar estas permisses.
529
530
531
532
Figura 9.19: Lista de permisses, onde foi retirada a permisso de acesso para o usurio annimo.
Figura 9.20: Mensagem de erro ao tentar acessar uma pgina para a qual o usurio annimo
(conta IUSR_SERVIDOR, no nosso exemplo) no tem mais permisso de acesso.
533
IMPORTANTE
Caso voc teste o acesso localmente no servidor onde a pgina est gravada e a autenticao
integrada esteja habilitada, voc ter acesso pgina. Isto acontece porque o IIS tenta primeiro
acesso com a autenticao annima. No obtm sucesso. Se a autenticao 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 permisso de acesso
pgina, o IIS libera o acesso. Isto tambm vlido para usurios da sua rede local que fizeram
o logon em um domnio do Windows NT Server 4.0 ou do Windows 2000 e cujas contas ou
grupos a que pertencem possuam permisso de acesso para o arquivo solicitado. Nos prximos
itens veremos mais sobre a autenticao integrada.
Agora vamos restaurar as permisses NTFS para o usurio IUSR_SERVIDOR e testar para ver
se ele voltou a ter acesso.
Para atribuir novamente as permisses NTFS para o usurio IUSR_SERVIDOR.
1. Utilizando o Windows Explorer, localize a pasta cujas permisses NTFS sero alteradas.
2. D um clique com o boto direito do mouse sobre a pasta. No menu de opes, que
surge, d um clique em Propriedades.
3. Na janela de propriedades d um clique na guia Segurana.
4. Surge a janela indicada na Figura 9.21.
534
5. Observe que a conta com a descrio Conta de convidado da Internet, que a conta
para acesso annimo (no nosso exemplo, IUSR_SERVIDOR), no aparece na lista de
usurios, portanto a mesma no possui permisses de acesso.
6. D um clique no boto Avanado. Observe que, na janela que surge, a conta
IUSR_SERVIDOR tambm no est na listagem, conforme indicado na Figura 9.22.
535
536
537
538
autenticao possveis com o IIS. Lembrando que a autenticao com o IIS apenas um dos
tantos nveis de segurana que podemos configurar.
Autenticao Bsica
A autenticao bsica uma das mais antigas que existem, desenvolvidas desde a poca dos
primeiros servidores Web como o NCSA e o Cern HTTP. Neste tipo de autenticao, o usurio
precisa fornecer um username e uma senha. O mtodo de autenticao bsica um padro
de mercado amplamente usado para coletar informaes de nome de usurio e senha. A
autenticao bsica funciona da seguinte forma:
1. O navegador exibe uma caixa de dilogo na qual o usurio pode digitar seu username
e senha de conta do Windows 2000 atribudos anteriormente. Por isso, um prrequisito da autenticao bsica que o usurio j possua uma conta cadastrada no
Windows 2000.
2. O navegador tenta estabelecer uma conexo usando essas informaes (a senha
codificada com Base64 antes de ser enviada pela rede).
3. Se o servidor rejeita as informaes, o navegador da Web exibe repetidamente a caixa
de dilogo at que o usurio digite um nome de usurio e uma senha vlidos ou feche
a caixa de dilogo.
4. Quando o servidor Web verifica que o nome de usurio e a senha correspondem a uma
conta de usurio do Windows 2000 vlida, a conexo estabelecida e o acesso pgina
solicitada liberado.
A autenticao bsica apresenta como principal requisito o fato de que o usurio deve ter
uma conta no Windows 2000. Para sites que so acessados por um grande nmero de usurios
pode no ser uma boa opo. Alm disso, o fato do usurio ter que digitar um username e
senha no muito simptico.
Uma das grandes desvantagens deste mtodo de autenticao o fato de que a senha no
criptografada ao ser transmitida pela rede. A codificao que feita extremamente simples
de ser quebrada, por isso este mtodo de autenticao no dos mais seguros.
A vantagem da autenticao bsica que ela faz parte da especificao do HTTP e tem suporte
da maioria dos navegadores. A desvantagem que, pelo fato dos navegadores que usam a
autenticao bsica transmitirem senhas de forma descriptografada, ao monitorar as
comunicaes na sua rede, algum pode interceptar e decifrar facilmente essas senhas usando
ferramentas disponveis publicamente na prpria Internet. Portanto, a autenticao bsica
no recomendada, a menos que voc tenha certeza que a conexo entre o usurio e seu
servidor Web segura, como uma conexo direta via cabo ou uma linha dedicada.
539
IMPORTANTE
A autenticao integrada do Windows (que veremos logo em seguida) tem prioridade sobre a
autenticao bsica. O navegador escolher a autenticao integrada do Windows e tentar
usar as informaes de logon atuais do Windows antes de solicitar ao usurio um nome e
senha. Atualmente, somente o Internet Explorer, verso 2.0 e posterior, oferece suporte
autenticao integrada do Windows.
NOTA
O Internet Explorer, verso 4.0 e posterior, pode ser configurado para solicitar inicialmente
informaes do usurio, se necessrio. Para obter mais informaes, consulte a documentao
do Internet Explorer.
540
541
com um certificado de cliente, seu servidor Web associa automaticamente esse usurio
conta de usurio do Windows apropriada. Dessa forma, voc pode autenticar automaticamente
os usurios que fazem logon com certificados de cliente, sem exigir o uso da autenticao
bsica ou integrada do Windows. possvel mapear um certificado de cliente para uma conta
de usurio do Windows ou muitos certificados de cliente para uma conta. Por exemplo, se
voc tivesse vrios departamentos ou empresas diferentes no seu servidor, cada uma com seu
prprio site da Web, seria possvel usar o mapeamento vrios-para-um para mapear todos os
certificados de cliente de cada departamento ou empresa para o prprio site da Web. Dessa
forma, cada site forneceria acesso somente aos prprios clientes.
No prximo captulo veremos um pouco mais sobre Certificados Digitais.
O tipo de autenticao apenas um dos aspectos que precisam ser definidos; devem ser
consideradas diversas outras questes. A seguir, algumas questes que devem ser levadas em
consideraes na hora de decidir sobre o tipo de autenticao que iremos configurar no IIS,
ou se devemos configurar mais do que um tipo de autenticao.
Para um site pblico, ou reas de acesso pblico, a autenticao utilizando acesso annimo
a mais indicada, pois evita que o usurio tenha que fornecer um username e senha.
Para acesso ao contedo de uma Intranet, uma das primeiras opes a serem pensadas
a utilizao da autenticao integrada do Windows. Pois sendo uma Intranet um
ambiente controlado, possvel garantir que todos os clientes satisfaam as condies
exigidas pela autenticao integrada.
Para sites que trabalham com dados sensveis como servios bancrios pela Internet e
Comercio Eletrnico, sem dvida que a utilizao de Certificados Digitais o mais
indicado. Em Intranets os certificados tambm tm sido utilizados, pois conforme
descrevemos no incio do captulo, a maioria dos ataques parte de usurios da Intranet
da empresa. Muitas vezes nos preocupamos muito com os ataques externos e
esquecemos as ameaas que vem de dentro da prpria empresa.
542
543
544
14. Selecione as opes desejadas. Se voc clicar na opo Autenticao bsica, o IIS emite
um aviso de que para esta opo as senhas sero transmitidas sem criptografia, conforme
indicado na Figura 9.31.
Figura 9.31: Avisa de que na autenticao bsica a senha transmitida sem criptografia.
15. D um clique em Sim e a autenticao bsica ser habilitada.
16. D um clique no boto OK para fechar a janela de configurao dos tipos de autenticao.
17. Voc estar de volta janela de Propriedades de Site da Web padro. D um clique no
boto OK para fech-la.
18. Caso alguma aplicao Web ou pasta virtual do servidor possua uma configurao
diferente da definida para o Site da Web padro, o IIS abre uma janela informando
qual site possui uma configurao diferente e perguntando se voc deseja estender as
configuraes do site Web padro para as pastas virtuais e aplicativos Web internos,
conforme indicado na Figura 9.32.
545
19. Para estender as configuraes basta selecionar uma ou mais das opes mostradas e clicar
no boto OK. Voc tambm pode utilizar o boto Selecionar tudo e depois clicar em OK.
20. Voc estar de volta ao Gerenciador do Internet Services. Feche-o.
Para configurar as opes para uma pasta virtual em particular, basta localiz-la abaixo da
opo Site da Web padro, clicar com o boto direito sobre a mesma e clicar na opo
Propriedades. Depois s seguir os passos indicados anteriormente.
NOTA
Caso voc no tenha criado uma pasta virtual Captulo6, utilize qualquer pasta virtual
disponvel no seu servidor IIS.
7. Clique com o boto direito do mouse sobre a opo Capitulo6. No menu de opes que
surge, d um clique em Propriedades.
546
547
Figura 9.34: Listagem exibida quando a opo Pesquisa em Pasta est habilitada.
Caso esta opo no esteja marcada e o usurio digite o endereo 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 opo Pesquisa em Pasta estiver desabilitada.
548
Criar log de visitantes: Selecione esta opo para registrar as visitas feitas a este
diretrio em um arquivo de Log. As visitas sero registradas somente se o log estiver
ativado para este site da Web.
Indexar este recurso: Para permitir que o Servio de indexao da Microsoft (Index
Services) inclua este diretrio em um ndice de texto completo do site da Web,
selecione esta opo.
De uma maneira geral, recomendo que as opes Gravao e Pesquisa em pasta sejam marcadas
somente em situaes especiais e para reas que no contenham dados confidenciais.
Uma questo importante a combinao entre as permisses definidas no IIS e as permisses
NTFS. Por exemplo, vamos supor que o usurio tenha sido autenticado como usurio annimo
e est tentando gravar contedo em uma pasta virtual na qual o IIS possui permisso de
gravao, porm as permisses NTFS no permitem que o usurio annimo faa gravaes.
Como fica esta combinao?
Quando uma pgina solicitada, o IIS segue a seqncia indicada na Figura 9.36.
Servidor Web
recebe requisio.
Endereo IP
permitido?
Usurio permitido?
Permisses do
servidor Web concedem
acesso?
Permisses do
NTFS concedem
acesso?
Acesso concedido.
Acesso negado.
549
Observe que primeiro o IIS verifica se o usurio tem permisses da Web para o recurso
solicitado. Se o usurio no tiver, a solicitao falha e o usurio recebe uma mensagem 403
Acesso proibido. Depois, o IIS verifica as permisses do NTFS para o recurso. Se o usurio
no tiver permisses do NTFS para o recurso, a solicitao falha e o usurio recebe uma
mensagem 401 Acesso negado.
Ento a resposta para o nosso exemplo que o usurio no conseguiria gravar o contedo,
pois o mesmo no teria as permisses NTFS necessrias e receberia a mensagem de erro 401
Acesso negado.
NOTA
Caso voc no tenha criado uma pasta virtual Captulo6, utilize qualquer pasta virtual
disponvel no seu servidor IIS.
7. Clique com o boto direito do mouse sobre a pasta Capitulo6. No menu de opes que
surge d um clique em Propriedades.
8. Ser exibida a janela Propriedades de Capitulo6.
9. Certifique-se de que esto sendo exibidas as opes da guia Pasta.
10. Na parte de baixo da guia Pasta, temos um grupo de opes chamado Configuraes do
aplicativo. A seguir temos uma descrio de cada uma destas opes.
Conforme descrito anteriormente, um aplicativo da Web do IIS definido pela estrutura de
diretrios em que est localizado. Para obter mais informaes, consulte o Captulo 8 deste livro.
550
Somente scripts: Somente scripts, como os scripts ASP, podem ser executados.
Este o padro normalmente definido.
Baixa: Selecione esta opo para que os aplicativos sejam executados no mesmo
processo que os servios da Web (opo baixo). Neste caso se um dos aplicativos
apresentar problema e desativar o processo do servidor Web, todos os aplicativos
ficaro indisponveis at que o servidor Web tenha sido normalizado.
Mdia (em pool): Selecione esta opo para que a aplicao Web seja executada em
um processo em pool isolado em que outros aplicativos tambm so executados.
Alta (isolada): Neste caso a aplicao Web ser executada em seu prprio espao de
endereamento e se a mesma apresentar problemas, as outras aplicaes Web, bem
como o servidor IIS continuam funcionando normalmente. A execuo isolada
aumenta a disponibilidade do servidor Web, pois problemas em uma aplicao no
iro afetar todo o servidor, porm consome mais recursos, como memria, pois
cada aplicao executada em seu prprio espao de memria.
NOTA
Para determinar qual opo representa uma aplicao Web e qual simplesmente uma pasta
virtual s observar o cone ao lado do nome, no Gerenciador do Internet Services. Opes que
so simplesmente uma pasta virtual so representadas por um envelope amarelo, j aplicaes
Web possuem um cone que parece uma caixa aberta, conforme indicado na Figura 9.37.
551
Figura 9.37: cones para uma aplicao Web e para uma pasta virtual.
552
Figura 9.38: Janela para configurao das restries de nome de domnio e endereo IP.
Observe que temos duas opes para configurao, conforme descrito a seguir:
Acesso permitido: Se esta opo estiver marcada, todos tero acesso ao site, com exceo
dos endereos IP que estiverem indicados na listagem Exceto os listados abaixo. Este
mecanismo chamado de Lista Negra, ou seja, todo mundo tem acesso, com exceo
de quem est na lista.
Acesso negado: Se esta opo estiver marcada, ningum ter acesso ao site, com exceo
dos endereos IP que estiverem indicados na listagem Exceto os listados abaixo. Este
mecanismo chamado de Lista Branca, ou seja, ningum tem acesso, com exceo
de quem est na lista.
9. A ttulo de exemplo, deixe marcada a opo Acesso permitido. Agora vamos negar
acesso para um computador especfico.
NOTA
No exemplo do livro estarei negando acesso para o IP: 10.204.123.1, que o endereo IP do
meu computador. Utilize o endereo IP do equipamento para o qual voc quer negar acesso, a
nvel de teste.
10. D um clique no boto Adicionar. Surge a janela indicada na Figura 9.39.
553
554
555
556
Observe que a mensagem informa que o endereo IP foi rejeitado. Para que o endereo IP
10.204.123.1 volte a ter acesso ao site, so seguir os passos indicados anteriormente e removlo da lista de endereos IP com acesso negado.
Figura 9.44: Definindo permisses de banco de dados no Microsoft SQL Server 2000.
557
NOTA
Para maiores informaes sobre configuraes de segurana no Microsoft SQL Server 2000,
consulte a documentao do produto.
Na maioria dos bancos de dados pode ser necessrio o fornecimento de um username e senha
para que o acesso seja liberado. Podemos construir um formulrio HTML com dois campos,
onde o usurio digita o username e a senha. Ao clicar em um boto Logon, os valores digitados
so enviados para uma pgina ASP que monta a String de conexo de acordo com os dados
fornecidos pelo usurio, incluindo o username e senha.
Na Listagem 9.1, temos um exemplo de formulrio, onde temos dois campos: username e
senha, nos quais o usurio ir digitar as informaes de logon.
Listagem 9.1 Formulrio para digitao do username e da senha logon.htm.
1
<HTML>
<HEAD>
<TITLE>Informaes de Logon!!</TITLE>
</HEAD>
<BODY>
<P><FONT color=navy><B>
</B></FONT></P>
<P>
10
11
12
<TR>
13
<TD>Username:</TD>
14
15
</TR>
16
<TR>
17
18
19
<TD>Senha:</TD>
<TD><INPUT id=senha maxLength=15 name=senha type=password></TD>
</TR>
558
20
<TR>
21
<TD></TD>
22
23
</TR>
24
</TABLE>
25
</P>
26
</FORM>
27
</BODY>
28
</HTML>
Na Figura 9.45, temos o formulrio logon.htm carregado, onde o usurio digita as informaes
para o logon.
<HTML>
559
<HEAD>
</HEAD>
<BODY>
<%
10
Set conn=Server.CreateObject(ADODB.Connection)
11
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
19
%>
20
<HR>
21
</BODY>
22
</HTML>
560
Concluso
Neste captulo aprendemos sobre aspectos bsicos de segurana, tais como:
Tipos de autenticao.
Permisses NTFS do Windows 2000.
Opes de segurana do IIS.
Permisses a nvel de banco de dados.
Muito existe a ser tratado sobre segurana. Livros inteiros j foram escritos sobre o assunto.
Pela experincia de anos trabalhando com ambientes de Rede Locais e acesso a dados crticos
561
posso afirmar com convico: O primeiro passo para estabelecer um ambiente seguro a
definio de um poltica de segurana e a ampla divulgao da mesma, para que todos estejam
conscientes de suas responsabilidades em relao segurana.
Muitas vezes cuida-se muito da segurana de acesso lgico aos dados, com a otimizao das
configuraes de segurana do Sistema Operacional, do servidor Web e do servidor de Banco
de dados. So gastos milhares de dlares em equipamentos e programas sofisticados para
atuarem como Firewall. Investe-se em roteadores modernos, com capacidades de filtragem
de pacotes, deteco de tentativas de invaso e assim por diante. E, muitas vezes, a segurana
fsica esquecida. De que adianta toda esta segurana no acesso lgico, se um desconhecido
pode, facilmente, invadir a sala dos servidores e sair com uma meia dzia de fitas de backup
em baixo do brao?
Obviamente que o investimento em segurana de acesso lgico aos dados necessria, porm
o aspecto da segurana no acesso fsico igualmente importante. Pontos como estes devem
ser definidos na poltica de segurana da empresa, a qual deve ser continuamente revisada
para se adaptar s freqentes mudanas no mundo da tecnologia.
No prximo captulo veremos alguns conceitos avanados do ASP 3.0.
562
Captulo 10
Utilizando
Componentes do IIS
563
Introduo
Neste captulo estaremos tratando de uma srie de objetos do ASP e outros assuntos
importantes na construo de aplicativos Web com ASP 3.0.
Iniciaremos o captulo por um estudo do objeto Server e dos seus diversos mtodos e
propriedades. Veremos como solucionar problemas prticos, bastante comuns na construo
de aplicaes Web.
Apresentaremos um exemplo prtico que ilustra uma necessidade tpica de aplicaes Web.
No nosso exemplo, o usurio selecionar o nome de um pas em uma lista de pases. Ao clicar
em um boto Pesquisar, ser retornada uma lista, em forma de tabela, com todos os Clientes
para o Pas selecionado. O nome do Cliente ser um link, que ao ser clicado abrir uma
pgina com as informaes sobre o mesmo. Para construir esta pgina teremos que utilizar
alguns mtodos do objeto Server.
Em seguida, passaremos ao estudo de alguns componentes ASP. Veremos com mais detalhes
o conceito de componentes. Tambm aprenderemos a utilizar diversos componentes que so
fornecidos juntamente com o IIS. Estudaremos os seguintes componentes:
Content Link.
Ad Rotator.
Browser Capabilities.
Page Counter.
Estes componentes so fornecidos juntamente com o IIS e oferecem uma srie de
funcionalidades bastante interessantes, conforme veremos mais adiante.
O Objeto Server
O objeto Server nos fornece a possibilidade de estender as capacidades de nossas pginas
ASP, atravs da utilizao de objetos e componentes externos. Estes objetos e componentes
fornecem funcionalidades especficas as quais so necessrias aplicao que est sendo
desenvolvida.
A utilizao de componentes externos faz parte da filosofia de desenvolvimento de aplicaes
baseadas em componentes. Para o mundo Windows, os componentes devem seguir o padro
COM (Component Object Model), que no Windows 2000 recebe a denominao de COM+
(COM Plus).
564
565
IMPORTANTE
O tempo limite definido pela propriedade ScriptTimeout no ter efeito enquanto um
componente do servidor estiver processando. Por isso, caso voc esteja utilizando um
componente com defeitos, o mesmo continuar em execuo independente do valor definido
por esta propriedade.
Tambm podemos atribuir o valor armazenado nesta propriedade a uma varivel, como no
exemplo a seguir:
<%
tempo_limite = Server.ScriptTimeout
Response.Write tempo_limite
%>
O Mtodo CreateObject
O mtodo CreateObject utilizado para criar uma instncia 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
instalao padro do IIS e iremos estud-los ainda neste captulo.
A sintaxe para o mtodo CreateObject a seguinte:
Set nome_objeto = Server.CreateObject(Identificador_do_objeto)
566
Onde temos:
nome_objeto: o nome da varivel que ser utilizada para fazer referncia ao objeto
na pgina ASP onde o objeto criado. Em diversos exemplos deste livro criamos um
objeto para conexo com banco de dados e atribumos o mesmo a uma varivel chamada
conn. O nome da varivel determinado pelo desenvolvedor; poderamos ter utilizado
qualquer nome de varivel vlido.
Identificador_do_objeto: Especifica o tipo de objeto a ser criado. O formato
[Fornecedor.]Componente[.Verso]. 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
informaes, sobre o registro do componente, ficam armazenadas na Registry do Windows
2000, conforme indicado na Figura 10.1.
567
J um objeto criado em nvel de Sesso, ser destrudo quando a sesso for encerrada. Isto
acontece quando a sesso atinge o tempo limite ou o mtodo Abandon chamado. No exemplo
abaixo criamos um objeto em nvel de sesso chamado Rodar. Este componente , na verdade,
uma instncia do componente AdRotator. Estudaremos o mesmo mais adiante neste captulo.
<%
Set Session(rodar) = Server.CreateObject(MSWC.AdRotator)
%>
Podemos destruir um objeto atribuindo a varivel que representa o objeto, o valor Nothing.
<%
Session(rodar) = Nothing
%>
NOTA
Destruir o objeto significa retir-lo da memria, de maneira que no possa mais ser utilizado
e os recursos que o mesmo utilizava so liberados.
IMPORTANTE
No podemos criar uma instncia de objeto com o mesmo nome de um objeto interno. O
exemplo a seguir retorna um erro:
<%
Set Response = Server.CreateObject(Response)
%>
No podemos criar uma instncia de objeto chamada Response, uma vez que no Modelo de
Objetos do ASP j existe um objeto chamado Response, conforme estudado em captulos anteriores.
O Mtodo Execute(url)
O mtodo Execute chama um arquivo .asp e o processa como se ele fosse parte da chamada do
script ASP. A execuo da pgina corrente suspensa e o controle transferido para a pgina
especificada no parmetro URL. O mtodo Execute similar a uma chamada de procedimento
em muitas linguagens de programao. A pgina, chamada utilizando o mtodo Execute,
processada e, aps o trmino da execuo, o controle retorna para a pgina que fez a chamada.
O mtodo Execute possui a seguinte sintaxe:
Server.Execute(url)
568
onde URL uma seqncia de caracteres especificando o local do arquivo .asp a ser executado.
Se um caminho absoluto for especificado para esse parmetro, ento, ele dever ser para um
arquivo .asp dentro do mesmo espao do aplicativo, isto , dentro da mesma pasta virtual que
representa o aplicativo.
O mtodo Server.Execute fornece uma maneira de dividir um aplicativo complexo em mdulos
individuais. Empregando este mtodo, voc pode desenvolver uma biblioteca de arquivos
.asp que pode ser chamada quando necessrio. Esse enfoque uma alternativa para incluses
do lado do servidor, utilizando a diretiva #include.
Depois que o IIS processa o arquivo .asp especificado no parmetro url de Server.Execute, a
resposta retornada ao script ASP que fez a chamada. O arquivo .asp executado pode modificar
cabealhos HTTP. No entanto, como em qualquer arquivo .asp, se o mesmo tentar modificar
os cabealhos HTTP depois que enviar uma resposta para o cliente, gerar um erro.
O parmetro 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.
O parmetro caminho pode conter uma seqncia de caracteres de consulta.
Exemplo
O exemplo a seguir demonstra a execuo de um arquivo .asp que retorna algum texto. No
arquivo chamador.asp temos uma chamada do mtodo Execute para o arquivo chamado.asp.
Ao encontrar esta chamada, a execuo desloca-se para o arquivo chamado.asp, o qual
executado. Ao encerrar a execuo do arquivo chamado.asp, a execuo continua no arquivo
chamador.asp, com a linha seguinte a que utilizou o mtodo Execute.
Listagem 10.1 Arquivo que utiliza o mtodo Execute chamador.asp.
1
<HTML>
<BODY>
<%
Server.Execute(chamado.asp)
%>
</BODY>
10
</HTML>
569
<HTML>
<BODY>
<%
Response.Write <HR>
Response.Write <HR>
%>
</BODY>
</HTML>
O Mtodo GetLastError( )
O mtodo GetLastError retorna um objeto do tipo ASPError que descreve a condio de erro
que ocorreu. Esse mtodo s est disponvel antes do arquivo .asp ter enviado algum contedo
para o cliente.
Sintaxe
Server.GetLastError ()
570
NOTA
Votaremos a estudar este mtodo, com maiores detalhes, no Captulo 11, sobre tratamentos de
erro em pginas ASP.
O Mtodo URLEncode(texto)
Passamos uma String como parmetro para o mtodo URLEncode. Por exemplo, posso passar
o meu nome como argumento:
Jlio Cesar Fabris Battisti
O mtodo URLEncode converte os caracteres especiais, tais como letras acentuadas, espaos
em brancos e outros sinais que no so caracteres vlidos para fazerem parte de uma URL,
nos equivalentes que so vlidos. O meu nome seria convertido da seguinte maneira:
J%FAlio+Cesar+Fabris+Battisti
Observe que o (que no um caractere vlido para fazer parte de uma URL) foi substitudo
por %FA (caractere vlido para fazer parte de uma URL) e cada espao em branco foi substitudo
por um sinal de +. Podemos notar esta substituio, claramente, quando os dados que
preenchemos em um formulrio so enviados atravs do mtodo get. Conforme descrito
anteriormente neste livro, no mtodo get as informaes que foram digitadas em um formulrio,
so enviadas junto com a URL da pgina que est sendo chamada. Para capturar estes dados,
precisamos utilizar o mtodo QueryString do objeto Request Request.QueryString
(NomeDoCampo).
Mais adiante estaremos apresentando um exemplo prtico que far uso do mtodo URLEncode
e tambm do Mtodo HTMLEncode, que veremos ainda neste item.
Outros exemplos de converso feitas pelo mtodo URLEncode:
Orlando Frao
convertido para
Orlando+Fra%E7%E3o
Urlndia Alta
convertido para
Url%E2ndia+Alta
Boqueiro do Leo
convertido para
Boqueir%E3o+do+Le%E3o
Jos da Silva
convertido para
Jos%E9+da+Silva
571
Considere o exemplo a seguir, onde temos uma URL bastante longa, a qual resultado do
envio dos dados que foram preenchidos em um formulrio, utilizando o mtodo get ao invs
do mtodo 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 formulrio so enviados junto com a URL no formato
de pares e codificados de tal maneira que os caracteres especiais so 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 espao substitudo por um sinal de + e o foi substitudo por seu
equivalente vlido para fazer parte de uma URL %E9.
No trecho de cdigo a seguir, temos um exemplo dos resultados obtidos com a utilizao 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 mtodo QueryString decodifica os valores especiais de volta para os valores
originais. Por exemplo, o %E9 substitudo de volta para o original .
572
O Mtodo MapPath(url)
O mtodo MapPath(url) retorna o caminho fsico no servidor, correspondente a URL passada
como parmetro. Um caminho fsico um caminho do tipo: D:\Inetpub\wwwroot\Capitulo10.
O parmetro URL especifica o caminho relativo ou virtual a ser mapeado para um diretrio
fsico. Se Caminho iniciar com uma barra simples (/) ou invertida (\), o mtodo MapPath
retornar o caminho como se fosse um virtual completo. Se Caminho no iniciar com uma
barra, o mtodo MapPath retornar um caminho relativo ao diretrio do arquivo .asp que est
sendo processado.
Na Listagem 10.3, temos um exemplo de utilizao do mtodo MapPath.
Listagem 10.3 Utilizando o mtodo MapPath exmap.asp.
1
<HTML>
<HEAD>
</HEAD>
<BODY>
<HR>
<%
10
11
12
13
14
15
%>
16
<HR>
17
</BODY>
18
</HTML>
Na Figura 10.3 temos o resultado da pgina da Listagem 10.3 quando carregada no Internet
Explorer.
573
NOTA
O mtodo MapPath no verifica se o caminho que ele retorna vlido ou existe no servidor. Ele
apenas retorna qual seria o caminho fsico para o endereo relativo que foi passado. O mtodo
faz esta determinao com base no caminho fsico do diretrio raiz.
IMPORTANTE
No podemos utilizar o mtodo MapPath nos eventos Application_OnEnd e Session_OnEnd.
O Mtodo Transfer(url)
O mtodo Transfer(url) pra a execuo da pgina atual, e transfere a execuo para a
pgina especificada no parmetro URL. Caso tenham sido definidas informaes para o objeto
Session ou informaes de transao, as mesmas sero transferidas para a nova pgina. Porm,
o mtodo Transfer(url), aps finalizar a execuo da pgina que foi chamada, no retorna o
controle para a pgina original, como acontece no mtodo Execute.
574
O Mtodo HTMLEncode(texto)
O mtodo HTMLEncode converte os caracteres especiais do texto, passado como parmetro,
para caracteres reconhecidos no cdigo HTML. Considere os exemplos:
substitudo por
á
substitudo por
é
substitudo por
í
substitudo por
ó
substitudo por
ú
>
substitudo por
>
<
substitudo por
<
&
substitudo por
&
575
PROBLEMA
Vamos criar um exemplo que faz conexo com o banco de dados nwind.mdb. No nosso exemplo,
ser apresentada uma pgina principal.asp na qual o usurio selecionar o nome de um
pas em uma lista de pases. Esta lista de pases ser montada, dinamicamente, a partir da
tabela Customers, de tal maneira que somente sejam exibidos os pases para os quais existem
clientes cadastrados. Alm disso a listagem ser classificada em ordem alfabtica. Aps
selecionar o pas, o usurio clica em um boto Pesquisar. Com isso ser retornada uma lista,
em forma de tabela, com todos os Clientes para o Pas selecionado pgina listaclientes.asp. O
nome do Cliente ser um link, que ao ser clicado abrir uma pgina com as informaes sobre
o mesmo pgina cliente.asp. Para construir esta pgina teremos que utilizar alguns mtodos
do objeto Server.
<HTML>
<HEAD>
</HEAD>
<BODY>
<%
10
11
Set conn=Server.CreateObject(ADODB.Connection)
12
13
14
conn.ConnectionString = PROVIDER=MICROSOFT.JET.OLEDB.4.0;
DATA SOURCE=c:\meus documentos\nwind.mdb
576
15
conn.Open
16
17
a lista de pases.
18
21
%>
22
23
24
25
26
<%
27
28
29
30
na lista.
31
32
33
34
Response.Write SELECTED
35
End If
36
37
Paises.MoveNext
38
Loop
39
%>
40
</SELECT>
577
41
<HR>
42
43
</FORM>
44
</BODY>
45
</HTML>
<HTML>
<HEAD>
</HEAD>
<BODY>
<%
10
11
Set conn=Server.CreateObject(ADODB.Connection)
12
13
578
14
conn.ConnectionString = PROVIDER=MICROSOFT.JET.OLEDB.4.0;
15
conn.Open
16
17
a lista de pases.
18
21
%>
22
<HR>
23
24
25
<HR>
26
27
<TR>
28
<TD><B>Nome do Cliente</B></TD>
29
<TD><B>Pas</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
=server.URLEncode(Clientes.Fields(CustomerID))%>>
<%=Clientes.Fields(CompanyName)%>
40
</A>
41
</FONT>
42
</TD>
43
44
</TD>
45
</TR>
46
<%
47
Clientes.MoveNext
48
Loop
49
%>
50
</TABLE>
51
<HR>
52
</BODY>
53
</HTML>
<TD>
37
<FONT FACE=Arial>
38
<P>
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, construmos a seguinte URL:
http://servidor/capitulo10/cliente.asp?Codigo=
580
Este cdigo passa o campo CustomerID como parmetro para o mtodo URLEncode, o qual
ir converter qualquer caractere no permitido em uma URL para o equivalente permitido,
conforme descrito anteriormente. Vamos supor que o cdigo do clientes seja JSILVA. Neste
ponto o nosso link estar assim:
http://servidor/capitulo10/cliente.asp?Codigo=JSILVA
Este cdigo 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 parmetro que ser passado na URL
o Cdigo do Cliente (CustomerID), porm o texto que ser exibido na pgina o Nome do
Cliente (CompanyName). Estamos passando o Cdigo do Cliente como parmetro, porque
este campo uma chave primria e, portanto, no existiro dois clientes com o mesmo cdigo.
Porm, existe a possibilidade de existirem dois clientes com o mesmo nome.
Com isso montamos, facilmente, um link no nome de cada cliente. Quando o usurio clicar
no nome do cliente, ser passado, juntamente com a URL o Cdigo do Cliente como parmetro
de pesquisa para a pgina cliente.asp. O passo final da nossa aplicao construir a pgina
cliente.asp e depois testar o funcionamento da mesma.
Na Listagem 10.6, temos o cdigo para a construo da pgina cliente.asp.
Listagem 10.6 Localizando o registro do cliente. cliente.asp.
1
<HTML>
<HEAD>
</HEAD>
<BODY>
<%
10
11
Set conn=Server.CreateObject(ADODB.Connection)
12
581
13
14
conn.ConnectionString = PROVIDER=MICROSOFT.JET.OLEDB.4.0;
15
conn.Open
16
o Cliente.
17
18
19
%>
20
<HR>
21
22
<% =Cliente.Fields(CompanyName)%>
23
<HR>
24
25
<HR>
26
27
<TR>
28
29
<TD>Cdigo do Cliente:</TD>
<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>
37
<TD><B><% =Cliente.Fields(ContactName)%></B></TD>
Contato:</TD>
582
38
</TR>
39
<TR>
40
<TD>
41
<TD><B><% =Cliente.Fields(Address)%></B></TD>
42
</TR>
43
<TR>
44
45
<TD>
Endereo:</TD>
Cidade:
</TD>
<TD><B><% =Cliente.Fields(City)%></B></TD>
46
</TR>
47
<TR>
48
<TD>
49
<TD><B><% =Cliente.Fields(PostalCode)%></B></TD>
50
</TR>
51
<TR>
CEP:</TD>
52
<TD>
53
<TD><B><% =Cliente.Fields(Phone)%></B></TD>
54
</TR>
55
<TR>
Fone:</TD>
56
<TD>
57
<TD><B><% =Cliente.Fields(Fax)%></B></TD>
58
</TR>
59
<TR>
60
61
<TD>
Fax:</TD>
Pas:</TD>
<TD><B><% =Cliente.Fields(Country)%></B></TD>
62
</TR>
63
<HR>
64 </TABLE>
65
</BODY>
66
</HTML>
583
Observe que utilizamos cdigo ASP na tag <TITLE></TITLE>, o que possvel, sem maiores
problemas.
Outro detalhe a ser observado que utilizamos o mtodo Request.QueryString. Isto foi feito,
porque o Cdigo do Cliente foi passado na prpria URL. como se estivssemos utilizando o
mtodo get da tag <FORM>. Por isso, para recuperar o valor passado como parmetro,
precisamos utilizar o mtodo Request.QueryString ao invs de Request.Form.
Agora vamos ver a nossa aplicao em funcionamento.
Na Figura 10.4 vemos que foi carregada a pgina principal.asp e o usurio selecionou Argentina
na lista de pases.
584
585
prprio navegador, para retornar pgina listaclientes.asp, com a lista de Clientes da Argentina
e clicar em um outro Cliente para ver os dados do mesmo.
Com este exemplo prtico, encerramos o estudo do objeto Server. Nos prximos itens
aprenderemos a utilizar alguns componentes que so fornecidos juntamente com o IIS.
586
pgina, fosse exibido uma lista de links, de forma que o usurio pudesse se deslocar para uma
parte especfica do manual e tambm uma barra de navegao com links para o prximo
documento, o documento anterior, para o primeiro documento e para o ltimo documento.
Obviamente que esta estrutura de navegao pode ser criada manualmente. Porm pequenas
modificaes como a insero ou incluso de pginas, faro com que toda a estrutura de
navegao tenha que ser alterada. Para facilitar a criao de uma estrutura de navegao
deste tipo, podemos utilizar o componente Content Link.
O objeto Content Link fornecido atravs da DLL Nextlink.dll, a qual encontra-se, normalmente,
na pasta \winnt\system32\inetsrv, do drive onde est instalado o Windows 2000.
A sintaxe para criar um objeto do tipo Content Link a seguinte:
Set meu_objeto = Server.CreateObject(MSWC.Nextlink)
onde MSWC.Nextlink a identificao com que o objeto Content Link foi registrado.
Para salientar a utilizao do componente Content Link, vamos criar um exemplo onde temos
um manual com cinco captulos, alm da Introduo. Queremos utilizar o componente Content
Link para exibir, em todas as pginas do manual, um ndice com links para a Introduo e
para os cinco captulos; e no final e incio de cada documento, uma barra de navegao com
links para o prximo, anterior, primeiro e o ltimo documento.
Os documentos para o nosso exemplo sero os indicados na Tabela 10.1.
Tabela 10.1 Documentos para o nosso manual de exemplo.
Documento
Descrio
intro.asp
cap1.asp
cap2.asp
cap3.asp
cap4.asp
cap5.asp
O componente Content Link trabalha em conjunto com um arquivo de texto, o qual conhecido
como Lista de contedo. Neste arquivo de texto cada linha representa um documento que
far parte da Lista de contedo. Cada linha possui o seguinte formato:
URL-Pgina
Descrio
Comentrio
Cada um dos elementos deve ser separado do anterior por uma tabulao.
587
Este arquivo, alm de descrever quais os documentos que faro parte da Lista de contedo,
tambm define a ordem do documento nesta lista. Por exemplo, se estamos no arquivo cap3.asp
e clicamos no link prximo, ser carregada a pgina cap4.asp. Esta seqncia definida pela
ordem das linhas no arquivo que contm a Lista de contedo.
Para o nosso exemplo, teremos o seguinte arquivo de texto conteudo.txt:
intro.asp
Introduo
cap1.asp
Captulo 1
Captulo 1 do Manual
cap2.asp
Captulo 2
Captulo 2 do Manual
cap3.asp
Captulo 3
Captulo 3 do Manual
cap4.asp
Captulo 4
Captulo 4 do Manual
cap5.asp
Captulo 5
Captulo 5 do Manual
Chamaremos este arquivo de conteudo.txt, o qual ser salvo na mesma pasta que os demais
arquivos.
Uma vez criado o objeto, o prximo passo definir qual o arquivo de texto que ser utilizado
pelo componente Content Link.
A etapa final utilizar os mtodos do objeto Content Link para criar a estrutura dinmica de
navegao.
Antes de criarmos o nosso exemplo, vamos aprender a criar um objeto associado a um
componente do tipo Content Link. Tambm vamos estudar os mtodos deste componente.
588
No nosso exemplo, como o arquivo conteudo.txt possui seis linhas, este comando ir retornar
o valor 6. importante saber o nmero total de pginas na Lista de contedo, para que a
estrutura de navegao possa ser criada corretamente. A contagem dos elementos inicia com
1, e no 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 parmetro no for
encontrado, o mtodo GetListCount ir retornar 0.
O mtodo GetListIndex: Este mtodo retorna o nmero do ndice do elemento atual no
arquivo de contedo. A cada momento somente existe um item que o atual. Podemos
alterar o item atual utilizando os mtodos GetNextURL e GetPreviousURL, que estudaremos
mais adiante. Isto semelhante ao conceito de registro corrente de um objeto RecordSet e
utilizao dos mtodos MoveNext e MovePrevious do objeto RecordSet. O mtodo retorna
0 se a pgina atual no estiver includa no arquivo de contedo.
A sintaxe para este mtodo a seguinte:
Response.Write conteudo.GetListIndex(conteudo.txt)
<HTML>
<HEAD>
</HEAD>
<BODY>
<%
10
Set conteudo=Server.CreateObject(MSWC.Nextlink)
589
11
12
ultimo = conteudo.GetListCount(conteudo.txt)
13
atual = conteudo.GetListIndex(conteudo.txt)
14
If atual=ultimo Then
15
16
17
18
End If
19
%>
20
</BODY>
21
</HTML>
590
591
<HTML>
<HEAD>
</HEAD>
<BODY>
<%
Set conteudo=Server.CreateObject(MSWC.Nextlink)
10
ultimo = conteudo.GetListCount(conteudo.txt)
11
primeiro = 1
12
%>
13
14
15
<TR>
16
<TD colSpan=2>
<A HREF=<%=conteudo.GetNthURL(conteudo.txt,primeiro)%>>[Incio]</A>
<A HREF=<%=conteudo.GetPreviousURL(conteudo.txt)%>>[Anterior]</A>
<A HREF=<%=conteudo.GetNextURL(conteudo.txt)%>>[Prxima]</A>
<A HREF=<%=conteudo.GetNthURL(conteudo.txt,ultimo)%>>[ltima]</A>
17
</TD>
18
</TR>
19
20
<TR>
21
<TD width=10%>
592
22
<%
23
24
<A HREF=<%=conteudo.GetNthURL(conteudo.txt,i)%>>
<% =conteudo.GetNthDescription(conteudo.txt,i)%></A>
25
<%
26
Next
27
%>
28
29
</TD>
<% A prxima clula a clula de contedo. %>
30
<TD width=90%>
31
32
<HR>
33
<P><I>INTRODUO</I></P>
34
<HR>
35
36
<HR>
37
</TD>
38
</TR>
39
40
<TR>
41
<TD colSpan=2>
42
<A HREF=<%=conteudo.GetNthURL(conteudo.txt,primeiro)%>>[Incio]</A>
43
<A HREF=<%=conteudo.GetPreviousURL(conteudo.txt)%>>[Anterior]</A>
44
<A HREF=<%=conteudo.GetNextURL(conteudo.txt)%>>[Prxima]</A>
45
<A HREF=<%=conteudo.GetNthURL(conteudo.txt,ultimo)%>>[ltima]</A>
46
</TD>
47
</TR>
48
</TABLE>
49
</BODY>
50
</HTML>
593
<TD colSpan=2>
<A HREF=<%=conteudo.GetNthURL(conteudo.txt,primeiro)%>>[Incio]</A>
<A HREF=<%=conteudo.GetPreviousURL(conteudo.txt)%>>[Anterior]</A>
<A HREF=<%=conteudo.GetNextURL(conteudo.txt)%>>[Prxima]</A>
<A HREF=<%=conteudo.GetNthURL(conteudo.txt,ultimo)%>>[ltima]</A>
17
</TD>
594
valor 1 para fazer referncia primeira URL do arquivo de contedo, e ultimo contm o valor
retornado pelo mtodo GetListCount, que o ndice da ltima URL.
Outro detalhe importante a observar o caso de estarmos na primeira ou na ltima pgina. Se
estivermos na primeira pgina, o mtodo GetPreviousURL retorna o endereo da ltima pgina.
Se estivermos na ltima pgina, o mtodo GetNextURL retorna o endereo da primeira pgina.
Tambm gostaria de comentar a maneira como foi montado o menu de opes da coluna da
esquerda. Neste caso, utilizamos um lao For, variando de 1 at ltimo, para montar um
menu com links para todas as pginas do arquivo de contedo.
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 pginas que no esto no incio ou no fim do contedo. Vamos supor que
precisssemos inserir uma nova pgina 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 tivssemos criado
os links manualmente, teramos que revisar todas as pginas e alter-los. Se estivermos utilizando
o componente Content Link, a nica coisa que precisa ser feita alterar o arquivo de contedo,
inserindo a nova pgina na posio correta e renomear as demais, conforme indicado a seguir:
intro.asp
Introduo
cap1.asp
Captulo 1
Captulo 1 do Manual
cap2.asp
Captulo 2
Captulo 2 do Manual
cap3.asp
Captulo 3
Captulo 3 do Manual
cap4.asp
Captulo 4
Captulo 4 do Manual
cap5.asp
Captulo 5
Captulo 5 do Manual
cap6.asp
Captulo 6
Captulo 6 do Manual
595
O Componente Ad Rotator
O componente Ad Rotator permite que uma pgina ASP exiba um grfico diferente a cada vez
em que carregada. Sempre que um usurio abre ou recarrega a pgina da Web, o componente
Ad Rotator exibe um novo anncio baseado nas informaes especificadas em um arquivo de
texto, conhecido como Arquivo de Programao de Rotatria. Neste arquivo esto as diversas
informaes necessrias para que o componente funcione corretamente.
596
Este componente normalmente utilizado para exibir imagens animadas que funcionam como
anncios e propaganda. Cada vez que o usurio carrega a pgina exibido um anncio diferente.
Alm disso, possvel registrar quantos usurios clicam em cada anncio definindo o parmetro
URL no Arquivo de Programao de Rotatria para redirecionar os usurios para uma
determinada pgina, quando o usurio clicar no anncio. Quando especificamos esse parmetro,
cada salto para a URL de um anunciante registrado nos logs de atividade do servidor Web.
No Arquivo de Programao de Rotatria tambm podemos configurar uma determinada
freqncia para cada um dos anncios, de tal maneira que um anncio aparea um nmero
maior de vezes do que os outros. Desta forma estaramos priorizando um ou mais anncios
em detrimento de outros.
Para utilizar este componente necessitamos dos seguintes arquivos:
adrot.dll: Este o arquivo onde est implementada a funcionalidade do componente.
Este arquivo encontra-se, normalmente, na pasta \winnt\system32\inetsrv, do drive
onde est instalado o Windows 2000.
Arquivo de Programao da Rotatria: Um arquivo de texto que contm informaes
sobre o arquivo e a programao de exibio de anncios, tais como quais os anncios
que sero exibidos e qual o percentual de vezes, em relao ao total, que cada um
deve ser exibido. Esse arquivo deve estar disponvel em um caminho virtual do
servidor da Web.
Arquivo de Redirecionamento: Um arquivo opcional que implementa o redirecionamento e permite que o componente Rotatria de anncios registre quantos usurios
clicam em cada anncio.
Para criar um objeto do tipo Ad Rotator, podemos utilizar a seguinte sintaxe:
Set nome_objeto = Server.CreateObject( MSWC.AdRotator )
597
O Arquivo de Programao de Rotatria tem duas sees. A primeira seo define parmetros
que se aplicam a todas as imagens de anncios na programao de rotao. A segunda seo
especifica as informaes sobre o arquivo e a localizao de cada anncio individual e a
porcentagem de tempo de exibio que cada anncio deve receber. As duas sees so
separadas por uma linha que contm somente um asterisco (*).
Na primeira seo existem quatro parmetros globais, cada um consistindo em uma palavrachave e um valor. Todos eles so opcionais. Se voc no especificar valores para os parmetros
globais, o componente Ad Rotator usar os valores padro. Nesse caso, a primeira linha do
arquivo deve conter somente um asterisco (*).
Sintaxe
[REDIRECT URL]
[WIDTH Largura]
[HEIGHT Altura]
[BORDER Borda]
*
URL_anncio
URL_home_page_anncio
Texto
impresses
URL
Especifica o caminho para o arquivo dynamic link library (.dll, biblioteca de link dinmico)
ou de aplicativo (.asp) que implementa o redirecionamento. Esse caminho pode ser
especificado por completo (http://MyServer/MyDir/redirect.asp) ou em relao ao diretrio
virtual (/MyDir/redirect.asp).
Largura
Especifica a largura do anncio na pgina, em pixels. O padro so 440 pixels.
Altura
Especifica a altura do anncio na pgina, em pixels. O padro so 60 pixels.
598
Borda
Especifica a espessura da borda do link em torno do anncio, em pixels. O padro uma
borda de 1 pixel. Defina esse parmetro para 0 para um link sem borda.
Estes quatro primeiros parmetros so opcionais e caso sejam definidos tm efeitos sobre
todos os anncios a serem exibidos. Caso um ou mais destes parmetros no seja definido,
sero utilizados os valores padro. Mesmo que nenhum destes parmetros seja definido,
devemos colocar o * em uma linha, antes de iniciarmos a segunda seo do documento.
A partir de agora veremos os parmetros para a segunda seo do documento, aps a linha
com *. Estes parmetros definem cada um dos anncios a serem exibidos, individualmente.
URL_anncio
A localizao do arquivo de imagem do anncio. Por exemplo: images/anuncio1.gif.
URL_home_page_anncio
A localizao da home page do anncio, isto , a pgina que ser carregada se o usurio clicar
no anncio. Se o anncio no tiver uma home page, coloque um hfen (-) nessa linha para
indicar que no existe qualquer link para esse anncio.
Texto
Um texto alternativo exibido se o navegador no oferecer suporte a elementos grficos ou se
seus recursos grficos estiverem desativados.
Impresses
Um nmero entre 0 e 10000 que indica a densidade relativa do anncio.
Por exemplo, se um Arquivo de Programao de Rotatria contm trs anncios com o parmetro
impresses definido para 2, 3 e 5, o primeiro anncio ser exibido durante 20 % do tempo, o
segundo, durante 30 % do tempo e o terceiro, durante 50 % do tempo. Se a soma dos parmetros de
impresso de todos os itens exceder 10000, ser gerado um erro na primeira vez que o Arquivo de
Programao de Rotatria for acessado por uma chamada do mtodo GetAdvertisement.
599
Exemplo
O script a seguir demonstra como voc pode usar um Arquivo de Programao de Rotatria
para exibir vrios anncios e como incluir um arquivo de redirecionamento.
Capitulo10\rotatoria.txt
WIDTH 236
HEIGHT 56
BORDER 4
*
/capitulo10/imagens/anuncio1.gif
Pgina do Anunciante 1
20
/capitulo10/imagens/anuncio2.gif
http://servidor/capitulo10/anunciante2.htm
Pgina do Anunciante 2
30
/capitulo10/imagens/anuncio3.gif
http://servidor/capitulo10/anunciante3.htm
Pgina do Anunciante 3
50
Observe que quando for exibido anuncio1.gif, o mesmo no ser exibido como um link.
O Arquivo de Redirecionamento
O Arquivo de Redirecionamento um arquivo criado pelo desenvolvedor da aplicao Web.
Ele inclui geralmente um script para a anlise da seqncia de caracteres da solicitao pelo
objeto Ad Rotator e para o redirecionamento do usurio para a URL associada ao anncio no
qual o usurio clicou.
Voc tambm pode incluir um script no Arquivo de Redirecionamento para contar o nmero
de usurios que clicaram em um anncio especfico e salvar essas informaes em um arquivo
no servidor.
Exemplo
O exemplo a seguir redireciona o usurio para a home page do anncio.
600
redireciona.asp
<%
Response.Redirect(Request.QueryString(url)) %>
Observe que o parmetro URL passado no prprio link quando o usurio clica no anncio.
por isso que estamos utilizando Request.QueryString.
O nome do arquivo de imagem tambm passado como parmetro atravs da URL. Podemos
utilizar este parmetro para calcular o nmero de vezes que cada anncio clicado. No
fragmento de cdigo abaixo temos um exemplo de como calcular quantas vezes foram clicados
cada um dos anncios do nosso exemplo:
anuncio1.gif
anuncio2.gif
anuncio3.gif
Arquivo redireciona.asp que faz a contabilidade de cliques em cada anncio:
<%
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
Cdigo para salvar o valor do contador para cada anncio no banco de dados
...
Cdigo para redirecionar para a pgina especfica de cada anncio
...
%>
Onde temos Cdigo para salvar o valor do contador para cada anncio no banco de dados,
poderamos estabelecer uma conexo com um banco de dados e salvar o valor de cada contador
no banco de dados, pois aps a pgina 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
Descrio
Border
Clickable
TargetFrame
O nico parmetro para este mtodo especifica o local do arquivo de programao de rotatria
em relao ao diretrio virtual. Por exemplo, se o caminho fsico fosse C:\Inetpub\wwwroot\
Ads\Adrot.txt (no qual wwwroot o diretrio 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 mtodo retorna o cdigo HTML que exibe o anncio na pgina atual.
Vamos a um exemplo de utilizao do componente Ad Rotator.
Considere a pgina usaadrotator.asp da Listagem 10.9.
602
<HTML>
<HEAD>
</HEAD>
<BODY>
<%
Set conteudo=Server.CreateObject(MSWC.AdRotator)
conteudo.Clickable = True
10
%>
11
<HR>
12
13
<HR>
14
<% =conteudo.GetAdvertisement(/Capitulo10/rotatoria.txt)
15
%>
16
<HR>
17
18
</BODY>
19
</HTML>
20%
anuncio2.gif
30%
anuncio3.gif
50%
603
604
605
Considere o exemplo:
contador.Hits(/capitulo10/anuncio1.asp)
NOTA
O mtodo Hits retorna um nmero do tipo LONG que indica o nmero de vezes que uma
pgina da Web especfica foi aberta.
PageHit: O mtodo PageHit incrementa em 1 a contagem de acessos pgina da Web atual.
Utilizamos a seguinte sintaxe:
nome_objeto.PageHit( )
Considere o exemplo:
contador.PageHit( )
606
Veja o exemplo:
contador.Reset(/capitulo10/anuncio1.asp)
<HTML>
<HEAD>
</HEAD>
<BODY>
<HR>
<%
10
11
Set contador=Server.CreateObject(MSWC.PageCounter)
12
%>
13
14
<%
15
contador.PageHit
16
Response.Write contador.Hits
17
%>
18
<%
19
If contador.Hits =1 Then
20
Response.Write Vez
607
21
Else
22
Response.Write Vezes
23
End If
24
%>
25
</B></FONT>
26
<HR>
27
</BODY>
28
</HTML>
Na primeira vez que esta pgina for acessada, obteremos o resultado indicado na Figura 10.11.
608
Na Figura 10.13, temos uma noo do arquivo hitcnt.cnt onde so armazenadas as informaes
sobre o nmero de acessos.
609
capacidades do navegador do cliente, e com base nestas capacidades, carregar uma ou outra
verso da pgina, especfica para cada caso.
O componente Browser Capabilities cria um objeto do tipo BrowserType, o qual disponibiliza
para o script, uma descrio dos recursos do navegador da Web do cliente.
Quando um navegador se conecta com o servidor Web, ele envia automaticamente um
cabealho Agente de usurio do HTTP. Esse cabealho uma seqncia de caracteres ASCII
que identifica o navegador e seu nmero de verso. O objeto BrowserType compara o cabealho
com entradas no arquivo Browscap.ini.
Se ele encontrar uma correspondncia, o objeto BrowserType assumir as propriedades da
listagem do navegador que correspondeu ao cabealho Agente de usurio.
Se o objeto no encontrar uma correspondncia para o cabealho no arquivo browscap.ini,
ele procurar a correspondncia mais prxima usando os curingas * e ?. Se no for possvel
encontrar uma correspondncia usando os curingas, o objeto usar as configuraes do
navegador padro, se elas tiverem sido especificadas no arquivo browscap.ini. Se o objeto
no encontrar uma correspondncia e as configuraes do navegador padro no tiverem
sido especificadas no arquivo browscap.ini, o objeto definir todas as propriedades para a
seqncia de caracteres UNKNOWN.
Voc pode adicionar propriedades ou novas definies de navegador a esse componente
simplesmente atualizando o arquivo browscap.ini.
O componente Browser Capabilities usa os seguintes arquivos:
Browscap.dll: Este o arquivo onde est implementada a funcionalidade do
componente. Este arquivo encontra-se, normalmente, na pasta \winnt\system32\inetsrv,
do drive onde est instalado o Windows 2000.
Browscap.ini: um arquivo de texto que mapeia os recursos do navegador para o
cabealho Agente de usurio do HTTP. Esse arquivo deve estar no mesmo diretrio
que o arquivo Browscap.dll.
Utilizamos a seguinte sintaxe para criar um objeto do tipo BrowserType:
Set nome_objeto = Server.CreateObject(MSWC.BrowserType)
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
Na Listagem 10.11, temos um pequeno exemplo retirado do Help do IIS, onde so detectadas
algumas capacidades do navegador.
Listagem 10.11 Utilizando o componente Browser Capabilities capacidades.asp.
1
<HTML>
<HEAD>
</HEAD>
<BODY>
<%
<TABLE BORDER=1>
<TR>
9
10
11
12
13
<TD>Browser</TD>
<TD>
<TD>Version</TD>
<TD>
</TR>
15
<TR>
17
%> </TD>
<TR>
14
16
<%= bc.browser
<%= bc.version
%>
</TD>
<TD>Frames</TD>
<TD>
18
<%
19
<%
else
<%
end if
20
%>
%>
TRUE
FALSE
%>
<TD>
21
</TR>
22
<TR>
23
<TD>Tables</TD>
24
<TD>
25
<%
26
<%
27
<%
28
</TD>
29
%>
%> FALSE
%>
</TR>
611
TRUE
30
<TR>
31
<TD>BackgroundSounds</TD>
32
<TD>
33
<%
34
<%
else
<%
end if
35
36
37
TRUE
%> </TD>
</TR>
<TR>
38
<TD>VBScript</TD>
39
<TD>
40
<%
41
<%
else
42
43
%>
%> FALSE
<%
%>
TRUE
%> FALSE
end if
%>
</TD>
44
</TR>
45
<TR>
46
<TD>JScript</TD>
47
<TD>
48
<%
49
<%
else
50
<%
end if
51
</TD>
52
</TR>
53
</TABLE>
54
</BODY>
55
</HTML>
%>
TRUE
%> FALSE
%>
Ao carregarmos este exemplo no Internet Explorer, obtemos o resultado indicado na Figura 10.14.
Ao carregarmos este mesmo exemplo no Nestcape Navigator, obtemos o resultado indicado
na Figura 10.15.
612
613
Descrio
ActiveXControls
Backgroundsounds
Beta
Browser
Cookies
Frames
JScript
Plataform
Tables
VBScript
Version
Como um exemplo final, podemos utilizar este componente para detectar se o navegador o
Internet Explorer ou o Netscape e, com base nesta informao, redirecionar o usurio para
uma pgina desenvolvida especificamente para cada um dos navegadores.
Na Listagem 10.12, temos este exemplo.
Listagem 10.12 Utilizando o componente Browser Capabilities para redirecionar o usurio.
1
<HTML>
<HEAD>
</HEAD>
<BODY>
<%
Response.Redirect(paginaie.asp)
614
10
Response.Redirect(paginanetscape.asp)
11
Else
12
Response.Redirect(outros.asp)
13
End If
14
%>
15
</BODY>
16
</HTML>
Concluso
Neste captulo estudamos, detalhadamente, alguns componentes importantes na criao de
aplicativos Web, utilizando ASP e o IIS.
Iniciamos o captulo por um estudo completo do objeto Server. Vimos todos os mtodos e a
nica propriedade deste objeto. Depois, foi apresentado um exemplo prtico, o qual soluciona
um problema bastante comum na criao de aplicaes Web: como tornar o nome de um
usurio ou produto em um link, para o registro do funcionrio ou produto no banco de dados.
Com a utilizao dos mtodos do objeto Server foi simples a soluo deste problema.
Depois, passamos a estudar uma srie de componentes do IIS. Estudamos em detalhes, cada
um dos seguintes componentes:
Content Link.
Ad Rotator.
Page Counter.
Browser Capabilities.
615
Para cada um destes componentes foram apresentados exemplos completos, que ilustraram a
utilizao e as capacidades dos mesmos.
No prximo captulo estaremos tratando de alguns tpicos avanados na criao de aplicaes
Web com ASP. At l ento.
616
Captulo 11
Os Objetos FileSystemObject,
Drive, Folder e File
617
Introduo
Iniciaremos o captulo por um estudo detalhado do objeto FileSystemObject. Este objeto nos
fornece uma srie de recursos para acesso ao sistema de arquivos do servidor, atravs de
nossas pginas ASP.
Veremos uma srie de mtodos e uma propriedade que fazem parte deste objeto. Com a
utilizao do objeto FileSystemObject podemos criar pginas ASP para execuo de funes
administrativas, como por exemplo:
Verificao do espao disponvel em disco e unidades da rede.
Efetuar cpia de segurana entre unidades de disco.
Verificar se determinadas unidades, como gravador de CD ou ZIP Drive, esto
disponveis para uso.
Fazer um levantamento do espao utilizado em cada drive do sistema.
O objeto FileSystemObject , com certeza, um dos que oferece o maior nmero de mtodos.
Vamos estudar todos, detalhadamente. Tambm estudaremos alguns objetos derivados do
objeto FileSystemObject. Vamos estudar o objeto Drive e suas diversas propriedades. Um
pequeno exemplo de utilizao destas propriedades ser apresentado. Vamos estudar tambm
os objetos Folder e File suas diversas propriedades e mtodos. Um pequeno exemplo de
utilizao das propriedades de cada objeto ser apresentado.
No final do captulo, apresentaremos um exemplo prtico que utiliza os diversos objetos que
foram mostrados neste captulo.
O Objeto FileSystemObject
O objeto FileSystemObject nos fornece uma srie de recursos para acesso ao sistema de arquivos
do servidor, atravs de nossas pginas ASP. Com os recursos oferecidos por este objeto, podemos
manipular arquivos de texto, pastas e drives a partir do cdigo ASP.
Para criarmos um objeto do tipo FileSystemObject, podemos utilizar a seguinte sintaxe:
Set nome_objeto = Server.CreateObject(Scripting.FileSystemObject)
618
619
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 no um CD-ROM no drive de CD. Aprenderemos a utilizar a
propriedade IsReady quando estudarmos o objeto Drive mais adiante neste captulo.
620
NOTA
Estudaremos o objeto Drive mais adiante neste captulo.
Neste exemplo utilizamos a propriedade freespace do objeto Drive e a dividimos duas vezes
por 1024 para obter o espao livre em MB. Depois utilizamos a funo FormatNumber, para
exibir o valor obtido sem as casas decimais. O resultado deste trecho de cdigo algo do tipo:
Espao livre em E: 1.070 MB
O mtodo GetDriveName: Este mtodo retorna o nome do drive que foi passado como
parmetro.
A seguir temos um exemplo de utilizao deste mtodo.
<%
O primeiro passo a criao do objeto FileSystemObject.
Set fileobj=Server.CreateObject(Scripting.FileSystemObject)
For each drive in fileobj.Drives
Response.Write drive & <BR>
Response.Write Nome do drive: & fileobj.GetDriveName(drive) & <BR>
Next
%>
621
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 no existe, ser criada, e a pasta de origem e todo o seu contedo
sero copiados.
Se o parmetro de destino for o nome de um arquivo existente, ocorrer um erro.
Se o destino for o nome de uma pasta, o mtodo tentar copiar a pasta de origem e todo o seu
contedo para a pasta de destino. Se um arquivo que est sendo copiado j existir na pasta de
destino e o parmetro substituir estiver definido como False, ir ocorrer um erro. Caso contrrio,
o arquivo do diretrio de origem ser copiado sobre o arquivo do diretrio de destino.
622
Esta linha de cdigo ir copiar todo o contedo da pasta C:\meus documentos para a pasta
C:\teste. Caso a pasta C:\teste no exista, a mesma ser automaticamente criada antes que a
cpia seja efetuada.
O mtodo CreateFolder(nomepasta): Este mtodo cria uma pasta de acordo com o
parmetro que foi passado para o mesmo. Caso a pasta j exista, ser gerado um erro.
O exemplo a seguir, cria uma pasta chamada C:\teste123:
fileobj.CreateFolder(C:\teste123)
Figura 11.2: Erro gerado pelo mtodo CreateFolder quando a pasta j existe.
O mtodo DeleteFolder(pastaname,force): Este mtodo elimina a pasta especificada no
parmetro pastaname e todo o seu contedo. O parmetro force pode ser True ou
False. Este parmetro determina se o contedo de uma pasta, que possui o atributo de
somente leitura, para ser deletado ou no. O valor padro False.
623
Ser gerado um erro se a pasta especificada pelo parmetro pastaname no for encontrada.
Este mtodo encerra a sua execuo na ocorrncia do primeiro erro, sendo que as alteraes
que j foram feitas no sero desfeitas.
Considere o exemplo:
fileobj.DeleteFolder(C:\teste123)
Figura 11.3: Erro gerado pelo mtodo DeleteFolder quando a pasta no existe.
O mtodo FolderExists(nomepasta): Este mtodo retorna True se a pasta passada como
parmetro existe e False caso contrrio. O parmetro nomepasta pode conter um
caminho absoluto ou relativo.
Considere o exemplo abaixo:
<%
Set fileobj=Server.CreateObject(Scripting.FileSystemObject)
For each drive in fileobj.Drives
624
625
for C:\meus documentos e o parmetro passado para este mtodo for cartas, o valor
de retorno ser C:\meus documentos\cartas.
Vamos a mais alguns exemplos para esclarecer o comportamento deste mtodo. Vamos supor
que a pasta atual C:\meus documentos\cartas. Na Tabela 11.1 temos alguns exemplos de
retorno deste mtodo.
Tabela 11.1 Valores de retorno do mtodo GetAbsolutePathName.
Parmetro
Valor de retorno
C:
C:\meus documentos\cartas
C:..
C:\meus documentos
C:\\\
C:\
C:*.*\abril96
C:\meus documentos\cartas\*.*\abril96
filial5
C:\meus documentos\cartas\filial5
626
627
Com este fragmento de cdigo, criamos um objeto do tipo Folder, o qual est ligado pasta
temporria do Windows e pode ser acessado pela varivel temppasta.
O mtodo MoveFolder(origem,destino): Move a pasta especificada no parmetro origem,
para a pasta especificada no parmetro destino. Podemos incluir caracteres curinga na
origem, porm no no destino.
Se a origem contm caracteres curinga ou o destino termina com o caractere \, o mtodo
MoveFolder considera que o destino representa o nome de uma pasta j existente, para a qual
deve ser movida a pasta de origem. Caso contrrio o mtodo assume que o parmetro destino
especifica o nome de uma pasta que deve ser criada e para a qual deve ser movido o contedo
da pasta de origem. Em ambos os casos, devemos considerar o seguinte:
1. Se a pasta de destino no existe, a pasta de origem ser movida, sendo que a pasta de
destino ser criada antes, pelo prprio mtodo MoveFolder.
2. Se o parmetro destino for o nome de um arquivo, ser gerado um erro.
3. Se o parmetro destino for o nome de uma pasta que j existe, ser gerado um erro.
O mtodo MoveFolder ser interrompido na ocorrncia do primeiro erro. Quaisquer alteraes
que tenham sido feitas no sero revertidas.
Considere o exemplo:
fileobj.MoveFolder C:\teste1, C:\teste2
628
devem ser copiados os arquivos especificados pelo parmetro origem. Caso contrrio o mtodo
assume que o parmetro 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 no existe, os arquivos especificados no parmetro origem sero
copiados, sendo que a pasta de destino ser criada antes, pelo prprio mtodo CopyFile.
2. Se o parmetro destino for o nome de um arquivo que j existe, ser gerado um erro
caso o parmetro substituir esteja definido como False; caso contrrio o arquivo existente
ser substitudo.
3. Se o parmetro destino for o nome de uma pasta, ser gerado um erro.
O mtodo CopyFile ser interrompido na ocorrncia do primeiro erro. Quaisquer alteraes
que tenham sido feitas no sero revertidas.
A seguir temos um exemplo de utilizao do mtodo CopyFile:
FileSystemObject.CopyFile c:\meus documentos\oficios\*.doc, e:\copia de segurana\
oficios\
629
Este fragmento de cdigo cria um objeto do tipo TextStream, o qual associado varivel arqtexto.
Depois utilizamos o mtodo writeline para escrever linhas de texto no arquivo c:\teste.txt.
Na Figura 11.6 temos o contedo do arquivo teste.txt, aps a execuo do cdigo do nosso exemplo.
630
NOTA
Iremos estudar o objeto File em detalhes, ainda neste captulo.
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 criao: & arquivo.DateCreated & <HR>
Response.Write Data ltimo acesso: & arquivo.DateLastAccessed & <HR>
%>
631
NOTA
Observe que j utilizamos algumas propriedades do objeto File. Conforme descrito
anteriormente, iremos estudar este objeto ainda neste captulo.
O mtodo GetFileName(caminho): Retorna o nome do ltimo arquivo ou pasta que foi
especificado no parmetro caminho. Por exemplo, se passarmos C:\meus
documentos\clientes.mdb como parmetro ser retornado clientes.mdb. J se passarmos
C:\meus documentos, ser retornado meus documentos. Se o parmetro passado no
terminar com o nome de uma pasta ou arquivo, o mtodo GetFileName retornar uma
String de tamanho zero .
NOTA
Este mtodo no verifica se o caminho passado como parmetro existe ou no.
O mtodo GetTempName( ): Retorna o nome de um arquivo ou pasta, nome este que
gerado randomicamente. Este arquivo ou pasta pode ser utilizado para operaes que
necessitam de um local de armazenamento temporrio.
Este mtodo no cria um arquivo temporrio. Ele apenas gera um nome que pode ser utilizado
pelo mtodo CreateTextFile, o qual pode ser usado para criar o arquivo.
Considere o exemplo:
<%
Set fileobj=Server.CreateObject(Scripting.FileSystemObject)
632
tempname=fileobj.GetTempName
Set txttemp=fileobj.CreateTextFile(tempname)
%>
O mtodo MoveFile(origem, destino): Este mtodo pode ser utilizado para mover o
arquivo passado no parmetro origem para a localizao especificada no parmetro
destino. Podemos utilizar caracteres curinga na origem, porm no no destino.
Se a origem contm caracteres curinga ou o destino termina com o caractere \, o mtodo
MoveFile considera que o destino representa o nome de uma pasta j existente, para a qual
deve ser movido o arquivo de origem. Caso contrrio, o mtodo assume que o parmetro
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 no existe, o arquivo de origem ser movido, sendo que a pasta de destino
ser criada antes, pelo prprio mtodo MoveFile.
2. Se o parmetro destino for o nome de um arquivo existente, ser gerado um erro.
3. Se o parmetro destino for o nome de uma pasta, ser gerado um erro.
O mtodo MoveFile ser interrompido na ocorrncia do primeiro erro. Quaisquer alteraes
que tenham sido feitas no sero revertidas.
Considere o exemplo:
<%
Set fileobj=Server.CreateObject(Scripting.FileSystemObject)
fileobj.MoveFile C:\teste.txt, D:\documentos\teste.txt
%>
633
Com isso finalizamos o estudo dos mtodos relacionados com arquivos e tambm 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 mtodo GetDrive do objeto FileSystemObject,
conforme descrito anteriormente.
No exemplo a seguir, criamos um objeto do tipo Drive, chamado driveobj:
<%
Set fileobj=Server.CreateObject(Scripting.FileSystemObject)
Set driveobj = fileobj.GetDrive(D:)
%>
Agora podemos ter acesso a todas as propriedades do objeto driveobj. Ento vamos ao estudo
destas propriedades.
Descrio
AvailableSpace
634
Propriedade
Descrio
ser impostas pelo Windows 2000. O valor retornado
em bytes. Caso no existam definio de quotas ou
outras restries, esta propriedade retornar o mesmo
valor que a propriedade FreeSpace.
DriveLetter
DriveType
FileSystem
FreeSpace
IsReady
Path
RootFolder
SerialNumber
ShareName
TotalSize
VolumeName
Na Listagem 11.1, podemos ver um exemplo de utilizao das propriedades do objeto Drive.
635
<HTML>
<HEAD>
</HEAD>
<BODY>
<%
Set fileobj=Server.CreateObject(Scripting.FileSystemObject)
10
<HR>
11
<%
12
Set objdrive=fileobj.GetDrive(D:)
13
14
15
16
17
18
Response.Write O drive D: pode ser usado? <B> & objdrive.IsReady & </B><BR>
19
20
Response.Write Pasta raiz para o drive D: <B> & objdrive.RootFolder & </B><BR>
21
22
23
24
%>
25
<HR>
26
</BODY>
27
</HTML>
636
</B><BR>
O Objeto Folder
Para criar um objeto do tipo Folder, utilizamos o mtodo GetFolder ou o mtodo
GetSpecialFolder do objeto FileSystemObject, conforme descrito anteriormente. Um objeto
do tipo Folder tambm retornado pela propriedade RootFolder do objeto Drive.
No exemplo a seguir, criamos um objeto do tipo Folder, chamado folderobj:
<%
Set fileobj=Server.CreateObject(Scripting.FileSystemObject)
Set folderobj = fileobj.GetFolder(D:\meus documentos)
%>
Agora podemos ter acesso a todas as propriedades e mtodos do objeto folderobj. Ento vamos
ao estudo destas propriedades e mtodos.
637
Descrio
Attributes
DateCreated
DateLastAccessed
DateLastModified
Drive
Files
IsRootFolder
Name
ParentFolder
Path
ShortName
638
Propriedade
Descrio
ShortPath
Size
SubFolders
Type
<HTML>
<HEAD>
</HEAD>
<BODY>
<%
Set fileobj=Server.CreateObject(Scripting.FileSystemObject)
10
%>
11
<HR>
12
<%
13
14
15
16
17
639
objfolder.
18
19
20
21
22
23
24
25
26
27
Response.Write <HR>
28
29
30
31
32
Response.Write <HR>
33
34
35
36
37
%>
38
</BODY>
39
</HTML>
A Figura 11.9 mostra a parte inicial do resultado desta pgina ao ser carregada no Internet
Explorer.
640
641
642
arqtexto.writeline(LINHA 1 DO TEXTO)
arqtexto.writeline(LINHA 2 DO TEXTO)
arqtexto.writeline(LINHA 3 DO TEXTO)
arqtexto.writeline(*************************)
%>
Este fragmento de cdigo cria um objeto do tipo TextStream, o qual associado varivel
arqtexto. Depois utilizamos o mtodo writeline para escrever linhas de texto no arquivo
C:\teste.txt.
Na Figura 11.11 temos o contedo do arquivo teste.txt, aps a execuo do cdigo do nosso
exemplo.
O mtodo Move destino: Move a pasta e todo o seu contedo, para a pasta especificada
no parmetro destino.
Se o destino termina com o caractere \, o mtodo Move considera que o destino representa
o nome de uma pasta j existente, para a qual deve ser movida a pasta. Caso contrrio o
mtodo assume que o parmetro destino especifica o nome de uma nova pasta que deve ser
criada e para a qual deve ser movido o contedo da pasta de origem.
Caso a pasta de destino j exista, ocorrer um erro.
643
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 mtodo GetFile do objeto FileSystemObject,
conforme descrito anteriormente.
No exemplo a seguir, criamos um objeto do tipo File, chamado arqobj:
<%
Set fileobj=Server.CreateObject(Scripting.FileSystemObject)
Set arqobj = fileobj.Getfile(C:\meus documentos\nwind.mdb)
%>
Agora podemos ter acesso a todas as propriedades e mtodos do objeto arqobj. Ento vamos
ao estudo destas propriedades e mtodos.
Descrio
Attributes
DateCreated
DateLastAccessed
DateLastModified
644
Propriedade
Descrio
Drive
Name
ParentFolder
Path
ShortName
ShortPath
Size
Type
<HTML>
<HEAD>
</HEAD>
<BODY>
<%
Set fileobj=Server.CreateObject(Scripting.FileSystemObject)
645
10
%>
11
<HR>
12
<%
13
14
15
16
17
18
19
20
21
22
23
24
25
26
Response.Write <HR>
27
%>
28
</BODY>
29
</HTML>
646
647
O mtodo Delete(force): Este mtodo elimina o arquivo associado com o objeto File. O
parmetro force pode assumir os valores True ou False. Se o parmetro force for definido
como True, o arquivo ser eliminado mesmo que tenha o atributo de Somente leitura.
O valor padro do atributo force False.
Considere o exemplo:
arqobj.Delete(True)
O mtodo Move destino: Move o arquivo para a pasta especificada no parmetro destino.
Se o destino termina com o caractere \, o mtodo Move considera que o destino representa o
nome de uma pasta j existente, para a qual deve ser movido o arquivo. Caso contrrio o mtodo
assume que o parmetro destino especifica o nome de um novo arquivo que deve ser criado.
Caso o arquivo especificado pela parmetro destino j exista, ocorrer um erro.
Considere o exemplo:
arqobj.Move C:\copia de seguranca\
Este exemplo abre o arquivo C:\testfile.txt como somente leitura e no formato ASCII.
648
Com isso encerramos o estudo do objeto File. Agora vamos a um exemplo prtico de aplicao
do que nos aprendemos neste captulo.
Exemplo Prtico
Neste exemplo vamos considerar o problema a seguir.
Temos uma pasta virtual no servidor IIS chamada informativos. Dentro desta pasta colocamos
diariamente informativos, que so numerados: inf01.htm, inf02.htm e assim por diante. Dentro
da pasta informativos existe, tambm, um arquivo index.asp que apresenta uma tabela com
todos os informativos disponveis. Porm no queremos atualizar esta tabela manualmente.
Desejamos que cada vez que um novo arquivo seja salvo na pasta informativos, o mesmo,
automaticamente aparea na tabela de informativos do arquivo index.asp. O nosso trabalho
ser construir a pgina 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. Alm disso esta tabela deve exibir um mximo de seis colunas. Ento, mos
obra, vamos pr os objetos que aprendemos neste captulo para funcionar.
Na Listagem 11.4, temos a soluo para o problema proposto.
Listagem 11.4 Gerando uma tabela de contedo automaticamente.
1
<HTML>
<HEAD>
</HEAD>
<BODY>
</B></FONT>
</P>
<HR>
10
<%
11
12
Set fileobj=Server.CreateObject(Scripting.FileSystemObject)
13
14
649
15
16
17
E:\inetpub\wwwroot\informativos
18
linha=0
19
20
21
If arquivo.name<>index.asp then
22
If linha=0 Then
23
Response.Write <TR>
24
End If
25
26
linha=linha+1
27
If linha=6 Then
28
Response.Write </TR>
29
linha=0
30
31
End If
End If
32
Next
33
Response.Write </TABLE>
34
%>
35
</BODY>
36
</HTML>
650
utilizando a propriedade name, exibimos apenas inf01.htm. Mas, alm disso, fizemos uso da
funo Left(arquivo.nome,5), de tal maneira que fosse exibido apenas o nome do arquivo (cinco
primeiros caracteres), sem a extenso. Desta forma exibido apenas inf01.
Conforme podemos ver na Figura 11.13, existem 20 informativos na pasta E:\inetpub\
wwwroot\informativos.
651
Agora toda vez que um novo informativo for gravado na pasta informativos, o usurio, ao
carregar a pgina 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
pgina index.asp que o link para os dois novos informativos j seriam, automaticamente,
exibidos, conforme indicado na Figura 11.15.
Concluso
Neste captulo fizemos um estudo completo do objeto FileSystemObject e de seus derivados,
tais como os objetos Drive, Folder e File.
Com o entendimento destes objetos podemos construir aplicaes bastante interessantes
utilizando ASP. Desde funes administrativas, tais como gravar informaes em um arquivo
de Log, monitorar a ocupao de espao de diversos drives, at a criao dinmica de links
conforme o exemplo mostrado no item anterior.
Com certeza o objeto FileSystemObject um dos mais complexos devido ao grande nmero
de mtodos e objetos derivados que o mesmo apresenta. Porm, conforme podemos constatar
no decorrer deste captulo, extremamente simples sua utilizao.
652
Alguns cuidados devem ser tomados, principalmente, com mtodos que movem ou eliminam
arquivos, pois se ocorrem erros, o mtodo ter a execuo suspensa na ocorrncia do primeiro
erro e modificaes que j tenham sido feitas no sero revertidas.
Por exemplo, se estivermos movendo uma pasta e todas as suas subpastas de uma localizao
para outra e ocorrer um erro no meio do processo, alguns arquivos tero sido movidos e outros
no. Aqueles que foram movidos no sero restaurados ao local de origem. Por isso, sempre
uma boa idia testar a pgina ASP que utiliza estes mtodos em um ambiente de testes, para
somente depois coloc-las em produo. Alis, ter um ambiente especfico para testes uma
excelente idia no s no desenvolvimento para a Web, mas em qualquer tipo de desenvolvimento
de software.
No captulo final deste livro estudaremos uma srie de tcnicas adicionais que auxiliam e
facilitam a criao e a padronizao no desenvolvimento de pginas ASP.
653
Captulo 12
Tratamento de Erros,
Transaes e Outros Assuntos
655
NOTA
Implementamos esta tcnica de validao de campos em um formulrio, em um exemplo do
Captulo 6.
Com isso podemos notar que um correto tratamento de erros torna os nossos aplicativos Web
mais amigveis e fceis de trabalhar. Sempre que possvel devemos evitar situaes onde o
usurio recebe mensagens de erro tcnicas, enviadas pelo servidor. Sempre que possvel
devemos introduzir cdigo para tratamento destes erros, de tal forma que os mesmos possam
ser interceptados e, se no corrigidos a tempo, pelo menos possamos enviar uma mensagem
mais amigvel, para que o usurio saiba onde est o problema.
Na seqncia aprenderemos sobre o conceito de transaes e o Microsoft Transaction Services.
Veremos que a utilizao do conceito de transaes garante que nossas aplicaes Web tenham
acesso a dados mais depurados e livres de erros.
656
Na parte final do captulo estaremos tratando de assuntos diversos, tais como a utilizao da
diretiva #include e tambm o uso de diretivas como @CODEPAGE e @TRANSACTION.
O Objeto ASPError
O objeto ASPError uma das novidades da verso 3.0 do ASP. Para obtermos um objeto do
tipo ASPError, utilizamos o mtodo GetLastError do objeto Server. O objeto ASPError, atravs
de suas diversas propriedades, nos fornece uma srie de informaes a respeito do ltimo
erro ocorrido em nossa aplicao Web.
NOTA
Quando o IIS encontrar um erro ao compilar ou executar um arquivo .asp, ele gerar um erro
personalizado 500;100. Por padro, todos os aplicativos e sites da Web iro transferir o
processamento de um erro personalizado 500;100 para o arquivo .asp padro. Aps a gerao
de um erro personalizado 500;100, o IIS tambm criar uma instncia do objeto ASPError que
descrever a condio de erro.
Descrio
ASPCode
ASPDescription
Category
Column
657
Propriedade
Descrio
Description
File
Line
Number
Source
Erros de Sintaxe
Este um dos tipos de erro mais comuns. Considere o comando a seguir:
Response.Write Informativos da empresa ABC Ltda!
658
Observe que nesta linha o desenvolvedor esqueceu de fechar aspas. Este pequeno engano
suficiente para gerar o erro indicado na Figura 12.1.
659
Dim arrayinteiros(9)
arrayinteiros(10)=25
%>
Neste exemplo estamos criando um array com 10 elementos: ndice 0 at o ndice 9, porm
estamos tentando utilizar o ndice 10. Este cdigo ir gerar um erro em tempo de execuo,
conforme indicado na Figura 12.2.
660
Erros Lgicos
Este, com certeza, o pior tipo de erro. O cdigo executa aparentemente sem problemas, a
pgina carregada, porm os resultados obtidos no so os esperados. Este tipo de erro acontece
porque o programador utilizou um algoritmo incorreto.
Por exemplo, ao pesquisar em um banco de dados, na tabela Pedidos. Se quisermos somente
os pedidos para o Brasil ou para a Argentina, devemos utilizar a seguinte instruo SQL:
Select * from Pedidos where Pais=Brazil Or Pais=Argentina
661
Vamos supor que voc queira calcular os valores de uma aplicao utilizando a seguinte frmula:
Total= Emprstimo multiplicado pelos juros mais adicional de risco e tudo isso
dividido por 1.33.
Esta frmula ir efetuar os clculos porm de maneira incorreta. Primeiro o emprstimo ser
multiplicado pelos juros. Depois o risco dividido por 1.33 e os dois resultados somados.
Porm no isso que queremos. Para fazer com que a frmula seja calculada corretamente,
podemos fazer o uso de parnteses, conforme indicado a seguir:
Total =((emp*juros)+risco)/(1.33)
Desta maneira garantimos a ordem correta das operaes e deixamos o cdigo mais fcil de ler.
Este apenas um pequeno exemplo de erro lgico. Existe uma infinidade de armadilhas e
situaes possveis de ocorrncia de erros lgicos. Em muitas delas difcil a deteco do erro
se o programador no for disciplinado e o processo como um todo no estiver bem documentado.
662
Use indentao do cdigo. Isto facilita muito a leitura do cdigo e demonstra quais
linhas de cdigo 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 indentao deixa o cdigo mais legvel e facilita na hora de procurar e corrigir erros.
Se voc tiver uma determinada rotina de clculo ou acesso a banco de dados, que
utilizada em diversos locais na sua aplicao, pense em escrev-la e salv-la em um
arquivo separado e depois utilizar a diretiva #include para incluir este cdigo nos
locais onde o mesmo necessrio. Isto evita que voc tenha que escrever o mesmo
cdigo em diversos locais e principalmente que o escreva de maneira diferente. Alm
disso se forem necessrias modificaes, basta faz-las no arquivo original e no 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 captulo.
Documentar, documentar e documentar. Este um dos princpios bsicos para o desenvolvimento de aplicaes. Mas infelizmente poucos o levam muito a srio. Documentar
detalhadamente a sua aplicao no perda de tempo; muito pelo contrrio. Quando
surgem problemas ou so necessrias modificaes na aplicao, a documentao o
auxiliar mais valioso que podemos ter mo. No despreze este aspecto.
663
O Conceito de Transao
Na era da Internet e do Comrcio Eletrnico temos questes bastante complexas a serem
tratadas no desenvolvimento de aplicaes Web. Uma destas questes sobre a integridade
das bases de dados. Existem determinadas operaes que envolvem entrada e atualizao de
informaes em diversas tabelas ou at mesmo em diversos bancos de dados.
Para que possamos entender exatamente o conceito de transao, vamos fazer uso de um
exemplo clssico: O usurio que utiliza o site do seu banco na Internet para fazer uma
transferncia entre contas correntes.
Para que a transferncia ocorra com sucesso, as seguintes aes devem ser executadas:
Debitar da conta do usurio o valor a ser transferido.
Creditar o valor que est sendo transferido na conta do destinatrio.
Estas duas operaes devem ser finalizadas com sucesso e de maneira nica, ou seja, ou as
duas operaes so executadas com sucesso ou nenhuma delas. Por exemplo, se a operao
de debitar da conta do usurio aconteceu com sucesso e na hora de creditar na conta do
destinatrio houve algum problema, a operao de dbito da conta do usurio deve ser
revertida, ou seja, a conta do usurio deve ter creditado o valor anteriormente debitado.
Neste caso a operao falha como um todo e as duas contas continuam com o saldo que
tinham antes da operao.
Este exemplo serve para que possamos definir exatamente o que uma transao.
Uma transao um conjunto de uma ou mais operaes que devem acontecer como um
todo, ou seja, ou todas as operaes so realizadas com sucesso ou nenhuma das operaes
realizada. Se ocorrer algum problema depois que algumas operaes j foram efetuadas, as
mesmas devero ser revertidas, de tal maneira que a situao dos dados retorne ao seu estado
original antes das modificaes efetuadas pela transao.
medida que as aplicaes tornam-se mais e mais complexas, a utilizao de transaes
um requisito obrigatrio.
Durante algum tempo, o prprio desenvolvedor precisou codificar a funcionalidade de
transaes, de tal maneira que a integridade dos dados fosse garantida. Hoje, a funcionalidade
de transaes est embutida nos chamados servidores de Aplicao. Com isso, o desenvolvedor
no precisa escrever o cdigo para transaes, ao invs disso podem ser utilizadas as
funcionalidades oferecidas pelo servidor de Aplicao. No caso do IIS 5.0 no Windows 2000,
podemos utilizar as funcionalidades do Microsoft Transaction Services. No Windows NT
4.0, com IIS 4.0, tnhamos o Microsoft Transaction Server, o qual fazia parte do pacote de
software conhecido como Option Pack 4.0.
664
Uma transao deve apresentar as caractersticas conhecidas como ACID, onde temos o
seguinte: A Atomicidade; C Consistncia; I Isolamento; D Durabilidade.
Atomicidade: Esta propriedade define que a transao deve acontecer como um todo, ou
seja, todas as aes embutidas na transao devem ocorrer com sucesso ou falhar como
um todo. Se algum erro acontecer, o sistema deve retornar ao seu estado anterior transao.
Consistncia: Esta propriedade garante que ao final da transao o sistema estar em
um estado consistente. Se todas as aes da transao forem executadas com sucesso,
as alteraes sero salvas no banco de dados e o sistema estar disponvel para uso. Se
ocorrer algum problema as alteraes sero desfeitas e o sistema tambm estar
disponvel para uso.
Isolamento: Esta propriedade muitas vezes conhecida como Serializao. Cada transao
executada como se no houvesse outras transaes. Isso feito para que, quando a
transao estiver executando, a mesma no acesse dados inconsistentes, isto , dados
que esto sendo alterados por outra transao. Com isso garantido que o sistema estar
em um estado consistente e pronto para ser utilizado ao final de cada transao.
Durabilidade: Este princpio garante que, uma vez completada a transao, as alteraes
que a mesma efetuou sero permanentemente gravadas no banco de dados, mesmo
que acontea alguma falha no sistema. No exemplo da transferncia entre contas, temos
que garantir que o valor ser realmente debitado da conta do usurio e creditado na
conta do destinatrio.
665
<%
.
End transaction.
Server.Transfer(/Capitulo10/segunda.asp)
%>
No entanto, o script abaixo chama um outro script que tambm inicializa uma transao:
<%@ TRANSACTION=Required %>
<%
Instancia um componente do Microsoft Transaction Services.
Set objVendas = Server.CreateObject(VendasTransacted.Complete)
.
.
.
%>
666
compra de passagem e reserva de assento. Todos os demais scripts podem ser executados de
maneira segura sem um contexto de transao.
IMPORTANTE
Visto que as transaes devem ser utilizadas apenas para pginas que necessitam de
processamento de transao, voc no pode declarar o arquivo global.asa de um aplicativo
como transacional.
IMPORTANTE
A transao tambm ser anulada se a pgina exceder o tempo limite antes da concluso da
transao.
667
NOTA
Observe o exemplo a seguir, retirado da documentao do IIS 5.0. Nele estamos utilizando um
componente chamado MyExample.BankComponent. Este um componente que foi registrado
e pode ser gerenciado atravs 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 pginas ASP.
<%@ TRANSACTION=Required %>
<%
Response.Buffer = True
%>
<HTML>
<BODY>
<H1>Bem-vindo ao servio bancrio on-line</H1>
<%
Set BankAction = Server.CreateObject(MyExample.BankComponent)
BankAction.Deposit(Request(AcctNum))
%>
<P>Obrigado. A sua transao est sendo processada.</P>
</BODY>
</HTML>
<%
Mostra esta pgina em caso de sucesso da transao.
Sub OnTransactionCommit()
%>
<HTML>
<BODY>
Obrigada. A sua conta foi creditada.
</BODY>
</HTML>
<%
Response.Flush()
668
End Sub
%>
<%
Mostra esta pgina se a transao falhar.
Sub OnTransactionAbort()
Response.Clear()
%>
<HTML>
<BODY>
No foi possvel concluir a transao.
</BODY>
</HTML>
<%
Response.Flush()
End Sub
%>
669
670
671
NOTA
Para maiores informaes sobre a instalao de Aplicativos e componentes COM, consulte a
ajuda do Windows 2000.
Escopo de Objeto
Normalmente, voc no deve armazenar objetos criados a partir de um componente do COM
nos objetos ASP Application ou Session. Os objetos COM sero desativados quando a transao
for concluda. Como os objetos Session e Application se destinam a instncias de objeto que
podem ser utilizadas em mltiplas pginas ASP, voc no dever utiliz-los para manter
objetos que sero liberados ao final de uma transao.
Um script ASP a raiz, ou o incio, de uma transao declarada. Qualquer objeto COM utilizado
em uma pgina ASP transacional ser considerado parte da transao. Quando a transao
estiver concluda, os objetos COM utilizados na pgina sero desativados, incluindo objetos
armazenados no objeto Session ou Application. Tentativas posteriores de chamar o objeto
com o escopo Session ou Application de outra pgina transacional falharo.
672
que as atualizaes sejam enviadas ao servidor remoto, mesmo que a rede no esteja disponvel
no momento. O seu aplicativo receber uma mensagem de confirmao e poder continuar a
transao. 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).
Por exemplo:
<! #include file=conexao.inc >
Ao encontrar esta diretiva em uma pgina ASP, o IIS substitui a diretiva pelo texto do arquivo
conexao.inc. como se o cdigo do arquivo conexao.inc tivesse sido digitado diretamente na
pgina ASP. Somente depois que a substituio feita, que o script executado.
Por exemplo, o nosso arquivo conexao.inc poderia conter o cdigo necessrio para estabelecer
uma conexo com o banco de dados nwind.mdb. Com isso teramos o seguinte cdigo no
arquivo conexao.inc:
<%
O primeiro passo criar a conexo com o banco de dados
Para isto crio um objeto do tipo Connection
Cria um objeto do tipo ADODB.Connection
673
Set conn=Server.CreateObject(ADODB.Connection)
Agora abro uma conexo 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 pgina 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 conexo teria que ser reconfigurada. Utilizando a diretiva #include, somente precisaramos
alterar em um nico lugar: no arquivo conexao.inc. A partir deste momento, todas as pginas
que acessam o arquivo conexao.inc passaro a ter acesso s modificaes efetuadas no arquivo
conexao.inc. Veja o quanto esta tcnica facilita a manuteno de nossas pginas ASP, evitando
que uma mudana simples como esta, tivesse que ser feita em dezenas de pginas.
IMPORTANTE
A conta com a qual o usurio est fazendo acesso ao site deve ter permisses para acessar o
arquivo .inc. Caso contrrio ocorrer um erro. Por exemplo, se o usurio est autenticado
como usurio annimo, a conta IUSR_NOME_DO_COMPUTADOR deve ter permisses NTFS
sobre os arquivos que forem acessados via diretiva #include, caso contrrio o usurio receber
uma mensagem de erro.
674
As Diretivas @
Nesta seo aprenderemos um pouco mais sobre as chamadas Diretivas de processamento ou
diretivas @. Utilizamos as Diretivas de processamento @ em scripts para enviar informaes
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
Onde: pgina_de_cdigo um nmero inteiro que representa uma pgina de cdigo vlida
para o sistema que est executando o interpretador ASP.
Na Tabela 12.2, temos o valor para alguns dos principais Cdigos de Pgina.
Tabela 12.2 Valores de Cdigos de Pgina.
Cdigo
Descrio
Alias
1200
Alfabeto Universal
unicode
1201
unicodeFEFF
1250
windows-1250
1251
windows-1251
1252
iso-8859-1
1253
windows-1253
1254
Alfabeto Turco
iso-8859-9
1255
iso-8859-8
676
Cdigo
Descrio
Alias
1256
windows-1256
1257
windows-1257
1258
windows-1258
20866
koi8-r
21866
koi8-ru
28592
iso-8859-2
28593
iso-8859-3
28594
iso-8859-4
28595
iso-8859-5
28596
iso-8859-6
28597
iso-8859-7
50220
Japons (JIS)
iso2022-jp
50225
Coreano (ISO)
iso-2022-cr
51949
Coreano (EUC)
euc-cr
852
ibm852
866
cp866
936
gb2312
949
Coreano
ks_c_5601-1987
950
big5
677
678
Em muitas tabelas com a relao 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
Tambm podemos alterar o cdigo LCID utilizando a propriedade LCID do objeto Session,
conforme descrito no Captulo 8.
Onde:
Valor uma cadeia de caracteres que indica o tipo de suporte de transao. Os valores possveis so:
Required O script iniciar uma transao.
Requires_New O script iniciar uma transao.
Supported O script no iniciar uma transao.
Not_Supported O script no iniciar uma transao.
Se um script contiver a diretiva @TRANSACTION, ela dever ser a primeira linha do arquivo .asp,
caso contrrio, ser gerado um erro. Voc deve adicionar a diretiva a cada pgina a ser executada em
uma transao. A transao atual finalizada quando o processamento do script termina.
Se o script que contm a diretiva @TRANSACTION foi chamado pelo mtodo Server.Transfer
ou Server.Execute e o valor foi especificado como Required, o mesmo continuar a transao
do arquivo .asp de chamada, se essa transao tiver sido criada. Se a transao do arquivo
.asp de chamada no tiver sido criada, o arquivo .asp chamado criar uma nova transao.
679
ASP2
<%@ TRANSACTION=Required%>
<%
Server.CreateObject(MeuComponente.Closeout)
%>
Concluso
Neste captulo analisamos uma miscelnea de assuntos a respeito de ASP.
Iniciamos o captulo falando sobre o objeto ASPError e sobre a importncia do tratamento de
erros em nossas aplicaes Web. Tambm foram dadas algumas sugestes para reduzir a
ocorrncia de erros e gerar cdigo de melhor qualidade.
Depois passamos ao conceito de transaes. Vimos o que significa cada uma das letras da
sigla ACID. Aprendemos a utilizar a diretiva @TRANSACTION para inserir uma pgina ASP
no contexto de uma transao.
Na seqncia, passamos ao estudo da diretiva #include, a qual facilita a padronizao e
manuteno do cdigo, uma vez que podemos escrever cdigo que comum a muitas pginas
em um nico arquivos, e depois inserir este arquivo, onde for necessrio, utilizando a diretiva
#include.
Para finalizar o captulo tratamos das diretivas @, conhecidas como Diretivas de
processamento. Estas diretivas orientam o servidor IIS sobre como o mesmo deve processar
cada pgina. Atravs destas diretivas podemos definir qual o interpretador que deve ser usado,
qual o cdigo de localidade e assim por diante.
Com isso, estamos encerrando este trabalho. Procurei colocar informaes teis para usurios
desde o iniciante at o usurio mais experiente. Obviamente que este trabalho no esgota o
assunto, pois o mesmo muito extenso.
680
Apndice
Referncia Rpida
da Linguagem VBScript
681
Para declarar um bloco de cdigo que roda no servidor, utilizamos a seguinte sintaxe:
<SCRIPT LANGUAGE=vbscript RUNAT=Server>
Comando1
Comando2
...
Comandon
</SCRIPT>
Tambm podemos utilizar o VBScript dentro de qualquer trecho de cdigo 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 cdigo
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
pgina, antes que tenha sido enviada qualquer sada para o navegador do cliente.
682
Outra opo que teramos seria a utilizao de Java Script, que na verso da Microsoft
conhecido como JScript. Conforme descrito anteriormente, optamos pela utilizao de
VBScript, que no ponto de vista deste autor parece ser a escolha mais indicada quando
trabalhamos com pginas ASP.
O primeiro comando declara trs variveis sem tipo definido, ou melhor, do tipo Variant. No
VBScript, diferente do Visual Basic ns no declaramos o tipo da varivel. Por padro, todas
as variveis so do tipo Variant, isto , podem conter qualquer valor. Para que possamos ter
um tratamento mais refinado em relao as variveis so definidos os chamados subtipos de
Variant, os quais esto descritos na Tabela A.1.
Na Tabela A.1, temos a descrio para os subtipos do tipo Variant.
Tabela A.1 Subtipos do tipo Variant.
Subtipo
Descrio
Empty
NULL
Boolean
Byte
Integer
Currency
de 922.337.203.685.477,5808 at 922.337.203.685.447,5807.
Long
Single
Double
683
Subtipo
Descrio
Date(Time)
String
Object
Contm um objeto.
Error
O segundo comando Dim nomes(20), declara um array com 21 elementos. Isto mesmo, so
21 e no 20 elementos. No esquea que o primeiro elemento o de ndice 0 (zero) e no o de
ndice 1 (um).
Mais adiante veremos sobre as funes para converso de tipos.
IMPORTANTE
Embora no seja obrigatria a declarao das variveis em VBScript, sempre uma boa prtica
de programao declarar e comentar todas as variveis que utilizamos em nosso cdigo.
Tambm podemos criar arrays dinmicos, utilizando a seguinte declarao:
Dim nomes( ).
ou at mesmo arrays de mltiplas dimenses. Por exemplo, podemos criar uma Matriz-array
de duas dimenses, utilizando o seguinte comando:
Dim produo(4,10).
Operadores
Para realizar desde operaes bastante simples, at operaes mais complexas, VBScript nos
disponibiliza uma srie de operadores, os quais esto descritos na Tabela A.2.
Na Tabela A.2, temos a descrio dos operadores do VBScript.
Tabela A.2 Operadores do VBScript.
Operador
Descrio
Adio
Subtrao
684
Operador
Descrio
Multiplicao
Diviso
&
Exponenciao
MOD
OR
Descrio
>
Maior do que.
<
Menor do que.
>=
Maior ou igual .
<=
Menor ou igual .
<>
Diferente de.
685
Neste caso, assim que um dos testes lgicos for verdadeiro, os comandos respectivos so
executados e a estrutura abandonada. Por exemplo, se o teste_lgico1 for verdadeiro, os
comandos respectivos sero executados e os demais testes nem sequer sero avaliados.
O Lao For...Next
Este lao executa um bloco de cdigo um nmero determinado de vezes.
For i=1 to 10
i=i+1
msgbox i
Next
686
Loop
Nesta estrutura, enquanto a condio for Verdadeira, o cdigo dentro do lao executado.
Quando a condio tornar-se Falsa, o primeiro comando aps o final do lao ser executado.
Neste caso, se a condio for Falsa j na primeira vez, o lao no ser executado nenhuma vez.
687
IMPORTANTE
O cdigo dentro do lao deve ser capaz de alterar a condio para Falso, quando for necessrio,
pois caso contrrio a condio ser sempre Verdadeira, e os comandos dentro do lao ficaro
em execuo, infinitamente, ou at o programa travar. A criao de laos infinitos, devido a
erros de programao, uma causa comum de erros e travamentos.
Considere o exemplo:
<SCRIPT LANGUAGE=vbscript>
<!
Dim x
x=10
Contador=1
Soma=0
Faz a soma dos 10 primeiros nmeros maiores do que zero
Do While Contador <= x
Soma = Soma + Contador
Contador = Contador + 1
Loop
>
</SCRIPT>
688
Nesta estrutura, enquanto a condio for Verdadeira, o cdigo dentro do lao executado.
Quando a condio tornar-se Falsa, o primeiro comando aps o final do lao ser executado.
Neste caso, se a condio for Falsa j na primeira vez, o lao ser executado uma nica vez.
IMPORTANTE
O cdigo dentro do lao deve ser capaz de alterar a condio para Falso, quando for necessrio,
pois caso contrrio a condio ser sempre Verdadeira, e os comandos dentro do lao ficaro
em execuo, infinitamente, ou at o programa travar. A criao de laos infinitos, devido a
erros de programao, uma causa comum de erros e travamentos.
Considere o exemplo:
<SCRIPT LANGUAGE=vbscript>
<!
Dim x
x=10
Contador=1
Soma=0
Faz a soma dos 10 primeiros nmeros maiores do que zero
Do
Soma = Soma + Contador
Contador = Contador + 1
Loop While Contador <= x
MsgBox Valor da Soma = & Soma
>
</SCRIPT>
689
Nesta estrutura, enquanto a condio for Falsa, o cdigo dentro do lao executado. Quando a
condio tornar-se Verdadeira, o primeiro comando aps o final do lao ser executado. Neste
caso, se a condio for Verdadeira, j na primeira vez, o lao no ser executado nenhuma vez.
IMPORTANTE
O cdigo dentro do lao deve ser capaz de tornar a condio Verdadeira, quando for necessrio,
pois caso contrrio a condio ser sempre Falsa, e os comandos dentro do lao ficaro em
execuo, infinitamente, ou at o programa travar. A criao de laos infinitos, devido a erros
de programao, 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 nmeros maiores do que zero
Do Until Contador > x
Soma = Soma + Contador
Contador = Contador + 1
Loop
MsgBox Valor da Soma = & Soma
>
</SCRIPT>
690
...
Comandon
Loop Until condio
Nesta estrutura, enquanto a condio for Falsa, o cdigo dentro do lao executado. Quando a
condio tornar-se Verdadeira, o primeiro comando aps o final do lao ser executado. Neste
caso, se a condio for Verdadeira, j na primeira vez, o lao ser executado uma nica vez.
IMPORTANTE
O cdigo dentro do lao deve ser capaz de tornar a condio Verdadeira, quando for necessrio,
pois caso contrrio a condio ser sempre Falsa, e os comandos dentro do lao ficaro em
execuo, infinitamente, ou at o programa travar. A criao de laos infinitos, devido a erros
de programao, uma causa comum de erros e travamentos.
Considere o exemplo:
<SCRIPT LANGUAGE=vbscript>
<!
Dim x
x=10
Contador=1
Soma=0
Faz a soma dos 10 primeiros nmeros maiores do que zero
Do
Soma = Soma + Contador
Contador = Contador + 1
Loop Until Contador > x
MsgBox Valor da Soma = & Soma
>
</SCRIPT>
Comentrios em VBScript
Em blocos de cdigo VBScript podemos utilizar a palavra Rem para criar uma linha de
comentrio:
Rem Esta linha um comentrio.
691
J em blocos de cdigo ASP podemos utilizar o apstrofe para criar uma linha de comentrio.
<%
Esta linha de comentrio.
%>
Funes no VBScript
A linguagem VBScript nos oferece uma grande quantidade de funes. Temos funes para
converso de tipos de valores, outras para trabalhar com datas, com Strings para formatao
de nmeros e assim por diante.
Vamos apresentar um resumo das principais funes do VBScript, divididas em Categorias.
ASC(String)
Retorna o valor numrico do cdigo ANSI para o primeiro caractere da String passada como
parmetro.
Asc(G)
Retorna: 71
Chr(nmero)
Retorna o caractere ASCII correspondente ao nmero passado como parmetro.
Chr(65)
Retorna: A
CBool(expresso)
Retorna Verdadeiro ou Falso, dependendo da expresso que foi passada como parmetro.
Cbool(2>3)
692
Cbool(2<3)
CByte(expresso)
Converte a expresso passada como parmetro para um Variant do subtipo Byte.
Cbyte(20)
Retorna: 20
Cbyte(300)
Retorna: Um erro
Tipo de erro:
Erro de tempo de execuo do Microsoft VBScript (0x800A0006)
Sobrecarga: Cbyte
CCur(expresso)
Converte a expresso passada como parmetro para um Variant do subtipo Currency.
Observe o exemplo:
Valor = 543.214588
Response.Write valor*2
Retorna: 1086,429176
Agora vamos utilizar a funo CCur:
Valor = 543.214588
Response.Write CCur(valor*2)
Retorna: 1086,4292
CDate(data)
Converte a data passada como parmetro para um Variant do subtipo Date. Onde data
qualquer expresso de data vlida.
CDate(Novembro 10,1991)
Retorna: 10/11/1991
693
CDbl(data)
Converte a expresso passada como parmetro para um Variant do subtipo Double.
Observe o exemplo:
Dim Moeda, ValorDouble
Moeda = CCur(234.456784)
CInt(expresso)
Converte a expresso passada como parmetro para um Variant do subtipo Integer.
CInt(30/7)
Retorna: 4
CLng(expresso)
Converte a expresso passada como parmetro para um Variant do subtipo Long.
Considere o exemplo:
Dim MyVal1, MyVal2, MyLong1, MyLong2
MyVal1 = 25427.45
MyVal2 = 25427.55
MyLong1 = CLng(MyVal1)
MyLong2 = CLng(MyVal2)
CSng(expresso)
Converte a expresso passada como parmetro para um Variant do subtipo Single.
Considere o exemplo:
Dim MyDouble1, MyDouble2, MySingle1, MySingle2
MyDouble1, MyDouble2 contero valores do tipo Double.
MyDouble1 = 75.3421115
MyDouble2 = 75.3421555
MySingle1 = CSng(MyDouble1)
MySingle2 = CSng(MyDouble2)
694
CStr(expresso)
Converte a expresso passada como parmetro para um Variant do subtipo String.
CStr(233)
Fix(expresso)
Retorna a parte inteira do nmero.
Fix(30/7)
Retorna: 4
Hex(expresso)
Retorna uma String representando o valor hexadecimal do nmero.
Hex(1562)
Retorna: 61A
Int(expresso)
Converte a expresso passada como parmetro para um Variant do subtipo Integer.
Int(30/7)
Retorna: 4
Oct(expresso)
Retorna uma String representando o valor octal do nmero.
Oct(1562)
Retorna: 3032
Round(expresso,numcasasdecimais)
Retorna um nmero com a quantidade de casas decimais definidas pelo parmetro
numcasasdecimais.
Round(235.3658,2)
Retorna: 235,37
695
Sgn(expresso)
Retorna um nmero inteiro indicando o sinal do nmero.
Sgn(-23)
Retorna: -1
Sgn(23)
Retorna: 1
Date( )
Esta funo retorna a data do sistema.
Date ( )
Retorna: 21/08/2000.
DateAdd(intervalo,numerodeintervalos,data)
Esta funo utilizada para retornar uma data a partir de um intervalo que foi adicionado.
Utilizamos a seguinte sintaxe:
DateAdd(intervalo,numerodeintervalos,data)
onde, o parmetro intervalo especifica o tipo de intervalo que deve ser adicionado. Na Tabela
A.3 temos os valores possveis para este parmetro.
Tabela A.3 Valores possveis para o parmetro intervalo.
Valor
Descrio
yyyy
Ano
Trimestre
Ms
Dias
696
Valor
Descrio
Dia de semana
ww
Semanas
Horas
Minutos
Segundos
Por exemplo, para saber que data teremos contados 10000 dias a partir da data atual,
podemos utilizar:
DateAdd(d,10000,Date())
Esta funo utilizada para calcular a diferena entre duas datas. Esta diferena pode ser
calculada em intervalos de tempo conforme definido pelo parmetro intervalo. Os valores
possveis para o parmetro intervalo esto indicados na tabela A.3.
Por exemplo, para saber o nmero 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 funo retorna apenas uma parte da data. A parte que ser retornada definida pelo parmetro
intervalo. Os valores possveis para o parmetro intervalo esto indicados na tabela A.3.
DatePart (yyyy,01/05/2000)
Retorna: 2000.
697
DateSerial(ano,ms,dia)
Esta funo retorna uma variante do subtipo Data.
DateSerial (1990+10,12-4,31)
Retorna: 31/08/2000.
DateValue(String)
Esta funo retorna uma variante do subtipo Data. A String deve conter um formato de data vlida.
DateValue (Novembro 23,1997)
Retorna: 23/11/1997.
Day(data)
Retorna apenas o dia da data que foi passada como parmetro.
Day(25/02/2000)
Retorna: 25.
Hour(tempo)
Retorna apenas a hora do tempo passado como parmetro.
Hour(18:22:31)
Retorna: 18.
Minute(tempo)
Retorna apenas os minutos do tempo passado como parmetro.
Minute(18:22:31)
Retorna: 22.
Month(data)
Retorna apenas o ms da data que foi passada como parmetro.
Month(25/02/2000)
Retorna: 02.
698
MonthName(data)
Retorna uma String referente ao ms da data.
MonthName(02)
Retorna: fevereiro.
Para receber o nome do ms abreviado utilize a seguinte sintaxe:
MonthName(02,True)
Retorna: fev.
Now( )
Esta funo retorna a data e a hora do sistema.
Now ()
Second(tempo)
Retorna apenas os segundos do tempo passado como parmetro.
Second(18:22:31)
Retorna: 31.
Time( )
Esta funo retorna um Variant do subtipo Date, a qual indica a hora do sistema.
Time ( )
TimeSerial(hora,minuto,segundo)
Esta funo retorna um Variant do subtipo Date, a qual representa os parmetros passados.
TimeSerial (12+3,23,45-8)
Retorna: 15:23:37.
699
TimeValue(String)
Esta funo retorna um Variant do subtipo Date, de acordo com a String passada como
parmetro. A String deve ser um formato de hora vlido.
TimeValue(12:23:45)
Retorna: 12:23:45.
WeekDay(data)
Retorna um nmero indicativo do dia da semana.
WeekDay(21/08/2000)
WeekDayName(nmero)
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 parmetro indica que para retornar o nome abreviado.
Year(data)
Retorna apenas o ano da data que foi passada como parmetro.
Year(25/02/2000)
Retorna: 2000.
Funes Matemticas
Estas funes so utilizadas para facilitar os clculos matemticos.
Na seqncia temos a apresentao das principais funes desta categoria.
700
Atn(nmero)
Esta funo retorna Arco tangente de um nmero. O nmero representa um valor em radianos.
Atn(3.14)
Retorna: 1,26248066459947.
Cos(nmero)
Esta funo retorna o coseno de um nmero. O nmero representa um valor em radianos.
Cos(3.14)
Retorna: -1.
Exp(nmero)
Retorna o logaritmo neperiano e elevado ao nmero passado como parmetro.
Exp(1)
Retorna: 2,71828182845905.
Log(nmero)
Esta funo retorna o logaritmo natural do nmero passado como parmetro. o logaritmo
na base e.
Log(1000)
Retorna: 6,90775527898214.
Randomize( )
Inicializa o gerador de nmeros aleatrios.
Randomize( )
Rnd(nmero)
Esta funo gera um nmero aleatrio entre 0 e 1.
Randomize
Rnd(100)
701
Sin(nmero)
Esta funo retorna o seno de um nmero. O nmero representa um valor em radianos.
Sin(3.14)
Retorna: 0.
Sqr(nmero)
Esta funo retorna a raiz quadrada do nmero passado como parmetro.
Sqr(25)
Retorna: 5.
Tan(nmero)
Esta funo retorna a tangente de um nmero. O nmero representa um valor em radianos.
Tan(3.14)
Retorna: 0.
FormatCurrency(expresso)
Retorna uma String formatada com o smbolo de Moeda definido nas Opes regionais do
Painel de controle.
FormatCurrency(1000.25)
Retorna: R$ 1.000,25
FormatDateTime(expresso,opo)
Retorna uma String formatada como data e hora. O parmetro opo no obrigatrio. Este
parmetro 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
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(expresso,numdigitos)
Retorna o resultado da expresso com uma String, com o nmero de casas decimais definidos
pelo parmetro numdigitos.
FormatNumber(1235.36258,3)
Retorna: 1235,362.
FormatPercent(expresso,numdigitos)
Retorna o resultado da expresso com uma String formatada como porcentagem (multiplicada
por 100) e com o sinal de %, com o nmero de casas decimais definidos pelo parmetro
numdigitos.
FormatPercent(25.32/100,2)
Retorna: 25,32%.
InStr(String1,String2)
Retorna a posio da primeira ocorrncia de String2 em String1.
InStr(Antnio Cndido da Silva,Silva)
Retorna: 20.
703
LCase(string)
Converte uma String para minsculas.
LCase(Jos da Silva)
Left(string,nmero)
Retorna um nmero especificado de caracteres a partir do incio da String. Espaos em branco
tambm contam como caractere.
Left(Jos da Silva,4)
Retorna: Jos.
Left(Jos da Silva,7)
Len(string)
Retorna o tamanho da String ou o nmero de bytes necessrios para armazenar a varivel.
Len(Jos da Silva)
Retorna: 13.
LTrim(string)
Retorna uma cpia da String sem espaos em branco esquerda da String.
LTrim(
Jos da Silva)
Mid(string,start,nmero)
Retorna um nmero especificado de caracteres (nmero) de uma String, a partir de uma
posio especificada (start).
Mid(Jos da Silva,6,8)
Retorna: da Silva.
704
Replace(string,ocorrncia,substituio)
Retorna uma String onde uma determinada String (definida pelo parmetro ocorrncia) foi
substituda por outra (definida pelo parmetro substituio).
Replace(Jose da Silva,e,)
Right(string,nmero)
Retorna um nmero especificado de caracteres a partir do final da String. Espaos em branco
tambm contam como caractere.
Right(Jos da Silva,5)
Retorna: Silva.
Right(Jos da Silva,8)
Retorna: da Silva.
RTrim(string)
Retorna uma cpia da String sem espaos em branco direita da String.
RTrim(Jos da Silva
Space(nmero)
Retorna uma String com o nmero de espaos em branco especificados pelo parmetro numero.
Space(10)
StrComp(String1,String2)
Retorna o resultado da comparao de duas Strings. O resultado pode ser um dos seguintes valores:
String1 menor do que String2: -1
String1 igual a String2: 0
705
Retorna: 0.
StrComp(Jose,Zeze)
Retorna: -1.
StrComp(Zeze,Jose)
Retorna: 1.
StrComp(Zeze,Null)
Retorna: Null.
String(nmero,caractere)
Retorna uma String formada pelo caractere definido no parmetro caractere, tantas vezes
quantas definidas pelo parmetro numero.
String(30,*)
Retorna: ******************************
StrReverse(string)
Retorna uma String em ordem reversa da original.
StrReverse(Jos da Silva)
Trim(string)
Retorna uma cpia da String sem espaos em branco, nem direita, nem esquerda da String.
Trim(
Jos da Silva
UCase(string)
Converte uma String para maisculas.
UCase(Jos da Silva)
706
ndice Remissivo
ndice
Remissivo
707
Quatro Camadas, 33
#include, 673
%>, 46
Apresentao, 33
@CODEPAGE, 675
Cliente, 33
@ENABLESESSIONSTATE, 675
Dados, 34
@LANGUAGE, 675
Lgica, 34
@LCID, 675
Modelo, 33
@TRANSACTION, 675
Outras questes, 34
Segurana, 550
<%, 46
Proteo, 551
ADO
Camada de apresentao, 30
Arquitetura, 288
Lgica do Negcio, 31
Conceito, 288
Problemas, 30-31
Conexes, 323
Trs Camadas, 31
Apresentao, 32
Dados, 32
Lgica, 32
Provedor, 323
Modelo, 32
Senha, 323
Servidor, 324
Modelo de Objetos do, 290-291
Outras questes, 34
ASP
Entendendo, 170
OLE DB
IIS 5.0, 36
Aplicaes
Application, 177
ASPError, 177
Collections, 177
Events, 177
Mtodos, 177
Properties, 177
O que ?, 457
Request, 177
Duas Camadas, 29
Response, 177
Cliente, 29
Server, 177
Modelo, 29
Session, 177
Global.asa, 465
O que ?, 36
Para a Web, 29
Outros servidores, 36
708
ndice Remissivo
Tables, 614
VBScript, 614
Version, 614
Mtodos
GetListCount, 588
Comrcio Eletrnico, 23
GetListIndex, 589
B2B, 24-26-27
GetNextDescription, 590
B2C, 24
GetNextURL, 590
Cdigo de retorno, 47
GetNthURL, 591
CRM, 25
GetPreviousDescription, 591
GetPreviousURL, 591
Componente Page Counter, 605
Exemplo, 607
Altura, 598
File_Location, 605
Borda, 599
Mtodos
Impresses, 599
Hits, 606
Largura, 598
PageHit, 606
Texto, 599
Reset, 606
URL, 598
URL_anncio, 599
URL_home_page_anncio, 599
Save_Count, 606
Componentes
Ad Rotator, 564
Exemplo, 603
Propriedades
Border, 602
Clickable, 602
TargetFrame, 602
Componente Browser Capabilities, 609
D
Diretivas
Exemplo, 611
#include, 673
Propriedades
@CODEPAGE, 675
ActiveXControls, 614
@ENABLESESSIONSTATE, 675
BackGroundsounds, 614
@LANGUAGE, 675
Beta, 614
@LCID, 675
Browser, 614
@TRANSACTION, 675
Cookies, 614
Frames, 614
JScript, 614
Plataform, 614
E
Erros
De semntica, 659
709
De sintaxe, 658
Log, 149
Lgicos, 661
Rnd, 149
Minimizar, 658-662
Sgn, 149
Sin, 150
Exemplos de aplicao
Sqr, 150
Tan, 150
Cbool, 127
Cbyte, 128
CCur, 129
Cdate, 130
CDbl, 131
CInt, 132
CLng, 133
CSng, 134
CStr, 135
Fix, 135
Int, 135
Date, 140
DateAdd, 145
DateDiff, 144
Day, 141
ORACLE, 331
Hour, 143
Month, 142
MonthName, 143
Exemplos prticos
Hello World, 44
Now, 142
Data automtica, 48
Time, 141
WeekDay, 147
WeekDayName, 148
Year, 147
FAT, 526
FAT32, 526
Is Array, 113
Funes
Is Date, 118
IsEmpty, 121
Abs, 149
IsNull, 122
Atn, 149
IsNumeric, 124
Cos, 149
IsObject, 125
Exp, 149
VarType, 115
710
ndice Remissivo
Asc, 136
Chr, 136
LCase, 137
Left, 138
Conta IUSR_NOME_DO_COMPUTADOR
Len, 137
Configurando, 515
Mid, 139
Right, 138
Sincronizando, 518
String, 140
UCase, 138
Lgica de, 44
G-H
Instalando, 4
Melhorias, 10
Novidades, 10
HTML
Administrao e Servios, 11
Estrutura de um documento, 56
Desenvolvimento de aplicaes, 12
Formulrios, 60
Permisses NTFS
<FORM></FORM>, 60
Configurando, 525
Boto Reset, 75
Boto Submit, 75
Estrutura de pastas, 37
Caixa de combinao, 72
Pastas virtuais, 38
Caixa de Texto, 62
Testando, 9
Internet
ARPANET, 16
O atributo action, 61
Contedo dinmico, 19
Radio Buttons, 68
ASP, 20
Reviso rpida, 56
Banco de dados, 21
Tags
CGI, 20
<BODY></BODY>, 58
Perl, 20
<FONT></FONT>, 58
SQL Server, 20
<HEAD>, 57
Contedo esttico, 16
<HTML>, 57
Elementos da, 17
<TABLE></TABLE>, 58
Internet, 18
<TD></TD>, 58
Servidor Web, 18
<TR></TR>, 58
Usurio, 18
FTP, 16
gopher, 16
711
Histria, 16
HTML, 17
HTTP, 17
Viso geral, 17
Relacionamentos, 253
Ajuda, 161
J-L
Java Script, 12
Laos de controle
Case, 49
Linguagem SQL
Funes de agregao, 426
N
Netscape Navigator 4.x, 4
NTFS, 5, 526
AVG, 427
Auditoria, 527
Count, 427
Compresso, 527
Max, 427
Min, 427
Desempenho, 527
Sum, 427
Gerenciamento, 527
Instrues
DELETE, 274
Permisses, 527
INSERT, 273
SELECT, 264
UPDATE, 272
Introduo, 263
Pesquisas
O
Objeto Application
Colees
Contents, 479
StaticObjects, 479
Definio, 468
Eventos
OnStart, 469
Mtodos
Modelo Relacional
Chave Primria, 252
Lock, 484
Remove, 483
712
ndice Remissivo
RemoveAll, 483
Disconnect, 295
Unlock, 484
ExecuteComplete, 295
InfoMessage, 295
RollBackTransComplete, 295
WillConnect, 295
Propriedades
WillExecute, 295
ASPCode, 657
ASPDescription, 657
Exemplo, 295
Category, 657
Mtodos
Column, 657
BeginTrans, 293
Description, 658
Cancel, 293
File, 658
Close, 293-333
Line, 658
CommitTrans, 293
Number, 658
Execute, 293
Source, 658
Open, 293
OpenSchema, 293
Objeto Command
RoolbackTrans, 293
Introduo, 389
Mtodos
Propriedades
Cancel, 393
CreateParameter, 393
Attributes, 293
Execute, 393
CommandTimeout, 293
ConnectionString, 294-324
Propriedades, 393
ConnectionTimeout, 294
ActiveConnection, 394
CursorLocation, 294
CommandText, 394
DefaultDatabase, 294
CommandTimeout, 394
Errors, 294
CommandType, 394
IsolationLevel, 294
Mode, 294
Properties, 294
Name, 394
Provider, 294
Parameters, 394
State, 294
Prepared, 394
Version, 294
Properties, 394
State, 394
AvailableSpace, 634
DriveLetter, 635
Eventos
BeginTransComplete, 295
DriveType, 635
CommitTransComplete, 295
FileSystem, 635
ConnectComplete, 295
FreeSpace, 635
713
IsReady, 635
FolderExists, 624
Path, 635
GetAbsolutePathName, 625
RootFolder, 635
GetBaseName, 631
SerialNumber, 635
GetDrive, 620
ShareName, 635
GetExtensionName, 631
TotalSize, 635
GetFile, 631
VolumeName, 635
GetFileName, 632
GetParentFolderName, 627
GetTempName, 632
Mtodos
MoveFile, 633
MoveFolder, 628
Copy, 647
OpenTextFile, 633
Delete, 648
Move, 648
OpenAsTextStream, 648
Propriedades
Attributes, 644
Copy, 642
DateCreated, 644
CreateTextFile, 642
DateLastAcessed, 644
Delete, 643
Move, 643
DateLastModified, 644
Propriedades
Drive, 645
Name, 645
Attributes, 638
ParentFolder, 645
DateCreated, 638
Path, 645
DateLastAcessed, 638
ShortName, 645
DateLastModified, 638
ShortPath, 645
Drive, 638
Size, 645
Files, 638
Type, 645
IsRootFolder, 638
Name, 638
ParentFolder, 638
Mtodos
BuildPath, 621
Path, 638
CopyFile, 628
ShortName, 638
CopyFolder, 622
ShortPath, 639
CreateFolder, 623
Size, 639
CreateTextFile, 629
SubFolders, 639
Type, 639
DeleteFile, 630
DeleteFolder, 623
DriveExist, 620
FileExists, 630
Propriedades
714
ndice Remissivo
Attributes, 402
AbsolutePage, 343
Direction, 402
AbsolutePosition, 343
Name, 402
ActiveCommand, 344
NumericScale, 402
BOF, 344
Precision, 403
BookMark, 344
Size, 403
CacheSize, 344
Type, 403
CursorType, 344
CursorLocation, 344
EditMode, 344
Value, 403
EOF, 344
Objeto RecordSet
Filter, 345
Cursores, 336
Localizao, 339
LockType, 345
MaxRecords, 345
Definio, 335
PageCount, 345
PageSize, 345
RecordCount, 345
Sort, 345
Mtodos
Source, 345
AddNew, 346
State, 345
Cancel, 346
CancelBatch, 346
Objeto Request
Coleo Cookies, 199
CancelUpdate, 346
Exemplo, 200
Clone, 346
Close, 346
Delete, 346
Exemplo, 182
Find, 346
GetRows, 346
Exemplo, 189
GetString, 346
Move, 346
MoveFirst, 346
MoveLast, 346
Exemplo, 194-196
MoveNext, 346
MovePrevious, 346
BinaryRead, 204
Open, 346
Propriedades
Requery, 346
TotalBytes, 203
Resynk, 347
Save, 347
Objeto Response
Coleo Cookies, 206
Update, 347
Exemplo, 207
Propriedades
715
Mtodos
Mtodos
AddHeader, 220
Abandon, 501
AppendToLog, 220
Remove, 502
RemoveAll, 502
BinaryWrite, 221
Propriedades
Clear, 222
End, 223
CodePage, 503
Flush, 224
LCID, 504
Redirect, 225
SessionID, 504
Write, 226
TimeOut, 504
Usando variveis, 490
Propriedades
Buffer, 211
ODBC
Criando uma fonte
CacheControl, 212
CharSet, 213
ContentType, 214
Expires, 215
IsClientConnected, 217
PICS, 218
Objeto Server, 564
Mtodos
CreateObject, 566
P
Permisses NTFS
Arquivos
Execute, 568
GetLastError, 570
Gravar, 528
HTMLEncode, 575
Leitura, 528
MapPath, 573
Transfer, 574
Modificar, 529
URLEncode, 571
Avanadas, 531-532
Definindo, 529
Objeto Session
Pastas
Colees
Contents, 496
Gravar, 528
StaticObjects, 497
Leitura, 528
Definio, 486
Eventos
Definindo Variveis, 489
OnEnd, 488
Modificar, 528
Plug-in, 55
OnStart, 487
716
ndice Remissivo
R-S
If Then, 96
If Then Else, 96
Segurana
Select Case, 99
Principais eventos,
Introduo, 510
Transaes
Abortando Script, 667
Conceito, 28-663
Inserindo Cdigo, 78
Operadores de comparao, 87
Resultados de, 91
Operadores matemticos, 83
O que ?, 54
Procedimentos e Funes, 151
Referncia, 681
Visual Basic, 54
VBA, 54
VBScript, 12
Criando Funes, 154
VPN, 3
W-X
Declarando Variveis, 78
Declarao obrigatria, 81
XML, 12
Escopo de, 91
Subtipos, 82
Tipo de uma varivel, 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