Sie sind auf Seite 1von 222

Centro Atlntico

Programao Web com


ASP - Active Server Pages

Joo Vieira
Centro Atlntico

Programao Web com


ASP - Active Server Pages

Edies Centro Atlntico


Portugal/2000

Reservados todos os direitos por Centro Atlntico, Lda.


Qualquer reproduo, incluindo fotocpia, s pode ser feita
com autorizao expressa dos editores da obra.

Programao Web com Active Server Pages


Coleco: Tecnologias
Autor: Joo Vieira
Direco grfica: Centro Atlntico
Capa: Paulo Buchinho

Centro Atlntico, Lda., 2000


Av. D. Afonso Henriques, 1462 - 4450 Matosinhos
Tel. 22 - 938 56 28/9 Fax. 22 - 938 56 30
Rua da Misericrdia, 76 - 1200 Lisboa
Tel. 21 - 321 01 95
Fax 21 - 321 01 85
Portugal

geral@centroatlantico.pt
www.centroatlantico.pt

Fotolitos: Centro Atlntico


Impresso e acabamento: Rolo & Filhos
1 edio: Janeiro de 2000

ISBN: 972-8426-21-6
Depsito legal: 146.485/00

Marcas registadas: todos os termos mencionados neste livro conhecidos como sendo marcas
registadas de produtos e servios, foram apropriadamente capitalizados. A utilizao de um
termo neste livro no deve ser encarada como afectando a validade de alguma marca registada
de produto ou servio.
O Editor e os Autores no se responsabilizam por possveis danos morais ou fsicos causados
pelas instrues contidas no livro nem por endereos Internet que no correspondam s HomePages pretendidas.

ndice
1. Introduo s Active Server Pages
1.1
1.2
1.3
1.4
1.5
1.6
1.7

Do Autor
Requisitos para as ASP
ASP vs. JavaScript / VBScript
Instalar o servidor de Internet
Programar com ficheiros ASP e HTML
Conhecer o HTML (Hyper Text Markup Language) em 12 passos
Sites com recursos de ASP

12
13
15
16
19
19
23

2. Expresses e Operadores
2.1

2.2

2.3

Os primeiros passos
2.1.1 Exemplo: Ol Portugal
2.1.2 Exemplo: Ol Portugal com varivel
2.1.3 Exemplo: Clculo de variveis
2.1.4 Exemplo: Cdigo ASP embebido em HMTL
IF, THEN, ELSE, END IF
2.2.1 Exemplo: Comparao entre variveis

28
28
29
29

30

FOR, WHILE, CASE


2.3.1 Exemplo: Comparao de variveis com ciclos
2.3.2 Exemplo: Select Case
2.3.3 Exemplo: Contadores ASP embebidos em HMTL
2.3.4 Exemplo: HMTL embebido em contadores ASP

32
33
33
34

2.4

Variveis

35

2.5

Tabela de Operadores
2.5.1 Exemplo: Comparao de varivel entre valores 37
2.5.2 Exemplo: Utilizao de todos os operadores

38

3. Funes
3.1

Tabela de funes base das ASP

40

3.2

As nossas funes
3.2.1 Exemplo: N dias at o ano 2001
3.2.2 Exemplo: Validar o e-mail
3.2.3 Exemplo: Criar uma ComboBox a partir de um array
3.2.4 Exemplo: Criar um grfico em HTML a partir de um array

48
50
52
53

Uso de SSI (Server Side Includes) com as nossas funes


3.3.1 Exemplo: Uso de um ficheiro externo com SSI
3.3.2 Exemplo: Ficheiro com todas as funes
3.3.3 Exemplo: ASP que usa o ficheiro com todas as funes

56
57
58

3.3

4. Objectos
4.1

Tabela de Objectos

62

4.2

Variveis globais e de sesso

65

4.3

Interagir com o utilizador


4.3.1 Exemplo: Responder ao utilizador com os dados recolhidos
4.3.2 Exemplo: Validar formulrio
4.3.3 Exemplo: Curso online
4.3.4 Exemplo: Proteco de pginas com password

72
73
81
88

Ficheiro global.asa
4.4.1 Exemplo: Quantos utilizadores esto a visitar a pgina
4.4.2 Exemplo: Chat em Browser

100
102

Cookies, dados do utilizador e do servidor


4.5.1 Exemplo: Recolher dados do utilizador
4.5.2 Exemplo: Pginas personalizadas

105
107

Formatao de strings

108

4.4

4.5

4.6

5. Bases de dados
5.1

Bases de Dados / SQL

114

5.2

Construir uma base de dados em Microsoft Access

117

5.3

Conexo base de dados

122

5.4

Inserir, apagar e actualizar dados em bases de dados


5.4.1 Exemplo: Inserir dados
5.4.2 Exemplo: Eliminar dados
5.4.3 Exemplo: Actualizar dados

127
135
137

Apresentao de dados
5.5.1 Exemplo: Listar dados em tabela
5.5.2 Exemplo: Listar dados com imagens
5.5.3 Exemplo: Listar dados a pedido

142
144
146

Exemplos com bases de dados


5.6.1 Exemplo: Livro de Visitas
5.6.2 Exemplo: Sondagens de opinio

148
152

5.5

5.6

6. Componentes
6.1

Introduo aos Componentes

156

6.2

Tratamento de ficheiros de texto com o TextStream


6.2.1 Exemplo: Histria sem fim
6.2.2 Exemplo: Contador de acessos

159
163

Componentes de e-mail
6.3.1 Exemplo: Envio de e-mail com attachment

164

Criar componentes em Visual Basic 6


6.4.1 Exemplo: Componente Livro de Visitas

173

6.3
6.4

7. Exemplos reais
7.1
7.2
7.3

Introduo
A R: Motor de Busca
A Loja: Loja E-Commerce

182
183
197

Rece

Re

Pea gratuitamente o seu e-book

Receba gratuitamente, por e-mail, a verso


digital (e-book) deste livro, para poder utilizar
todos os programas sem ter que os re-escrever.
Para tal, envie a cpia da factura deste livro
para o Centro Atlntico, para o e-mail
geral@centroatlantico.pt ou por correio para,
Centro Atlntico
Ap. 413
4760 V. N. Famalico

Introduo
s Active Server
Pages

1.1 Do Autor

12

1.2 Requisitos para as ASP

13

1.3 ASP vs. JavaScript / VBScript

15

1.4 Instalar o servidor de Internet

16

1.5 Programar com ficheiros ASP e HTML

19

1.6 Conhecer o HTML (Hyper Text Markup

Language) em 12 passos
1.7 Sites com recursos de ASP

19
23

12 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES

1.1 Do Autor
Escrevi este livro, acima de tudo, para dar algum apoio a todos
aqueles que querem iniciar-se neste tema de programao Internet
do lado do servidor. Quando comecei a pesquisar estes assuntos,
h alguns anos, a realidade era muito diferente para conseguir
programar neste tipo de sistemas. Seria necessrio um servidor (com
certos requisitos), e conhecimentos bastante mais avanados de
programao. A definio de pginas dinmicas na altura, consistia
na existncia de ficheiros executveis do lado do servidor que criavam
pginas HTML consoante o que o utilizador procurava, e que limitava
bastante os tipos de pesquisa. Quando o Perl (para programao
de pginas dinmicas) apareceu, o panorama mudou, e as facilidades
deste tipo de programao comeavam. Mesmo assim, a Microsoft
apareceu com os IDC (Internet Database Connector), que apesar
de serem de mais fcil compreenso no eram to potentes a nvel
de desenvolvimento.
Mais tarde, apareceram as ASP, que deram uma grande (e boa)
viragem na programao do lado do servidor. O programador
comeava a ter uma linguagem potente e flexvel onde podia
desenvolver o mais variado tipo de servios e de solues.
Quando comecei a trabalhar nesta linguagem estava-se a fazer a
transio do sistema IDC para as ASP. As facilidades das mesmas
deram-me hiptese de as poder experimentar onde quer que fosse.
Mesmo assim, os recursos a nvel de manuais e pginas Internet
eram poucos, e tive bastantes dificuldades em me desenvolver nesta rea. Apesar de tudo, dois sites deram-me uma grande ajuda
(www.swynk.com e www.4guysfromrolla.com), pois muitos programadores j l deixavam os seus artigos, cdigo e ideias. Com este
suporte on-line e alguma ajuda de programadores de todo o mundo,
comecei a desenvolver pginas, e tudo foi correndo normalmente.
Quando me senti preparado comecei a escrever artigos para estes
mesmos sites, para apoiar aqueles que iriam ter as mesmas dificuldades que eu tive.
Com este livro quero fazer o mesmo, apoiar todos os que querem
entrar nesta rea, e tentar que o caminho para o domnio das ASP
seja o menos dificultado possvel. Este livro est separado por captulos; cada captulo est estruturado por uma parte do sistema das
ASP, e foi dada uma ordem a estes, para que os temas estivessem
ordenados por nveis de dificuldade. No final deixo alguns exemplos, que sei iro ser muito teis a todos aqueles que querem algo
Verso digital, individual, licenciada em Fev/2000, pelo Centro Atlntico, da verso 1.0 do livro 'Programao Web com ASP'

CAPTULO 1: INTRODUO S ACTIVE SERVER PAGES 13


mais que tpicos e artigos. Estes exemplos para os iniciados necessitam de uma compreenso de todos os temas abordados neste
livro, mas os programadores mais avanados podem ir directamente para os exemplos, e recorrer ao manual para entenderem ou reverem alguns aspectos da programao com ASP. Espero que este
livro sirva para aquilo que o leitor est procura, pois quando eu
comecei se tivesse tido este manual, metade dos meus problemas
tinham sido resolvidos muito mais depressa. Para me ajudar nos
temas tenho os problemas que normalmente recebo todas as semanas de vrios pontos do planeta, que me do uma ideia daquilo
que os programadores mais precisam quando comeam a trabalhar
com esta tecnologia.

1.2 Requisitos para as ASP


ASP a abreviatura de Active Server Pages. ASP so pginas
dinmicas para a Internet, que usam uma linguagem de programao ao estilo do VB (Visual Basic). Para quem est familiarizado
com o VB no lhe ser difcil entender este cdigo, pois as rotinas
de scripting de ambos os sistemas so quase idnticas e seguem
as mesmas regras. Se alm do VB, tiver slidos conhecimentos de
HTML (Hyper Text Marked Language), rapidamente estar preparado para programar sobre este sistema a um bom nvel depois de
dominar os tpicos deste manual. Mesmo que no domine o HTML,
poder ler o captulo 1.6 onde esto indicados alguns dos principais
comandos (chamados Tags) do mesmo.
Este sistema foi o segundo adoptado pela Microsoft para a criao
de poderosos sites dinmicos com acesso a bases de dados. O
primeiro sistema foi o de IDC que usava um sistema de dois ficheiros, um com o cdigo HTML (HTX) que continha rotinas de chamada de ficheiros IDC, que por sua vez tinham as declaraes de SQL
para acesso s bases de dados. No era to flexvel, era mais lento
de se programar, e tinha certos requisitos de programao algo diferentes das ASP.

14 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES

Fig. 1.1 - Esquema geral do funcionamento das ASP

No existem requisitos em relao aos browsers a usar para aceder


aos sites criados em ASP, pois todo o cdigo interpretado pelo
servidor de Internet, e aquilo que chega ao utilizador final puro
HTML gerado pelas ASP. Com a experincia, e futuros testes, vai
entender todos estes aspectos que tenho vindo a mencionar.
A nvel de hardware, o programador tanto pode ter o seu computador pessoal em casa para trabalhar nos exemplos deste livro, como
trabalhar directamente no prprio servidor online. O importante
que a partir do momento que disponibilize a sua pgina online, opte
em vez do PWS (Personal Web Server), pelo IIS (Internet Information
Server), pois este mais seguro, mais potente, e suporta melhor
mltiplos sites, alm de que para controlar os acessos, configurar e
controlar o seu servidor de Internet necessita mesmo do IIS (por
isso indicado para situaes a nvel profissional). Todo o cdigo que
criado em PWS funciona em IIS, quando no so usados componentes externos (DLL); a partir desse momento necessrio instalar os mesmos na mquina para onde se est a exportar o cdigo.
De outra forma, basta o leitor copiar os ficheiros que criou para um
ou outro sistema, que o mesmo aceita e interpreta da mesma maneira. Claro que tem de ter em ateno outros aspectos como a
localizao das bases de dados, as suas conexes, e componentes
extra (tudo isto visto nos prximos captulos).
Verso digital, individual, licenciada em Fev/2000, pelo Centro Atlntico, da verso 1.0 do livro 'Programao Web com ASP'

CAPTULO 1: INTRODUO S ACTIVE SERVER PAGES 15

1.3 ASP vs JavaScript/VBScript


Muitas pessoas perguntam Qual a diferena entre as ASP e o
JavaScript? Ou o VBScript? Ou mesmo o to potente Java?.
Bem, as diferenas so bastantes, no s falando das ASP, mas
tambm de outras linguagens parecidas, como o Perl, PHP ou mesmo o Cold Fusion. Enquanto o JavaScript e o VBScript e o Java,
funcionam do lado do cliente (apesar de haver hiptese do Java
funcionar tambm a nvel do servidor com servlets) as ASP funcionam no servidor. Uma boa maneira de notar esta diferena entre as
ASP e o JavaScript/VBScript, olhando para as instrues de programao de ambos. Quando estamos no nosso browser e vamos
ver o source de um ficheiro com JavaScript ou VBScript, vemos todo
o cdigo, e da vem o problema desse cdigo poder ser usado ilegalmente por outro programador - situao muito usual. Com as
ASP, ao tentar aceder ao cdigo, s se v puro HTML, pois as ASP
so tratadas e processadas no servidor de Internet que por sua vez
envia a formatao online toda em HTML.
O cdigo de JavaScript facilmente identificado no meio do cdigo
HTML, sendo a sua estrutura a seguinte:
<SCRIPT LANGUAGE=JAVASCRIPT>
{
history.go(-1);
}
</SCRIPT>
Este exemplo est a simular o boto de recuo do browser, fazendo
com que seja recuada uma pgina. Normalmente este cdigo usado na seguinte situao (pelo menos aquela em que o uso mais):
<a href=javascript : history-go(-1)>Voltar Atrs</a>
O VBScript no final de contas o cdigo base das ASP, mas que
corre no lado do cliente:
<SCRIPT LANGUAGE=VBSCRIPT>
formatcurrency(10000)
</SCRIPT>
Este cdigo formata o valor 10000, para que fique 10.000$00.

16 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES


Com o Java o problema diferente, muito pesado, nem todos os
browsers o suportam, e a sua programao dispendiosa, e toma
muitos recursos, que a fazem ideal para outros campos. Este foi
ento posto de parte por todos aqueles que querem sites com rpido acesso a bases de dados, e flexveis, no s na programao
mas tambm na utilizao (interface com o utilizador), onde as ASP
e linguagens semelhantes tm vindo a dominar todo o mercado. E
se formos a ter em conta o que aceder a bases de dados online,
poderemos ver que todos os servios online tm de aceder a essas
mesmas estruturas, para poderem praticar o chamado e-commerce,
que veremos tambm neste manual.

1.4 Instalar o servidor de Internet


O servidor de Internet bastante fcil de instalar e a documentao
da Microsoft que vem com o pacote do software bastante explcita. Mesmo assim vou s indicar alguns pontos para a instalao do
software.
Se est a pensar em instalar um servidor de Internet para ter pginas online, a opo certa o WindowsNT com o Option Pack 4 (de
onde vem o IIS 4) e se possvel com o Service Pack 4 ou 5 do
WindowsNT. Se quiser usar sistemas mais recentes pode tambm
usar o Windows 2000, que vem mais seguro no aspecto dos sites
que fiquem sob sua alada e trs j o IIS 5.
As grandes diferenas no IIS 5 sero no aspecto do uso de cdigo e
alguns objectos novos, que no so bem novos, mas sim melhoramentos de alguns j usados anteriormente. A nvel de performance
essa ser melhor pois os cabealhos de HTTP (a informao que
recolhida pelo browser, enviada pelo servidor) quando possvel so
enviados comprimidos, permitindo uma reduo de tamanho de informao. Ter alguns wizards para instalao de sites, e um grande avano que o programador no ter de se preocupar com as
extenses dos ficheiros, podendo colocar cdigo ASP em qualquer
lado, pois o novo servidor vai detectar as diferenas. Existir uma
maneira mais prtica de redireccionamento de pginas, poder ser
executado cdigo dinamicamente (do tipo o utilizador ter uma pgina online para testar scripts no momento), melhor controlo de componentes, e o mais importante de todos, a hiptese de se criarem e
usarem classes, sistema usado por programadores em ambientes
de programao orientada por objectos.
Verso digital, individual, licenciada em Fev/2000, pelo Centro Atlntico, da verso 1.0 do livro 'Programao Web com ASP'

CAPTULO 1: INTRODUO S ACTIVE SERVER PAGES 17


Caso contrrio, o PWS para o Windows 98 uma boa escolha pois
pesa menos no computador e ser o suficiente para criar as ASP
que ir usar futuramente no Windows NT. Eu indicaria ento que
instalasse tudo o que vem no pacote (PWS ou IIS), as consolas de
gesto, o transaction server, os exemplos, o ADO (Access Data
Obects), todos os componentes que vierem em resumo, tudo o
que for possvel instalar. Perceber durante a leitura deste manual o
porqu desta indicao, e com a sua especializao nesta matria
ao longo da sua vida profissional tambm o entender.
O directrio onde as pginas vo ficar instaladas pode ser aquele
que o programador quiser, mas aconselho vivamente a utilizar o
que est por defeito c:\inetpub\wwwroot\, e a partir do interior deste
gerir todas as pginas que quiser criar. No apague os ficheiros que
ele criar, principalmente um chamado global.asa, que iremos tratar
mais adiante.
Depois de todo o sistema instalado tem de activar o servio de
Internet. No PWS basta ir ao Personal Web Server e carregar em
Start (normalmente ele j est por defeito). No IIS 4 ter de ir
Management Console e escolher Default Web Site da lista do lado esquerdo, carregando depois no boto de run.

Fig. 1.2 - Aspecto da consola do PWS

Como se pode verificar na figura 1.2, o servidor virtual criado por


defeito o nome que se deu ao computador, variando por isso de
mquina para mquina. No meu caso ser jvpc. Assim, quando for
preciso aceder ao servidor virtual, poder-se- fazer no browser atravs de http://jvpc/ ; aparecer-lhe-o informaes do PWS, da mesma
maneira que se escrevesse no address link do seu browser localhost
.

18 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES

Fig. 1.3 - Pgina principal do servidor


Internet PWS, depois de instalado

Mas para os exemplos deste livro eu criei um directrio semi-virtual


para trabalhar os meus ficheiros. Para tal segui os seguintes passos:
1. Criar um directrio dentro de c:\inetpub\wwwroot\
(ex. c:\inetpub\wwwroot\livro\)
2. Entrar na consola do PWS
3. Parar os servios, clicando em Stop
4. Clicar no icon da lista da esquerda que tem o nome de
Advanced
5. Carregar em Add para se acrescentar novo directrio
semi-virtual
6. Em Directory Fazer browse at ao directrio criado
na linha 1.
7. Em Alias escrever o nome a usar logo a seguir
de http://nomepc/ (ex. livro)
8. Carregar em OK
9. Na lista do lado esquerdo, carregar em Main
10. Reiniciar os servios de Internet, carregar em Start
11. Fica ento instalado o primeiro servidor virtual Internet
no seu PC (ex. http://pcnome/livro/)
No se esquea de que os ficheiros de ASP s funcionam dentro do
directrio que criado para esse destino, e configurado por defeito
ou por si. Mas tudo isto est acessvel nos manuais do software.
Irei ento comear a demonstrar o aspecto do cdigo HTML.

Verso digital, individual, licenciada em Fev/2000, pelo Centro Atlntico, da verso 1.0 do livro 'Programao Web com ASP'

CAPTULO 1: INTRODUO S ACTIVE SERVER PAGES 19

1.5 Programar com ficheiros


ASP e HTML
As extenses dos ficheiros ASP *.asp, e dos ficheiros HMTL *.html
ou *.htm
Conforme a verso do servidor Internet, o programador poder definir quais as extenses a usar e para que tipo de ficheiro. Poder at
personalizar os ficheiros ASP, fazendo com que passem a ser *.xyz
Como estes tipos de ficheiros no so compilados e sim interpretados (os *.asp no servidor e os *.html no browser), o programador estar a programar sobre ficheiros de texto, mas com as extenses referidas. Normalmente so usados editores Freeware, que se podem
encontrar na Internet, ou outros mais profissionais como o InterDev
da Microsoft. Acho que cada um deve tentar todos os que puder,
para fazer a escolha que esteja mais apropriada sua maneira de
programar.

1.6 Conhecer o HTML (Hyper


Text Markup Language) em
12 passos
Para se programar as ASP, sero necessrios certos requisitos, no
s a nvel de hardware como de conhecimento a nvel de programao. Falo do HTML, que necessrio como base para um bom entendimento de tudo aquilo que descrito neste manual. Para isso
descreverei alguns comandos do HTML, que de linguagem de programao tem muito pouco, visto que se poderia comparar a alguns
processadores de texto bastante antigos (quem se lembrar do
WordStar sabe ao que me refiro!).
Vou ento indicar 12 pontos essenciais em relao ao HTML, para
que o leitor fique melhor preparado para o que vai ler nos prximos
captulos, onde se misturar HTML com o cdigo ASP.

20 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES


1. O cdigo HTML que aparece no browser fica sempre entre duas
Tags - Tags so os comandos que esto entre os smbolos <>
<HTML>
<BODY>
.
</BODY>
</HTML>

2. Como deve ter reparado, todas as Tags que comeam com


<NOMEDATAG> tm de acabar com uma barra </NOMEDATAG>. Nem
todas o requerem, mas podemos dizer que cerca de 90% sim.

3. Para enviar contedo para o browser de maneira a ser visvel


pelo utilizador, basta escrever:
<HTML>
<BODY>
ISTO UM TESTE
</BODY>
</HTML>

4. Para mudar-se os parmetros dos textos escritos usada a Tag


<FONT>, onde poder mudar o tamanho das letras, a cor e at
mesmo o tipo de letra:
<HTML>
<BODY>
<FONT FACE=ARIAL COLOR=GREEN SIZE=5>ISTO UM
TESTE</FONT>
</BODY>
</HTML>

5. Para simular um pargrafo existe a Tag <P>


<HTML>
<BODY>
<P><FONT FACE=ARIAL COLOR=GREEN SIZE=5>ISTO UM
TESTE</FONT></P>
E ISTO J OUTRO TESTE
</BODY>
</HTML>

Verso digital, individual, licenciada em Fev/2000, pelo Centro Atlntico, da verso 1.0 do livro 'Programao Web com ASP'

CAPTULO 1: INTRODUO S ACTIVE SERVER PAGES 21


6. A mudana de linha feita com <BR> que funciona como que
um Enter no mesmo pargrafo:
<HTML>
<BODY>
<P><FONT FACE=ARIAL COLOR=GREEN SIZE=5>ISTO UM
TESTE</FONT></P>
E ISTO<BR> J <BR> OUTRO TESTE<BR>
</BODY>
</HTML>
7. Para se criar tabelas usamos <TABLE></TABLE>, onde <TR></TR>
simbolizam as linhas, e <TD></TD> as colunas dessa mesma linha:
<HTML>
<BODY>
<TABLE BORDER=1>
<TR>
<TD>ESTA A PRIMEIRA LINHA, PRIMEIRA COLUNA</TD>
<TD> ESTA A PRIMEIRA LINHA, SEGUNDA COLUNA </TD>
</TR>
<TR>
<TD> ESTA A SEGUNDA LINHA, PRIMEIRA COLUNA </TD>
<TD> ESTA A SEGUNDA LINHA, SEGUNDA COLUNA </TD>
</TR>
</TABLE>
</BODY>
</HTML>

8. Quando queremos introduzir comentrios ao cdigo usamos


<! >. D muito jeito quando o cdigo HTML muito extenso,
comentando assim o que est criado em vrios pontos do script:
<HTML>
<BODY>
<!ISTO QUE AQUI EST ESCRITO NO APARECE NO BROWSER>
ISTO SIM, J APARECE NO BROWSER
</BODY>
</HTML>

22 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES


9. Quando necessrio um script, para funcionar do lado do cliente
tipo JavaScript ou VBScript usa-se a Tag <Script Language=.>
</Script>
<HTML>
<BODY>
<!ISTO QUE AQUI EST ESCRITO NO APARECE NO BROWSER>
ISTO SIM, J APARECE NO BROWSER
<SCRIPT LANGUAGE=JAVASCRIPT>
.
</SCRIPT>
</BODY>
</HTML>

10.Uma das maneiras de recebermos dados do utilizador atravs


de formulrios. Podemos usar o mtodo POST ou GET, que sero
definidos para o tipo de programao com dados dos utilizadores
via ASPs. Estes so estruturados da seguinte maneira:
<HTML>
<BODY>
<FORM NAME=nomedoformulario METHOD=POST>
O seu nome:<INPUT NAME=nome><BR>
O seu telefone:<INPUT NAME=email><BR>
<INPUT TYPE=SUBMIT>
</FORM>
</BODY>
</HTML>

11.Para ter um texto que vai ter a outra pgina, tem de fazer o link
com a Tag <A> </A>
<HTML>
<BODY>
<FORM NAME=nomedoformulario METHOD=POST>
O seu nome:<INPUT NAME=nome><BR>
O seu telefone:<INPUT NAME=email><BR>
<INPUT TYPE=SUBMIT>
</FORM>
<A HREF=outrapagina.html>Pode seguir por aqui</A>
</BODY>
</HTML>
Verso digital, individual, licenciada em Fev/2000, pelo Centro Atlntico, da verso 1.0 do livro 'Programao Web com ASP'

CAPTULO 1: INTRODUO S ACTIVE SERVER PAGES 23


12. Para mostrar uma imagem no browser use a Tag <IMG>
<HTML>
<BODY>
<IMG SRC=nomedaimagem.gif>
</BODY>
</HTML>

Ficam assim demonstrados os passos que julgo serem os bsicos


essenciais do HTML, para compreender parte daquilo que vai ser
demonstrado neste manual. A linguagem HMTL bastante simples
e limitada. Uma boa observao a outros sites pode fazer maravilhas aos seus conhecimentos de HMTL ;-)
Quando estiver no captulo dos exemplos deste manual, e se no
estiver a perceber o cdigo de HTML volte a consultar este captulo
onde se introduziram as Tags que poderiam causar mais dvidas. A
maioria das outras Tags e opes so quase bvias aquando da
sua traduo para portugus.

1.7 Sites com recursos de ASP


Poderia enumerar muitas dezenas de sites com recursos a nvel
das ASP, alguns dos quais eu ainda recorro. Mas vou indicar aqueles que julgo valerem mesmo a pena, no apenas pelo contedo
que tm, mas tambm pela maneira como apresentam o contedo
e o organizam:

www.activeserverpages.com
Este o site Pai das ASP. Ter
sido em princpio o primeiro relacionado com este assunto.
Tem muitos exemplos explicados, e vrios truques para
aquelas dificuldades que vo
aparecendo enquanto programamos. actualizado periodicamente h muito tempo.

24 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES

www.15seconds.com
Este tambm daqueles que
todos os que esto dentro do
assunto conhecem. Tem muitos artigos, de vrios tipos, e
um motor de busca que vai
pesquisar vrios sites de ASP.

www.swynk.com
Este site, no incio, era dos
melhores, tinha muita informao e muito bem estruturada.
Est vocacionado para tudo o
que tiver a haver com Windows
NT, e devido ao IIS4 tambm
tem muito bons artigos de ASP.
Tenho uma coluna minha l,
onde poder recolher algumas
ideias de ASP.
Este site cresceu muito, e muito depressa, por isso julgo ser
a causa dos atrasos na sua
actualizao.

www.4guysfromrolla.com
Indiscutivelmente um site a no
perder. Foi tambm graas a
este site que consegui alcanar os objectivos, nas empresas onde trabalhei com ASP.
Tem muita informao, artigos
e cdigo. Se por l passar vai
notar que tenho l alguns artigos.

Verso digital, individual, licenciada em Fev/2000, pelo Centro Atlntico, da verso 1.0 do livro 'Programao Web com ASP'

CAPTULO 1: INTRODUO S ACTIVE SERVER PAGES 25

www.asphole.com
um grupo de sites, que se
dedicam s ASP, tem tambm
muitos recursos, apesar de estarem a ser ultrapassados por
sites mais recentes como o
Aspin.

www.aspin.com
Este site bastante recente e
j cheguei a visit-lo quase todos os dias. Est muito bem organizado e tem bastantes temas por onde pode pesquisar.

www.asptoday.com
Este daqueles sites que
quando comear a programar
ASPs com alguma assiduidade ir com certeza visitar. Eles
obrigam os seus autores a escreverem os artigos em exclusividade, sendo por isso daqueles sites onde os artigos l
publicados no so lidos em
mais lado nenhum.

Expresses e
Operadores
2.1 Os primeiros passos
2.1.1 Exemplo: Ol Portugal
2.1.2 Exemplo: Ol Portugal com varivel
2.1.3 Exemplo: Clculo de variveis
2.1.4 Exemplo: Cdigo ASP embebido
em HMTL

28
28
29
29

2.2 IF, THEN, ELSE, END IF


2.2.1 Exemplo: Comparao entre variveis 30
2.3 FOR, WHILE, CASE
2.3.1 Exemplo: Comparao de variveis
com ciclos
2.3.2 Exemplo: Select Case
2.3.3 Exemplo: Contadores ASP
embebidos em HMTL
2.3.4 Exemplo: HMTL embebido em
contadores ASP

32
33
33
34

2.4 Variveis

35

2.5 Tabela de Operadores


2.5.1 Exemplo: Comparao de varivel
entre valores
2.5.2 Exemplo: Utilizao de todos
os operadores

37
38

28 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES

2.1 Os primeiros passos


Para comear irei demonstrar-lhe, em apenas uma linha, como
poder escrever uma frase; depois veremos o mesmo no HTML,
com variveis e aces entre variveis. Isto ainda antes de definir os
objectos, mtodos, expresses, funes e regras das ASP. Terei
como princpio que o leitor tem conhecimentos de HTML, visto ser a
base de toda esta programao (programao Internet).

(ficheiro cpt2-1-1.asp)

<%response.writeOl Portugal%>

Vemos aqui algo que nos salta vista e que so os <% %>. Como se
pode facilmente verificar, estes so os identificadores de onde comea e acaba a ASP que foi construda, pois quando introduzirmos
cdigo entre o HTML, teremos de definir onde esto as ASP, e estes
indicadores sero determinantes para esse propsito. Response
um objecto das ASP que conta com bastantes mtodos. Este e o
objecto Request vo ser sem sombra de dvidas aqueles com que
ir trabalhar mais. Encontra uma tabela no captulo seguinte com os
objectos principais e seus mtodos de maneira que sempre que
necessitar os possa encontrar mais rapidamente consultando a tabela.

(ficheiro cpt2-1-2.asp)

<%
pais = Portugal
response.writeOl & pais
%>

Este segundo exemplo demonstra uma abordagem diferente mas


com o mesmo resultado no browser. Aqui pretendo demonstrar a
maneira como se fazem ligaes com o smbolo &

CAPTULO 2: EXPRESSES E OPERADORES 29

Fig 2.1 - Resultado dos ficheiros


cpt1-4-1.asp e cpt1-4-2.asp

Se quisermos usar variveis numricas, e calcular algo com elas,


temos ento o exemplo seguinte:

(ficheiro cpt2-1-3.asp)

<%
a = 10
b=2
response.write a * b
%>
Como j deve ter verificado, este tipo de linguagem usa variveis
(tambm elas dinmicas) que no necessitam de inicializao, podendo ser criadas em qualquer momento. Apesar de haver uma
maneira em que o obrigado a fazer (com Explicit) mas s se assim o definir. Outro ponto bastante agradvel de que no necessita
de marcadores para definir o final de cada linha. Por exemplo, em
a=10. No necessrio ponto e vrgula ou outro qualquer marcador
para terminar uma linha de cdigo.
(ficheiro cpt2-1-4.asp)

<% iniciar a varivel


cptvar=passear%>
<HTML>
<BODY>
<FONT SIZE=6 >Eu hoje fui <%=cptvar%>, para o Alentejo</FONT>
</BODY>
</HTML>

30 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES


Neste exemplo foi feito aquilo que de mais normal vai ser feito no
resto deste manual - usar as variveis geradas ou no nas ASP e
introduzi-las no meio do cdigo HTML. Repare no truque para que a
varivel fique entre o HTML. No foi necessria a rotina
response.write, sendo ento introduzido apenas o caracter de
igualdade seguido da varivel.
A plica usada para comentar, sempre que quisermos introduzir
algum comentrio ao cdigo. Neste livro vamos us-la com frequncia para dar explicaes adicionais de algumas situaes a nvel de
programao.
Julgo que com estes exemplos o leitor ficou a perceber como se
estrutura de um modo geral a programao em ASP.

2.2 IF, THEN, ELSE, END IF


Vamos ento iniciar alguma programao bsica e essencial, aquilo
que une toda a programao, e que so os operadores e as
expresses. Vou comear pelas expresses, e deixar uma tabela
de operadores para o final deste captulo (visto que so bastante
poucos). Entretanto estes vo sendo usados nos prximos exemplos.

(ficheiro cpt2-2-1.asp)

<%
a= 10
b=100
if a < b then
response.write a menor que b
else
if a > b then
response.write a maior que b
end if
end if
%>

CAPTULO 2: EXPRESSES E OPERADORES 31


A expresso IF, foi aqui usada para que em conjunto com o operador
< , fizessem uma comparao. A mensagem que vai ser enviada
para o browser, depende dos valores a e b. O IF tem uma estrutura
simples:
IF (ALGO) THEN
(FAZ MAIS ALGO)
END IF
Ou quando as opes so vrias:
IF (ALGO) THEN
(FAZ ALGO)
END IF
IF (ALGO2) THEN
(FAZ ALGO2)
END IF
IF (ALGO3) THEN
(FAZ ALGO3)
END IF
Mas se as opes esto em cadeia, e se uma acontecer, as outras
tm de ficar anuladas. Teremos de usar a expresso ELSE:
IF (ALGO) THEN
(FAZ ALGO)
ELSE
IF (ALGO2) THEN
(FAZ ALGO2)
ELSE
IF (ALGO3) THEN
(FAZ ALGO3)
END IF
END IF
END IF
Este tipo de expresses d muito jeito aos programadores, mas
quando existem vrias opes em cadeia, eu sugiro que se use a
expresso CASE; fica melhor organizado, e as confuses dentro do
cdigo so bastante menores. Estas pequenas regras que vou escrevendo neste manual, no so propriamente para serem seguidas religiosamente. Se calhar o leitor nem vai ter muitos problemas,
mas quando o cdigo comea a ficar muito extenso, o programa
tende a ficar confuso. Notar isso se l voltar ao fim de uns meses
para fazer manuteno (muito comum em sites na Internet).

32 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES

2.3 FOR, WHILE, CASE


As expresses de repetio, usadas pelas ASP, so conhecidas de
qualquer programador, no sendo por isso algo que precise de uma
especial ateno para as tentar perceber.

(ficheiro cpt2-3-1.asp)

<%
a= 4
b=12
if a < b then comparao entre dois valores
for I=0 to a ciclo FOR
response.write a( & a & ) maior que & I & <br>
o smbolo <br> em HTML simboliza mudana de linha
no mesmo pargrafo
next I final de ciclo FOR
else
if a>b then
I=a
While b<I ciclo WHILE
Response.write b( & b & ) menor que & I & <br>
I=I1
wend final de ciclo WHILE
end if
end if
%>

Neste caso aproveitei cdigo de um exemplo inteiro, para lhe dar


mais umas linhas com este ciclo WHILE. Inicialmente faz-se a primeira comparao, que se repetir enquanto a mesma for vlida.
Neste caso enquanto b for menor que I, o ciclo (loop) vai sendo concretizado.
A minha expresso de repetio favorita, a CASE, muito flexvel e
rpida. Por mais tarde que eu volte a mexer no cdigo, fico a sempre
perceber o que l se passa em minutos.

CAPTULO 2: EXPRESSES E OPERADORES 33


(ficheiro cpt2-3-2.asp)

<%
resposta = 4
Select case resposta
case 1 response.write No & resposta
case 2 response.write No & resposta
case 3 response.write Acertou & resposta
case 4 response.write No & resposta
case else response.writeDesconhecido.
end select
%>
Neste case a comparao feita por hipteses em funo de uma
resposta (varivel resposta), tendo-se ateno mesma, iremos fazer uma comparao com as hipteses possveis (1, 2, 3 e 4 so as
nicas possveis) e executar a declarao correspondente (se acertou ou se no acertou).

(ficheiro cpt2-3-3.asp)

<CENTER><TABLE BORDER=1>
<% contador = 1
while contador<6%>
<TR>
<TD BGCOLOR=RED>
<FONT COLOR=WHITE><%=contador%></FONT></TD>
<TD><%=(contador-1)%></TD>
<TD><%=(contador+1)%></TD>
<TD><%=(contador*100)%></TD>
</TR>
<%
contador = contador + 1
wend
%>
</TABLE></CENTER>

Neste caso, fui usar novamente o WHILE, mas com o intuito do leitor perceber a potencialidade de trabalhar com tabelas - no final de
contas aquilo que mais vai usar se o destino que pretende dar aos
seus conhecimentos de ASP for a programao com bases de dados. Introduzindo o valor que se quer dentro de cada clula da tabela, o truque que origina, as grandes tabelas dos sites de comrcioelectrnico. Alm de texto, pode introduzir um novo esquema de tabelas e/ou imagens.

34 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES

Fig. 2.2 - Resultado do ficheiro cpt2-3-3.asp

(ficheiro cpt2-3-4.asp)

<% contador = 1
while contador<8
%><FONT face=ARIAL size=<%=contador%>>TESTE</FONT><BR>
<%contador=contador + 1
wend
%>

Neste caso, foi-se alterar uma opo das Tags de HTML, para que
no fosse preciso repetir a mesma 8 vezes. Este j um pensamento a seguir pelo programador de ASP - tentar evitar escrever
muitas linhas de cdigo, e sim optimizar ao mximo todas as funes que vier a criar.

Fig. 2.3 - Resultado do ficheiro cpt2-3-4.asp

CAPTULO 2: EXPRESSES E OPERADORES 35

2.4 Variveis
Nas ASP, as variveis so tambm, como no Visual Basic, dinmicas, no sendo por isso necessria a sua inicializao. Seja como
for, m programao usar variveis globais sem controlo sobre
as mesmas. Deve-se usar, mas no em excesso, assim como se
devem sempre inicializar as mesmas, no s para melhor controlo,
mas tambm para melhor performance. Para que no se desleixe
com as variveis, use o cdigo <% Option Explicit %> no incio de cada
pgina para que tenha de inicializar sempre as variveis. Assim, as
alocaes de memria, para as variveis dinmicas, sero feitas
com uma melhor estrutura, ficando por esse motivo beneficiado o
desempenho das suas pginas.

Para inicializar uma varivel em ASP basta usar Dim . Para criarmos a varivel xpto usamos ento <%Dim xpto%>

Temos nas ASP, alguns tipos de variveis a considerar:


- variveis usuais (usadas no momento, e que, como so
dinmicas, podem ser criadas a qualquer altura sem
inicializao das mesmas; podemos incluir os arrays neste grupo, que podem ser passados para as variveis de sesso).
Normalmente quando as inicializamos usamos a expresso
Dim varivel
- variveis Application (usadas como globais no site pois todos os utilizadores tm acesso mesma);
- variveis de sesso/Session (usadas para acompanharem
toda uma sesso de acesso por parte de um utilizador, mas s
acessveis por este, e no por todos como as de Application).

36 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES

2.5 Operadores
Apesar de j terem sido praticamente todos usados neste captulo,
vou ento deixar uma pequena tabela dos operadores, para referncia.
Os operadores de comparao e igualdade so os seguintes:
TIPO DE OPERADOR

DESCRIO

Igualar a

if a = b

c=d

<

Menor do que

if a < b

while c < x

>

Maior do que

if a > b

while c > x

<=

Menor ou igual do que

if a <= b

while c <= x

>=

Maior ou igual do que

if a >= b

while c >= x

<>

Diferente de

if a <> b

while c <> x

Estes so os operadores principais das ASP, e ser com estes que


iremos trabalhar ao longo deste manual. Estes operadores no sero usados nica e exclusivamente no cdigo de ASP, mas tambm
aquando do uso de declaraes de SQL.

CAPTULO 2: EXPRESSES E OPERADORES 37


Quando queremos fazer comparaes mltiplas podemos ento usar
AND ou OR, como nos seguintes casos:
(ficheiro cpt2-5-1.asp)

<% a = 10
b = 20
c = Teste
If a > 9 AND a <=20 then
Response.write (a) est entre 9 e 20 <br>
End if
%>

Nos operadores aritmticos temos ento uma outra tabela:


TIPO DE OPERADOR

DESCRIO

Usado para expoente,


(Para o caso de 26, temos
nas ASP , (2^6))

Multiplicador,
(2*5)

Diviso para retornar valor singular


(a / b)

Diviso inteira
(a \ b)

Soma
(a+b)
Este valor tambm funciona para
concatenao tal como o smbolo &

Diferena
(ab)

MOD

Resto da diviso
( a MOD b )

Podemos ento demonstrar todos os operadores aritmticos da tabela anterior, num ficheiro de ASP.

38 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES


(ficheiro cpt2-5-2.asp)

<%
a=2
b=8
c = 10
st1 =Desta maneira
st2 = tambm podemos concatenar strings.
Response.Write a = 2<br>
Response.Write b = 8<br>
Response.Write c = 10<br>
Response.write st1 = Desta maneira<br>
Response.write st2 = tambm podemos concatenar strings.<br>
Response.Write <br><br>
Response.Write - b^a -> & b^a & <br>
Response.Write - a*b -> & a*b & <br>
Response.Write - c/a -> & c/a & <br>
Response.Write - a\b -> & a\b & <br>
Response.Write - a-b -> & a-b & <br>
Response.Write - a+b -> & a+b & <br>
Response.Write - c MOD a -> & c MOD a & <br>
Response.Write - st1 + st2 -> & st1+st2 & <br>
%>
E para se perceber um pouco melhor o que est a acontecer neste
cdigo, pode recorrer seguinte imagem, que julgo responder a
qualquer dvida com que possa ter ficado.

Fig. 2.4 - Resultado do ficheiro cpt2-5-2.asp

Estes operadores so muito importantes na medida em que todo o


tipo de estatsticas, contas, comparaes e clculos extra os iro
requerer. No dia a dia, as empresas precisam de certas situaes
resolvidas que por vezes no tm soluo nas funes pr-definidas das ASP, e nessa altura ter de ser o leitor a desenvolver as
suas prprias funes, por meio destes operadores de base.

Funes

3.1 Tabela de funes base das ASP


3.2 As nossas funes
3.2.1 Exemplo: N dias at o ano 2001
3.2.2 Exemplo: Validar o e-mail
3.2.3 Exemplo: Criar uma ComboBox
a partir de um array
3.2.4 Exemplo: Criar um grfico em HTML
a partir de um array
3.3 Uso de SSI (Server Side Includes)
com as nossas funes
3.3.1 Exemplo: Uso de um ficheiro
externo com SSI
3.3.2 Exemplo: Ficheiro com todas
as funes
3.3.3 Exemplo: ASP que usa o ficheiro
com todas as funes

3
40

48
50
52
53

56
57
58

40 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES

3.1 Tabela de Funes base das ASP


Um dos aspectos que mais se destaca nas ASP so as suas
funes, e a facilidade de manuseamento das mesmas. Existem
funes que facilitam muito a vida a quem faz a programao de
vrios sites . A recursividade um dos pontos fortes quando
programamos, e as funes ajudam nesse aspecto.
A tabela seguinte, tal como a tabela de objectos que existe no prximo captulo, vo de encontro a tudo aquilo que este manual se refere - a programao de potentes sites interactivos e dinmicos. Ser
a partir deste captulo que o leitor se ir confrontar com exemplos
realmente essenciais para a programao do dia a dia de sites profissionais. Espero que estas tabelas vo de encontro s necessidades do leitor, que quer procurar rapidamente aquela funo ou objecto que necessita no momento em que est a programar. A tabela
est por ordem alfabtica para facilitar a procura de qualquer uma
das funes que possa ser necessria. As funes so da verso
2.00 das ASP, pertencente ao VBScript V4.

TABELA DE FUNES DAS ASP


Funo

Descrio

Abs()

Esta funo serve para devolver nmeros


absolutos, sejam eles de que tipo forem.
Ex.
variavel = Abs(23.34) devolve 23.34
variavel = Abs(-23.34) devolve 23.34

Array()

Os arrays servem para definirmos listas de


valores dentro de uma mesma varivel. So muito
usados para simplificar actos muito comuns em
programao, a todos os nveis. Um array
constitudo por vrios valores que esto
separados por uma posio. O array
variavel(Joo, 3, 1200, Sol), tem 4 posies. As
posies de um array comeam sempre do 0.
Para acedermos aos dados que esta tem, basta
indicarmos a posio que nos interessa.
Ex.
variavel(Joo, 3, 1200, Sol)
Response.write variavel(0) devolve Joo
Response.write variavel(1) devolve 3
Response.write variavel(3) devolve Sol

CAPTULO 3: FUNES 41
Asc()

Devolve o nmero ASCII de um caracter


Ex.
variavel1 = Asc(C) devolve 67
variavel2 = Asc(1) devolve 49

Atn()

Serve para calcular o arco-tangente de um valor


Ex.
Atn(1) devolve 0,785398163397448

CBool()

Retorna True ou False: False se a expresso for


falsa, caso contrrio True
Ex.
Cbool(32=32) devolve True
Cbool(10=32) devolve False

CByte()

Transforma qualquer valor (do tipo no Byte) para


o tipo Byte
Ex.
CByte(225.1278) devolve 225

CCur()

Idntico a CByte(), mas neste caso para


o tipo de moeda usado.

CDate()

Converte uma expresso que tende para uma


Data, numa Data validada, no sendo necessrio
usar IsDate()
Ex.
variavel1 = Cdate(Dezembro 1, 1990)
a varivel1 fica com uma data vlida

CDbl()

Converte um valor (do tipo no Double)


para o tipo Double

Chr()

Ao contrrio da funo Asc(), esta converte os


valores ASCII para o caracter correspondente
Ex.
Chr(67) devolve C
Chr(49) devolve 1

CInt()

Converte um valor (do tipo no Intenger)


para o tipo Integer

CLng()

Converte um valor (do tipo no Long)


para o tipo Long

Cos()

Devolve o coseno de um ngulo

42 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES


CreateObject() Cria uma referncia a um objecto externo
Ex.
Set Objecto=Server.CreateObject(Projecto.Objecto)
Csng()

Converte um valor (do tipo no Single)


para o tipo Single

CStr()

Converte um valor (do tipo no String)


para o tipo String
Ex.
CStr(123) devolve uma string 123

Date()

Devolve a Data corrente no servidor Internet


Ex.
response.write Date()

DateAdd()

Esta funo serve para o programador obter uma


data posterior ou anterior quela que pretende
usar para clculo.
Podemos querer saber qual o dia referente a 20
dias depois da data pretendida, ou 1 ms, ou 2
anos.
A expresso usa 3 campos, o primeiro para
introduzirmos o campo de data por onde queremos calcular a diferena, o segundo campo para
o valor numrico dessa diferena, e no final a data
de incio.
O campo do caracter que define o tipo de diferena aceita as seguintes opes:
h horas
n minutos
s segundos
yyyy anos
q quarto anual
m meses do ano
y dias do ano
d dias
w dias da semana
ww semanas do ano
Ex. DateAdd(m, 1, 31-Jan-2000) devolve 29-Fev-2000
DateAdd(d, 1, 31-Jan-2000) devolve 1-Fev-2000

DateDiff()

Devolve a diferena entre duas datas escolhendo


um dos campos de comparao explicados em
DateAdd()
Ex.
DateDiff(d, Now, 31-Jan-1999)
devolve a diferena entre a data de hoje
e o dia 31 de Janeiro de 1999

CAPTULO 3: FUNES 43
DatePart()

dada uma certa data e obtemos em que altura


do ano acontece usando os valores de campo de
DateAdd()
Ex.
DatePart(q, 31-Set-2000)
devolve o quarto do ano em que a data se aplica

DateSerial()

Devolve uma data para especificados ano,


ms e dia

DateValue()

Devolve uma data vlida daquela que pedida

Day()

Devolve o dia do ms de uma data


Ex. Day(31-Set-2000) devolve 31

Exp()

Devolve a exponencial de um valor

Filter()

Pesquisa um array, para procura de um


valor ou expresso
Ex. variavel1(Internet,Sites,Hosting,Portugal)
Filter(variavel1,Si) devolve Sites

Fix()
Devolve o inteiro de um qualquer valor
FormatCurrency()Transforma um valor normal numrico
para valor monetrio.
Ex. FormatCurrency(32420) devolve 32.420$00
FormatDateTime() Funciona como FormatCurrency()
mas para datas
FormatNumber() Formata um nmero da maneira que nos convm
FormatPercent() Devolve uma percentagem do universo que o
programador pretende
Ex. FormatPercent(23/230) devolve 10,00%
GetObject()

Devolve a referncia a um objecto

Hex()

Transforma um valor para resultado hexadecimal

Hour()

Devolve a hora de uma expresso


Ex. Hour(Now()) devolve a hora do momento

InStr()

Devolve a posio de uma string dentro


de outra a contar do incio
Ex. InStr(1,Hoje um bom dia para se
programar, ra) devolve 21

44 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES


InStrRev()

Devolve a posio de uma string dentro


de outra a contar do fim
Ex. InStr(1,Hoje um bom dia para
se programar, ma,35,0) devolve 33

IsArray()

Devolve True ou False em relao a uma varivel,


validando-a no caso de ser ou no um array

IsDate()

Devolve True ou False em relao a uma string,


validando-a no caso de esta ser do tipo Date ou no

IsEmpty()

Valida uma varivel, para ver se a mesma


est ou no vazia

IsNull()

Valida uma varivel para ver se a mesma


Null ou no

IsNumeric()

Valida uma string/valor para ver se o mesmo


numrico ou no

IsObject()

Valida um Objecto, certificando-se se o mesmo


o ou no

Join()

Junta todas as variveis dentro de um array,


criando uma s.
Ex.
variavel(0) = Hoje
variavel(0) = est
variavel(0) = bom
variavel(0) = tempo.
variavel2 = Join(variavel)
a variavel2 ficar igual a Hoje est bom tempo.

LBound()

Devolve o menor valor da dimenso de um array

LCase()

Devolve uma string em lower case


Ex.
LCase(Estamos em Setembro.)
devolve estamos em setembro.
Devolve um certo nmero de caracteres a contar
do lado esquerdo da string
Ex.
Left(Vamos programar ASP.,3)
devolve Vam

Left()

Len()

Devolve o tamanho de uma string


Ex.
Len(Vamos programar ASP.)
devolve 20

CAPTULO 3: FUNES 45
Log()

Devolve o logaritmo de um dado nmero

LTrim()

Devolve uma string sem espaos do lado esquerdo


Ex.
LTrim( Isto um teste.)
devolve Isto um teste.

Mid()

Serve para termos um nmero dado de


caracteres de uma string, a partir de uma dada
posio
Ex.
Mid(Vamos programar ASP., 7, 9 )
devolve programar

Minute()

Devolve o minuto de uma data/hora

Month()

Devolve o valor correspondente ao ms de uma


dada data
Ex.
Month(date())
devolve o valor do ms em que
estiver a testar o cdigo

MonthDate()

Devolve o nome do ms (por extenso)


Ex. MonthDate(10) devolve Outubro

Now()

Devolve a data e hora corrente

Oct()

Devolve o valor octal de um dado nmero

Replace()

Altera certo caracter/string por outro dado


Ex.
replace(yyXiiXppX22fXjX , X , P )
devolve yyPiiPppP22fPjP

RGB()

Devolve um valor representativo de uma cor. A


expresso estruturada por RGB(vermelho,
verde, azul)
Os valores usados vo de 0 a 255
Ex.
RGB(22,233,143)
devolve 9431318

Right()

Funciona como a funo Left() mas a


contar da direita

Rnd()

Retorna um valor aleatrio

Round()

Faz arredondamento a valores numricos


Ex.
Round(23,77) devolve 24

46 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES


Second()

Devolve os segundos de uma dada hora

Sgn()

Devolve o sinal de um valor


Ex.
Sgn(2) devolve 1
Sgn(-12) devolve 1
Sgn(0) devolve 0

Sin()

Devolve o seno de um ngulo indicado

Space()

Introduz um dado nmero de espaos numa string


Ex. response.write Teste & Space(12) & Feito
devolve Teste
Feito

Split()

Divide uma string num array, escolhendo o critrio


de separao
Ex. resultado = Split(IstoKKmaisKumKteste., K, -1, 1)
devolve ;
resultado(0) = Isto
resultado(1) =
resultado(2) = mais
resultado(3) = um
resultado(4) = teste.

Sqr()

Devolve a raiz quadrada de um valor

StrComp()

Compara duas strings, devolvendo um valor, no


que respeita se so iguais ou no.
A estrutura desta funo StrComp(var1,var2,tipo)
Var1 e var2 so duas strings escolha, o tipo
pode ser definido por 0 (comparao entre
binrios) ou 1 (comparao entre textos)
Ex.
var1 = Teste
var2 = TesTE
StrComp( var1, var2) devolve 1
StrComp( var1, var2, 0) devolve 1
StrComp( var1, var2, 1) devolve 0

StrReverse() Devolve uma string dada, invertendo-a


Ex.
StrReverse(123456) devolve 654321
String()

Devolve repetidamente um caracter escolhido


um nmero de vezes definido
Ex. String(C,10) devolve CCCCCCCCCC

Tan()

Devolve a tangente de um determinado nmero

CAPTULO 3: FUNES 47
Time()

Devolve a hora do sistema

TimeSerial()

Devolve uma hora para hora,


minuto e segundos especificados

TimeValue()

Devolve uma hora vlida daquela que pedida

TypeName()

Devolve o tipo de varivel que estamos a usar


Ex.
TypeName(ASP) devolve String
TypeName(12.40) devolve Double.
TypeName(NullVar) devolve Null
TypeName(ArrayVar) devolve Variant().
TypeName(6) devolve Integer

UBound()

Devolve o maior valor da dimenso de um array

Ucase()

Devolve uma string em upper case


Ex.
LCase(Estamos em Setembro.)
devolve ESTAMOS EM SETEMBRO.

VarType()

Parecido com TypeName(), mas devolve um valor


correspondente aos dados da varivel a validar.
Os nmeros possveis de resposta so:
0 Vazio
1 Null
2 Integer
3 Long
4 Single
5 Double
6 Currency
7 Date
8 String
9 Object
10 Error
11 Boolean
12 Variant
13 Data Access Object
(DAO)
17 Byte
8192 Array

WeekDay()

Devolve o dia da semana de uma dada data


Ex.
WeekDay (Outubro 10, 1999)
devolve 1 que representa Domingo

WeekDayName() Devolve por extenso o dia da semana de uma


dada data
Ex.
WeekDayName (1)
ou
WeekDayName(WeekDay (Outubro 10, 1999))
devolvem ambas as expresses domingo
Year()

Devolve o ano de uma dada data

48 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES


Apesar da existncia de um nmero considervel de funes nas
ASP estas vingam no pela quantidade das mesmas, mas sim, nos
objectos que existem. Com os objectos que as ASP disponibilizam,
o leitor poder criar potentes funes prprias, ou componentes para estas em Visual Basic.
Este assuntos sero abordados noutros captulos, mas que no tero nexo se o leitor no conhecer o funcionamento de procedimentos e funes em ASP, ou at mesmo o uso de ficheiros externos.
Neste captulo ainda no ir aprender como interagir com o utilizador,
mas sim tratar de todo o tipo de dados e/ou variveis que lhe podero aparecer.

3.2 As nossas Funes


O leitor tem acesso a todas as funes disponveis pelas ASP 2.00,
e a partir de agora pode definir as suas prprias funes. No esquecer que as ASP 3.00 vm com o Windows 2000 e o seu IIS5,
como indicado no primeiro captulo. Nos prximos casos as funes que vo ser criadas sero para situaes que por vezes aparecem na programao de sites Internet.
Neste primeiro exemplo criou-se uma funo que devolve o nmero
de dias que faltam at ao ano 2001 a partir de uma dada data.

(ficheiro cpt3-2-1.asp)

<%
Function a2001(data) incio da funo
If IsDate(data) then se for uma data for vlida
ento envia-se a diferena entre datas
a2001 = DateDiff(d,data,Janeiro 1, 2001")
else caso contrrio
enviamos a data como invlida, em forma de informao
a2001 = Data invlida...
end if final do if
End Function final da funo
Response.Write Hoje & now() & <br><br> escreve a data
corrente
escreve-se ento o resultado
Response.write Faltam & a2001(now()) & dias at ao ano 2001.
%>

CAPTULO 3: FUNES 49
Foram usadas as seguintes funes:
IsDate()
DateDiff()

Now()

para nos certificarmos se a dada data tinha


realmente um formato vlido de data;
que retorna o nmero de dias at ao ano 2001
(o nmero de dias pois isso que foi
estabelecido, aquando do campo d);
d-nos a data corrente, que inclui
as horas.

Como se viu, as funes tm uma estrutura prpria:


Function nome_da_funcao(variavel1, variavel2, variaveln)
.
Nome_da_funcao = resposta
End Function

Fig. 3.1 - Resultado do ficheiro cpt3-2-1.asp

A maneira de chamar uma funo simples, basta o uso do nome


da funo em qualquer ponto do cdigo.
No prximo exemplo pretende-se saber se um e-mail vlido. Desta
maneira o programa valida algo que perturba muitos programadores, para tentarem que o input dos utilizadores seja o mais correcto
possvel, e os e-mails introduzidos sejam o mais correctos.

50 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES


(ficheiro cpt3-2-2.asp)

<%
Function valmail(email) incio da funo
se o tamanho do e-mail for menor que 5 dificilmente ser vlido(a@a.c)
If Len(email) <= 5 Then
Valmail=False else
se no existir um @ tambm no vlido
If InStr(1, email, @, 1) < 2 Then
valmail=False
Else
o ponto final tambm importante
If InStr(1,email, ., 1) < 4 Then
Valmail=False
Else
Valmail=True
End If
End If
End If
End Function final da funo
if valmail(o_meu_email@algum_email.com) then
Response.WriteO e-mail o_meu_email@algum_email.com
vlido.<br>
Else
Response.WriteO e-mail o_meu_email@algum_email.com no
vlido.<br>
End if
if valmail(tentar@iludir) then
Response.Write O e-mail tentar@iludir vlido.<br>
Else
Response.Write O e-mail tentar@iludir no vlido.<br>
End if
%>
Foram usadas as seguintes funes:
Len()
retorna o tamanho de uma string, para
sabermos se tem o tamanho mnimo
pretendido para um e-mail normal
InStr()
muito usado para nos certificarmos da
existncia do smbolo @ ou de um ponto
final, sempre usado antes da extenso
do domnio.
O leitor tem assim, uma funo que lhe valida todos os e-mails que
receber como input.

CAPTULO 3: FUNES 51

Fig. 3.2 - Resultado do ficheiro cpt3-2-2.asp

Como se pode ver mais nitidamente na figura, os e-mails que foram


usados para testar foram validados correctamente, pelo menos dentro das regras que foram pr-definidas. O leitor pode alterar as regras para a validao do e-mail. Outro ponto que por vezes nos toca
referente criao dinmica de ComboBox. Estas caixas, usadas
em formulrios do HTML, tm um aspecto conhecido por todos os
programadores: carrega-se num boto que faz aparecer uma lista
com vrias opes. Neste exemplo ser criada uma funo para
criar essa caixa (ComboBox) a partir de um array. No captulo de
bases de dados, esta mesma funo alterada para se poder criar
com dados retirados de uma base de dados real.
Neste momento criada uma ComboBox. O cdigo HTML simples de se perceber. Em relao ao ciclo FOR, este vai-se repetindo
enquanto no chegar ao limite do tamanho do Array com a funo
Ubound().

52 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES


(ficheiro cpt3-2-3.asp)

<%@ Language=VBScript %>


<%
Function criacaixa()
%><select size=1" name=nome><%
For I=0 to UBound(ardados)
%>
<option><%=ardados(I)%></option>
<%
Next
%></select><%
End Function
Dim ardados(3) inicializao de array
Ardados(0)
Ardados(1)
Ardados(2)
Ardados(3)

= Alentejo
= Minho
= Algarve
= Beira-Litoral

%>
<form>
Viajar Para ? <%=criacaixa()%>
</form>
Foram usadas as seguintes funes:
UBound()
retorna o tamanho de um array, necessrio
neste caso para sabermos at que
ponto podemos ir com o ciclo FOR.

Fig. 3.3 - Resultado do ficheiro cpt3-2-3.asp

CAPTULO 3: FUNES 53
Como se pode ver, foi usada a linha <%@ Language=VBScript %>
que serve para o programador ter acesso mais facilitado ao cdigo
ASP, que conhecido como o VBScript do lado do servidor. O IIS
interpreta cdigo, e acaba por percorrer todas as linhas, quer tenham ASP ou no, se indicarmos no nicio do ficheiro de que se trata
de um ficheiro com VBScript, a sua performance ser melhorada,
mas no essencial o uso desta linha no nicio do cdigo.
Algo tambm muito comum so os grficos correspondentes a opinies, ou outros, para transmitir informao a partir dos dados em
bases de dados. No exemplo seguinte pode-se perceber o truque de
criar grficos em HTML, que servem para esse mesmo propsito. O
cdigo seguinte bastante explcito nesse ponto. O truque o de
controlar o tamanho das clulas das tabelas de HTML com os valores indicados pelo programa, que os pode aceder de qualquer lado,
mas neste exemplo indicados array a array.
(ficheiro cpt3-2-4.asp)

<%@ Language=VBScript %>


<%
Function criagrafico()
For I=0 to Ubound(ardados)
%>
<table border=0" width=100">
<tr><td><font face=ARIAL size=2">
<%= ardados(I,0)%></font></td></tr>
<tr><td><table bgcolor=blue border=1" width=<%=ardados(I,1)%>>
<tr><td>
</td></tr></table>
</td></tr></table>
<%
Next
End Function
Dim ardados(3,3)
Ardados(0,0) = Primeiro
ardados(0,1) = 100
ardados(1,0) = Segundo
ardados(1,1) = 40
ardados(2,0) = Terceiro
ardados(2,1) = 60
ardados(3,0) = Quarto
ardados(3,1) = 18
criagrafico()
%>

54 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES


Os grficos foram criados de uma maneira mais primria por assim dizer, pois existe a hiptese de se utilizar componentes comerciais que criam ficheiros de extenso GIF em tempo real com todo
o tipo de grficos que se podem encontrar, por exemplo, no Microsoft
Excel. Desta maneira, os grficos so de barras e muito mais rpidos a processar.

Fig. 3.4 - Resultado do ficheiro cpt3-2-4.asp

Como se pode ver pela imagem, o grfico coerente, e as barras


percebem-se bastante bem. O programador pode controlar melhor
o tamanho do grfico, pode usar imagens ou mesmo outras cores.
A imagem que podemos ver o resultado do grfico no Internet
Explorer (IE). No Netscape o resultado algo diferente, mas isso
tem a haver com a maneira como esse traduz o cdigo HTML em
relao s tabelas. Mas no resultado percebe-se sempre o mesmo,
por isso no existem problemas em usar este tipo de cdigo para
gerar grficos de barras.

3.3 Uso de SSI (Server Side Includes)


com as nossas funes
Os SSI, vo ser certamente algo que o leitor vai usar bastante, pois
alm de poder separar o cdigo HTML em vrios ficheiros, e estruturar
a pgina principal da maneira que lhe convm (dinamicamente), pode
ter algo como que uma biblioteca de funes prpria. Digamos que
o programador tem vrias funes que usa normalmente nos sites

CAPTULO 3: FUNES 55
que mantm, ou que repete bastante nas vrias pginas de um
mesmo site. Com os SSI, o programador introduz todas as funes
que quer num ficheiro, que por sua vez chamado no incio do cdigo ASP. A partir da todas as funes desse ficheiro esto acessveis na programao dessa pgina ASP. Devemos usar os SSI para
aquele tipo de cdigo que sabemos vai ser alterado em vrias pginas. Dessa maneira, bastar alterar uma vez, para que todas as
pginas fiquem actualizadas com o novo cdigo.
A maneira de se chamar um ficheiro dentro de um ASP (uso de
SSI), tenha ele parte de cdigo HTML, ou de ASP, <!#INCLUDE
FILE=ficheiro.inc> . Este cdigo introduzido no cdigo HTML,
e no no de ASP. Mas tem de estar num ficheiro de ASP e no no de
um de HTML - um pouco confuso! Vejamos ento os seguintes ficheiros, criados a partir de tudo aquilo que temos vindo a criar neste
captulo, e recorrendo ao uso de SSI (chamada de ficheiros exteriores para complementar a programao).
Vamos ento criar um ficheiro que tem o nosso topo de pgina HTML
por defeito. Esse ficheiro ficar com uma extenso diferente (*.inc)
para se poder diferenciar dos outros. Pode-se criar HMTL e ASP
nesse mesmo ficheiro.

(ficheiro cpt3-3-1.inc)

<div align=center>
<center>
<table border=0" width=80% bgcolor=#0000FF>
<tr>
<td width=100%><b><font face=Arial color=#FFFFFF>A
Listagem das minhas Funes:</font></b></td>
</tr>
</table>
</center>
</div>
<div align=right><%=FormatDateTime(Now(),2)%></div><br>

Foram usadas as seguintes funes:


FormatDateTime()
Now()

formata a data escolhida, neste caso


com um Formato de tipo 2;
usada para que seja formatada a
data corrente.

56 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES


Depois de criado um ficheiro para os topos de todas as pginas
ASP, criamos um ficheiro como exemplo para usar esse outro.
um ficheiro simples, que serve apenas para demonstrar as
potencialidades do uso de SSI.

(ficheiro cpt3-3-1.asp)

<!#INCLUDE FILE=cpt3-3-1.inc>
<p>
Aqui poder-se- escrever qualquer cdigo HTML,<br>
ou at mesmo de ASP.
</p>

Fig. 3.5 - Resultado do ficheiro cpt3-3-1.asp

Para perceber melhor a grande vantagem das SSI vamos criar um


ficheiro ASP com todas as funes que foram criadas neste captulo, e us-las todas na mesma pgina, sem termos de ter todo o
cdigo das funes na ASP que programamos.

CAPTULO 3: FUNES 57
(ficheiro cpt3-3-2.asp)

<%@ Language=VBScript %>


<%
Function a2001(data)
if IsDate(data) then
a2001 = DateDiff(d,data,Janeiro 1, 2001")
else
a2001 = Data invlida...
end if
End Function
Function valmail(email)
If Len(email) <= 5 Then
valmail=False
else
If InStr(1, email, @, 1) < 2 Then
valmail=False
Else
If InStr(1,email, ., 1) < 4 Then
valmail=False
else
valmail=True
End If
End If
End If
End Function
Function criacaixa()
%><select size=1" name=nome><%
For I=0 to UBound(ardados)
%>
<option><%=ardados(I)%></option>
<%
Next
%></select><%
End Function
Function criagrafico()
For I=0 to UBound(ardados2)
%>
<table border=0" width=100">
<tr><td><font face=ARIAL size=2"><%= ardados2(I,0)%></font></td></tr>
<tr><td><table bgcolor=blue border=1"
width=<%=ardados2(I,1)%>><tr><td></td></tr></table></td></tr></table>
<%
Next
End Function
%>

58 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES


Como foi visto o ficheiro cpt3-3-2.asp tem todas as funes criadas
neste captulo. Iremos inclu-lo com a potencialidade dos SSI numa
outra pgina que usaremos para demonstrar as funes. Foi alterado o nome de um dos arrays, para que no existissem conflitos
entre ambas as funes. De futuro, as funes recebem os
parmetros, para no nos preocuparmos com este tipo de situaes. Vemos ento no exemplo a seguir, introduzido atravs de SSI,
o ficheiro cpt-3-3-2.asp . Para as ASP como se todo aquele cdigo
estivesse presente no ficheiro, tomando todas as funes como locais. A partir deste momento podemos utilizar o ficheiro e todas as
suas funes.
(ficheiro cpt3-3-3.asp)

<!#INCLUDE FILE=cpt3-3-2.asp>
<!#INCLUDE FILE=cpt3-3-1.inc>
<p>
Iremos agora ver todos as funes do captulo a funcionar,<br>
e no precisamos de as ter neste ficheiro.<br>
Desta maneira temo-las em todos os ASP que quisermos sem termos de<br>
escrever o cdigo todo de novo, ou de passar o tempo<br>
no Copy & Paste...</p><br>
<%Response.Write Hoje & now() & <br>
Response.write Faltam & a2001(now()) & dias at ao ano
2001.<br><br>
if valmail(o_meu_email@algum_email.com) then
Response.Write O e-mail o_meu_email@algum_email.com
vlido.<br>
Else
Response.Write O e-mail o_meu_email@algum_email.com no
vlido.<br>
End if
if valmail(tentar@iludir) then
Response.Write O e-mail tentar@iludir vlido.<br>
Else
Response.Write O e-mail tentar@iludir no vlido.<br>
End if
Dim ardados(3) inicializao de array
Ardados(0) = Alentejo
ardados(1) = Minho
ardados(2) = Algarve
ardados(3) = Beira-Litoral
%>

CAPTULO 3: FUNES 59
<br><br><form id=form1 name=form1>
Viajar Para? <%=criacaixa()%>
</form><br>
<%
Dim ardados2(3,3)
Ardados2(0,0) = Primeiro
ardados2(0,1) = 100
ardados2(1,0) = Segundo
ardados2(1,1) = 40
ardados2(2,0) = Terceiro
ardados2(2,1) = 60
ardados2(3,0) = Quarto
ardados2(3,1) = 18
criagrafico()
%>
O resultado na imagem seguinte bastante explcito daquilo que se
pretendia. Temos todas as funes a funcionar, e podendo funcionar
em todos os ficheiros ASP que o programador tiver para o seu site,
com apenas a insero de uma linha de cdigo no topo de cada
pgina ASP.

Fig. 3.6 - Resultado do ficheiro cpt3-3-3.asp

Agora o leitor poder estender toda a sua programao num s ficheiro, pelo menos as funes que acha virem a ser aquelas que
mais vai utilizar.

Objectos

4.1 Tabela de Objectos

62

4.2 Variveis globais e de sesso

65

4.3 Interagir com o utilizador


4.3.1 Exemplo: Responder ao utilizador
com os dados recolhidos
4.3.2 Exemplo: Validar formulrio
4.3.3 Exemplo: Curso online
4.3.4 Exemplo: Proteco de pginas
com password

72
73
81
88

4.4 Ficheiro global.asa


4.4.1 Exemplo: Quantos utilizadores esto
a visitar a pgina
100
4.4.2 Exemplo: Chat em Browser
102
4.5 Cookies, dados do utilizador e do servidor
4.5.1 Exemplo: Recolher dados do utilizador105
4.5.2 Exemplo: Pginas personalizadas
107
4.6 Formatao de strings

108

62 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES

4.1 Tabela de Objectos


Os objectos que as ASP tm por defeito parecem ser poucos, mas
os seus mtodos so os suficientes para que o leitor consiga
alcanar os objectivos pretendidos para o seu site. A maneira de
usar os objectos bastante simples, e intuitiva, funcionando como
os objectos das outras linguagens.
TABELA DE OBJECTOS DAS ASP
Objectos

Mtodos e suas funes

Response

Redirect
usado para redireccionarmos o utilizador para
outra pgina. Usado normalmente para controlo
de utilizadores e acessos.
Cookies
mecanismo para deixar informaes do lado do
cliente com variada informao (dentro das
cookies existem outros mtodos para o seu
controlo, como veremos depois em pormenor).
Write
esta a maneira para enviar informao para o
browser.
CacheControl
desta maneira controlamos se a pgina pode
deixar que se faa cache da mesma nos
browsers (por defeito no deixa fazer cache).
Charset
uma maneira de definirmos o tipo de caracteres
a usar.
ContentType
para definir o tipo de informao que vai ser
passada, usado normalmente para UpLoad onde
definimos que queremos passar no s informao usual, mas tambm binria, originria de
ficheiros.

CAPTULO 4: OBJECTOS 63
Expires
uma maneira de definir o tempo que uma pgina
ficar activa e deixar de estar disponvel. Neste
caso definimos ao fim de quanto tempo expirar.
ExpireAbsolute
idntico ao Expires, com a diferena que se pode
controlar, no com o valor que define ao fim de
quanto tempo, mas sim com uma data que
define a altura em que deixa de estar disponvel.
IsClientConnected desta maneira controlamos se o cliente ainda est ligado.
Status
define o cdigo que est no HTTP header.
AddHeader
Ajusta dinamicamente a informao que est no
HTTP header.

Request

Cookies
neste caso ser usado para ir buscar os cookies
criados com o objecto response.
Querystring
desta maneira poderemos obter os valores que vm
da pgina anterior, depois de submetermos um
formulrio com o mtodo GET.
Form
este mtodo permite-nos obter os dados enviados
por um formulrio que esteja com o mtodo POST.
ServerVariables
usa-se muito este mtodo para identificar os tipos
de browsers que o cliente est a usar, os IPs do
mesmo, a pgina de onde o cliente veio, assim
como variadas informaes sobre o servidor que
est a ser usado.

64 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES


Server

HTMLEncode
o mtodo que formata a informao que o utilizador
insere. Esta formatao muito importante devido
a alguns smbolos serem reconhecidos pelo HTML,
e por esse motivo o layout pode no ter o aspecto
planeado
URLEncode
parecido com o HTMLEncode, mas formata a string
de maneira a ser vlida para usar na linha de
address dos browsers.
CreateObject
esta a maneira como iremos aceder a objectos
exteriores, assim como componentes criados por
ns ou outros. Os componentes de ASP so ficheiros de extenso DLL, especiais para os ASPs,
possveis com o VB ou o VC++ (Visual C++).
MapPath
com este mtodo que trabalharemos os nossos
ficheiros localmente (no servidor).

Session

Timeout
as sesses do servidor tm um limite, ao fim do
qual toda a informao contida nas sessions
desaparecem. Desta maneira poderemos
controlar o tempo que as sesses esto activas.
SessionID
este o mtodo que nos d o numero da sesso
do cliente corrente. So uma espcie de
impresso digital das sesses.
Abandon
fora a finalizao das sesses.

Application

A varivel global, mas idntica para todos os


utilizadores, ao contrrio das sessions que so
variveis do tipo global, mas s para o cliente que
est nessa sesso.

TextStream

CreateTextFile
mtodo de criao de ficheiros de texto.
OpentextFile
mtodo de leitura dos ficheiros de texto.

CAPTULO 4: OBJECTOS 65
A estrutura de um objecto e seu mtodo do tipo objecto.mtodo,
logo, para criar-mos, por exemplo, um cookie , usamos
response.cookies, e para obter o valor introduzido na cookie, usaremos ento request.cookies.
Depois de se ver esta tabela, muitas questes ficam no ar, em relao a vrios mtodos que aqui descrevemos. A sua grande maioria
vai ser aprofundada nos prximos captulos, mas iremos tratar alguns
deles ainda neste captulo, assim como desenvolver exemplos reais
de como usufruir ao mximo destes objectos.

4.2 Variveis globais e de sesso


As variveis globais/sesso, sero uma das hipteses que o programador ter para poder passar dados de base de uma pgina
para a outra. Normalmente quando se passa de uma pgina para
outra, as variveis da primeira pgina deixam de funcionar numa
segunda. A maneira de ultrapassar este obstculo usando os objectos Application e Session. Apesar de ambos os objectos serem
usados para variveis globais, cada um tem um objectivo diferente,
e um comportamento diferente dentro do contexto da programao
de pginas ASP. Para o leitor perceber como ambas funcionam explica-se ento como funciona o servidor de Internet que suporta as
ASP:
O servidor Internet faz um controlo de acessos s pginas que contm sob sua alada, e por isso cria um ID para cada acesso HTTP
que feito na mquina onde est instalado e a correr. Desta forma o
servidor consegue fazer uma estatstica mais pormenorizada, que a
grande maioria dos outros no conseguem. A partir do momento
que o programador tem acesso a este ID, poder seguir o rasto
(pormenorizado) daquilo que esse utilizador faz, dentro do site. O ID
de sesso, que pode aceder-se por session.sessionID, termina e
passa a ser outro a partir do momento que o browser desligado, ou
que passa o tempo limite de uma sesso, que se pode aceder por
session.TimeOut . Cada pessoa que est a aceder ao site tem um
ID diferente, assim como que cada sesso diferente, podendo o
programador usar as sesses, para passar de variveis de uma
pgina para outra, visto que a ligao apenas se quebra no desligar
do browser, ou no atingir do limite de tempo das sesses. Pode-se
ver pelo cdigo seguinte o ID de uma sesso e o tempo limite que
est por defeito no servidor.

66 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES


(ficheiro cpt4-2-1.asp)

<%
Response.Write O numero desta sesso & session.SessionID
Response.Write <br>O tempo de validade de uma sesso de
Response.write session.Timeout & minutos.
%>

Foram usadas os seguintes objectos:


Response.Write
Session.SessionID
Session.Timeout

objecto usado para escrita, tanto em


cookies, browser, headers, etc.
a maneira de saber qual o cdigo da
sesso no momento.
devolve o tempo de expirao das
sesses, definido no momento.

Fig. 4.1 - Resultado do ficheiro cpt4-2-1.asp

Podemos ento usar o objecto Session para passarmos todo o tipo


de variveis de uma pginas ASP para outra. Aqui ento est um
exemplo em que passamos uma string entre duas pginas. Ter em
ateno de que estas variveis ficam acessveis no s na pgina
que se corre em seguida, mas em todas aquelas que pertencerem
a esse site. Por isso se para chegar-mos a um ficheiro C comeando em A, tenhamos de passar por B, a sesso criada em A continua
activa.

CAPTULO 4: OBJECTOS 67
(ficheiro cpt4-2-2.asp)

<%
Response.Write <br>O tempo de validade de uma sesso de &
session.Timeout & minutos.
session.Timeout = 10
Response.Write <br> Depois de alterado passou a & session.Timeout
session(Teste) = Isto um teste
Response.Write <br>Entretanto foi criada uma varivel de sesso
Session(Teste),
Response.Write que contm a string & session(Teste) & .
%>
<br><br><a href=cpt4-2-3.asp>carregue aqui para passar prxima
pgina</a>

Foram usadas os seguintes objectos:


Session(Teste)
Session.TimeOut

a maneira de saber qual o cdigo da


sesso no momento;
neste ficheiro usmos este objecto
com este mtodo, de maneira a
alterarmos o tempo limite de uma
sesso.

A possibilidade de podermos alterar o tempo limite de uma sesso


muito importante, tanto para sites de proteco por password, como
para sites mais pesados, onde necessitamos de mais tempo, pois
uma pgina que demore muito tempo a abrir, ou a processar algo
bastante pesado, possa demorar mais de 1 minuto, e nessa altura a
sesso deveria ter um mnimo de 2 minutos. Aqui tambm pudemos
ver como possvel usar dentro de uma string, ou ento l criar
algo com os mesmos. Visto que as so usadas para conter strings,
e outro tipo de dados, o programador para as usar ter de criar uma
a mais por cada uma que l introduzir. Tal como est no ficheiro, que
vimos anteriormente.
No ficheiro cpt4-2-2.asp temos ento a possibilidade de ver como
se altera o objecto que controla o tempo das sesses, e como criar
uma sesso nossa, e l introduzir dados que queiramos estarem
acessveis em uma ou vrias pginas.
Este ficheiro vai chamar um outro (cpt4-2-3.asp) para que o leitor se
aperceba da maneira como foi possvel criar uma sesso prpria e
aceder mesma, a partir de outras pginas.

68 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES


(ficheiro cpt4-2-3.asp)

Podemos ver que a varivel de sesso trazida da pgina anterior


<strong><font face=ARIAL color=RED size=3><%=Session(Teste)%>
</font></strong>
Aqui nada de novo a no ser a maneira como foi acedida a sesso
criada no ficheiro anterior. No parece nada de especial mas de certeza que vai usar muitas vezes nas suas pginas ASP. Nos seminrios da Microsoft, os seus apresentadores aconselham sempre o
mnimo uso destas variveis, para que no atrapalhem a performance
do servidor Web. No aconselho que isto seja levado risca, mas
se estiver de posse de um servidor que tem uma mdia de 10.000
acessos dirios, a a recomendao da Microsoft deve ser levada
mais a srio. Caso contrrio, e por experincia prpria, no existem
motivos de preocupao se usar este tipo de variveis em excesso.

Fig. 4.2 - Resultado do ficheiro cpt4-2-2.asp

Fig. 4.3 - Resultado do ficheiro cpt4-2-3.asp

CAPTULO 4: OBJECTOS 69
As imagens so bem elucidativas em relao ao uso de uma sesso criada pelo programador. Da mesma maneira que criada uma
sesso para suportar uma string, o leitor poder usar para criar um
array ou nmero. As hipteses so imensas, e a programao a
este nvel bastante facilitada com este objecto.
Outro objecto que usado para tratar de variveis globais
Application, que criado e acessvel tal como se faz com as sesses, com a particularidade que para o alterarmos tem-se de seguir
certas regras.
A grande diferena entre Application e Session que enquanto as
variveis criadas pelo segundo so acedidas apenas pelo utilizador
do momento, ou por aquele a quem pertence um SessionID, as variveis Application so acedidas por todos os utilizadores, todos os
SessionID. Fica assim um esquema para o leitor perceber melhor
como isto funciona.

Fig. 4.4 - Funcionamento das variveis globais

Pelo esquema pode-se reparar que para cada utilizador existe uma
sesso independente, enquanto a varivel de Application igual para
todos.
Vemos ento um exemplo de como criar e aceder a uma varivel de
Application. Repare que existem dois mtodos Lock e UnLock para
que a mesma possa ser alterada. Para aceder mesma no necessrio usar as regras ditas anteriormente, e visveis no exemplo
seguinte:

70 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES


(ficheiro cpt4-2-4.asp)

<%
Application.Lock
Application(Teste2) = Uma varivel acessvel por todos os utilizadores...
Application.UnLock
Response.Write Avarivel Application(Teste2") >
Response.Write Application(Teste2) & <
%>

Foram usados os seguintes objectos:


Application.Lock

serve para trancar a varivel aos


utilizadores, de maneira a poder ser
alterada a varivel;
Application(Teste2) da mesma maneira que se usa as
Sessions, pode-se criar uma
varivel e aceder mesma;
Application.UnLock usado para depois que alterada a
varivel, tirando o Lock.

Fig. 4.5 - Resultado do ficheiro cpt4-2-4.asp

CAPTULO 4: OBJECTOS 71

4.3 Interagir com o utilizador


Aquilo que realmente faz a diferena entre as pginas estticas e as
pginas dinmicas a possibilidade de resposta aos utilizadores
em tempo real. Podem-se programar pginas que recebendo um
input de um utilizador, estas respondem de acordo com os dados
recolhidos, e isso no se pode fazer apenas com HMTL, e outros
recursos bsicos.
Para se recolher dados do utilizador necessrio criar uma estrutura que permite o utilizador inseri-los, de maneira que o programador
possa trabalhar com os mesmos. Em primeiro lugar criado um
formulrio HTML, que tanto pode estar numa simples pgina HTML,
como numa pgina ASP. O utilizador pode ter uma pgina HTML
com o formulrio que depois de submetido vai buscar um ficheiro
ASP, onde o programador pode recolher os dados e trabalhar sobre
eles. Ou ento o programador numa mesma pgina ASP controla o
input que feito, e conforme o estado em que o contexto se encontra, conforme a aco que accionada. Mas com os ficheiros de
exemplo seguintes, o leitor vai perceber as diferenas.

(ficheiro cpt4-3-1.html)

<form action=cpt4-3-1.asp method=POST>


Nome: <input type=text name=nome size=20"><br>
Idade: <input type=text name=idade size=2" Maxlength=2"><br>
Telefone: <input type=text name=telefone size=12" Maxlength=14"><br>
<input type=submit value=Enviar>
</form>

Foram usadas as seguintes Tags:


Application.Lock

serve para trancar a varivel aos


utilizadores, de maneira a poder ser
alterada a varivel;
Application(Teste2) da mesma maneira que se usa as
Sessions, pode-se criar uma
varivel e aceder mesma;
Application.UnLock usado para depois que alterada a
varivel, tirando o Lock.

72 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES


(ficheiro cpt4-3-1.asp)

O utilizador <strong>
<%=Request.Form(nome)%></strong>,
tem <strong><%=Request.Form(idade)%></strong> anos<br>
e est acessvel pelo nmero de telefone
<strong><%=Request.Form(telefone)%></strong> !
Foram usados os seguintes objectos e funes:
Request.Form(...)
mecanismo para ir buscar os dados
que vinham do formulrio anterior
onde estava o mtodo POST.

Fig. 4.6 - Resultado do ficheiro cpt4-3-1.html

Nesta primeira imagem vemos o formulrio em que o utilizador vai


introduzir os seus dados, e temos a imagem que mostra os dados
que o mesmo disponibilizou.

Fig. 4.7 - Resultado do ficheiro cpt4-3-1.asp

CAPTULO 4: OBJECTOS 73
(ficheiro cpt4-3-2.asp)

<%Sub usar_dados()%>
O utilizador <strong><%=Request.Form(nome)%></strong>,
tem <strong><%=Request.Form(idade)%></strong> anos<br>
e est acessvel pelo nmero de telefone
<strong><%=Request.Form(telefone)%></strong> !
<%End Sub%>
<%Sub formulario()%>
<form action=cpt4-3-2.asp method=POST id=form1 name=form1>
Nome: <input type=text name=nome size=20"><br>
Idade: <input type=text name=idade size=2" Maxlength=2"><br>
Telefone: <input type=text name=telefone size=12"
Maxlength=14"><br>
<input type=submit value=Enviar name=submeter>
</form>
<%End Sub%>
<%
if Request.Form(submeter)= then
formulario
else
usar_dados
end if
%>
Usando um s ficheiro ASP simulamos os dois ficheiros anteriores,
num s, poupando burocracia algortmica.

Fig. 4.8 - Resultado inicial do ficheiro cpt4-3-2.asp

74 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES

Fig. 4.9 - Resultado final do ficheiro cpt4-3-2.asp

Como se pode ver por estas duas ltimas imagens, o resultado o


mesmo, com a grande diferena que neste segundo exemplo usamos sempre o mesmo ficheiro. Isto pode ser bom para poupana
de recursos, mas para sites com muitos acessos pode dar os seus
problemas, visto que com muitos acessos deve-se separar o mal
pelas aldeias, e ter vrios ficheiros ASP a tratar dos dados.
J foi visto como criar um formulrio, como obter os dados a criados, como os mostrar no browser, mas, falta ainda, tratar os dados
e valid-los de forma aos mesmos preencherem os requisitos que
pretendemos para uma qualquer aplicao. Digamos que temos um
site que serve para simular uma atribuio de bolsa de estudo. Pretendemos o nome do aluno, a data de nascimento, a mdia do ltimo ano e o rendimento mensal dos pais. Vamos criar uma frmula
(de forma alguma a usada na realidade), onde todos os alunos online podem ficar a saber se vale a pena candidatarem-se ou no.
Vamos ento dizer ao aluno que tem hiptese ao candidatar-se num
dos seguintes casos:
- rendimento mensal dos pais menor ou igual a 80.000$00 e mdia
maior que 11 valores;

CAPTULO 4: OBJECTOS 75
- rendimento mensal entre 80.000$00 e 100.000$00 e mdia maior
que 13 valores;
- rendimento mensal entre 100.000$00 e 160.000$00 e mdia
maior que 16;
- mdia maior que 18;
- o aluno no pode ter menos de 10 anos e mais de 28.

No vamos aprofundar muito com questes das quantidades envolvidas, mas vamos ento pedir os dados necessrios para que possamos dizer se tem hiptese ou no no caso de se candidatar. Alm
de dizermos isso, vamos calcular a idade do aluno pela data de
nascimento. Desta forma o leitor perceber mais alguns pontos de
desenvolvimento ASP a este nvel e poderemos ento criar um
pequeno curso online que demonstra muito genericamente uma das
grandes potencialidades da Internet, a formao online.
Continuando ento, vamos criar o formulrio com as perguntas, e
no esquecendo os nomes de cada Tag de input, nomes esses que
sero os identificadores no uso do objecto request.
Vamos por partes, neste caso vamos estudar a estrutura a desenvolver. Separemos por partes o que vai ser feito:
- Formulrio de pedido de dados do aluno;
- Validao dos dados do aluno;
- Apresentao do resultado.

Estas 3 fases distintas podem ser feitas em 3 procedimentos diferentes. Criaremos um procedimento formulario(), dados_validar() e
resposta(). Ficamos assim com os 3 pontos definidos. Basta agora
criar o cdigo que os vai colocar em produo.
Comecemos pelo formulrio que vai pedir os dados ao utilizador:

76 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES

<%Sub formulario()%>
<p align=center><I><b>
<font size=4" color=#800000">Simulador de Bolsas de
Estudo</font></b></I>
<br>
<div align=center>
<center>
<FORM name=bolsa method=POST>
<table border=0" width=400" bgcolor=#CED299"><tr>
<td width=100% align=left>
<strong>
<font size=2" face=ARIAL color=RED>
<%=session(erro)%></font></strong>
<font face=Arial><b>Nome: </b></font>
<input type=text name=nome size=44"
value=<%=Request.Form(nome)%> maxlength=50">
<font face=Arial><b><br>Data de Nascimento:</b></font>
<input type=text name=dia size=2" value=<%=Request.Form(dia)%>
maxlength=2"><input type=text name=mes maxlength=2"
value=<%=Request.Form(mes)%> size=2">- 19
<input type=text name=ano size=2" maxlength=2"
value=<%=Request.Form(ano)%>><b>
<font face=Arial><br>Mdia do ltimo ano:</font></b>
<input type=text name=media value=<%=Request.Form(media)%>
size=2" maxlength=2">valores<b>
<font face=Arial><br>Rendimento mensal dos pais:</font></b>
<input type=text name=rendimento
value=<%=Request.Form(rendimento)%> maxlength=7" size=7">$00
<p align=center><input type=submit value=Simular
name=submeter><br></p>
</td>
</tr></table>
</FORM>
</center>
</div>
<%End Sub%>

CAPTULO 4: OBJECTOS 77

Fig. 4.10 - Resultado do formulrio do ficheiro cpt4-3-3.asp

Como o leitor deve ter reparado foram introduzidos como variveis


por defeito alguns Request.Form (), isto porque no queremos que
o utilizador perca os dados por cada vez que faa um erro ou que
queira voltar atrs, na sua simulao. Desta forma garantimos que
os dados esto sempre nos stios certos. No caso de se recomear
uma simulao, por defeito os Headers dos ficheiros HTML ficam
em branco espera de novo Submit do formulrio. A varivel
session(erro) serve para mostrar uma mensagem de aviso em
relao aos dados que foram introduzidos incorrectamente, que tentamos manter cada vez que tudo estiver validado e correcto, para
que quando se recomece o formulrio ainda l esteja essa mesma
mensagem.
Assim, com este cdigo, ficamos com um formulrio que alm de
receber input do utilizador, envia os dados para uma nova fase, que
a fase de validao.
Para validar-mos estes dados precisamos de os receber, e para
isso foi usado no cdigo inicial o seguinte cdigo:
nome = Request.Form(nome)
data = Request.Form(dia) & - & Request.Form(mes) & -19 &
Request.Form(ano)
media = Request.Form(media)
rendimento = Request.Form(rendimento)

78 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES


Este cdigo introduzido antes de se usarem os procedimentos
pois queremos que as variveis sejam dadas como variveis pblicas dentro deste ficheiro ASP. Desta forma, mais fcil tratar os
dados e escusamos de estar sempre a usar o cdigo Request.Form
(..), bastando assim apenas o nome que atribumos a cada um
dos argumentos que so passados. A varivel Data fica com uma
formatao diferente, pois queremos construir uma data real, para
que no uso da funo IsDate() disponhamos partida de algo semelhante para validao.
<%Sub dados_validar()%>
<%
session(erro) =
se no for data a varivel de sesso fica com o erro correspondente
if not(IsDate(data)) then
session(erro) = * A data est invlida...<br>
else
if (not(IsNumeric(media))OR ((media<0)OR(media>20))) then
session(erro) = * A mdia invlida...<br>
else
if not(IsNumeric(rendimento)) then
session(erro) = * O rendimento est invlido...<br>
end if
end if
end if
if session(erro)<> then
formulario
else
resposta
end if
%>
<%End Sub%>
Como se viu foram validadas todas as variveis que o formulrio
apanhou do utilizador, e validadas conforme aquilo que se pretendia:
a data validada como data e o rendimento e mdia do aluno como
nmeros, para que no sejam aceites letras ou outros caracteres
idnticos. E no final chamado o formulario() ou o procedimento
resposta(), conforme o que se pretende. No caso de existir algum
erro nas variveis que foram pedidas, o utilizador enviado novamente para o formulrio, que mantm os dados anteriores, visto que
os est sempre a apanhar com Request.Form(). Caso contrrio, e
visto que est tudo certo, o utilizador recebe a resposta em relao
sua simulao. Esta resposta dada a partir do cdigo que vemos
a seguir.

CAPTULO 4: OBJECTOS 79
<%Sub resposta()%>
<%session(erro) = %>
<div align=center>
<center>
<table border=0" width=400" bgcolor=#CED299">
<tr><td width=100% align=left>
<%idade = DateDiff(yyyy, data, Now)
if (idade>10 and idade<28) then%>
<p align=center><b><font color=#800000" face=Arial size=3"><br>
O Aluno</font>
<font face=Arial size=4" color=#FF0000"><%=nome%></font>
<font color=#800000" face=Arial size=3"> ,&nbsp;<br>com a mdia de </font>
<font face=Arial size=4" color=#FF0000"><%=media%></font>
<font color=#800000" face=Arial size=3">valores<br>nascido em </font>
<font face=Arial size=4" color=#FF0000"><%=data%></font>
<font color=#800000" face=Arial size=3"><br></font>
<font face=Arial size=4" color=#FF0000">
<% if ((rendimento<=80000)AND(media>11)) then
mensagem = tem
else
if ((rendimento>80000 AND rendimento<100000) AND
(media>13)) then
mensagem = tem
else
if ((rendimento>=100000 AND rendimento<160000) AND
(media>16)) then
mensagem = tem
else
if (media>18) then
mensagem = tem
else
mensagem = no tem
end if
end if
end if
end if
Response.Write mensagem%>
</font>
<font color=#800000" face=Arial size=3">direito<br> bolsa de
estudo.<br></font></b></p><br>
<%
else%>
<br><center><strong><font face=ARIAL color=red size=3'>
No possivel concorrer bolsa de estudo<br> com <%=idade%>
anos.</font></strong></center><br>
<%end if%>
</td></tr></table>
<br><br><a href=cpt4-3-3.asp>repetir a simulao</a>
</center>
</div>
<%End Sub%>

80 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES

Fig. 4.11 - Resultado de validao do ficheiro cpt4-3-3.asp

Na imagem anterior, obteve-se uma resposta do formulrio em relao mdia que o utilizador introduziu, que no sendo vlida, pede
para que seja corrigida. Este tipo de correco feito tambm para
outras variveis, e o procedimento em si o mesmo, mas com
mensagens de erro diferentes, correspondendo a cada uma das situaes de validao.

Fig. 4.12 - Resultado de resposta do ficheiro cpt4-3-3.asp

CAPTULO 4: OBJECTOS 81
Como podemos ver na imagem anterior, a resposta que se obteve
foi negativa, depois de se terem efectuadas as comparaes com
os requisitos definidos para a atribuio de bolsa ao estudante.
Teve-se o cuidado de se criar uma tabela com um texto de resposta
por defeito, que s altera as zonas que so correspondentes aos
dados que o utilizador introduziu. Neste caso usado o DateDiff (),
para que os alunos com uma idade no vlida para as bolsas sejam
avisados disso. No caso contrrio enviada a resposta em relao
ao apoio por Bolsa de Estudo.
Introduziu-se um link para o caso do utilizador querer recomear a
simulao. Ser aqui que tudo recomear, tendo em conta que a
varivel de sesso tem de estar vazia, ou o ltimo erro continuaria a
aparecer apesar de ser uma nova simulao. Por isso esta funo
comea com a sesso de erro a ser limpa, pois para se ter chegado
a este ponto era porque as variveis estavam correctas.
Depois desta explicao, podemos ver o cdigo por completo, para
percebermos melhor o seu funcionamento.

(ficheiro cpt4-3-3.asp)

<%Sub resposta()%>
<%session(erro) = %>
<div align=center>
<center>
<table border=0" width=400" bgcolor=#CED299">
<tr><td width=100% align=left>
<%idade = DateDiff(yyyy, data, Now)
if (idade>10 and idade<28) then%>
<p align=center><b><font color=#800000" face=Arial size=3"><br>
O Aluno</font>
<font face=Arial size=4" color=#FF0000"><%=nome%></font>
<font color=#800000" face=Arial size=3"> ,&nbsp;<br>com a mdia de </font>
<font face=Arial size=4" color=#FF0000"><%=media%></font>
<font color=#800000" face=Arial size=3">valores<br>nascido em </font>
<font face=Arial size=4" color=#FF0000"><%=data%></font>
<font color=#800000" face=Arial size=3"><br></font>
<font face=Arial size=4" color=#FF0000">
<% if ((rendimento<=80000)AND(media>11)) then
mensagem = tem
else
if ((rendimento>80000 AND

82 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES


rendimento<100000)AND(media>13)) then
mensagem = tem
else
if ((rendimento>=100000 AND
rendimento<160000)AND(media>16)) then
mensagem = tem
else
if (media>18) then
mensagem = tem
else
mensagem = no tem
end if
end if
end if
end if
Response.Write mensagem%>
</font>
<font color=#800000" face=Arial size=3">direito<br> bolsa de
estudo.<br></font></b></p><br>
<%
else%>
<br><center><strong><font face=ARIAL color=red size=3'>
No possvel concorrer bolsa de estudo<br> com <%=idade%>
anos.</font></strong></center><br>
<%end if%>
</td></tr></table>
<br><br><a href=cpt4-3-3.asp>repetir a simulao</a>
</center>
</div>
<%End Sub%>
<%Sub dados_validar()%>
<%
session(erro) =
if not(IsDate(data)) then
session(erro) = * A data est invlida...<br>
else
if (not(IsNumeric(media))OR ((media<0)OR(media>20))) then
session(erro) = * A mdia invlida...<br>
else
if not(IsNumeric(rendimento)) then
session(erro) = * O rendimento est invlido...<br>
end if
end if
end if

CAPTULO 4: OBJECTOS 83
if session(erro)<> then
formulario
else
resposta
end if
%>
<%End Sub%>
<%Sub formulario()%>
<p align=center><i><b><font size=4" color=#800000">Simulador de
Bolsas de Estudo</font></b></i>
<br>
<div align=center>
<center>
<FORM name=bolsa method=POST>
<table border=0" width=400" bgcolor=#CED299"><tr>
<td width=100% align=left>
<strong><font size=2" face=ARIAL color=RED><%=session(erro)%>
</font></strong>
<font face=Arial><b>Nome: </b></font>
<input type=text name=nome size=44"
value=<%=Request.Form(nome)%> maxlength=50">
<font face=Arial><b><br>Data de Nascimento:</b></font>
<input type=text name=dia size=2" value=<%=Request.Form(dia)%>
maxlength=2"><input type=text name=mes maxlength=2"
value=<%=Request.Form(mes)%> size=2">- 19
<input type=text name=ano size=2" maxlength=2"
value=<%=Request.Form(ano)%>><b>
<font face=Arial><br>Mdia do ltimo ano:</font></b>
<input type=text name=media value=<%=Request.Form(media)%>
size=2" maxlength=2">valores<b>
<font face=Arial><br>Rendimento mensal dos pais:</font></b>
<input type=text name=rendimento
value=<%=Request.Form(rendimento)%> maxlength=7" size=7">$00
<p align=center><input type=submit value=Simular
name=submeter><br></p>
</td>
</tr></table>
</FORM>
</center>
</div>
<%End Sub%>

84 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES


<%
nome = Request.Form(nome)
data = Request.Form(dia) & - & Request.Form(mes) & -19 &
Request.Form(ano)
media = Request.Form(media)
rendimento = Request.Form(rendimento)
if (Request.Form(submeter)=) then
formulario
else
dados_validar
end if
%>

Foram usados os seguintes objectos e funes:


Session ()

usado neste caso para que tenhamos uma


varivel que guarde o tipo de erro que foi
achado nos dados introduzidos pelo
utilizador;
DateDiff ()
DateDiff (), assim como est explicado na
tabela de funes, serve para devolver uma
diferena entre duas datas, tanto em dias,
anos, minutos, . Neste caso usamos para
devolver os anos entre o dia de hoje, e a data
de nascimento introduzida pelo utilizador.
Esta varivel depois usada para sabermos
se o mesmo rene condies para poder
receber resposta da aplicao;
IsDate ()
O IsDate, devolve True ou False, conforme
a data indicada seja ou no uma data vlida;
IsNumeric () Como o IsDate, este tambm booleano, e
indica se a varivel numrica ou no;
Request.Form () Esta a maneira de o programa aceder aos
dados submetidos pelo ltimo formulrio.

No seguinte exemplo criado um curso online, bastante simples,


de resposta mltipla. Este exemplo importante, pois, caso o leitor
o compreenda ter uma boa noo das potencialidades das variveis de sesso, e passagem de parmetros entre vrios procedimentos.
Necessitamos claro, de perguntas, respectivas respostas, validao das respostas, e uma apresentao do resultado depois do teste.

CAPTULO 4: OBJECTOS 85
Definimos ento alguns procedimentos:
- Procedimentos de perguntas (onde teremos um formulrio de pergunta e respostas, que neste exemplo so 5, devido a serem 5 perguntas);
- Um procedimento, para enviar o total do teste, e respectiva mensagem de aprovao ou reprovao.
Todos os procedimentos de perguntas tero ento o aspecto do cdigo da seguinte tabela, mas com a diferena de que cada um tem
as suas perguntas e respostas, parte essa que ter de ser alterada.
<%Sub Pergunta1()%>
<%session(npergunta)=1%>
<div align=center>
<center>
<table border=0" width=500" bgcolor=#B8CFCF>
<tr>
<td width=100%><b><font face=Arial>Pergunta &gt; <i>1 / 5<br>
<br>
</i></font></b>
<FORM name=pergunta1" action=cpt4-3-4.asp method=POST>
<p>
<font face=Arial>Qual o cdigo para escrever no browser?</font></p>
<div align=center>
<center>
<table border=0" width=300">
<tr>
<td width=7% align=right><input type=radio value=resposta1"
name=pergunta1"></td>
<td width=93%><font face=Arial>Request.Write ()</font></td>
</tr>
<tr>
<td width=7% align=right><input type=radio value=resposta2"
name=pergunta1"></td>
<td width=93%><font face=Arial>Session(escrever)</font></td>
</tr>
<tr>
<td width=7% align=right><input type=radio value=resposta3"
name=pergunta1"></td>
<td width=93%><font face=Arial>Response.Write ()</font></td>
</tr>
<tr>
<td width=7% align=right><input type=radio value=resposta4"
checked name=pergunta1"></td>
<td width=93%><font face=Arial>No sei</font></td>
</tr>

86 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES


</table>
</center>
</div>
<p align=center><input type=submit value=Responder
name=submeter></p>
</FORM>&nbsp;
</td>
</tr>
</table>
</center>
</div>
<%End Sub%>
Podemos ver por este exemplo que o cdigo usado praticamente
HTML puro, com a excepo do uso de uma varivel de sesso que
serve para podermos controlar em que pergunta vai o teste, de maneira que o utilizador seja enviado para a pergunta seguinte, e no
final para o resultado do teste.

Fig. 4.13 - Pergunta do ficheiro cpt4-3-4.asp

Como se pode ver este um teste de ASP. O leitor pode fazer testes
de tudo o que quiser, e com o uso de bases de dados (a ver em
prximo captulo), pode criar vrios tipos de testes usando apenas
um procedimento para todos eles.
Ser ento num outro procedimento, depois de todas as perguntas
terem sido respondidas, que todas as variveis sero limpas, de
maneira a que se possa responder a um novo teste, ou tentar nova
sorte. Nesta fase, ser feita uma validao de todas as respostas e
incrementada uma varivel com o total de valores do teste - alterada
consoante a qualidade das respostas dadas.

CAPTULO 4: OBJECTOS 87
<%Sub total_respostas ( )%>
<%session(pergunta5) = Request.Form(pergunta5)
total = 0
if session(pergunta1) = resposta3 then total = total + 4
if session(pergunta2) = resposta2 then total = total + 6
if session(pergunta3) = resposta3 then total = total + 3
if session(pergunta4) = resposta1 then total = total + 2
if session(pergunta5) = resposta3 then total = total + 5
Response.Write <center><strong>Teve & total & valores neste
teste...<strong><br><br>
if total < 10 then
Response.Write <strong><font size=4' color=RED>REPROVADO
</font></strong>
Else
if (total > 10 AND total <= 11) then
Response.Write <strong><font size=4' color=BLUE>APROVADO
tangente...</font></strong>
Else
if (total >= 12 AND total < 17) then
Response.Write <strong><font size=4' color=BLUE>APROVADO
</font></strong>
Else
if (total >= 18 AND total<=20) then
Response.Write<strong><font size=4' color=BLUE>APROVADO
com distino!</font></strong>
end if
end if
end if
end if
%>
Como se pode observar, todas as variveis de sesso devolvem as
respostas, que conforme estejam certas ou no iro ser
determinantes no desenvolvimento da varivel local total, para a nota
final do teste online.
Observando todo o cdigo, teremos ento uma noo mais real daquilo que se pretende, pois com as primeiras linhas de cdigo se
pode perceber como todos os procedimentos so geridos.

Fig. 4.14

88 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES


(ficheiro cpt4-3-4.asp)

<%Sub Pergunta1()%>
<%session(npergunta)=1%>
<div align=center>
<center>
<table border=0" width=500" bgcolor=#B8CFCF>
<tr>
<td width=100%><b><font face=Arial>Pergunta &gt; <i>1 / 5<br>
<br>
</i></font></b>
<FORM name=pergunta1" action=cpt4-3-4.asp method=POST>
<p>
<font face=Arial>Qual o cdigo para escrever no browser?</font></p>
<div align=center>
<center>
<table border=0" width=300">
<tr>
<td width=7% align=right><input type=radio value=resposta1"
name=pergunta1"></td>
<td width=93%><font face=Arial>Request.Write ()</font></td>
</tr>
<tr>
<td width=7% align=right><input type=radio value=resposta2"
name=pergunta1"></td>
<td width=93%><font face=Arial>Session(escrever)</font></td>
</tr>
<tr>
<td width=7% align=right><input type=radio value=resposta3"
name=pergunta1"></td>
<td width=93%><font face=Arial>Response.Write ()</font></td>
</tr>
<tr>
<td width=7% align=right><input type=radio value=resposta4"
checked name=pergunta1"></td>
<td width=93%><font face=Arial>No sei</font></td>
</tr>
</table>
</center>
</div>
<p align=center><input type=submit value=Responder
name=submeter></p>
</FORM>&nbsp;
</td>
</tr>
</table>
</center>
</div>
<%End Sub%>

CAPTULO 4: OBJECTOS 89
<%Sub Pergunta2()%>
<%session(pergunta1) = Request.Form(pergunta1)
session(npergunta)=2%>
<div align=center>
<center>
<table border=0" width=500" bgcolor=#B8CFCF>
<tr>
<td width=100%><b><font face=Arial>Pergunta &gt; <i>2 / 5<br>
<br>
</i></font></b>
<FORM name=pergunta2" action=cpt4-3-4.asp method=POST>
<p>
<font face=Arial>Como se cria uma varivel global, acessvel
por<br>todos os utilizadores?</font></p>
<div align=center>
<center>
<table border=0" width=300">
<tr>
<td width=7% align=right><input type=radio value=resposta1"
name=pergunta2"></td>
<td width=93%><font face=Arial>Session ()</font></td>
</tr>
<tr>
<td width=7% align=right><input type=radio value=resposta2"
name=pergunta2"></td>
<td width=93%><font face=Arial>Application ()</font></td>
</tr>
<tr>
<td width=7% align=right><input type=radio value=resposta3"
name=pergunta2"></td>
<td width=93%><font face=Arial>x = 1</font></td>
</tr>
<tr>
<td width=7% align=right><input type=radio value=resposta4"
checked name=pergunta2"></td>
<td width=93%><font face=Arial>No sei</font></td>
</tr>
</table>
</center>
</div>
<p align=center><input type=submit value=Responder
name=submeter></p>
</FORM>&nbsp;
</td>
</tr>
</table>
</center>
</div>
<%End Sub%>

90 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES


<%Sub Pergunta3()%>
<%session(pergunta2) = Request.Form(pergunta2)
session(npergunta)=3%>
<div align=center>
<center>
<table border=0" width=500" bgcolor=#B8CFCF>
<tr>
<td width=100%><b><font face=Arial>Pergunta &gt; <i>3 / 5<br>
<br>
</i></font></b>
<FORM name=pergunta3" action=cpt4-3-4.asp method=POST>
<p>
<font face=Arial>Qual o servidor Internet para as ASP que
<br>usado no Windows NT?</font></p>
<div align=center>
<center>
<table border=0" width=300">
<tr>
<td width=7% align=right><input type=radio value=resposta1"
name=pergunta3"></td>
<td width=93%><font face=Arial>Personal Wide Server</font></td>
</tr>
<tr>
<td width=7% align=right><input type=radio value=resposta2"
name=pergunta3"></td>
<td width=93%><font face=Arial>Apache</font></td>
</tr>
<tr>
<td width=7% align=right><input type=radio value=resposta3"
name=pergunta3"></td>
<td width=93%><font face=Arial>Internet Information Server</font></td>
</tr>
<tr>
<td width=7% align=right><input type=radio value=resposta4"
checked name=pergunta3"></td>
<td width=93%><font face=Arial>No sei</font></td>
</tr>
</table>
</center>
</div>
<p align=center><input type=submit value=Responder
name=submeter></p>
</FORM>&nbsp;
</td>
</tr>
</table>
</center>
</div>
<%End Sub%>

CAPTULO 4: OBJECTOS 91
<%Sub Pergunta4()%>
<%session(pergunta3) = Request.Form(pergunta3)
session(npergunta)=4%>
<div align=center>
<center>
<table border=0" width=500" bgcolor=#B8CFCF>
<tr>
<td width=100%><b><font face=Arial>Pergunta &gt; <i>4 / 5<br>
<br>
</i></font></b>
<FORM name=pergunta4" action=cpt4-3-4.asp method=POST>
<p>
<font face=Arial>Qual a funo que devolve uma diferena entre
duas datas?</font></p>
<div align=center>
<center>
<table border=0" width=300">
<tr>
<td width=7% align=right><input type=radio value=resposta1"
name=pergunta4"></td>
<td width=93%><font face=Arial>DateDiff ()</font></td>
</tr>
<tr>
<td width=7% align=right><input type=radio value=resposta2"
name=pergunta4"></td>
<td width=93%><font face=Arial>IsDate ()</font></td>
</tr>
<tr>
<td width=7% align=right><input type=radio value=resposta3"
name=pergunta4"></td>
<td width=93%><font face=Arial>Date ()</font></td>
</tr>
<tr>
<td width=7% align=right><input type=radio value=resposta4"
checked name=pergunta4"></td>
<td width=93%><font face=Arial>No sei</font></td>
</tr>
</table>
</center>
</div>
<p align=center><input type=submit value=Responder
name=submeter></p>
</FORM>&nbsp;
</td>
</tr>
</table>
</center>
</div>
<%End Sub%>

92 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES


<%Sub Pergunta5()%>
<%session(pergunta4) = Request.Form(pergunta4)
session(npergunta)=5%>
<div align=center>
<center>
<table border=0" width=500" bgcolor=#B8CFCF>
<tr>
<td width=100%><b><font face=Arial>Pergunta &gt; <i>5 / 5<br>
<br>
</i></font></b>
<FORM name=pergunta5" action=cpt4-3-4.asp method=POST>
<p>
<font face=Arial>Como chama em ASP um procedimento chamado
procedimento1?</font></p>
<div align=center>
<center>
<table border=0" width=300">
<tr>
<td width=7% align=right><input type=radio value=resposta1"
name=pergunta5"></td>
<td width=93%><font face=Arial>get procedimento1</font></td>
</tr>
<tr>
<td width=7% align=right><input type=radio value=resposta2"
name=pergunta5"></td>
<td width=93%><font face=Arial>run procedimento1</font></td>
</tr>
<tr>
<td width=7% align=right><input type=radio value=resposta3"
name=pergunta5"></td>
<td width=93%><font face=Arial>procedimento1</font></td>
</tr>
<tr>
<td width=7% align=right><input type=radio value=resposta4"
checked name=pergunta5"></td>
<td width=93%><font face=Arial>No sei</font></td>
</tr>
</table>
</center>
</div>
<p align=center><input type=submit value=Responder
name=submeter></p>
</FORM>&nbsp;
</td>
</tr>
</table>
</center>
</div>
<%End Sub%>

CAPTULO 4: OBJECTOS 93
<%Sub total_respostas()%>
<%session(pergunta5) = Request.Form(pergunta5)
total = 0
if session(pergunta1) = resposta3 then total = total + 4
if session(pergunta2) = resposta2 then total = total + 6
if session(pergunta3) = resposta3 then total = total + 3
if session(pergunta4) = resposta1 then total = total + 2
if session(pergunta5) = resposta3 then total = total + 5
Response.Write <center><strong>Teve & total & valores neste
teste...<strong><br><br>
if total < 10 then
Response.Write <strong><font size=4' color=RED>REPROVADO</
font></strong>
Else
if (total > 10 AND total <= 11) then
Response.Write <strong><font size=4' color=BLUE>APROVADO
tangente...</font></strong>
Else
if (total >= 12 AND total < 17) then
Response.Write <strong><font size=4' color=BLUE>APROVADO
</font></strong>
Else
if (total >= 18 AND total<=20) then
Response.Write<strong><font size=4' color=BLUE>APROVADO
com distino!</font></strong>
end if
end if
end if
end if
%>
<br><br><center><a href=cpt4-3-4.asp>recomear</a></center>
<%session(pergunta1) =
session(pergunta2) =
session(pergunta3) =
session(pergunta4) =
session(pergunta5) =
session(npergunta) = 0%>
<%End Sub%>
<%
Select case session(npergunta)
case 1 Pergunta2
case 2 Pergunta3
case 3 Pergunta4
case 4 Pergunta5
case 5 total_respostas
case else Pergunta1
end select
%>

94 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES


Foram usados os seguintes objectos e funes:
Session ()
muito usado neste exemplo, este objecto
tem tanto o nmero da ltima pergunta, para
que possamos direccionar o utilizador para
a pergunta seguinte, como as respostas das
respectivas perguntas;
Request.Form () Tal como noutros exemplos, recebe os
valores que foram enviados por formulrio.
Para acabar esta parte do captulo, vamos ver como podemos proteger as nossas pginas ASP, de maneira a s serem acedidas depois de introduo de login e password, e controlando o tempo que
estes tm de activao. Parece algo que requer alguma programao mais avanada, mas ser o exemplo onde ter de ser escrito
um mnimo de cdigo de programao. Tudo o que o leitor tem de
criar um ficheiro, formulrio onde o utilizador ir introduzir o login e
a password, a mensagem de erro, e o envio para a pgina principal
do site protegido, que por sua vez, s pode ser acedido depois do
login e password serem validados.
Vamos ento dividir o ficheiro de entrada e validao de dados em 3
partes: a primeira parte ser aquela em que sero pedidos os dados
por intermdio de um formulrio, a segunda parte ser a zona onde
aparecer uma mensagem de erro, no caso de os dados estarem
errados, e a terceira a zona onde se controla qual dos procedimentos
executado.
Vamos ento ter de receber dados, que vamos introduzir em variveis de sesso, de maneira a que possamos ter os dados activos
durante o tempo que definirmos em Session.TimeOut Quando
reiniciamos a pgina e esses dados estiverem incorrectos, enviamos o utilizador para uma mensagem de erro, caso contrrio, ser
encaminhado para a primeira pgina protegida. As pginas protegidas devero ento ter apenas 3 linhas de cdigo, de maneira a compararmos o login e password que esto em variveis de sesso.
(ficheiro cpt4-3-5.asp)

<%Sub formulario%>
<FORM action=cpt4-3-5.asp?todo=in method=POST>
<div align=center>
<center>
<table border=1" width=250" bgcolor=#FFCCFF>
<tr>
<td width=100%>
<center><font size=4">Controlo de Acessos</font></center>
</center>
<div align=center>

CAPTULO 4: OBJECTOS 95
<table border=0" width=96%>
<tr>
<td width=50%>
<p align=right><font face=Arial>Login:</font></td>
<center><center>
<td width=50%><input type=text name=login size=8"></td>
</tr>
</center></center>
<tr>
<td width=50%>
<p align=right><font face=Arial>Password:</font></td>
<center><center>
<td width=50%><input type=password name=password
size=8"></td>
</tr>
</table><br><input type=submit name=submete
value=Submeter><br>
</center>
</div>
</td>
</tr>
</table>
</center>
</div>
</FORM>
<%End Sub%>
<%Sub erro%>
<center><br><br><br>
<font face=ARIAL color=RED size=6">ERRO, login e password errados...</font>
<br><br><a href=cpt4-3-5.asp>tente de novo</a></center>
<%End Sub%>
<%
session.Timeout = 4 o tempo que as sesses vo estar activas
session(login) = Request.Form(login) vamos buscar os ltimos dados de login
session(password) = Request.Form(password) e de password
if Request.Querystring(todo) = then se o argumento estiver todo limpo
vamos ao formulrio
formulario
else seno vamos ver o que tm as sesses no momento
if ((session(login)<>xpto and session(password)<>123") AND
Request.Querystring(todo)=in) then
erro neste caso o login e password no so validados
else
Response.Redirect(cpt4-3-5test.asp) aqui o utilizador
validado positivamente
end if
end if
%>

96 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES


Foram usados os seguintes objectos e funes:
Session ()
ter as variveis que simbolizam o login e
password. Estas sero comparadas no
incio de cada pgina protegida, de maneira
a assegurar se o utilizador est validado ou
no;
Session.Timeout () neste exemplo este mtodo usado
para definirmos o tempo em que as sesses
esto activas, ou seja, os minutos em que
as sesses esto activas, depois da
inactividade ocorrente no site.
Agora que vimos o cdigo que recebe e valida a entrada de um
utilizador vamos ver uma normal pgina ASP, que est protegida, a
qual s possvel ao utilizador aceder, se validada a sua entrada no
formulrio. No incio de todas as pginas ASP que queremos protegidas, fazemos uma comparao das variveis de sesso de maneira a sabermos se estas so vlidas ou no.
(ficheiro cpt4-3-5test.asp)

<%if ( session ( login ) <> xpto and session( password )<> 123 ) then
Response.Redirect(cpt4-3-5erro.asp)
end if%>
<center><br><br><br>
<font face=ARIAL color=BLUE size=6">Bem vindo a esta pgina...</font>
</center>
Como ficou demonstrado, simples a maneira de se poder proteger
pginas de um site. Alm deste caso, o utilizador pode fazer uma
conexo a uma base de dados, e usar apenas uma varivel de sesso que diz sim ou no, conforme seja validada ou no depois de
inquirida a base de dados.

4.4 Ficheiro Global.asa


Muitos programadores de ASP tm um certo receio de mexer neste
ficheiro, ou at mesmo de programar usando o mesmo. No h que
ter receio em mexer neste ficheiro, que acima de tudo uma
tecnologia importante para certas solues online, e que uma das
armas das ASP em relao a outras linguagens semelhantes. Quando entramos num site em servidor IIS existem 4 fases distintas que
vou identificar de maneira a poder continuar com o meu raciocnio:

CAPTULO 4: OBJECTOS 97
1. o primeiro utilizador entra e o servidor fica alerta;
2. o utilizador comea uma nova sesso, e essas sesses
que ele cria so as que utilizamos para variveis globais, e
para definir o tempo de aco das mesmas.
3. o utilizador sai do site e a sua sesso acaba;
4. o ltimo utilizador do site sai e o servidor Internet deixa
de estar alerta.
Depois de vistas estas 4 fases, posso agora demonstrar esta explicao do ponto de vista prtico.
O ficheiro Global.Asa, algo como que o controlador dos acessos
ao site que o programador criou, ou estiver a desenvolver. Este ficheiro tem apenas 4 funes distintas: a primeira aquela que
activada quando o site fica activo; a segunda activada por cada
vez que entra um utilizador; a terceira activada por cada vez que
sai um utilizador do site, e a quarta activada quando o site deixa de
ter utilizadores. Desta maneira, podemos criar cdigo dentro de cada
uma destas zonas para nosso benefcio. Por exemplo, o leitor quer
que seja introduzido num ficheiro de texto o endereo IP de cada
utilizador que entra no site. Basta escrever dentro da segunda funo
do ficheiro Global.Asa o cdigo que cria essa linha no ficheiro de
controlo, para ter a certeza que cada acesso registado. Ou se
quisermos saber quanto tempo cada utilizador passa em mdia no
site, basta criarmos um registo de tempo de entrada na segunda
funo, e um na terceira funo, e mais tarde fazermos DateDiff()
para sabermos a mdia que cada utilizador gasta no nosso site.
O esquema de um ficheiro Global.Asa o seguinte:
<SCRIPT LANGUAGE=VBScript RUNAT=Server>
Sub Application_OnStart
End Sub
Sub Session_OnStart
End Sub
Sub Session_OnEnd
End Sub
Sub Application_OnEnd
End Sub
</SCRIPT>

98 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES


Como podemos ver tem apenas 4 procedimentos que so percorridos em determinadas situaes.
Este ficheiro tem de estar localizado no directrio principal do site,
usando o esquema que temos vindo a seguir ficar em
c:\inetpub\wwwroot\livro\

Fig. 4.15 - Como deve estar configurado o nosso


directrio virtual, onde queremos ter o site

Fig. 4.16 - Directrio onde o ficheiro


global.asa tem de ficar em funo do
site virtual da imagem anterior

CAPTULO 4: OBJECTOS 99
Agora para testarmos a potencialidade deste ficheiro vamos saber
quantos utilizadores esto neste momento no nosso site. Para isso
basta criarmos uma varivel que se incrementa no procedimento
Session_OnStart(), e que se decrementa no Session_OnEnd(). Desta
maneira se estiverem 4 utilizadores ao mesmo tempo no site a varivel ser 4. Se um deles sair passar a ser 3 pois houve uma sesso que acabou. Da mesma maneira, por cada utilizador que entre
no site essa mesma varivel ir ser incrementada. Passando da
teoria prtica vamos ento editar o nosso ficheiro Global.Asa, que
suportar o controlo dos acessos ao site.
(ficheiro global.asa)

<SCRIPT LANGUAGE=VBScript RUNAT=Server>


Sub Application_OnStart
Session.Timeout = 3
Application.Lock
Application(utilizadores) = 0
Application.UnLock
End Sub
Sub Session_OnStart
Application.Lock
Application(utilizadores) = Application(utilizadores) + 1
Application.UnLock
End Sub
Sub Session_OnEnd
Application.Lock
Application(utilizadores) = Application(utilizadores) - 1
Application.UnLock
End Sub
Sub Application_OnEnd
End Sub
</SCRIPT>
Foram usados os seguintes objectos e funes:
Session.Timeout ()

onde se define o tempo que vai


durar cada sesso. Se o utilizador
ficar inactivo durante um certo
perodo de tempo (em minutos), a
funo Session.OnEnd() activa-se e
processa uma sada do site. Aqui va
mos definir esse tempo em minutos;

100 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES


Application.Lock ()

o mtodo usado para trancar a


varivel, de maneira que possa ser
alterada sem intervenes externas.
Um meio de proteco dos dados
que esto l includos;
Application (utilizadores)
desta maneira obtemos uma
varivel global, onde todos os
utilizadores tm acesso, de maneira
que todos podem aceder aos dados
relativos ao nmero de utilizadores
do site em questo;
Application.UnLock () neste mtodo destranca-se a
varivel depois da mesma ter sido
alterada.
Depois de termos este ficheiro no local certo e com o cdigo acima
descrito, est na hora de acedermos varivel de maneira a sabermos quantos utilizadores esto online. Para isso basta apenas uma
linha de cdigo ASP, dentro do HTML que o leitor achar apropriado
para a apresentao deste valor.
(ficheiro cpt4-3-6.asp)

<font face=ARIAL size=3">Existem neste momento</font>


<font face=ARIAL color=red
size=5"><%=Application(utilizadores)%></font>
<font face=ARIAL size=3"> utilizadores...</font><br>
Foram usados os seguintes objectos e funes:
Application () aqui usado para podermos escrever
no browser o nmero de utilizadores que
esto a navegar no nosso site.

Fig. 4.17 - Imagem do ficheiro cpt4-3-6.asp

CAPTULO 4: OBJECTOS 101


Como podemos ver nesta imagem, existem 4 utilizadores no site. O
leitor pode obter este valor abrindo vrias janelas no browser e entrar
neste mesmo site virtual.
Esta uma das formas de usar o global.asa para nosso benefcio.
Outra maneira tentar criar um chat para os utilizadores do site. O
truque est em criarmos vrias variveis do tipo Application() e ir
actualizando cada uma delas conforme a introduo de informao
por parte dos utilizadores. Ao entrar uma nova linha de texto actualizam-se as variveis, igualando a mais recente imediatamente anterior e assim consecutivamente. O ficheiro global.asa vai entrar aqui
novamente - ser onde as variveis vo ser inicializadas.
Neste exemplo teremos trs ficheiros: um para controlar os frames,
pois para este exemplo teremos de usar dois ficheiros em simultneo, outro onde se mostram as frases, com um auto-refresh de 8
segundos, e outro ainda para o formulrio de introduo de mensagens.

(ficheiro cpt4-3-7.html)

<HTML>
<HEAD><TITLE>Chat</TITLE></HEAD>
<frameset FRAMEBORDER=0" BORDER=false framespacing=0"
rows=90,60">
<FRAME SRC=cpt4-3-7top.asp SCROLLING=no>
<FRAME SRC=cpt4-3-7.asp SCROLLING=no>
</FRAMESET>
</HTML>
Os frames so uma tcnica para se conseguir no mesmo ecr
visualizar vrias pginas em simultneo. Usam-se muito em sites
muito complexos, e quando se pretende dar uma sensao de televiso com vrios botes para mudar de canal (neste caso para mudar
de local no site).
Nos frames, primeiro criamos a linha que define a espessura das
margens que separam as pginas, assim como os espaos, e tamanho de apresentao de cada uma das pginas.
<frameset FRAMEBORDER=0" BORDER=false framespacing=0"
rows=90,60">
Vamos ento configurar cada uma das pginas que vo ser criadas
para colocar o chat em funcionamento dentro do esquema de frames.
<FRAME SRC=cpt4-3-7top.asp SCROLLING=no>
<FRAME SRC=cpt4-3-7.asp SCROLLING=no>

102 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES


E acabamos por finalizar o cdigo HTML para a criao das frames.
A partir daqui vamos criar os ficheiros ASP que vo trabalhar com
as variveis que guardam os textos do chat. O primeiro ser aquele
que introduz a informao introduzida pelo utilizador para as variveis globais, que vo aparecer em todas as diferentes sesses, permitindo que todos os utilizadores vejam o que todos introduzem no
chat.
(ficheiro cpt4-3-7.asp)

<body bgcolor=BLACK>
<%
If not Request.Form(mensagem)= THEN
APPLICATION.LOCK
Application(linha18) = Application(linha17)
Application(linha17) = Application(linha16)
Application(linha16) = Application(linha15)
Application(linha15) = Application(linha14)
Application(linha14) = Application(linha13)
Application(linha13) = Application(linha12)
Application(linha12) = Application(linha11)
Application(linha11) = Application(linha10)
Application(linha10) = Application(linha9)
Application(linha9) = Application(linha8)
Application(linha8) = Application(linha7)
Application(linha7) = Application(linha6)
Application(linha6) = Application(linha5)
Application(linha5) = Application(linha4)
Application(linha4) = Application(linha3)
Application(linha3) = Application(linha2)
Application(linha2) = Application(linha1)
Application(linha1) = <B> & Request.Form(nick) & :</B> &
Request.Form(mensagem)
APPLICATION.UNLOCK
END IF
%>
<FORM NAME=chat ACTION=cpt4-3-7.asp METHOD=post >
<font size=3" color=white>Nick: </font>
<INPUT NAME=nick SIZE=10 maxlength=14"
value=<%=Request.Form(Nick)%>><br>
<font size=3" color=white>Mensagem: </font>
<INPUT NAME=mensagem SIZE=30 maxlength=72"><br>
<INPUT TYPE=submit value=Introduzir>
</FORM>
</body>

CAPTULO 4: OBJECTOS 103


Foram usados os seguintes objectos e funes:
Application ( linhan)
variveis que guardam todas
as mensagens que vo sendo
deixadas. Cada vez que uma nova
introduzida, todas se vo igualando
de maneira a andar uma casa para
cima.
Precisamos agora de um ficheiro que mostra os dados no ecr
(browser). Ser ento o prximo ficheiro que vai tratar dessa funo,
de reparar na Meta Tag usada (pelo HTML), para refrescar a pgina
por cada nmero de segundos escolhido pelo programador (neste
caso, 8 segundos).
(ficheiro cpt4-3-7top.asp)

<HTML>
<HEAD>
<META HTTP-EQUIV=REFRESH CONTENT=8;cpt4-3-7top.asp>
</HEAD>
<%=Application(linha18)%><BR>
<%=Application(linha17)%><BR>
<%=Application(linha16)%><BR>
<%=Application(linha15)%><BR>
<%=Application(linha14)%><BR>
<%=Application(linha13)%><BR>
<%=Application(linha12)%><BR>
<%=Application(linha11)%><BR>
<%=Application(linha10)%><BR>
<%=Application(linha9)%><BR>
<%=Application(linha8)%><BR>
<%=Application(linha7)%><BR>
<%=Application(linha6)%><BR>
<%=Application(linha5)%><BR>
<%=Application(linha4)%><BR>
<%=Application(linha3)%><BR>
<%=Application(linha2)%><BR>
<%=Application(linha1)%><BR>
</HTML>

O resultado aquele que podemos ver na seguinte imagem. A introduo no formulrio do anterior Nick usado serve para facilitar a
utilizao pois o utilizador, em princpio, estar sempre a usar o
mesmo Nick.

104 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES

Fig. 4.18 - Imagem geral do chat

O ficheiro global.asa oferece aos programadores um vasto conjunto


de possibilidades. No caso do nmero de utilizadores em simultneo, o programa pode alm de os contabilizar, guardar o valor num
ficheiro de texto ou numa base de dados, assim como todos os dados das mquinas dos mesmos. As opes so vrias, cabendo ao
programador conhecer o funcionamento deste ficheiro, e usufruir ao
mximo das suas potencialidades.

4.5 Cookies, dados do Utilizador


e do servidor
muito vulgar as empresas quererem controlar os acessos aos
seus sites, nomeadamente terem acesso ao IP das pessoas que os
visitam, os sites de onde vm, e at o tempo gasto nas pginas.
Normalmente a melhor maneira de recolher dados do lado do cliente
usando JavaScript, mas esta tecnologia est sempre dependente
da capacidade de interpretao dos browsers. As ASP tm uma alternativa para recolher este tipo de dados (apesar de no se conseguir todos os que se conseguem com JavaScript), que se usam
muito nestas ocasies. Essas alternativas ASP alm de recolherem
dados do lado do cliente, tambm disponibilizam dados do compu-

CAPTULO 4: OBJECTOS 105


tador que est a suportar a pgina, podendo o webmaster de um site
criar uma pgina protegida para conhecer os dados da sua mquina. Estas informaes so dadas como variveis especiais do servidor, e para acedermos a elas usamos o objecto ServerVariables().
Necessitamos ento de saber que tipo de variveis de servidor
existem para podermos tirar partido das mesmas. Para obtermos
todas as que podemos obter basta corrermos o seguinte cdigo ASP.
(ficheiro cpt4-3-8.asp)

<TABLE border=1" bordercolor=black cellspacing=0">


<TR><TD><B>Variveis</B></TD>
<TD><B>Conteudo</B></TD></TR>
<%For Each nome In Request.ServerVariables%>
<TR><TD><%=nome%></TD>
<TD><%=Request.ServerVariables(nome)%>
</TD></TR>
<%Next %>
</TABLE>
Foram usados os seguintes objectos e funes:
For Each / Next ()

Request.ServerVariables ()

Usamos esta expresso para


percorrermos todos os eventos
possveis com o objecto
ServerVariables;
devolve o contedo da informao
que pretendemos tanto do servidor
como do cliente.
Podemos pedir uma informao por
Request.ServerVariables(HTTP_COOKIE)
ou Request.ServerVariables(13).

Fig.4.19 - Resultado parcial do ficheiro cpt4-3-8.asp

106 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES


Este tipo de variveis vo permitir ultrapassar muitas lacunas a nvel
de programao de pginas dinmicas. Da mesma maneira que
nos servimos destas variveis para usarmos as potencialidades do
JavaScript, usamos tambm o mtodo Cookies para podermos usar
os mesmos em ASP.
As variveis de sesso resolvem muitos problemas na programao, mas o uso de cookies nunca deixa de ser uma realidade. Eles
so muito usados para adaptao de sites conforme o tipo de
utilizador. Os cookies so ficheiros criados no lado do utilizador para
guardarem variveis que o programa necessite de ter de cada mquina que visite o site. Vamos ver como as cookies funcionam, de
uma maneira que o leitor poder ficar com muitas ideias em relao
a solues vlidas para os sites que vai criar. Temos o exemplo de
alguns sites portugueses que do a hiptese ao utilizador de configurar os dados que aparecem na pgina inicial. Isto no seria possvel
sem o recurso a cookies, e o exemplo que vou demonstrar vai ser
usado para algo parecido. Pretende-se uma pgina onde o utilizador
configura alguns aspectos da mesma, e por cada vez que a for visitar essa configurao pessoal est activa. Isto tudo porque um ficheiro foi criado no computador do utilizador, com variveis l incorporadas criadas pela ASP, aquando das configuraes do prprio
utilizador.

(ficheiro cpt4-3-9.asp)

ol, no indiscrio mas ser que est a usar<br>


uma mquina com as seguintes configuraes:<br>
<%=Request.ServerVariables(HTTP_USER_AGENT)%><br>
J agora, o seu IP no ser
<%=Request.ServerVariables(REMOTE_ADDR)%> ?
<br><br>Obrigado pelas informaes...

Pelo cdigo anterior julgo que fica clara a maneira como se usam e
acedem s variveis do servidor
Os cookies tm alguns mtodos que vo ser explorados neste exemplo. Os cookies aqui criados foram feitos como se de objectos se
tratassem criando-se uma estrutura OCOOKIE que detm vrias
variveis. A este array de cookies vai-se acrescentar uma validade,
que definida em dias, usando-se (DATE + nmero de dias) para a
activar.

CAPTULO 4: OBJECTOS 107


(ficheiro cpt4-3-10.asp)

<%if Request.Form(alterar)<> then


Response.Cookies (OCOOKIE)(Titulo) = Request.Form(nome)
criar um cookie
Response.Cookies (OCOOKIE)(CorFundo) = Request.form(cor)
Response.Cookies (OCOOKIE).Expires = DATE + 10
definir o tempo de activao em dias
end if%>
<body bgcolor=<%= Request.Cookies (OCOOKIE)(CorFundo)%>>
Ol
<font FACE=ARIAL color=BROWN size=5"><%= Request.Cookies
(OCOOKIE)(Titulo)%></font> ...
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<div align=center>
<center>
<table border=3" width=350">
<tr>
<td width=100%>
<form method=POST>
<p>O seu nome: <input type=text name=nome size=20"></p>
<p>Cor de fundo: <select size=1" name=cor>
<option selected value=WHITE>Branco</option>
<option value=BLUE>Azul</option>
<option value=RED>Vermelho</option>
<option value=GREEN>Verde</option>
</select></p>
<p align=center><input type=submit value=alterar
name=alterar></p>
</form>
<p>&nbsp;</td>
</tr>
</table>
</center>
</div>
Foram usados os seguintes objectos e funes:
Response.Cookies (OCOOKIE) ter as variveis que
simbolizam o login e password. Estas sero
comparadas no incio de cada pgina
protegida, de maneira a assegurar se o
utilizador est validado ou no;

108 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES


Response.Cookies (OCOOKIE)() neste exemplo
este mtodo usado para definirmos nomes
de cookies em "2 grau" - podemos ter
vrias variveis associadas a um mesmo
cookie;
Response.Cookies (OCOOKIE).Expires Com o mtodo
Expires pode-se definir quando que o
cookie deixa de estar activo.

Fig. 4.20 - Resultado parcial do ficheiro cpt4-3-10.asp

As cookies tm alguns inconvenientes, pois qualquer utilizador mais


experiente pode aced-las e apagar aquilo que foi criado. Por isso,
no se recomenda muito o uso das mesmas para sites crticos.
Consideram-se sites crticos aqueles que movimentam dados de
muita importncia, e que tm uma aco determinante para os
utilizadores e para a prpria empresa proprietria do site.

4.6 Formatao de strings


Quando temos uma string normal querermos alter-la, pois o formato com que nos chega pode no ser o apropriado para os nossos
fins. Temos ento nessa altura que alterar (formatar) essa string de

CAPTULO 4: OBJECTOS 109


maneira a ficar no formato que mais nos convm. Existem vrios
tipos de formato. Vamos identificar alguns e depois experimentar
com uma pgina onde todos esto a funcionar. Podemos ento
formatar strings, nmeros e datas:

formatDateTime(12-01-1995 12:12:00,1)
Obtm-se assim uma data por extenso, onde at se inclui o dia da
semana. uma formatao til para quando queremos uma maior
descrio de uma data, para apresentar clculos, ou apenas para
pginas que suportam calendrios feitos em ASP.
Response.Write formatCurrency(12312321)
Podemos formatar um qualquer nmero para a nossa moeda. O
resultado do nmero em questo ser ento em escudos.
Response.Write FormatNumber(4231,22345553,5)
Quando precisamos de obter um nmero e temos de definir as casas decimais, podemos usar esta funo para essa mesma tarefa.
FormatPercent(15/67)
Esta funo muito til quando fazemos estatsticas num site, ou
quando temos um grfico, como por exemplo, de uma dada votao. Somam-se todos os votos, separam-se os que so referentes
a um assunto, e usamos esta funo para sabermos a que percentagem pertence esse assunto no universo.
Server.HTMLEncode(Hoje dia de praia, <font color=RED size=4'>
tu vais</font> ?)
J alguns sites tiveram problemas nos seus dados, como Livros de
Visitas, e fruns, devido s Tags de HTML, pois se os dados do
utilizador no forem controlados este pode alterar o funcionamento
do site, com dados abusivos, e no aceites. Para que no seja possvel ao utilizador escrever Tags de HMTL a funcionar no site, usamos este mtodo.
Server.URLEncode(http://www.joaovieira.com/)
Esta funo no muito usada, mas sempre que for preciso formatar
uma string, de maneira a ela servir como referncia para outro site,
que tem espaos no link ou outra formatao estranha, usa-se este
mtodo para se obter a string certa para esse efeito
Depois de revistos alguns tipos de formatao, vamos ento escrever o nosso ficheiro exemplo, para vermos tudo a funcionar. sempre a melhor maneira de perceber - experimentar, alterar valores ou
alterar algum cdigo.

110 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES


(ficheiro cpt4-3-11.asp)

str1 = 12-01-1995 12:12:00


Response.Write str1 & <strong>(no formatada)</strong><br>
Response.Write formatDateTime(str1,1) & (formatada com opo 1 de
FormatDateTime)<br><br>
str2 = 12-01-1995 12:12:00
Response.Write str2 & <strong>(no formatada)</strong><br>
Response.Write formatDateTime(str2,3) & (formatada com opo 3 de
FormatDateTime)<br><br>
str3 = 12312321
Response.Write str3 & <strong>(no formatada)</strong><br>
Response.Write formatCurrency(str3) & (formatada)<br><br>
str4 = 4231,22345553
Response.Write str4 & <strong>(no formatada)</strong><br>
Response.Write FormatNumber(str4,5) & (formatada com formatNumber
para 5 casas decimais)<br><br>
str5 = 15/67
Response.Write str5 & <strong>(no formatada)</strong><br>
Response.Write FormatPercent(15/67) & (formatada com Format
Percent)<br><br>
str6 = Hoje dia de praia, <font color=RED size=4'> tu vais</font> ?
Response.Write str6 & <strong>(no formatada)</strong><br>
Response.Write Server.HTMLEncode(str6) & (formatada com
Server.HTMLEncode)<br><br>
str7 = http://www.joaovieira.com/
Response.Write str7 & <strong>(no formatada)</strong><br>
Response.Write Server.URLEncode(str7) & (formatada com
Server.URLEncode)<br><br>
Foram usados os seguintes objectos e funes:
FormatDateTime () Servimo-nos desta funo para
formatar uma string que continha
uma data/hora;
FormatNumber ()
formatou-se um nmero com certas
casas decimais definidas na prpria
funo;
FormatPercent ()
obteve-se um valor que fez a
percentagem de um nmero
solitrio em relao soma de um
grupo de nmeros;

CAPTULO 4: OBJECTOS 111


Server.HTMLEncode ()
Server.URLEncode ()

formatou-se assim todo o


cdigo HTML;
obteve-se uma string vlida
de se usar num qualquer link de um
qualquer browser.??????

Fig. 4.21 - Resultado parcial do ficheiro cpt4-3-11.asp

E assim fica arrumado mais um captulo. Vimos que qualquer tipo


de formatao pode ser da maior importncia, pois os problemas de
validao, e no s, assim o exigem. Poderamos ter quase um livro
s para formatao de strings, nmeros, datas etc. Porque por vezes s queremos os minutos, ou s os segundos, ou as horas e
segundos, e depois calcular o maior, etc. Mas julgo que aqui ficam
as bases para o leitor se poder desenvolver neste assunto com maior
liberdade e criatividade.

Bases de dados

5.1 Bases de Dados / SQL

114

5.2 Construir uma base de dados


em Microsoft Access

117

5.3 Conexo base de dados

122

5.4 Inserir, apagar e actualizar dados


em bases de dados
5.4.1 Exemplo: Inserir dados
5.4.2 Exemplo: Eliminar dados
5.4.3 Exemplo: Actualizar dados

127
135
137

5.5 Apresentao de dados


5.5.1 Exemplo: Listar dados em tabela
5.5.2 Exemplo: Listar dados com imagens
5.5.3 Exemplo: Listar dados a pedido

142
144
146

5.6 Exemplos com bases de dados


5.6.1 Exemplo: Livro de Visitas
5.6.2 Exemplo: Sondagens de opinio

148
152

114 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES

5.1 Bases de dados


As bases de dados (BD) foram como que o grande impulsionador
da procura das ASP e outras linguagens relacionadas para a programao Internet. A grande vantagem destas linguagens a hiptese de se aceder a bases de dados, e, por conseguinte, disponibilizar
informao dinmica online. Desta maneira pode-se vender online,
ter revistas com informao online, abrir Bancos, Seguradoras, e
outros tipos de empreendimentos online. No vamos propriamente
ver como se abre o maior negcio do sculo (deixo isso para o leitor), mas poderemos ver como se processam algumas partes desses sistemas, e como solucionar certos problemas. O livro de visitas, muito procurado, pois todos gostamos de ter um no nosso site,
um exemplo de como podemos disponibilizar um servio interactivo
online sem precisar de muita manuteno. Um e-zine, jornal online,
mais um exemplo de como se podem criar pequenas comunidades dedicadas a um certo assunto.
Os sistemas de gesto de bases de dados (SGBD ou DBMS) a
utilizar com as ASP podem ser diversos. Tudo o que precisa de ter
os drivers (ficheiros para configurao do Windows, com software
externo) necessrios para se ligar via ODBC (sistema que faz uma
ponte entre bases de dados independentemente dos sistemas
operativos das mesmas). Os exemplos que vo ser demonstrados
neste livro so feitos em MSAccess, visto ser indiscutivelmente a
base de dados mais acessvel para Windows (para Linux teramos
outras solues tambm muito utilizadas). De referir que via ODBC
indiferente a base de dados em relao ao cdigo de programao,
visto que ser usado puro cdigo SQL para qualquer tipo de
interveno nos dados. O ODBC o sistema (que encontramos no
control panel) para criarmos uma ligao com qualquer tipo de BD
suportado pelo servidor (ou pelo menos referente aos drivers que
estiverem instalados).
Uma base de dados constituda por tabelas, algumas delas ligadas
entre si. Podemos, por exemplo, ter uma tabela de contactos
pessoais para guardar um cdigo identificador, nome, telefone e email.
Ficaria qualquer coisa do tipo:

TABELA: CONTACTOS
ID Nome Telefone EMail

CAPTULO 5: BASES DE DADOS 115


Mas s isto no chega. Precisamos de saber que tipo de campos
que vamos usar, e para isso teremos uma tabela onde definimos
alm do tipo, o tamanho disponvel para os dados:
TABELA: CONTACTOS
ID as number
Nome as varchar(50)
Telefone as varchar(14)
EMail as varchar(22)

Ficou assim criada uma tabela possvel de ser usada numa base de
dados. Vamos ento demonstrar esta mesma tabela mas com dados
j introduzidos depois de ter sido criada.

TABELA: CONTACTOS
ID as number Nome as varchar(50) Telefone as varchar(14) EMail as varchar(22)
1
2
3
4

Joo
Carlos
Rui
Pedro

219886675
324444332
234343444
332442433

Joao@joao.pt
Carlos@carlos.pt
Rui@rui.pt
Pedro@pedro.pt

Pode-se ver ento mais facilmente como se processa (teoricamente)


a criao de uma tabela em base de dados, e como ela comporta os
dados que lhe so fornecidos.
Agora, a maneira como estes dados so introduzidos, e como
podemos aceder aos mesmos, j requer uma linguagem prpria de
bases de dados. O SQL (Structured Query Language), criada no
incio dos anos 70 pela IBM, desde ento usada como standard
em todas as bases de dados relacionais at hoje criadas.
O SQL a linguagem padro para a definio, actualizao e
pesquisa de bases de dados. Qualquer linguagem de terceira ou
quarta gerao que trabalhe com bases de dados decerto que
embebe expresses de SQL, quer estejemos a falar de ambientes
de bases de dados MSAccess, Informix, SQLServer ou Oracle.
O SQL contm poucos comandos, o que faz que com alguma
experincia se possam fazer maravilhas.
O sistema simples: as ASP usam uma conexo ODBC, que por
sua vez est ligada a uma qualquer base de dados. As ASP usam o
ADO (ActiveX Data Objects) para que com uma conexo base de
dados possamos usufruir de vrias hipteses de como programar

116 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES


com as mesmas.
A estrutura base do SQL a seguinte:
SELECT [ DISTINCT | ALL] coluna1, coluna2,
FROM tabela WHERE (situao) GROUP BY
HAVING
UNION | INTERSECT (usar para mais de um SELECT)
ORDER BY (ordenar por coluna)

Neste caso apenas obtemos dados, e no alteramos os dados j


existentes. Para isso necessrio outro tipo de expresses. Por
exemplo, para inserir,
INSERT INTO tabela (coluna1, coluna2, )
VALUES (dados1, dados2, )

Para apagar os dados de uma tabela basta,


DELETE FROM tabela

Ou ento se apenas pretendermos eliminar um nico registo (linha),


DELETE FROM tabela WHERE coluna1 = dados1

Podemos tambm actualizar dados, e nesse caso escreveramos,


UPDATE FROM tabela SET coluna1 = novo_dado1
WHERE coluna2 = dado2

No caso da tabela anteriormente descrita, se o programador quiser


saber os dados de todas as pessoas que comeam com a letra J,
basta escrever a seguinte expresso SQL:
SELECT * FROM CONTACTOS WHERE nome like J%
As plicas so usadas sempre que se compara uma string. Para
valores numricos tal j no preciso. As datas por vezes
necessitam de #data# , como nas bases de dados da Microsoft.

CAPTULO 5: BASES DE DADOS 117


No caso de se querer introduzir um novo registo j ser necessrio
um manuseamento diferente dos dados; usaremos ento o comando
INSERT - outro comando standard do SQL.
INSERT INTO CONTACTOS (ID, nome, Telefone, E-Mail)
VALUES (5, Ricardo, 288889999, Ricardo@ricardo.pt)

A nossa tabela passar ento a ter a seguinte estrutura:

TABELA: CONTACTOS
ID as number Nome as varchar(50) Telefone as varchar(14) EMail as varchar(22)
1
2
3
4
5

Joo
Carlos
Rui
Pedro
Ricardo

219886675
324444332
234343444
332442433
288889999

Joao@joao.pt
Carlos@carlos.pt
Rui@rui.pt
Pedro@pedro.pt
Ricardo@ricardo.pt

Podemos, para nos ajudar, contar com os seguintes operadores


vlidos no SQL:
OPERADOR
=
>
<
<=
>=
<>

DESCRIO
Para igualar
Maior que
Menor que
Menor ou igual
Maior ou igual
Diferente

5.2 Construir uma base de dados


em MSAccess
Depois daquilo que foi visto inicialmente neste captulo, e olhando
para o que vai ser feito, o leitor pode pensar que quase no vale a
pena conhecer mais das expresses de SQL. um engano, pois
mais cedo ou mais tarde se o leitor no conhecer o essencial destas
expresses, o trabalho com as novas linguagens Internet decorrer
muito mais lento e menos vantajoso.

118 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES


Foi adoptado para este livro a base de dados Microsoft Access, pois
a mais acessvel de todas, mas indiferente aquando de uma
conexo via ODBC.
A ideia criar uma base de dados para contactos. O propsito no
propriamente a vantagem comercial, ou tcnica, mas sim um
exemplo perceptvel, para se usar nos exemplos de introduo ao
uso de bases de dados com ASP.
A estrutura da primeira tabela da base de dados a seguinte :
TABELA: CONTACTOS
ID
Auto-number
Nome
Text (50)
Idade
Number (Integer)
Telefone
Text (22)
Email
Text (32) / null
Data
Date / Time

A partir daqui temos a primeira anlise feita. Basta agora traduzir


isto para a base de dados MSAccess. Em Email temos null, pois
queremos que este campo possa aceitar valores nulos.
Em primeiro lugar iniciamos o programa de base de dados. O ecr
ter as opes para criarmos um novo ficheiro, ou usarmos um j
existente. Vamos escolher a opo para iniciarmos um novo ficheiro.

Fig. 5.1 - Escolha da criao de um novo


ficheiro para base de dados em MSAccess

CAPTULO 5: BASES DE DADOS 119


Depois de iniciarmos a opo anterior, fica ento a opo de escolhermos o local onde vai ficar o ficheiro, e qual o nome a dar ao
mesmo. Neste livro o ficheiro vai-se chamar livro.mdb

Fig.5.2 - Local onde fica o ficheiro e seu nome

A zona de trabalho do MSAccess aparece, e deparamo-nos com


uma pequena consola vazia, onde a opo mais visvel ser NEW
(dentro da zona de Tables, como ilustra a seguinte figura).

Fig.5.3 - Aspecto da consola de


manuteno e criao da base de dados

120 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES


Carregamos em NEW, e vamos escolher a opo Design View como
maneira esquemtica da criao da tabela que pretendemos para a
base de dados.

Fig. 5.4 - Escolha de esquema para


a criao da tabela CONTACTOS

Criamos ento a estrutura pretendida neste exerccio, da tabela


CONTACTOS. O esquema a criar como o que est na figura. No
h muito a explicar no funcionamento do MSAccess neste campo,
mas qualquer manual, ou site sobre este tipo de base de dados explica o que for necessrio. No esquecer de definir o campo EMAIL
a permitir aceitar valores nulos, pois nem todas as pessoas tm email. Para isto basta na parte debaixo do esquema de criao da
tabela, e no tab General, um YES no campo que diz Allow Zero Length.
Se o leitor no quiser ter problemas na programao, e para estar
mais vontade, pode repetir este passo para todos os campos
(excepto na chave primria, como bvio).

Fig. 5.5 - Esquema da tabela CONTACTOS no MSAccess

CAPTULO 5: BASES DE DADOS 121


Ao sair depois da criao do esquema da BD, ser pedido o nome
da tabela. Neste livro o nome adoptado para esta ser o de CONTACTOS. Para melhor percepo dos exemplos que iremos apresentar, ser melhor o leitor iniciado nas ASP, criar os ficheiros e
tabelas de acordo com este manual.

Fig. 5.6 - Escolha do nome a dar tabela CONTACTOS

Depois fica ento acessvel na consola do MSAccess a tabela que


foi ento criada. Ficamos assim com uma base de dados j algo
estruturada.

Fig. 5.7 - Tabela CONTACTOS acessvel


no MSAccess depois de criada

Normalmente, nas bases de dados empresariais, as tabelas so


criadas com comandos do tipo CREATE TABLE que s por si daria
para mais um captulo, por isso tambm a adopo do MSAccess,
que cria toda a estrutura depois de termos feito apenas alguns esquemas a nvel visual.

122 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES


Fica assim criada a primeira tabela da base de dados que nos vai
acompanhar no resto deste livro.

5.3 Conexo base de dados


Normalmente a conexo s bases de dados pelas ASP feito pelo
ADO, que por sua vez usa uma conexo ODBC. Esta conexo
feita sem se saber se a base de dados MSAccess ou no. O que
interessa que a mesma seja feita com sucesso. Vai-se criar a conexo via ODBC, mas vai ser exemplificado tambm uma maneira
de se conectar BD MSAccess sem ser necessrio o uso do ODBC,
ligao essa mais conhecida internacionalmente por DSNLess
Connection (visto que para o uso de ODBC a conexo processa-se
com DSN=).
Para ser feita esta conexo temos de saber onde temos o ficheiro da
BD, e o nome que achamos ser o mais fcil, ou acessvel para uso
dentro da programao ASP. Neste manual vai ser livrodsn
Primeiro o leitor vai ao Control Panel (Painel de Controlo) que pode
ser acedido a partir do Start (Iniciar), como demonstra a figura seguinte.

Fig. 5.8 - Atalho para a zona onde


se encontra o controlo de ODBC

Depois de a entrar, escolha o cone ODBC, entrando na sua consola

CAPTULO 5: BASES DE DADOS 123

Fig. 5.9 - Escolha do cone que simboliza


a entrada para a zona de controlo ODBC

Escolha nos Tabs superiores a opo System DSN, podendo ver as


ligaes que j esto criadas. O mais normal o leitor no ter
nenhuma, mas isso no problema pois o que interessa que aquela
que deseja criar fique l disponvel.

Fig. 5.10 - Zona onde se vai criar o identificador


da conexo ODBC para o uso da BD em ASP

124 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES


O leitor carrega em ADD, para inicializar o processo de criao da
conexo.

Fig. 5.11 - Escolha do tipo de BD, para conexo

Na imagem anterior o leitor poderia escolher em vez do MSAccess


outras BD, como por exemplo, Oracle, SQL Server, Informix ou mesmo um ficheiro de Excel. Neste exemplo vamos escolher o MSAccess,
mas caso a opo fosse outra seria nesta altura que deveria tomar
essa deciso, e depois ir criar a ligao com base num ficheiro diferente do MSAccess. A chamada que vai ser feita das ASP com queries
vai aceder a tabelas e colunas, independentemente da base de dados
em questo. No entanto, para utilizao de funes especiais no
conformes a norma ANSI do SQL, temos que ter conscincia que tal
pode no ser compatvel com outras bases de dados. Por exemplo,
no Oracle, pode-se usar to_char () e to_date (), mas no funcionam
noutras bases de dados.

Fig. 5.12 - Zona de criao da conexo BD

CAPTULO 5: BASES DE DADOS 125


Dentro da zona de criao da conexo, o programador vai ter de
seguir 2 passos importantes e nem por isso (ter em ateno a figura
anterior) muito complexos.
1 Criar um nome para aceder conexo, neste caso livrodsn
2 Carregar no boto SELECT e escolher o ficheiro da base de
dados, neste caso livro.mdb

Fig. 5.13 - Imagem da consola depois de criada a conexo

Depois destes passos, se aparecer livrodsn como na imagem anterior, a conexo est feita, e o leitor pode preparar-se para programar
em ASP com acesso BD.
A maneira mais usual de se conectar BD por via do DSN, onde se
indica neste caso o nome da conexo que foi criado livrodsn.
O primeiro passo ser criar um objecto de conexo BD,
Set Conn = Server.CreateObject(ADODB.Connection)
Depois deste passo vamos usar o mtodo open, prprio do objecto
que foi criado,
Conn.open DSN=livrodsn;
Desta maneira acabmos de fazer uma conexo BD. Tudo o que
agora preciso de uma maneira de podermos trabalhar os dados
referentes BD que est nessa conexo. Vamos ento usar o
RecordSet, mais um tipo de objectos, mas desta maneira, para o
controlo de dados.

126 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES


Podemos ento criar um objecto RecordSet com o seguinte cdigo,
Set rs = Server.CreateObject(ADODB.Recordset)

Depois das fases anteriores, tudo o que tem de fazer para controlar
a BD criar uma declarao de SQL e accionar a mesma, isto da
seguinte maneira,
SQLStmt = SELECT FROM
rs.Open SQLstmt,Conn,1,2

Desta maneira o leitor j fez uma procura na BD, apesar de no


fazer uma sada para o browser, mas isso ser visto nas prximas
linhas.
A estrutura completa para uma conexo BD, e fazer uma alterao
ou uma procura na mesma ficar da seguinte forma,
Set Conn = Server.CreateObject(ADODB.Connection)
Conn.open DSN=livrodsn;
Set rs = Server.CreateObject(ADODB.Recordset)
SQLStmt = SELECT FROM .. ORDER BY .. DESC
rs.Open SQLstmt,Conn,1,2

A declarao de SQL apenas um exemplo e no funciona como


est. Vamos ver exemplos vlidos j a seguir. Ou se possuir conhecimentos de SQL pode tentar aquilo que quiser (lembrar que neste
momento a BD est ainda vazia).
Outra maneira de nos conectarmos BD introduzindo o tipo de BD
na extenso da conexo e o local onde est a mesma,
conn = DRIVER={Microsoft Access Driver (*.mdb)};
conn = conn & DBQ= & Server.Mappath(./livro.mdb) & ;
Set rs = Server.CreateObject(ADODB.Recordset)
SQLStmt = Select * FROM contactos
rs.Open SQLStmt, conn, 2, 1
Neste caso a BD est no mesmo directrio e por isso na varivel
DBQ no foi preciso indicar a morada onde a mesma est.
Ficam assim vistas duas maneiras de nos conectarmos BD. Nor-

CAPTULO 5: BASES DE DADOS 127


malmente os sites de aluguer de espao fazem-se pagar por cada
conexo que feita por DSN, fazendo com que a maioria dos programadores opte por fazer uma conexo directa como no segundo caso
agora visto. O leitor ir optar por aquela que mais lhe convm, desde
que no se esquea que se mais tarde for mudada a BD pode ter de
alterar o cdigo em todos os ficheiros, o que com a ligao via DSN
j no seria preciso.

5.4 Inserir, apagar e actualizar dados


em base de dados
Vamos ento comear por ver como podemos inserir dados na BD,
e aproveitaremos para fazer inseres de duas maneiras diferentes.
Na primeira foramos no cdigo a insero dos dados, como podemos ver no exemplo seguinte:
(ficheiro cpt5-4-1.asp)

Set Conn = Server.CreateObject(ADODB.Connection)


Conn.open DSN=livrodsn;
Set rs = Server.CreateObject(ADODB.Recordset)
SQLStmt = INSERT INTO contactos (nome, idade, telefone, email, data)
SQLStmt = SQLStmt & VALUES(Bernardo Miguel, 12, 33242443,
bernardo@bernardo.pt, now())
rs.Open SQLstmt,Conn,1,2
Response.Write Introduzido com sucesso...

Foram usados os seguintes objectos/mtodos:


Server.CreateObject(ADODB.Connection) a maneira com
que criamos o objecto de conexo BD;
Server.CreateObject(ADODB.Recordset) criao do
recordset que nos permitir trabalhar com a
BD;
conn.Open DSN= serviu para abrir a BD com a
conexo via DSN, referente BD em
questo;
Rs.Open,,1,2 o 1 representa o tipo de cursor (pode ser
0 Forward Only, 1 KeySet, 2 Dynamic,
3 Static) , o 2 representa o tipo de Lock da
BD (1 Read-Only, 2 Pessimistic,
3 Optimistic, 4 Batch Optimistic).

128 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES


Podemos tambm criar um ficheiro ASP onde temos um formulrio
para introduo de dados por parte do utilizador, que depois validado e introduzido na BD.
Iremos ento criar alguns procedimentos para a execuo deste ficheiro de introduo de dados via formulrio.
Sub formulario_introducao%>
<div align=center>
<table bordercolor=black border=1" cellpadding=5" cellspacing=0">
<tr><td>
<form action=cpt5-4-2.asp?fazer=introduzir method=POST>
Nome: <input type=text name=nome
value=<%=Request.Form(nome)%> size=30"><br>
Idade: <input type=text name=idade
value=<%=Request.Form(idade)%> size=3"><br>
Telefone: <input type=text name=telefone
value=<%=Request.Form(telefone)%> size=12"><br>
E-Mail: <input type=text name=email
value=<%=Request.Form(email)%> size=22"><br>
<center><input type=submit value=Introduzir></center>
</form>
</td></tr></table></div>
<%End Sub%>

Assim fica criado o procedimento formulario_introducao, que o


interface de introduo de dados para o utilizador. De reparar que foi
introduzido o Request.Form(), para que cada vez que se tenha
de repetir a introduo de dados devido a um campo ser invlido, o
utilizador no tenha de introduzir tudo de novo.
O argumento para sabermos o que se vai seguir fazer (o argumento que vem da linha de comando do link quando se chama a pgina
pagina.asp?fazer=...), como podemos ver neste caso ficar
fazer=introduzir, que ao iniciarmos a pgina validaremos para saber o
que vai ser executado, para mostrar o formulrio ou receber e enviar
os dados introduzidos.
Depois da introduo dos dados, verificamos que os recebemos e
que queremos introduzir na BD, mas para isso temos de os validar
primeiro, pois certos campos tm de ter um certo nmero de caracteres, assim como o campo idade tem de ser numrico.

CAPTULO 5: BASES DE DADOS 129


Sub validar_dados()
if len(Request.Form(nome))>50 or len(Request.Form(nome))<3 then
Response.Write <center><font color=RED>O nome no pode
exceder os 50 caracteres, ou ter menos de 3.</font></center>
formulario_introducao
exit sub
else
if (len(Request.Form(idade))>3 or (not
isnumeric(Request.Form(idade)))) then
Response.Write <center><font color=RED>A idade no
vlida...</font></center>
formulario_introducao
exit sub
else
if len(Request.Form(telefone))>22 or
len(Request.Form(telefone))<6 then
Response.Write <center><font color=RED>O telefone excedeu
o nmero de caracteres, ou tem menos de 6.</font></center>
formulario_introducao
exit sub
else
if len(Request.Form(email))>32 then
Response.Write <center><font color=RED>O email
excedeu o nmero de caracteres.</font></center>
formulario_introducao
exit sub
end if
end if
end if
end if
introducao_dados
End Sub
Ao introduzirmos dados incorrectos este procedimento vai devolver
uma mensagem de erro

Fig. 5.14 - Aspecto do formulrio do ficheiro cpt5-4-2.asp,


com um campo em que se tentam introduzir dados invlidos

130 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES

Fig. 5.15 - Erro de validao do campo


idade do ficheiro cpt5-4-2.asp

Depois de tudo validado o utilizador poder repetir novamente, devido incluso de um link que d essa hiptese.

Fig. 5.16 - Mensagem de confirmao de


introduo de dados do ficheiro cpt5-4-2.asp

CAPTULO 5: BASES DE DADOS 131


Depois da validao, corremos o procedimento introducao_dados
que onde estar o cdigo de conexo e declarao SQL, necessrios para actuar na BD.
Sub introducao_dados()
Set Conn = Server.CreateObject(ADODB.Connection)
Conn.open DSN=livrodsn;
Set rs = Server.CreateObject(ADODB.Recordset)
SQLStmt = INSERT INTO contactos (nome, idade, telefone, email, data)
SQLStmt = SQLStmt & VALUES(&Request.Form(nome)&,
SQLStmt = SQLStmt & &Request.Form(idade)&,
SQLStmt = SQLStmt & &Request.Form(telefone)&,
SQLStmt = SQLStmt & &Request.Form(email)&,
SQLStmt = SQLStmt & now())
rs.Open SQLstmt,Conn,1,2
Response.Write <br><br><center>Acabou de ser introduzido um novo
contacto.<br><br>
Response.Write <a href=cpt5-4-2.asp>introduzir novo contacto</a>
</center>
End Sub
Depois da introduo dos dados, fica a nossa pgina completa. Note-se que toda a introduo de dados feita via SQL, para que no
futuro no tenha problemas de portar o cdigo para algum sistema
diferente. Usamos o Exit Sub, para que no corra logo a seguir
introduo dos dados, sendo nosso objectivo mostrar o texto de erro
e pedir novos dados puxando o formulrio novamente.
O resultado final da nossa pgina ento o seguinte:
(ficheiro cpt5-4-2.asp)

<%
Sub introducao_dados()
Set Conn = Server.CreateObject(ADODB.Connection)
Conn.open DSN=livrodsn;
Set rs = Server.CreateObject(ADODB.Recordset)
SQLStmt = INSERT INTO contactos (nome, idade, telefone, email, data)
SQLStmt = SQLStmt & VALUES(&Request.Form(nome)&,
SQLStmt = SQLStmt & &Request.Form(idade)&,
SQLStmt = SQLStmt & &Request.Form(telefone)&,
SQLStmt = SQLStmt & &Request.Form(email)&,
SQLStmt = SQLStmt & now())
rs.Open SQLstmt,Conn,1,2
Response.Write <br><br><center>Acabou de ser introduzido um novo
contacto.<br><br>

132 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES


Response.Write <a href=cpt5-4-2.asp>introduzir novo contacto</a>
</center>
End Sub
Sub validar_dados()
if len(Request.Form(nome))>50 or len(Request.Form(nome))<3 then
Response.Write <center><font color=RED>O nome no pode
exceder os 50 caracteres, ou ter menos de 3.</font></center>
formulario_introducao
exit sub
else
if (len(Request.Form(idade))>3 or (not
isnumeric(Request.Form(idade)))) then
Response.Write <center><font color=RED>A idade no
vlida...</font></center>
formulario_introducao
exit sub
else
if len(Request.Form(telefone))>22 or
len(Request.Form(telefone))<6 then
Response.Write <center><font color=RED>O telefone excedeu
o nmero de caracteres, ou tem menos de 6.</font></center>
formulario_introducao
exit sub
else
if len(Request.Form(email))>32 then
Response.Write <center><font color=RED>O email
excedeu o nmero de caracteres.</font></center>
formulario_introducao
exit sub
end if
end if
end if
end if
introducao_dados
End Sub
Sub formulario_introducao%>
<div align=center>
<table bordercolor=black border=1" cellpadding=5" cellspacing=0">
<tr><td>
<form action=cpt5-4-2.asp?fazer=introduzir method=POST>
Nome: <input type=text name=nome
value=<%=Request.Form(nome)%> size=30"><br>
Idade: <input type=text name=idade

CAPTULO 5: BASES DE DADOS 133


value=<%=Request.Form(idade)%> size=3"><br>
Telefone: <input type=text name=telefone
value=<%=Request.Form(telefone)%> size=12"><br>
E-Mail: <input type=text name=email
value=<%=Request.Form(email)%> size=22"><br>
<center><input type=submit value=Introduzir></center>
</form>
</td></tr></table></div>
<%End Sub%>
<%
if request.querystring(fazer) = introduzir then
validar_dados
else
formulario_introducao
end if
%>

O cdigo,
if request.querystring(fazer) = introduzir then
validar_dados
else
formulario_introducao
end if

serve para sabermos qual a aco a prosseguir, pois no nosso formulrio criamos o argumento fazer, para podermos controlar se
mostramos o formulrio ou se vamos actuar na BD, com dados j
introduzidos.
Agora, podemos deparar com uma situao em que o utilizador quer
apagar um contacto. Nesta altura necessrio disponibilizar uma
lista de contactos existentes, de maneira ao utilizador escolher aquele
que quer apagar. Uma das maneiras possveis (e a que vamos usar),
a de criar uma ComboBox com todos os nomes, e um boto de
apagar junto da mesma.
Primeiro precisamos de um procedimento onde temos o formulrio
que inclui a tal ComboBox e o boto para apagar.

134 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES


<%Sub formulario()
Set Conn = Server.CreateObject(ADODB.Connection)
Conn.open DSN=livrodsn;
Set rs = Server.CreateObject(ADODB.Recordset)
SQLStmt = SELECT * FROM contactos
rs.Open SQLstmt,Conn,1,2
%>
<FORM ACTION=cpt5-4-3.asp?fazer=apagar METHOD=POST>
<font face=ARIAL size=2">contactos na base de dados</font><br>
<SELECT NAME=contacto>
<OPTION selected> escolha </OPTION>
<%While Not rs.EOF
%>
<OPTION VALUE=<%= rs.Fields(ID) %>><%= rs.Fields(nome)%>
</OPTION>
<%rs.MoveNext
Wend
rs.close%>
</SELECT>
&nbsp;&nbsp;&nbsp;<INPUT type=submit value=Apagar>
</FORM>
<%End Sub%>
Verificar que na ComboBox a tag VALUE recebe o nmero do ID do
contacto, nmero esse que ser a referncia futura na declarao
de SQL, de forma a sabermos qual o contacto a eliminar.

Fig. 5.17 - Aspecto do formulrio do ficheiro cpt5-4-3.asp

CAPTULO 5: BASES DE DADOS 135


No procedimento para apagar, tudo o que se tem a fazer receber o
nmero (identificador) do contacto que pretende apagar, introduzir
esse valor na declarao de SQL, e executar a mesma. O contacto
fica ento apagado, devolvida uma mensagem ao utilizador que
diz que o processo foi executado com sucesso. Introduziu-se tambm um link para o caso de haver necessidade de se apagar mais
algum contacto.
<%Sub apagar_contacto%>
<%
Set Conn = Server.CreateObject(ADODB.Connection)
Conn.open DSN=livrodsn;
Set rs = Server.CreateObject(ADODB.Recordset)
SQLStmt = DELETE FROM contactos WHERE ID = &
Request.Form(contacto)
rs.Open SQLstmt,Conn,1,2
%>
<strong><font face=ARIAL size=3">O contacto escolhido foi apagado...
</font></strong><br>
<br><br><a href=cpt5-4-3.asp>continuar a apagar</a>
<%End Sub%>

Fig. 5.18 - Aspecto da resposta do ficheiro


cpt5-4-3.asp, depois do comando apagar

136 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES


O ficheiro com todo o cdigo fica ento com a seguinte estrutura:
(ficheiro cpt5-4-3.asp)

<%Sub formulario()
Set Conn = Server.CreateObject(ADODB.Connection)
Conn.open DSN=livrodsn;
Set rs = Server.CreateObject(ADODB.Recordset)
SQLStmt = SELECT * FROM contactos
rs.Open SQLstmt,Conn,1,2
%>
<FORM ACTION=cpt5-4-3.asp?fazer=apagar METHOD=POST>
<font face=ARIAL size=2">contactos na base de dados</font><br>
<SELECT NAME=contacto>
<OPTION selected> escolha </OPTION>
<%While Not rs.EOF
%>
<OPTION VALUE=<%= rs.Fields(ID) %>><%= rs.Fields(nome)%>
</OPTION>
<%rs.MoveNext
Wend
rs.close%>
</SELECT>
&nbsp;&nbsp;&nbsp;<INPUT type=submit value=Apagar>
</FORM>
<%End Sub%>
<%Sub apagar_contacto%>
<%
Set Conn = Server.CreateObject(ADODB.Connection)
Conn.open DSN=livrodsn;
Set rs = Server.CreateObject(ADODB.Recordset)
SQLStmt = DELETE FROM contactos WHERE ID = &
Request.Form(contacto)
rs.Open SQLstmt,Conn,1,2
%>
<strong><font face=ARIAL size=3">O contacto escolhido foi apagado...
</font></strong><br>
<br><br><a href=cpt5-4-3.asp>continuar a apagar</a>
<%End Sub%>
<%
if Request.querystring(fazer)=apagar then
apagar_contacto
else
formulario
end if
%>

CAPTULO 5: BASES DE DADOS 137


Ao criar e apagar dados em bases de dados, o utilizador comea ao
longo do tempo a necessitar de fazer actualizaes nos contactos,
como o e-mail e o nmero de telefone. por isso que aparece agora
o prximo ficheiro para actualizar dados j existentes. A frmula vai
ser um pouco a mesma que foi vista. Vamos ento ter a ComboBox,
s que nesta escolhemos o contacto, depois sero devolvidos os
dados desse, preparados para actualizao.
Foi usado um procedimento que j tinha sido criado aquando da
insero de novos contactos referimo-nos validao da informao. Vamos tambm usar o formulrio de apresentao e recepo
dos dados, criado anteriormente, ficando por fazer apenas o cdigo
de inicializao, e os procedimentos de alterao dos dados.
O esquema aqui vai mudar, na medida em que necessrio guardar a varivel que representa a identificao da linha da tabela a
alterar (o identificador a chave da tabela). Isto porque ser feita
uma escolha num formulrio. De seguida passamos para a zona
onde o utilizador poder alterar os dados do identificador escolhido
anteriormente, e no final faz-se uma execuo da alterao feita na
fase anterior, com uma declarao de UPDATE de SQL.
<%Sub alterar()
Set Conn = Server.CreateObject(ADODB.Connection)
Conn.open DSN=livrodsn;
Set rs = Server.CreateObject(ADODB.Recordset)
SQLStmt = SELECT * FROM contactos WHERE ID= &
session(contacto)
rs.Open SQLstmt,Conn,1,2%>
<div align=center>
<table bordercolor=black border=1" cellpadding=5" cellspacing=0">
<tr><td>
<form action=cpt5-4-4.asp?fazer=executar method=POST>
Nome : <input type=text name=nome value=<%=rs.Fields(nome)%>
size=30"><br>
Idade : <input type=text name=idade value=<%=rs.Fields(idade)%>
size=3"><br>
Telefone: <input type=text name=telefone
value=<%=rs.Fields(telefone)%> size=12"><br>
E-Mail: <input type=text name=email value=<%=rs.Fields(email)%>
size=22"><br>
<center><input type=submit value=Submeter Alterao></center>
</form>
</td></tr></table></div>
<%End Sub%>

138 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES


Repare-se que a maneira de obtermos o valor que vem na resposta
da execuo do SQL com rs.Fields(..) , ou seja,
recordset.Fields(nome_do_campo). Mais tarde o leitor ter de lidar
com estes dados um a um, pois a resposta de uma declarao pode
ser mltipla.
Desta maneira, os dados foram introduzidos nos campos certos no
formulrio, e o utilizador ter a hiptese de os alterar. A seguir, depois da submisso desses novos dados, preciso validar os mesmos, e se tudo estiver correcto, introduzi-los na BD, como no procedimento seguinte:
<%Sub executar_alterar%>
<%
Set Conn = Server.CreateObject(ADODB.Connection)
Conn.open DSN=livrodsn;
Set rs = Server.CreateObject(ADODB.Recordset)
SQLStmt = UPDATE contactos SET
SQLStmt = SQLStmt & nome = &Request.Form(nome)&,
SQLStmt = SQLStmt & idade = &Request.Form(idade)&,
SQLStmt = SQLStmt & telefone = &Request.Form(telefone)&,
SQLStmt = SQLStmt & email = &Request.Form(email)&
SQLStmt = SQLStmt & WHERE ID = & session(contacto)
rs.Open SQLstmt,Conn,1,2
%>
<strong><font face=ARIAL size=3">O contacto escolhido foi alterado...
</font></strong><br>
<br><br><a href=cpt5-4-4.asp>continuar a alterar</a>
<%End Sub%>

Toda a estrutura fica ento completa, da seguinte maneira:


(ficheiro cpt5-4-4.asp)

<%Sub formulario_principal()
Set Conn = Server.CreateObject(ADODB.Connection)
Conn.open DSN=livrodsn;
Set rs = Server.CreateObject(ADODB.Recordset)
SQLStmt = SELECT * FROM contactos
rs.Open SQLstmt,Conn,1,2%>
<FORM ACTION=cpt5-4-4.asp?fazer=alterar METHOD=POST>
<font face=ARIAL size=2">contactos na base de dados</font><br>
<SELECT NAME=contacto>
<OPTION selected> escolha </OPTION>
<%While Not rs.EOF%>

CAPTULO 5: BASES DE DADOS 139


<OPTION VALUE=<%= rs.Fields(ID) %>><%= rs.Fields(nome)%>
</OPTION>
<%rs.MoveNext
Wend
rs.close%>
</SELECT>
&nbsp;&nbsp;&nbsp;<INPUT type=submit value=Alterar>
</FORM>
<%End Sub%>
<%Sub executar_alterar%>
<%
Set Conn = Server.CreateObject(ADODB.Connection)
Conn.open DSN=livrodsn;
Set rs = Server.CreateObject(ADODB.Recordset)
SQLStmt = UPDATE contactos SET
SQLStmt = SQLStmt & nome = &Request.Form(nome)&,
SQLStmt = SQLStmt & idade = &Request.Form(idade)&,
SQLStmt = SQLStmt & telefone = &Request.Form(telefone)&,
SQLStmt = SQLStmt & email = &Request.Form(email)&
SQLStmt = SQLStmt & WHERE ID = & session(contacto)
rs.Open SQLstmt,Conn,1,2
%>
<strong><font face=ARIAL size=3">O contacto escolhido foi alterado...
</font></strong><br>
<br><br><a href=cpt5-4-4.asp>continuar a alterar</a>
<%End Sub%>
<%Sub validar_dados()
if len(Request.Form(nome))>50 or len(Request.Form(nome))<3 then
Response.Write <center><font color=RED>O nome no pode
exceder os 50 caracteres, ou ter menos de 3.</font></center>
Alterar
exit sub
else
if (len(Request.Form(idade))>3 or (not
isnumeric(Request.Form(idade)))) then
Response.Write <center><font color=RED>A idade no
vlida.</font></center>
Alterar
exit sub
else
if len(Request.Form(telefone))>22 or
len(Request.Form(telefone))<6 then
Response.Write <center><font color=RED>O telefone excedeu

140 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES


o nmero de caracteres, ou tem menos de 6.</font></center>
Alterar
exit sub
else
if len(Request.Form(email))>32 then
%>center><font color=RED>O email excedeu o nmero de
caracteres.</font></center><%
alterar
exit sub
end if
end if
end if
end if
executar_alterar
End Sub%>
<%Sub alterar()
Set Conn = Server.CreateObject(ADODB.Connection)
Conn.open DSN=livrodsn;
Set rs = Server.CreateObject(ADODB.Recordset)
SQLStmt = SELECT * FROM contactos WHERE ID= &
session(contacto)
rs.Open SQLstmt,Conn,1,2%>
<div align=center>
<table bordercolor=black border=1" cellpadding=5" cellspacing=0">
<tr><td>
<form action=cpt5-4-4.asp?fazer=executar method=POST>
Nome : <input type=text name=nome value=<%=rs.Fields(nome)%>
size=30"><br>
Idade : <input type=text name=idade value=<%=rs.Fields(idade)%>
size=3"><br>
Telefone : <input type=text name=telefone
value=<%=rs.Fields(telefone)%> size=12"><br>
E-Mail : <input type=text name=email value=<%=rs.Fields(email)%>
size=22"><br>
<center><input type=submit value=Submeter Alterao></center>
</form>
</td></tr></table></div>
<%End Sub%>
<%
if len(session(contacto)) = 0 and len(Request.Form(contacto))<>0 then
session(contacto) = Request.Form(contacto)
end if

CAPTULO 5: BASES DE DADOS 141


select case request.querystring(fazer)
case alterar alterar
case executar validar_dados
case else formulario_principal
end select%>

O cdigo,
if len(session(contacto)) = 0 and len(Request.Form(contacto))<>0 then
session(contacto) = Request.Form(contacto)
end if

usado para que o identificador do contacto seja guardado e esteja


disponvel durante as pginas, pois com ele que podemos localizar, nas declaraes de SQL, se o tamanho do mesmo vazio, e o
retorno do formulrio estiver preenchido. Vamos ento preencher a
varivel de sesso contacto, com o identificador que vem do formulrio.

Para controlarmos qual dos procedimentos a executar, alm de determinarmos a varivel argumento fazer, temos que depois buscar o
valor que esta detm, e correr o procedimento que se identifica com
esse comando, com o seguinte cdigo:
select case request.querystring(fazer)
case alterar alterar
case executar validar_dados
case else formulario_principal
end select

Ficam ento assim descritas as trs situaes que o leitor vai encontrar quando comear a trabalhar com as ASP: Introduzir, apagar
e actualizar dados em BD parece ser por vezes difcil mas isso s
se pode dizer depois de conhecidos os objectivos. Por vezes para
se actualizar uma tabela preciso percorrer outras, e o programa
ter de abrir vrios recordsets e por vezes vrias conexes, o que
ser mais trabalhoso, e pedir um esforo intelectual maior.

142 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES

5.5 Apresentao de dados


Podemos apresentar os dados de vrias maneiras mas normalmente
so usadas as tabelas de HMTL (tratadas no primeiro captulo deste
manual) para chegarmos a esse objectivo.
Alm da conexo BD, necessitaremos ento de executar declaraes de SQL, como j foi feito. A diferena aqui que vamos ter de
percorrer uma a uma e colocar os dados nos locais que nos convm.
O mtodo movenext, que funciona com o objecto recordset, o
passo a seguir por cada vez que queremos percorrer a resposta da
nossas declarao de SQL.
(ficheiro cpt5-5-1.asp)

<%
Set Conn = Server.CreateObject(ADODB.Connection)
Conn.open DSN=livrodsn;
Set rs = Server.CreateObject(ADODB.Recordset)
SQLStmt = SELECT * FROM contactos
rs.Open SQLstmt,Conn,1,2
%>
<table border=0" width=580" cellpadding=4" cellspacing=0">
<tr>
<td width=170"><b>Nome</b></td>
<td width=50" align=right><b>Idade</b></td>
<td width= align=right><b>Telefone</b></td>
<td width=><b>E-Mail</b></td>
</tr>
<% cor=99CCFF
while not rs.EOF%>
<tr>
<td bgcolor=#<%=cor%>><%=Rs.Fields(nome)%></td>
<td bgcolor=#<%=cor%> align=right><%=Rs.Fields(idade)%></td>
<td bgcolor=#<%=cor%>
align=right><%=Rs.Fields(telefone)%></td>
<td bgcolor=#<%=cor%> ><%=Rs.Fields(email)%></td>
</tr>
<%rs.MoveNext
if cor=99CCFF then
cor=9999FF
else
cor=99CCFF
end if
wend
%></table>

CAPTULO 5: BASES DE DADOS 143


Foram usados os seguintes objectos e funes:
Rs.Fields()

a maneira com que podemos aceder aos


dados dentro dos campos que pretendemos;
Rs.Movenext () usamos este mtodo para podermos
movimentar o cursor que anda pela base de
dados.
O resultado aquele que se pode ver na imagem seguinte - uma
estrutura apresentvel, que pode servir de Report para muitos tipos
de dados. Repare no truque da mudana de cor por linha, para facilitar a pesquisa dos dados.

Fig. 5.19 - Aspecto da resposta do ficheiro cpt5-5-1.asp

O cdigo,
if cor=99CCFF then
cor=9999FF
else
cor=99CCFF
end if
ento o pequeno truque para que possamos alternar as cores das
linhas. Iniciamos a varivel cor com um valor, e, dentro do loop, vamos validar a mesma, de maneira que ela troque pela cor oposta.

144 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES


Agora digamos que queremos criar uma tabela dinmica, que vai
fazer uso de imagens. Neste caso para aqueles que tm e para os
que no tm e-mail. Digamos que para cada pessoa que tem e-mail
aparece uma imagem que, carregando na mesma, permite o envio
de e-mail para essa pessoa.
Para isso temos de validar o campo que devolve o e-mail, ver se
esse no est vazio, e nesse caso mostrar ou no a imagem referente a um envelope.
(ficheiro cpt5-5-2.asp)

<%
Set Conn = Server.CreateObject(ADODB.Connection)
Conn.open DSN=livrodsn;
Set rs = Server.CreateObject(ADODB.Recordset)
SQLStmt = SELECT * FROM contactos
rs.Open SQLstmt,Conn,1,2
%>
<table border=0" width=580" cellpadding=4" cellspacing=0">
<tr>
<td width=32" align=right><font size=1"><b>e-mail</b></font></td>
<td width=170"><b>Nome</b></td>
<td width=50" align=right><b>Idade</b></td>
<td width= align=right><b>Telefone</b></td>
</tr>
<% cor=99CCFF
while not rs.EOF%>
<tr>
<td align=right><%
if len(Rs.Fields(email))>1 then
Response.write <a href=mailto:&Rs.Fields(email)&>
Response.Write <img border=0' src=carta.jpg></a>
end if
%></td>
<td bgcolor=#<%=cor%>><%=Rs.Fields(nome)%></td>
<td bgcolor=#<%=cor%> align=right><%=Rs.Fields(idade)%></td>
<td bgcolor=#<%=cor%>
align=right><%=Rs.Fields(telefone)%></td>
</tr>
<%rs.MoveNext
if cor=99CCFF then
cor=9999FF
else
cor=99CCFF
end if
wend
%></table>

CAPTULO 5: BASES DE DADOS 145


Foram usados os seguintes objectos e funes:
Len ()

aqui usado para testar o tamanho do e-mail.


Se for menor que um porque inexistente,
e nesse caso no se mostra a imagem que
representa um envelope e respectivo link
para envio de e-mail;
<a href=mailto:<%=Rs.Fields(email) %>> desta
maneira introduzimos o e-mail que
devolvido pela BD, e usando o comando
mailto: ele passa a usar esse link, como
envio de e-mail para o endereo definido.
Como se pode verificar foi aproveitado o cdigo do ficheiro cpt5-51.asp. Para este caso bastou-nos alterar a ordem de apresentao
dos dados, e validar o campo de e-mail.

Fig. 5.20 - Aspecto da resposta do ficheiro cpt5-5-2.asp

Algo que muito usado nas pginas Internet a pesquisa nas bases
de dados da existncia de um dado utilizador, e esse exemplo que
vamos apresentar de seguida.

146 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES


(ficheiro cpt5-5-3.asp)

<%Sub Listagem()
Set Conn = Server.CreateObject(ADODB.Connection)
Conn.open DSN=livrodsn;
Set rs = Server.CreateObject(ADODB.Recordset)
SQLStmt = SELECT * FROM contactos WHERE nome like % &
Request.Form(nome) & %
rs.Open SQLstmt,Conn,1,2
%>
<table border=0" width=580" cellpadding=4" cellspacing=0">
<tr>
<td width=32" align=right><font size=1"><b>e-mail</b></font></td>
<td width=170"><b>Nome</b></td>
<td width=50" align=right><b>Idade</b></td>
<td width= align=right><b>Telefone</b></td>
</tr>
<% cor=99CCFF
while not rs.EOF%>
<tr>
<td align=right><%
if len(Rs.Fields(email))>1 then
Response.write <a href=mailto:&Rs.Fields(email)&>
Response.Write <img border=0' src=carta.jpg></a>
End if
%></td>
<td bgcolor=#<%=cor%>><%=Rs.Fields(nome)%></td>
<td bgcolor=#<%=cor%> align=right><%=Rs.Fields(idade)%></td>
<td bgcolor=#<%=cor%>
align=right><%=Rs.Fields(telefone)%></td>
</tr>
<%rs.MoveNext
if cor=99CCFF then
cor=9999FF
else
cor=99CCFF
end if
wend
%></table>
<br><a href=cpt5-5-3.asp>fazer nova procura</a>
<%End Sub%>
<%Sub formulario_procura%>
<form action=cpt5-5-3.asp?fazer=procura method=POST>
String para Procura : <input type=text name=nome size=22">
<input type=submit value=Procurar>
</form>
<%End Sub%>
<%select case request.querystring(fazer)
case procura listagem
case else formulario_procura
end select%>

CAPTULO 5: BASES DE DADOS 147


O resultado deste exerccio pode ser visto nas imagens seguintes,
onde vamos experimentar o cdigo com a introduo de jo que por
sua vez vai listar todas as ocorrncias do mesmo.

Fig. 5.21 - Aspecto do formulrio do ficheiro cpt5-5-3.asp

Fig. 5.22 - Aspecto da resposta do ficheiro cpt5-5-3.asp,


depois da procura de todas as ocorrncias com jo

Ficam assim demonstrados alguns exemplos para disponibilizar os


dados na Internet usando as ASP. Muitas podem ser as formas de
combinar as ASP com o cdigo HTML, mas isso j pertence ao desenvolvimento profissional das aplicaes que ir desenvolver depois de ler este manual.

148 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES

5.6 Exemplos com bases de dados


Um dos exemplos mais utilizados que recorrem s bases de dados
so os famosos livro de visitas, que alm de serem simples de
desenvolver, servem depois para serem aproveitados noutras
aplicaes para a Internet com as ASP.
Para comear vamos criar uma tabela na nossa BD; a mesma que
usmos para os contactos, com os campos bsicos para um livro
de visitas.
TABELA LIVRO_VISITAS
ID_livro as autonumber
Data_assinatura as Date/Time
Nome as Text (30)
Email as Text (30)
Texto as Memo
Agora que j temos a BD actualizada com a tabela livro_visitas
podemos iniciar a construo do esquema para o livro de visitas.
O livro de visitas no mais que uma tabela, como as que j vimos,
com dados, mas com uma apresentao diferente. Alm dessa
apresentao dos dados temos tambm um formulrio de introduo
de dados. Um truque, se assim se pode chamar, introduzido neste
exemplo, o de refrescar a pgina depois de ser submetido o
formulrio, para que o argumento no fique no link de caminho do
browser. O problema de o argumento ficar no link que ao fazer
refresh na pgina, os dados so introduzidos novamente, mas se
chamar a pgina novamente sem argumento esse problema fica
resolvido. Mas para nos apercebermos disto vamos ver o cdigo
fonte desta pgina ASP que um livro de visitas.
(ficheiro cpt5-6-1.asp)

<%
Sub Introduzir()
passa = 1
nome = left(Request.Form(nome),30)
nome = Replace(nome, , )
email = left(Request.Form(email),30)
email = Replace(email, , )
texto = Request.Form(texto)
texto = Replace(texto, , )
if (len(nome)<2) then
passa = 0
end if

CAPTULO 5: BASES DE DADOS 149


if (len(texto)<15) then
passa = 0
end if
If Len(email) > 0 and Len(email) < 5 Then
Passa = 0
Else
If InStr(1, email, @, 1) < 2 Then
Passa = 0
Else
If InStr(1,email, ., 1) < 4 Then
Passa = 0
End If
End If
End If
if passa=1 then
rs.Close
SQLStmt = INSERT INTO livro_visitas (data_assinatura, nome, email,
texto) VALUES(
SQLStmt = SQLStmt & & now() & ,
SQLStmt = SQLStmt & nome & , & email & , & texto & )
rs.Open SQLstmt,Conn,1,2
Response.Redirect(cpt5-6-1.asp)
Else
Response.Write <font color=red>os dados que tentou introduzir no
foram vlidos.</font>
end if
End Sub
Set Conn = Server.CreateObject(ADODB.Connection)
Conn.open DSN=livrodsn;
Set rs = Server.CreateObject(ADODB.Recordset)
SQLStmt = SELECT * FROM livro_visitas ORDER BY data_assinatura
DESC
rs.Open SQLstmt,Conn,1,2
if Request.QueryString(fazer)=introduzir then
introduzir
end if
%><p>&nbsp;</p><div align=center>
<table border=0" width=580" cellpadding=4" cellspacing=2"><%
while not rs.EOF%>
<tr><td bgcolor=#C6C6C6">
<p align=left>Assinatura de <a href=mailto:
<%=rs.Fields(email)%>> <%=rs.Fields(nome)%></a></p>
<center>
<p align=center><%=rs.Fields(texto)%></p>

150 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES


<p align=center>&nbsp;</td>
</center>
</td></tr>
<%rs.MoveNext
wend
%>
<tr><td>
<form action=cpt5-6-1.asp?fazer=introduzir method=POST>
Indique o seu nome : <INPUT TYPE=TEXT NAME=nome size=22"
maxlength=30"><br>
o seu e-mail : <INPUT TYPE=TEXT NAME=email size=22"
maxlength=30"><br>
a mensagem que quer deixar :<br>
<TEXTAREA name=texto cols=33" rows=7"></TEXTAREA><br>
<input type=submit value=Assinar o Livro>
</form>
</td></tr></table></div>

Foram usados os seguintes objectos e funes:


Len ()

esta funo serve aqui para podermos


medir o tamanho das strings que so
enviadas do formulrio. Assim poderemos
ver se esto vazias, ou se esto dentro dos
requisitos mnimos, impostos pelo
programa;
Left ()
devolve os n caracteres da esquerda de uma
determinada string. Digamos que temos um
campo que no pode ter mais de 30
caracteres na BD e assim ns foramos
esse limite;
Replace ()
foi aqui usado por causa das plicas , que
ao serem usadas nas declaraes de SQL
do erro, pois o prprio SQL usa as
mesmas para limitao de cdigo;
Response.Redirect ()
o truque que aqui foi feito com
este objecto e mtodo, era de maneira a que
o argumento ?fazer=introduzir no ficasse na
linha do URL no browser, pois no caso
do utilizador fazer refrescamento do site
com este argumento, a BD passava a ter
outro registo igual ao que j tinha sido feito.

CAPTULO 5: BASES DE DADOS 151

Fig. 5.23 - Aspecto da resposta do


ficheiro cpt5-6-1.asp - O Livro de Visitas

E assim fica o Livro de Visitas concludo. O leitor nesta altura ter


concerteza menos dificuldades em assimilar tudo aquilo que vai
sendo feito no cdigo, por isso no nos preocupamos com grandes
explicaes nestes exemplos finais.
Algo que muitas empresas cada vez mais anseiam em ter nos seus
sites so as sondagens de opinio - uma maneira de conhecerem
as tendncias, que em muito pode ajudar no dilogo com o
consumidor. Vamos ento ver os conceitos bsicos para criar uma
sondagem de opinio, e deixar o utilizador saber qual est a ser a
tendncia. A estrutura vai ser bastante simples:
Temos um pequeno formulrio com duas hipteses, onde vamos
usar radiobuttons, muito usados no HTML. Estes botes vo ter neste
exemplo duas hipteses, Sim ou No, e vai ser a que a nossa
sondagem se vai centrar. Temos ento a pergunta e as possveis
respostas. Temos de ter uma nova tabela na base de dados que vai
ter de ser actualizada por cada vez que algum escolher uma das
hipteses.
Vamos ento comear por construir a tabela que no vai ter mais de
trs campos.

152 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES


TABELA SONDAGEM
ID_sondagem as autonumber
Resposta as Text (5)
Valor as number
Vamos ento fazer um formulrio que recebe o input do utilizador, e
depois vamos processar o mesmo actualizando a base de dados
consoante a resposta.
(ficheiro cpt5-6-2.asp)

<%
Sub Introduzir()
SQLStmt = UPDATE sondagem SET valor = valor+1 WHERE
resposta = & Request.Form(sondagem) &
Rs.Open SQLstmt,Conn,1,2
Response.Redirect(cpt5-6-2.asp)
End Sub
Set Conn = Server.CreateObject(ADODB.Connection)
Conn.open DSN=livrodsn;
Set rs = Server.CreateObject(ADODB.Recordset)
if Request.QueryString(fazer)=introduzir then
introduzir
end if
%>
<div align=center>
<table border=0" width=400">
<tr>
<td width=100%>
<p align=center><font size=3" face=Arial><b>Acha que este livro
o ajudou?</b></font> </p>
<div align=center>
<table border=0" width=100">
<tr>
<td width=26">
<form action=cpt5-6-2.asp?fazer=introduzir method=POST>
<p align=right><font size=3" face=Arial><input type=radio
value=Sim name=sondagem></font></td>
<center>
<td width=60"><font size=3" face=Arial>Sim</font></td>
</tr>
</center>
<tr>
<td width=26">
<p align=right><font size=3" face=Arial><input type=radio
value=No name=sondagem></font></td>

CAPTULO 5: BASES DE DADOS 153


<center>
<td width=60"><font size=3" face=Arial>No</font></td>
</tr>
</table>
<input type=submit value=Votar></form>
<font size=3" face=Arial>
<b>Resultados at ao momento :</b><br>
<%SQLStmt = SELECT * FROM sondagem
rs.Open SQLstmt,Conn,1,2
while not rs.EOF
Response.Write rs.Fields(valor) & respostas com
Response.Write rs.Fields(resposta) & <br>
rs.MoveNext
wend
rs.Close
%>
</font>
</center>
</div>
<center>
</center>
</td>
</tr>
<center>
</table>
</center>
</div>
Como se pode notar nestes exemplos, a inicializao da conexo
base de dados sempre feita no incio do cdigo (sabendo que os
procedimentos e funes s actuam se chamados).

Fig. 5.24 - Aspecto da resposta do


ficheiro cpt5-6-2.asp - a Sondagem

154 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES


Como se pode ver pela imagem, a apresentao clara e o contedo o essencial. O leitor pode utilizar os dados que so recolhidos da
BD para criar grficos, ou outras formas de apresentao. A tabela
foi criada de maneira a que possa ter todo o tipo de sondagens,
independentemente do nmero de respostas possveis. Depois deste
captulo existe ainda mais uma matria para enriquecer os seus programas com ASP que a criao e uso de componentes, que vamos ver j nas prximas pginas.

Componentes

6.1 Introduo aos Componentes

156

6.2 Tratamento de ficheiros de texto


com o TextStream
6.2.1 Exemplo: Histria sem fim
6.2.2 Exemplo: Contador de acessos

159
163

6.3 Componentes de e-mail


6.3.1 Exemplo: Envio de e-mail
com attachment

164

6.4 Criar componentes em Visual Basic 6


6.4.1 Exemplo: Componente Livro
de Visitas

173

156 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES

6.1 Introduo aos Componentes


Os componentes das ASP so ficheiros ActiveX que servem para
melhorar o desempenho das pginas ASP, visto que so rpidos e
permitem o desenvolvimento de funes reutilizveis (que desta
maneira podem ficar acessveis para outras pginas). Se explorarmos bem o funcionamento das ASP vemos que os componentes
so uma constante nesta linguagem, pois ao usarmos o Response
ou mesmo o Request estamos j a usar componentes internos da
linguagem ASP. Desta maneira podemos muito facilmente invocar
os mtodos e objectos que precisamos para construir as nossas
pginas dinmicas.
Mas por vezes podemos querer aceder a certas funes que no
so possveis com as ASP. Para isso podemos aceder a outras como
o Visual Basic (por exemplo), criando um componente nesta linguagem.
Neste captulo vai-se ento demonstrar como se podem programar
componentes ASP em Visual Basic 6, para posterior uso nas nossas pginas ASP.
Com o tempo, o leitor vai cada vez mais usar este tipo de programao, pois facilita a mesma, e para aqueles que vendem os seus
servios, podem salvaguardar o seu cdigo desta maneira.
Existem alguns componentes que vm com as ASP, assim como o
CDO (componente de e-mail) que vem com o IIS, o TextStream,
que prprio das ASP, e muitos outros que podem ser encontrados
na Internet. A sua grande maioria comercial, ou seja, ter de pagar
para os poder utilizar nos seus servidores. Mas muitos outros so
grtis, e um dos locais onde pode tentar encontr-los em http://
www.aspfree.com ou http://www.15seconds.com . Estes sites tm
listagens dos componentes disponveis, ordenados por temas, e por
tipo de disponibilidade (Free, Trial, Comercial, Demo, etc.).
Durante este captulo o leitor vai aprender a instalar componentes
exteriores, desde encontr-los na Internet, fazer o seu download e a
seguir instal-los, sendo explicado tambm como instalar o seu prprio componente, criado em Visual Basic.
Depois de ter lido este livro, e ultrapassadas todas as dvidas, o
leitor estar ento preparado para programar as ASP a alto nvel,
bastando apenas alguma prtica adicional.

CAPTULO 6: COMPONENTES 157

6.2 Tratamento de ficheiros de


texto com o TextStream
Este objecto do componente FileSystemObject no necessita de
instalao pois vem j com o PWS ou IIS. Tudo o que tem de fazer
chamar o objecto do mesmo, e utiliz-lo. Este componente serve
para o leitor usar ficheiros de texto. Algo que pode ser til quando o
mesmo quer guardar informao de rpido acesso, ou mesmo criar
pginas HMTL no momento, do tipo dar a hiptese aos utilizadores
de criarem uma pgina sua em funo de um template do site. Desta forma toda a pgina pode ser gerada com este componente e
ficar disponvel no momento, e num nvel mais alto, ser enviada por
attach via e-mail para o utilizador. Alm destas funes o leitor pode
tambm fazer procura de ficheiros, e mov-los no servidor.
As tabelas abaixo servem para ter uma noo daquilo que se pode
fazer com este objecto, e quais as propriedades e mtodos para tal.

TABELA DE MTODOS DO TEXTSTREAM


Mtodo

Tipo

Descrio

Read

Input

Este mtodo vai ler os caracteres um a um.

ReadLine

Input

Como o nome indica, desta forma l-se


uma linha inteira.

ReadAll

Input

L-se toda a informao que est no


ficheiro.

Write

Output Escreve toda a informao que


quisermos introduzir, no mudando de
linha, sendo a informao seguinte
escrita logo a seguir a esta.

WriteLine

Output Escreve a informao enviada,


mudando de seguida de linha.

WriteBlankLines Output Introduz uma linha vazia.

Skip

Input

Salta um nmero especfico de


caracteres.

SkipLine

Input

Muda de linha.

158 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES


TABELA DE PROPRIEDADES DO TEXTSTREAM
Propriedade

Descrio

AtEndOfLine

Maneira de o leitor saber se chegou ao fim da linha.

Line

Devolve o nmero da linha onde vamos.

Column

Devolve o nmero de caracteres que foram


percorridos desde o incio da linha.

AtEndOfStream Desta maneira o leitor vai saber se j chegou ao


fim do ficheiro.

Uma maneira fcil de perceber o seu processo o de escrever e ler


as linhas de texto do ficheiro criado. Vamos ento criar uma pgina
ASP, que faz uma emulao de um jogo que uma histria em que
cada pessoa vai acrescentando um pargrafo. No final a histria at
pode ter nexo, ou pode mesmo ser a maior confuso. Mas isto serve
apenas para o leitor ter a percepo de como so usados estes
ficheiros, e como este componente funciona.
Primeiro de tudo vamos fazer uns ficheiros de teste, para nos apercebermos daquilo que vamos usar.
Para abrir uma conexo para escrita e leitura de um ficheiro vamos
usar procedimentos diferentes.

Para escrevermos num ficheiro vamos usar a estrutura,


Set ObjectoFicheiro = CreateObject(Scripting.fileSystemObject)
Set
EscreveTexto
=
ObjectoFicheiro.CreateTextFile
(Server.MapPath(ficheiro.txt),True)

Para lermos a informao l escrita usada a estrutura,


Set ObjectoFicheiro = CreateObject(Scripting.fileSystemObject)
Set LerTexto = ObjectoFicheiro.OpenTextFile
(Server.MapPath(ficheiro.txt),1)

CAPTULO 6: COMPONENTES 159


Desta maneira podemos ento criar linhas de texto e l-las logo a
seguir.

(ficheiro cpt6-2-1.asp)

<%
Response.Write processo : Vai ser criada uma linha de texto.<br><br>
Set ObjectoFicheiro = CreateObject(Scripting.fileSystemObject)
Set EscreveTexto = ObjectoFicheiro.CreateTextFile
(Server.MapPath(ficheiro.txt),True)
EscreveTexto.WriteLine(Este linha est no ficheiro de texto...)
EscreveTexto.Close
Response.Write processo: Escreveu uma linha de texto.<br><br>
Response.Write processo: Vai ler linha de texto.<br><br>
Set LerTexto = ObjectoFicheiro.OpenTextFile
(Server.MapPath(ficheiro.txt),1)
Response.Write processo: A linha lida : <b> & LerTexto.Readline & </b>
Set LerTexto = nothing
%>

Foram usados os seguintes objectos/mtodos:


CreateObject(Scripting.FileSystemObject) conexo ao
componente. Desta forma ficamos com um
objecto criado com a imagem do mesmo;
CreateTextFile () forma com que se define a criao de um
ficheiro de texto;
EscreveTexto.WriteLine () Escrita de uma linha de texto,
com mudana de linha;
EscreveTexto.Close Fechar o objecto de escrita de texto;
OpenTextFile ()

Abrir o ficheiro de texto para leitura;

LerTexto.Readline () Ler uma linha do ficheiro de texto;


LerTexto = nothing

Limpar o objecto de leitura de texto.

Podemos ento visualizar o resultado obtido pelo nosso exemplo,


em que na mesma ASP criamos um ficheiro de texto, com uma
linha, e logo a seguir vamos buscar essa mesma linha e escrev-la
no browser.

160 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES

Fig. 6.1 - Resultado do ficheiro cpt6-2-1.asp

E desta maneira vamos ento criar a ASP da histria que nunca


acaba. A estrutura um pouco bsica, mas que necessita de explicao prvia. Passamos ento sua estruturao:
1.
2.
3.
4.

Formulrio para input do utilizador;


Procedimento de escrita de nova linha para a histria;
Procedimento de leitura de texto;
Procedimento para saber se j existe ficheiro.

O facto de procurarmos se j existe um ficheiro de histria deve-se


ao facto de que o FileSytem devolve erro se no encontrar o ficheiro.
Desta forma criamos um por cada vez que ele no existir.
A maneira de sabermos se o ficheiro existe de usar o prprio componente e usar um mtodo chamado FileExists. Assim, poderemos
ento construir todo o cdigo.

CAPTULO 6: COMPONENTES 161

(ficheiro cpt6-2-2.asp)

<%
Sub procura_ficheiro()
Set ProcuraFicheiro =
Server.CreateObject(Scripting.fileSystemObject)
If Not ProcuraFicheiro.FileExists(Server.MapPath(historia.txt)) then
Set ObjectoFicheiro = CreateObject(Scripting.fileSystemObject)
Set EscreveTexto = ObjectoFicheiro.CreateTextFile
(Server.MapPath(historia.txt),True)
EscreveTexto.WriteLine(ERA UMA VEZ............)
EscreveTexto.Close
end if
End Sub
Sub escrita_de_linha()
Set ObjectoFicheiro = CreateObject(Scripting.fileSystemObject)
Set EscreveTexto = ObjectoFicheiro.OpenTextFile
(Server.MapPath(historia.txt),8,True)
If len(Request.Form(linha))>1 then
EscreveTexto.WriteLine(Request.Form(linha))
end if
EscreveTexto.Close
End Sub
Sub leitura_de_ficheiro()
Set ObjectoFicheiro = CreateObject(Scripting.fileSystemObject)
Set LerTexto = ObjectoFicheiro.OpenTextFile
(Server.MapPath(historia.txt))
While NOT LerTexto.AtEndOfStream
Response.Write &nbsp;&nbsp;| & LerTexto.ReadLine & <br>
Wend
Set LerTexto = nothing
End Sub
Sub formulario()
%>
<br><br><p><FORM action=cpt6-2-2.asp method=POST>
Novo Pargrafo: <input type=text name=linha size=60"
MaxLength=140"><br>
<input type=submit name=submeter Value=Acrescentar>
</FORM>
</p>
<%
End Sub

162 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES


If Request.Form(submeter) = Acrescentar then
escrita_de_linha
end if
procura_ficheiro
leitura_de_ficheiro
formulario
%>
Foram usados os seguintes objectos/mtodos:
ProcuraFicheiro.FileExists() este comando devolve True
ou False consoante exista o ficheiro
que procuramos ou no;
len()
Foi aqui usado para termos a
certeza que a linha enviada pelo
utilizador no est vazia, e nesse
caso no inserida uma linha em
branco no ficheiro;
LerTexto.AtEndOfStream Este cdigo, e no contexto em
que foi inserido (no loop), vai
percorrer linha a linha,
possibilitando-nos escrever cada
linha da histria, na formatao que
quisermos. Se fosse lido todo o
ficheiro de uma vez poderiamos ter
problemas de performance no
futuro.

Fig. 6.2 - Resultado do ficheiro


cpt6-2-2.asp - a histria que nunca acaba

CAPTULO 6: COMPONENTES 163


O resultado da histria nunca igual de site para site. Cada utilizador
chega e escreve uma nova linha, e pode alterar a mesma de acordo
com a sua vontade.
Outra forma de usarmos este til componente na contagem dos
acessos a um site. Para isso basta-nos criar um ficheiro ASP que
pode ser includo em qualquer lado, contando assim os acessos ao
nosso site. O esquema muito simples. Temos o ficheiro com um
valor, tiramos o valor, incrementamos-lhe um valor, e voltamos a l
introduzir, mas neste caso sempre a criar o ficheiro gravando o novo
por cima do antigo.
Tudo aquilo que vai ser usado foi j visto no exemplo anterior; s o
uso do objecto que vai ser um pouco diferente, o resultado ento
o do ficheiro cpt6-2-3.asp
(ficheiro cpt6-2-3.asp)

<%
Set ObjectoFicheiro = CreateObject(Scripting.fileSystemObject)
Set LerTexto = ObjectoFicheiro.OpenTextFile
(Server.MapPath(contador.txt),1)
Valor = LerTexto.ReadLine
Set LerTexto = nothing
Set EscreveTexto = ObjectoFicheiro.CreateTextFile
(Server.MapPath(contador.txt),True)
EscreveTexto.WriteLine(valor+1)
EscreveTexto.Close
Response.Write Houveram & (valor+1) & acessos...<br>
%>
Neste caso j tnhamos de ter criado um ficheiro de texto (contador.txt)
com o valor em que queramos inicializar a contagem, neste caso,
zero. Por cada entrada no site o valor incrementado, podendo o
leitor testar, fazendo mltiplos refrescamentos da pgina.

Fig. 6.3 - Resultado do ficheiro cpt6-2-3.asp

164 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES


Muitas outras funcionalidades se podem dar a este componente.
Por vezes o simples envio de informao via Internet entre sites distintos necessita deste tipo de tratamento - ficheiros de informao
que so trocados, e normalmente sempre em formato ASCII.

6.3 Componentes de e-mail


Este tipo de componentes (e-mail) so muito importantes na construo de sites dinmicos. uma das maneiras de fazer chegar
informao ao utilizador num nvel mais pessoal. Normalmente necessitamos de preencher o campo de e-mail noutros sites, pois disso depende a recepo de uma password, ou de um ficheiro que
no possvel fazer download pois tem de ser pedido aos seus responsveis. Com estes componentes o leitor pode fazer algo semelhante. Vrios componentes esto disponveis na Internet, assim
como o ASPEmail (www.aspemail.com) ou o Jmail que so grtis e
qualquer pessoa os pode usar.
Ficam ento todos os passos para termos acesso ao componente
Jmail, que existe h alguns anos e funcionou sempre na perfeio.
Para fazer download deste componente tem de se dirigir a http://
tech.dimac.net, e procurar o ficheiro w3Jmail.
Depois do download, a instalao simples, pois trata-se de um
ficheiro executvel, e no de um DLL solto. Neste site existem tambm exemplos de cdigo em que se usa o Jmail. Cabe ao leitor
explorar estes pontos mais a fundo. Seja como for so aqui demonstrados dois exemplos vlidos do uso deste componente.
(ficheiro cpt6-3-1.asp)

<%
Set Jmail = Server.CreateObject(JMail.SMTPMail)
JMail.ServerAddress = mail.servidor.pt aqui fica o servidor de e-mail
JMail.Sender = remetente@servidor.pt aqui fica o endereo de quem
envia o e-mail
JMail.Subject = Titulo do E-Mail aqui fica o titulo do e-mail / subject
JMail.AddRecipient receptor@servidor.pt endereo para onde
queremos enviar o e-mail
Corpo = Texto que vai no e-mail... & Chr(13) & chr(12) & Chr(13) & chr(12)
corpo = corpo & Chr(13) & chr(12) & Obrigado
JMail.Body = corpo envio do corpo da mensagem
Jmail.Priority = 3 implementar prioridade 1-mnima 3-mxima
JMail.Execute
%>

CAPTULO 6: COMPONENTES 165


Foram usados os seguintes objectos/mtodos :
Server.CreateObject(JMail.SMTPMail) Cria-se assim a
conexo ao componente de e-mail;
JMail.ServerAddress () Desta forma vamos definir o
servidor de e-mail a usar;
JMail.Sender ()
Define-se aqui qual o e-mail da
pessoa que o envia;
JMail.Subject ()
Aqui indicamos o ttulo da
mensagem;
JMail.AddRecipient () Escrevemos aqui para quem vamos
enviar o e-mail;
JMail.Body ()
Aqui fica a construo do corpo da
mensagem;
Jmail.Priority ()
Aqui definimos a prioridade do e-mail:
1-mnimo, 2-mdio, 3-mximo;
JMail.Execute ()
S depois deste comando que o
e-mail enviado. Primeiro so as
configuraes e depois que
executada a funo geral.
Este exemplo tratava apenas do envio de um e-mail, sem nenhum
propsito especial. Agora imaginemos que o leitor quer ter no seu
site um ficheiro com anedotas e, para que os outros possam ter
acesso, tm de indicar o e-mail para que as mesmas lhes sejam
enviadas. Entra ento assim o conceito do prximo exemplo: Temos
um campo de um formulrio onde os utilizadores vo introduzir o
seu e-mail, de maneira a poderem receber um documento que contm as anedotas que eles querem ter acesso.
(ficheiro cpt6-3-2.asp)

<%
Sub enviar_piada()
Set Jmail = Server.CreateObject(JMail.SMTPMail)
Jmail.ServerAddress = mail.servidor.pt
Jmail.Sender = seuemail@seuservidor.pt
Jmail.Subject = Aqui esto as piadas
Jmail.AddRecipient request.form(email)
Corpo = Aqui esto as piadas.doc em attachment. & Chr(13) & chr(12)
& Chr(13) & chr(12)
Corpo = corpo & Chr(13) & chr(12) & Obrigado
Jmail.Body = corpo
Jmail.AddAttachment d:/piadas.doc
Jmail.Priority = 2
Jmail.Execute
%>

166 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES


<br><br><br>
<p align=center><font face=Arial><b>Obrigado...</font><br>
<small>receber um e-mail meu dentro de momentos</small>
</p>
<%
End Sub
Sub formulario()
%>
<form action=cpt6-3-2.asp method=POST>
Introduza o e-mail onde quer<br> receber as piadas: <input type=text
name=email><br>
<input type=submit name=submeter value=Quero Receber>
</form>
<%
End Sub
if Request.Form(submeter) = Quero Receber then
enviar_piada
else
formulario
end if
%>

Foram usados os seguintes objectos/mtodos:


JMail.AddAttachment () A maneira com que
acrescentamos um ficheiro ao
nosso e-mail (via attachment).
Ficamos assim com mais conhecimentos sobre como se podem
apurar as pginas dinmicas. As utilizaes possveis para os componentes de e-mail so imensas. Numa delas, o leitor pode criar
uma newsletter, onde todos os utilizadores esto em BD, e quando
sai uma nova notcia uma pgina ASP pode-se encarregar de a enviar
para todos os registados em BD. O envio de passwords para quem
as perdeu tambm uma das muitas funcionalidades dadas a este
tipo de componentes. Assim como a confirmao de assinaturas e
servios que deste componente precisem para terem alguma funcionalidade. At mesmo o exemplo das anedotas pode ser usado para
criar uma listagem (em BD), de todos os e-mails que as solicitaram,
podendo mais tarde ser til para a divulgao de novas, fazendo
com que o trfego do site aumente por cada novidade que aparea.

CAPTULO 6: COMPONENTES 167

6.4 Criar componentes em


Visual Basic 6
Para criarmos o componente previsto necessitamos apenas de algum conhecimento de Visual Basic (VB). O Visual Basic uma das
bases das ASP e como as duas linguagens so derivadas de VBScript
no vo existir muitos problemas. At mesmo o leitor que j se sente confortvel na programao com ASP, e que nunca usou VB, no
vai ter muitas dificuldades em aperceber-se daquilo que vai ser feito.
O exemplo que vai ser criado no nada de muito difcil, algo alis
bastante simples, que serve apenas para ver como se devem criar
componentes, instal-los e us-los. Vamos ento criar um exemplo
que usa o cdigo j usado do Livro de Visitas, e que neste caso fica
dentro de um componente DLL para ASP. Outra particularidade deste exemplo que vamos dar hiptese pessoa que o estiver a usar
de poder fazer algumas alteraes.
Vamos ento, antes de mais, inicializar o Visual Basic (este exemplo usa o Visual Basic 6).
Ao aparecer a escolha do tipo de projecto optamos por ActiveX DLL.

Fig.6.4

- Escolha do tipo de projecto

168 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES


Vamos ento definir as propriedades do projecto que inicimos. Para
isso vamos ao menu do VB e escolhemos Project > Properties.

Fig. 6.5 - Abrir Propriedades do projecto

A partir daqui aparece uma consola de configurao como a da prxima figura.

Fig. 6.6 - Consola de propriedades do projecto

CAPTULO 6: COMPONENTES 169


Ao estarmos na consola de propriedades do projecto mudamos o
nome do projecto para LivroASP. Claro que o leitor pode criar o projecto com o nome que mais lhe convenha. Depois disto carregamos
em OK e vamos ento mudar o nome da nossa classe, que criada
por defeito aquando da iniciao do ActiveX DLL project, para
livrovisitas (visto ser este o nosso objectivo).

Fig. 6.7 - Alterar o nome da nossa


classe para livrovisitas

Mas necessria haver uma interaco entre ASPs e a DLL que


vamos criar, pois as mesmas s interagem com DLLs especficas.
Temos ento de ir buscar uma referncia para o VB saber que est
a compilar para o propsito que temos em vista.

Fig. 6.8 - Entrar na consola de referncias

170 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES


Depois de entrarmos na consola de referncias vamos ento escolher duas referncias: Microsoft Active Server Pages Object Library
(tem de se escolher sempre independentemente do tipo de projecto
para ASP) e Microsoft ActiveX Data Objects 2.1 Library (escolhemos para este caso pois vamos usar bases de dados, caso contrrio seria desnecessrio).

Fig. 6.9 - Referncias necessrias para este projecto

Depois de escolhidas as referncias, e de termos seguido as passagens j referidas, vamos ento comear a criar as primeiras linhas de cdigo VB para o nosso componente.
Antes de tudo vamos criar uma tabela de dados que julgamos serem vlidos para dar hiptese do Livro de Visitas ser configurvel
por pessoas estranhas ao cdigo do componente. Digamos que o
utilizador tem de ter a hiptese de usar um ficheiro com o nome que
quiser para usar o componente, a cor das caixas onde esto as
mensagens, e a cor das letras do site, e das caixas.
Desta maneira o utilizador do componente tem hiptese de configurar os dados sua vontade.
No VB precisamos de configurar certos objectos que nas ASP temos como certos, para que os precisamos de inicializar no VB falamos de Response, Request, Session etc.
Para isso temos de inicializar todas as chamadas dos objectos das
ASP, e para isso temos o seguinte cdigo,

CAPTULO 6: COMPONENTES 171

Private msc As ScriptingContext


Private mapplication As Application
Private mrequest As Request
Private mresponse As Response
Private mserver As Server
Private msession As Session
Private Conn As Connection
Private RS As Recordset
Podemos ento reconhecer a conexo BD e definio do Recordset
que vamos usar para aceder BD. De resto so as inicializaes
das variveis que vo compensar os objectos das ASP.
Para definirmos os procedimentos que so acessveis do exterior
basta definirmos se so Public ou Private.
Public Sub NomeDoProcedimento()
End Sub
Private Sub NomeDoProcedimento()
End Sub
Existem dois procedimentos base nos componentes de ASP, que
funcionam algo como os procedimentos do ficheiro Global.Asa, e
que so os seguintes:
Public Sub OnStartPage(psc As ScriptingContext)
End Sub
Public Sub OnEndPage()
End Sub
Deve ter reparado no tipo psc. Este serve para entrarmos no scripting
da linguagem ASP, que no fundo um sistema de texto corrido, para
interpretao.

Os procedimentos que vamos usar so os seguintes:


Public Sub CorLetras(cor As String)
Vai ser usado para introduzir a cor das letras numa varivel de sesso, varivel essa que ser posteriormente usada;

Public Sub ficheiro(ficheiro As String)


Aqui introduzimos numa varivel de sesso o nome do ficheiro que
suporta o livro de visitas. Vai influenciar no redireccionamente e no
Action do formulrio HTML;

172 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES


Public Sub CorLetrasCaixas(cor As String)
Aqui o utilizador definir a cor das letras das mensagens deixadas
no livro de visitas;
Public Sub CorCaixas(cor As String)
Procedimento para definir a cor das caixas que suportam as mensagens;
Public Sub OnStartPage(psc As ScriptingContext)
Procedimento base que suporta tudo aquilo que deve ser inicializado
antes de se comear a correr o cdigo;
Public Sub inicio()
Procedimento que ter as primeiras linhas de cdigo, que antes estavam fora dos procedimentos do livro de visitas;
Private Sub Introduzir()
Este o procedimento que j usvamos antes no livro de visitas,
aqui com algumas alteraes pois temos de escrever o cdigo todo
com Response.Write e no VB com mresponse.write;
Public Sub OnEndPage()
Este o procedimento base que define tudo o que feito quando se
acaba de usar o DLL. Neste caso limpamos todos os objectos que
foram criados para simular os usados nas ASP

Vamos ento ver parte do que feito no procedimento OnStartPage ():


Set msc = psc chamamos o objecto de scripting inicializado
Set mapplication = msc.Application definimos como usar as variveis
Application
Set mrequest = msc.Request definimos como usufruir do request
E o resto funciona no mesmo esquema, como o leitor pode ver a
seguir:
Set mresponse = msc.Response
Set mserver = msc.Server
Set msession = msc.Session
Nesta perspectiva quando o leitor quiser criar uma varivel de sesso chamada Ficheiro com um texto ficheiro.asp faz,

msession(Ficheiro) = ficheiro.asp

CAPTULO 6: COMPONENTES 173


Se quisermos ter um valor inserido por um formulrio com o nome
email fazemos,
Mrequest.form(email)
E assim para todos as outras emulaes criadas para os objectos.
O leitor depois saber qual o melhor uso a dar a cada uma. Tudo o
resto poder ser cdigo base do VB, que ser de onde se poder
tirar maior partido.
Vamos ento ver o ficheiro livrovisitas.cls - a classe que foi criada
no VB para suportar o nosso livro de visitas.
(ficheiro livrovisitas.cls)

Private msc As ScriptingContext


Private mapplication As Application
Private mrequest As Request
Private mresponse As Response
Private mserver As Server
Private msession As Session
Private Conn As Connection
Private RS As Recordset
Public Sub CorLetras(cor As String)
msession(CorLetras) = cor
End Sub
Public Sub ficheiro(ficheiro As String)
msession(Ficheiro) = ficheiro
End Sub
Public Sub CorLetrasCaixas(cor As String)
msession(CorLetrasCaixas) = cor
End Sub
Public Sub CorCaixas(cor As String)
msession(CorCaixas) = cor
End Sub
Public Sub OnStartPage(psc As ScriptingContext)
Set msc = psc
Set mapplication = msc.Application
Set mrequest = msc.Request
Set mresponse = msc.Response
Set mserver = msc.Server
Set msession = msc.Session

174 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES


Set Conn = mserver.CreateObject(ADODB.Connection)
Conn.Open DSN=livrodsn;
Set RS = mserver.CreateObject(ADODB.Recordset)
End Sub
Public Sub inicio()
If mrequest.QueryString(fazer) = introduzir Then
Introduzir
End If
mresponse.Write <p>&nbsp;</p><div align=center>
mresponse.Write <table border=0' width=580' cellpadding=4'
cellspacing=2'>
SQLstmt = SELECT * FROM livro_visitas ORDER BY data_assinatura
DESC
RS.Open SQLstmt, Conn, 1, 2
While Not RS.EOF
mresponse.Write <tr><td bgcolor= & msession(CorCaixas) & >
mresponse.Write <p align=left><font color= &
msession(CorLetrasCaixas) & >
mresponse.Write Assinatura de <a href=mailto: & RS.Fields(email)
& > & RS.Fields(nome)
mresponse.Write </a></font></p>
mresponse.Write <center>
mresponse.Write <p align=center><font color= &
msession(CorLetrasCaixas) & >
mresponse.Write RS.Fields(texto) & </font></p>
mresponse.Write <p align=center>&nbsp;</td>
mresponse.Write </center>
mresponse.Write </td></tr>
RS.MoveNext
Wend
mresponse.Write <tr><td>
mresponse.Write <form action= & msession(Ficheiro) &
?fazer=introduzir method=POST>
mresponse.Write <font color= & msession(CorLetras) & >Indique o
seu nome: </font>
mresponse.Write <INPUT TYPE=TEXT NAME=nome size=22'
maxlength=30'><br>
mresponse.Write <font color= & msession(CorLetras) & >o seu email: </font>
mresponse.Write<INPUT TYPE=TEXT NAME=email size=22'
maxlength=30'><br>
mresponse.Write <font color= & msession(CorLetras) & >a
mensagem que quer deixar:</font><br>
mresponse.Write <TEXTAREA name=texto cols=33' rows=7'>

CAPTULO 6: COMPONENTES 175


</TEXTAREA><br>
mresponse.Write <input type=submit value=Assinar o Livro>
mresponse.Write </form>
mresponse.Write </td></tr></table></div>
End Sub
Private Sub Introduzir()
passa = 1
nome = Left(mrequest.Form(nome), 30)
nome = Replace(nome, , )
email = Left(mrequest.Form(email), 30)
email = Replace(email, , )
texto = mrequest.Form(texto)
texto = Replace(texto, , )
If (Len(nome) < 2) Then
passa = 0
End If
If (Len(texto) < 15) Then
passa = 0
End If
If Len(email) > 0 And Len(email) < 5 Then
passa = 0
Else
If InStr(1, email, @, 1) < 2 Then
passa = 0
Else
If InStr(1, email, ., 1) < 4 Then
passa = 0
End If
End If
End If
If passa = 1 Then
RS.Close
SQLstmt = INSERT INTO livro_visitas (data_assinatura, nome, email,
texto) VALUES(
SQLstmt = SQLstmt & & Now() & ,
SQLstmt = SQLstmt & nome & , & email & , & texto & )
RS.Open SQLstmt, Conn, 1, 2
mresponse.Redirect (msession(Ficheiro))
Else
mresponse.Write <font color=red>os dados que tentou introduzir no
foram vlidos.</font>
End If
End Sub

176 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES


Public Sub OnEndPage()
Set msc = Nothing
Set mapplication = Nothing
Set mrequest = Nothing
Set mresponse = Nothing
Set mserver = Nothing
Set msession = Nothing
End Sub

Ficamos assim com o ficheiro que ir gerir todo o processo do componente. Tudo se passa como se fosse um ASP excepto as chamadas dos objectos base das ASP.
Para testarmos este cdigo necessitamos de fazer Run do mesmo,
e logo de seguida ir a um ASP que busca este componente. No VB6
existe essa vantagem - no necessitamos de instalar o componente
para o testar; basta carregar em RUN no VB, ir ao browser e abrir a
pgina que chama o componente. Neste caso uma pgina com a
seguinte estrutura:

(ficheiro cpt6-4-1.asp)

<%
Set lv = Server.CreateObject(LivroASP.livrovisitas)
Lv.Ficheiro(cpt6-4-1.asp)
lv.CorLetras(Green)
lv.CorLetrasCaixas(#F60000)
lv.CorCaixas(#C6C6FF)
lv.inicio
%>

Como se pode ver define-se todos os dados possveis do componente, busca-se o componente atravs de Serve.CreateObject onde
a estrutura ,
Server.CreateObject(NomeProjecto.NomeClasse)

Depois o uso bsico e de fcil compreenso.

CAPTULO 6: COMPONENTES 177

Fig. 6.10 - Aspecto do livro de visitas depois


de correr o cdigo no VB e aberta a pgina ASP

No esquecer que a partir do momento que o leitor carregar em


Stop, o componente deixa de funcionar na ASP. Se vir que o mesmo
est finalizado, chega a hora de o compilar, criar um verdadeiro ficheiro DLL, e instal-lo no servidor onde o quer ter a funcionar.
Para compilar o componente basta seguir os seguintes passos:
1. Ir a File > Make

Fig. 6.11 - Fazer a compilao do projecto

178 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES


2. Escolher o nome a dar ao componente (ficheiro DLL)

Fig. 6.12 - Escolher o nome do ficheiro

3. O directrio do componente fica ento,

Fig. 6.13 - Directrio onde est o componente criado

CAPTULO 6: COMPONENTES 179


4. Instalao do componente, depois de escolhido o
directrio onde o guardar (lembrar que o componente
LivroASP.DLL pode ser usado separado. Pode copiar
esse ficheiro para outro servidor e us-lo ento).
O directrio escolhido para ter os componentes foi
D:\InetPub\WWWRoot\Componentes\LivroASP.DLL

Fig. 6.14 - Directrio onde foi colocado


o componente para entrar em produo

Depois de introduzido o componente no directrio escolhido para


produo, vamos, dentro desse mesmo directrio, correr a seguinte
linha de comando em,
Start > Run
D:\InetPub\WWWRoot\Componentes\regsvr32 LivroASP.DLL

Fig. 6.15 - Instalar o componente

180 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES


Depois de correr a linha descrita devolvida uma mensagem de
sucesso, depois da qual temos o nosso componente acessvel no
nosso servidor.

Fig. 6.16 - Resposta de instalao


com sucesso do componente

O ficheiro regsvr32 costuma estar em C:\Windows\System. Caso


contrrio faa um Find, pois este est por defeito instalado no
Windows.
Est agora disponvel este componente para qualquer site que queira instalar no seu servidor. Se quiser pode disponiz-lo para outros
servidores, bastando lev-lo e instal-lo l.
De lembrar que este tipo de componentes por vezes necessita de
outros, e neste caso os ficheiros base (RunTime) do VB, tais como:
Microsoft Visual Basic 5 Runtime Msvbvm50.exe
Microsoft Visual Basic 6 Runtime Vbrun60.exe
Disponveis em http://www.vb-web-directory.com/microsof/
ms_dload.shtml ou no site da Microsoft.
Se o seu componente no funcionar noutro servidor, faa uma instalao dos componentes (RunTime) indicados acima. No Windows
98 no tem problemas com esta situao, seja como for fica assim
ento o aviso. Estes ficheiros encontram-se tambm ou na mquina que tem o VB instalado, ou em sites de programao na Internet.
Podem estar disponveis como ficheiros executveis, ou como componentes soltos, que se instalam da mesma maneira que o componente que crimos neste captulo.

Exemplos reais

7.1 Introduo

182

7.2 A R: Motor de Busca

183

7.3 A Loja: Loja E-Commerce

197

182 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES

7.1 Introduo
Este captulo foi introduzido neste manual, no para mais uma explicao detalhada linha a linha, mas para inspirar o leitor a desenvolvimentos mais complexos com as ASP. Vamos apresentar dois
exemplos que decerto incluem respostas para muitos problemas
que lhe so familiares.
O esquema de ambos muito parecido, ao ponto de serem usados
ficheiros idnticos em ambas as aplicaes. Estes exemplos tm
muito em comum, tais como, ficheiros, funes, mtodos de busca
de dados e muito mais. Mas o mais importante que ambos usam
apenas um ficheiro ASP e os outros so de apoio para a construo
do primeiro, que 80% dinmico. Teremos 3 zonas desse ficheiro, o
topo, o fundo e o centro. O centro a zona mais dinmica, onde
vamos escolher consoante a resposta do nosso Querystring ou
formulrio, os dados a mostrar no browser.
O esquema ento sempre o seguinte:

Fig. 7.1 - Esquema dos exemplos deste captulo


Verso digital, individual, licenciada em Jan/Fev do ano 2000, pelo Centro Atlntico, da verso 1.0 do livro 'Programao Web com ASP'

CAPTULO 7: EXEMPLOS REAIS 183

Pelo esquema vimos que existem ficheiros que esto includos na


ASP, isso graas ao facto de usarmos o sistema SSI (j visto neste
manual), de maneira a usarmos o comando <!#INCLUDE
FILE=ficheiro.inc> .
Desta maneira estamos livres para usar o primeiro ficheiro dinamicamente. Um exemplo de como fazer esse uso com o argumento
que vem com o link no browser. Digamos que temos duas hipteses:
se o argumento fazer for sim, apresentamos o ficheiro com cdigo
HTML a representar certo (pode no ser um ficheiro HTML, pode ter
funes ASP), se for no, apresentamos o ficheiro errado.
Vejamos ento:
No browser temos o link http://pc/livro/default.asp?fazer=sim
Teremos no cdigo ASP o seguinte:
fazer = request.querystring(fazer)
<%if fazer=sim then%>
<!#INCLUDE FILE=certo.inc>
<%else%>
<!#INCLUDE FILE=errado.inc>
<%end if%>

E desta maneira manipulamos a apresentao, no browser, dos


dados com um s ficheiro ASP. Claro que se estiver a programar
um site com muitos acessos esta no ser a maneira mais indicada,
mas se no contar com mais de mil acessos dirios pode estar
descansado. Seja como for, estes exemplos servem para lhe dar a
conhecer alguns truques usados por profissionais na programao
de sites. Claro que nada disto uma inveno de ltima hora, os
mesmos recursos so usados por muitos mas de maneira diferente.

7.2 A R Motor de Busca


Este sem sombra de dvidas daqueles exemplos que muitos querem estudar e perceber como se podem ultrapassar alguns problemas. No nenhum exemplo para sites Industriais, mas por aqui o
leitor ficar com as ideias arrumadas e com os conhecimentos suficientes para criar algo mais avanado do que este exemplo. O esquema de uso de ficheiros foi explicado no incio deste captulo, agora precisamos de ver como estruturar a base de dados e definir

184 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES


quais as funes que vamos precisar em funo dos procedimentos que o site dever ter. Podemos ento desde logo identificar algumas etapas, mas para no ficar muito confuso vamos comear pelas bases de dados, e logo de seguida esquematizar o esquema de
ficheiros que vo ser usados. No demais lembrar que neste captulo no prioridade explicar o que se faz em cada linha (apesar de
muitos pontos serem explicados) mas sim, apresentar uma soluo, e demonstrar como torn-la consistente na prtica.
Iremos ter ento apenas uma tabela para guardar os dados que
acharmos necessrios (claro que o leitor poder criar uma BD diferente, esta serve apenas de orientao inicial).
Achou-se que para este exemplo a data, o ttulo do site, uma descrio e a morada do prprio seriam suficientes.
Ficando o nosso ficheiro em MSAccess (o usado deste o incio do
manual) com o seguinte aspecto na consola de Design.

Fig. 7.2 - A BD do motor de busca - uma nica tabela

Verso digital, individual, licenciada em Jan/Fev do ano 2000, pelo Centro Atlntico, da verso 1.0 do livro 'Programao Web com ASP'

CAPTULO 7: EXEMPLOS REAIS 185


O esquema ento o seguinte:
TABELA: MOTORBUSCA
id_motor
Auto-number; o identificador do link
url
Text (250); o link da pgina registada
titulo
Text (80); o ttulo da pgina
descricao
Memo; uma breve descrio do que trata o site
data
Date/Time; data em que foi inserido o link no
motor de busca
Podemos ento comear a pensar no que vai ser preciso para por o
motor de busca a funcionar, e podemos desde j fazer uma lista de
pontos com a seguinte estrutura:
1 Aspecto da pgina inicial;
2 Formulrio de procura de dados;
3 Formulrio de registo de site;
4 Apresentao de dados;
5 Resultado de procura de sites;
6 Aspecto grfico.
Como vamos usar uma s ASP para suportar todas as tarefas do
site, vamos implementar o que foi visto na lista em vrios ficheiros
*.inc (pode ter outra extenso) e us-los quando achamos necessrio,
dentro da estratgia do site. Fica ento assim o esquema seguinte
para se ter uma noo do que vai acontecer, e onde aparecem os
ficheiros de que falamos:

Fig. 7.3 - Esquema de ficheiros do motor de busca

186 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES


Ficamos assim com uma ideia dos ficheiros que vo ser usados e
quais as hierarquias envolvidas nos mesmos. Vamos ento descrever o que cada ficheiro tem:

Imagens,

C:\Inetpub\wwwroot\livro\motordebusca\imagens\Topo.jpg
ficheiro que representa a imagem de topo do site, includo no
cdigo HMTL do ficheiro topo.inc
C:\Inetpub\wwwroot\livro\motordebusca\imagens\Bprocurar.gif
ficheiro que representa o boto que se carrega para pesquisarmos
no motor, usado no ficheiro procura.inc
C:\Inetpub\wwwroot\livro\motordebusca\imagens\Bregistar.gif
como o nome indica o boto para registarmos os sites que
queiram figurar na BD do motor de busca; chamado no ficheiro
registar.inc

Ficheiros da pgina,
C:\Inetpub\wwwroot\livro\motordebusca\Default.asp
ficheiro que recebe os argumentos dos formulrios ou da linha de
comando do browser, e consoante o recebido consoante o ficheiro
que demonstrado na zona central da pgina;
C:\Inetpub\wwwroot\livro\loja\motordebusca\Funcoes.asp
aqui existe uma funo que usada em mais que um ficheiro, cuja
funo validar as plicas usadas nas strings, para que quando
usarmos a BD no apaream erros, visto que as mesmas so
usadas pela prpria BD;
C:\Inetpub\wwwroot\livro\motordebusca\includes\Fundo.inc
ficheiro com o desenho do fundo do site (esttico a 100%);
C:\Inetpub\wwwroot\livro\motordebusca\includes\Inicial.inc
esquema inicial, se no existirem argumentos no link, ser este
ficheiro a aparecer;
C:\Inetpub\wwwroot\livro\motordebusca\includes\Listagem.inc
depois de submetida a string de procura, aparecem todos os sites
relacionados, e este ficheiro que o vai fazer;
Verso digital, individual, licenciada em Jan/Fev do ano 2000, pelo Centro Atlntico, da verso 1.0 do livro 'Programao Web com ASP'

CAPTULO 7: EXEMPLOS REAIS 187


C:\Inetpub\wwwroot\livro\motordebusca\includes\Procura.inc
simplesmente o formulrio onde o utilizador vai inserir a string de
procura;
C:\Inetpub\wwwroot\livro\motordebusca\includes\Registar.inc
este vai ser o ficheiro que tem o formulrio de registo de todos os
sites que querem estar indexados no nosso motor de busca;
C:\Inetpub\wwwroot\livro\motordebusca\includes\Topo.inc
HTML com o desenho do topo do site (tambm como o fundo, 100%
esttico);
C:\Inetpub\wwwroot\livro\livro.mdb
ficheiro de base de dados onde figura a tabela de dados que
usamos neste exemplo.
A estrutura de directrios pode ser alterada pelo leitor desde que
todo o ambiente o acompanhe. Pretendo por ambiente referir-me
configurao do servidor de Internet, conexo BD, s referncias
a pginas, etc.
Agora podemos ir ver o cdigo de todos os ficheiros e falar da funo
de cada procedimento dentro dos mesmos, se esses existirem.

(ficheiro default.asp)

<!#INCLUDE FILE=includes/topo.inc>
<div align=center>
<table width=600"><tr>
<td align=top width=600">
<center><font size=2" face=Verdana><a href=default.asp>pgina
inicial</a>&nbsp;&nbsp;&nbsp;
<a href=default.asp?fazer=registar>registar site
</a>&nbsp;&nbsp;&nbsp;</font></center>
<%
fazer = Request.QueryString(fazer) vamos buscar o argumento fazer
Select Case fazer vamos ento chamar o ficheiro consoante o
argumento
Case procura se o argumento for procura foi submetida uma busca
e se foi submetida uma busca vamos mostrar o formulrio de busca
e incluir a listagem de sites identificados com essa procura
%>
<!#INCLUDE FILE=includes/procura.inc>
<!#INCLUDE FILE=includes/listagem.inc>

188 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES


<%
Case registar se o argumento for este porque vai haver um novo
registo
%>
<!#INCLUDE FILE=includes/registar.inc>
<%
Case Else se no existir argumento introduzimos a pgina inicial
%>
<!#INCLUDE FILE=includes/procura.inc>
<!#INCLUDE FILE=includes/inicial.inc>
<%
End Select
%>
</td>
</tr></table></div>
<p>&nbsp;</p>
<!#INCLUDE FILE=includes/fundo.inc>
O resultado do exemplo anterior est representado na figura seguinte. Reparar que neste exemplo o argumento fazer no existe, e por
isso os ficheiros introduzidos no meio do cdigo so os correspondentes em Case Else.

Fig. 7.4 - Aspecto geral da pgina principal


Verso digital, individual, licenciada em Jan/Fev do ano 2000, pelo Centro Atlntico, da verso 1.0 do livro 'Programao Web com ASP'

CAPTULO 7: EXEMPLOS REAIS 189


(ficheiro funcoes.asp)

<%
esta funo serve exclusivamente para acrescentar uma plica
por cada uma que existir nas strings a usar em declaraes de SQL
Function tira_plicas(texto)
Texto = trim(texto) desta maneira tiramos os espaos em branco ao
incio e fim da string
texto_temp = esta uma string temporria onde vamos construir
uma string que no tem uma plica sozinha
For i=1 to len(texto) loop para percorrer a string
if Mid(texto,i,1)= then se achar plica acrescenta mais uma
texto_temp=texto_temp &
else
texto_temp=texto_temp & Mid(texto,i,1)
end if
Next
Tira_plicas = texto_temp ao fazermos esta igualdade estamos
a devolver o resultado desta funo ( funo corrente = valor )
End Function
%>
O ficheiro funcoes.asp como que uma biblioteca que recorremos
que tem funes generalistas. Nestes exemplos s o usei para uma
funo, mas o leitor poder usar para vrios tipos de funes.
Depois de fazermos #INCLUDE de um destes ficheiros, todas as
funes e procedimentos a existentes so usados como se ao cdigo
do ficheiro inicial pertencessem.
(ficheiro topo.inc)

<HMTL>
<HEADER>
<TITLE>A R - o novo motor de busca com ASP</TITLE>
</HEADER>
<BODY>
<div align=center><table width=600">
<tr><td>
<img src=imagens/topo.jpg>
</td></tr>
</table></div>

Figura. 7.5 - Imagem do topo do site

190 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES


(ficheiro fundo.inc)

<div align=center><table width=600">


<tr bgcolor=#8AC491"><td>
&nbsp;
</td></tr>
<tr><td>
<center><font size=2" face=ARIAL>(1999) Portugal, todos os direitos
reservados<br>para IE4+ & NN4+</font></center>
</td></tr>
</table></div>
</BODY>
</HTML>
O ficheiro inicial representa tudo aquilo que aparece na primeira pgina
aquando da chamada do site. Alm de incluirmos o formulrio de
pesquisa pertencente ao ficheiro procura.inc, introduzimos tambm
inicial.inc, que o que demonstra os ltimos links registados no nosso
site.
(ficheiro inicial.inc)

<br><br>
<p><font size=2" face=Verdana>Use este motor de busca, para adicionar os seus links ou procurar a pgina que tanto procura.
No se esquea de que este servio gratuito, por isso pode divulg-lo
por todos os seus amigos.<br>
Agradeo a sua visita e espero que goste...
</font></p>
<br><font face=Verdana color=blue>Os ltimos links adicionados
foram:</font><br><br>
<%
Set Conn = Server.CreateObject(ADODB.Connection)
Conn.open DSN=livrodsn;
Set rs = Server.CreateObject(ADODB.Recordset)
SQLStmt = SELECT url, titulo, data, descricao
SQLStmt = SQLStmt & FROM motorbusca ORDER BY data DESC
rs.Open SQLstmt,Conn,1,2
voltas=0 varivel para controlamros o nmero de registos a mostrar
na primeira pgina, ou, pgina inicial
enquanto no forem demonstrados os ltimos 5 links o loop executa-se
while NOT rs.EOF and voltas<5
response.write <p><font size=2' face=ARIAL>
response.write > <b><font size=3'><a href=
response.write rs.fields(url) & target=_blank>
response.write rs.fields(titulo) & </a></font></b><br>
response.write left(rs.fields(descricao),400)
Verso digital, individual, licenciada em Jan/Fev do ano 2000, pelo Centro Atlntico, da verso 1.0 do livro 'Programao Web com ASP'

CAPTULO 7: EXEMPLOS REAIS 191


usa-se a funo left para controlarmos o nmero de caracteres da
descrio
que queremos ver no site
response.write <small>submetido em & rs.fields(data)
response.write com o URL <a href= & rs.fields(url) &
target=_blank>
response.write rs.fields(url) & </a></small><br>
response.write </font></p>
voltas=voltas+1 incrementamos as voltas para controlo do nmero de
links a ver
rs.movenext movemos o cursor da Base de Dados para a prxima
posio
wend
rs.close fechamos o RecordSet
%>

(ficheiro procura.inc)

<br><div align=center>
<table border=1" cellspacing=0" cellpadding=2" width=400"
bordercolor=black><tr bgcolor=#8AC491"><td>
<FORM action=default.asp?fazer=procura method=POST>
<font face=ARIAL color=white>&nbsp;<b>insira a string de procura
</b></font><br>
<input type=text name=textoprocura
value=<%=request.form(textoprocura)%> size=40">
<input type=image border=0" src=imagens/bprocurar.gif>
</FORM>
</td></tr></table></div>

Fig. 7.6 - Tabela de procura

192 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES


(ficheiro listagem.inc)

<!#INCLUDE FILE=funcoes.asp><br><font face=Verdana


color=blue>
Resultado da
procura__________________________________________
</font><br><br>
<%
usamos aqui ento a funo que est em funcoes.asp para
tirar as plicas
da string que vem do formulrio de procura
stringprocura = tira_plicas(request.form(textoprocura))
depois da plica retirada fazemos ento a declarao de SQL
para procurarmos
a mesma no campo descricao
SQLStmt = SELECT url, titulo, data, descricao FROM
motorbusca
SQLStmt = SQLStmt & WHERE descricao LIKE
%&stringprocura&%
Set Conn = Server.CreateObject(ADODB.Connection)
Conn.open DSN=livrodsn;
Set rs = Server.CreateObject(ADODB.Recordset)
SQLStmt = SQLStmt & ORDER BY data DESC
rs.Open SQLstmt,Conn,1,2
if rs.eof then se chegarmos ao final da BD ento nada existe
response.write <p>&nbsp;</p>
response.write <br><br><font face=Verdana size=2'
color=blue><b>
response.write No foram encontrados registos...</b>
</font><br>
response.write <p>&nbsp;</p><p>&nbsp;</p><p>&nbsp;</p>
end if
while NOT rs.EOF seja como for, se existir, vamos mostrar
response.write <p><font size=2' face=ARIAL>
response.write > <b><font size=3'><a href= & rs.fields(url)
response.write target=_blank> & rs.fields(titulo) & </a>
</font></b><br>
response.write left(rs.fields(descricao),400)
response.write <br><small>submetido em & rs.fields(data)
response.write com o URL <a href= & rs.fields(url) &
target=_blank>
response.write rs.fields(url) & </a></small><br>
response.write </font></p>
rs.movenext
wend
rs.close
%>
Verso digital, individual, licenciada em Jan/Fev do ano 2000, pelo Centro Atlntico, da verso 1.0 do livro 'Programao Web com ASP'

CAPTULO 7: EXEMPLOS REAIS 193


Com as listagens recebemos a string de procura e fazemos uma
pesquisa com base na mesma. Se introduzirmos Internet, obtemos
um resultado como o da imagem seguinte.

Fig. 7.7 - Resultado da procura feita por


Internet nos sites existentes em BD

(ficheiro registar.inc)

<%
esta primeira funo vai ver se o site que queremos registar j existe
Function procura_repetido( link )
SQLStmt = SELECT url FROM MOTORBUSCA WHERE
url = &link&
rs.Open SQLstmt,Conn,1,2
if rs.eof then se no existir esse link
rs.close
procura_repetido = 0 a funo devolve o nmero 0
else caso contrrio
rs.close
procura_repetido = 1 a funo acha e devolve 1
end if
End Function
no procedimento seguinte posto o formulrio de registo no browser para
preenchimento
Sub formulario_registo()%>

194 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES


<br><br>
<div align=center>
<table border=1" cellspacing=0" cellpadding=2" width=400"
bordercolor=black><tr bgcolor=#8AC491"><td>
<FORM action=default.asp?fazer=registar&como=fazer method=POST>
<font face=ARIAL color=white>&nbsp;<b>Insira o URL do site que quer
registar</b></font><br>
<input type=text name=urlsite value=http:// size=52"><br>
<font face=ARIAL color=white>&nbsp;<b>ttulo do site</b></font>
<input type=text name=titulo size=30"><br>
<font face=ARIAL color=white>&nbsp;<b>breve descrio
</b></font>
<br><textarea name=descricao cols=44 rows=3></textarea><br><br>
<center><input type=image border=0" src=imagens/bregistar.gif>
</center>
</FORM>
</td></tr></table></div>
<%End Sub
o procedimento seguinte introduz os dados do registo
Sub introduzir_registo()
vamos buscar os dados introduzidos no formulrio
urlsite = request.form(urlsite) dados do formulrio no campo urlsite
titulo = request.form(titulo) dados do formulrio no campo ttulo
descricao = request.form(descricao) dados do formulrio no campo
descricao
OK=1 esta varivel vai controlar se aparecem erros
com o valor 1, sabemos que no existem erros
nos dados introduzidos em formulrio
if InStr(1, urlsite, http://, 1)<>1 then verificamos se existe http:// na string do url
OK = 0 se introduzirmos 0 porque j existe um erro
sempre que OK ficar a zero descrevemos o erro encontrado
Response.write &nbsp;<font color=red> - o link para o site no
vlido</font>
Else
vamos tambm certificar-nos do tamanho das strings
pois estas tm de ter os requisitos que quisermos e em
conformidade com a BD
if (len(urlsite)<12 or len(urlsite)>250)then
OK = 0
response.write &nbsp;<font color=red> - o link para o site no
vlido</font>
end if
end if
Verso digital, individual, licenciada em Jan/Fev do ano 2000, pelo Centro Atlntico, da verso 1.0 do livro 'Programao Web com ASP'

CAPTULO 7: EXEMPLOS REAIS 195


if Len(titulo)<4 or len(titulo)>80 then
OK = 0
response.write &nbsp;<font color=red>
response.write - o ttulo dado para o site no vlido</font>
end if
if Len(descricao)<12 or len(descricao)>400 then
OK = 0
response.write &nbsp;<font color=red>
response.write - a descrio do site no vlido</font>
end if
if (procura_repetido(urlsite)) = 1 then
OK = 0
Response.write &nbsp;<font color=red>
Response.write - o site que introduziu j foi registado
anteriormente</font>
end if
if OK=1 then se OK=1 ento no houve erros, vamos introduzir os dados
em BD
SQLStmt = INSERT INTO MOTORBUSCA (url, titulo, descricao, data)
VALUES
SQLStmt = SQLStmt & (&urlsite&, &titulo&,
SQLStmt = SQLStmt & &descricao&, &now()&)
rs.Open SQLstmt,Conn,1,2
response.write <p><br><br><font face=Verdana color=blue>
response.write O site & request.form(urlsite) & foi registado...</font></p>
else no caso de haverem erros, voltamos a introduzir o formulrio para
preencher
formulario_registo()
end if
End Sub%>
<%
Set Conn = Server.CreateObject(ADODB.Connection)
Conn.open DSN=livrodsn;
Set rs = Server.CreateObject(ADODB.Recordset)
o nosso argumento como, e se for fazer vamos introduzir um registo
If request.querystring(como)=fazer then
Introduzir_registo()
Else se no for introduzir vamos pedir os dados mostrando o formulrio
Formulario_registo()
end if
%>

196 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES

Fig. 7.8 - Formulrio de registo de site

No caso de um dos campos que vem do formulrio no ter a


informao correcta, alm de no ser introduzido, so mostradas
mensagens de erro tal como se v na figura seguinte pois o url no
vlido.

Fig. 7.9 - Erro dado devido ao URL no ser vlido

Depois de uma correcta introduo de dados obtemos uma


mensagem de aprovao.

Fig. 7.10 - Resposta depois do registo efectuado


Verso digital, individual, licenciada em Jan/Fev do ano 2000, pelo Centro Atlntico, da verso 1.0 do livro 'Programao Web com ASP'

CAPTULO 7: EXEMPLOS REAIS 197

7.3 A Loja: Loja E-Commerce


Este exemplo ter uma estrutura mais complexa devido ao volume
de dados que estaro envolvidos, mas a nvel profissional uma
estrutura muito simples que em nada vai complicar a vida queles
que vivem da programao com bases de dados.
A BD ter ento de ter uma tabela em que guardaremos a informao de todos os produtos, outra para a informao das encomendas recebidas, e claro a ltima que guarda a informao dos produtos que pertencem a cada uma das encomendas. No vamos j
falar da maneira como organizar isso tudo a nvel de programao,
mas necessrio o leitor saber o que vai ser usado neste exemplo.
O uso de ficheiros idntico ao do exemplo do motor de busca. S
temos que estruturar a base de dados e definir as funes que vamos precisar em funo das nossas necessidades.
Podemos ver que vamos precisar de ter produtos em BD, e temos
de os ter registados. O nome das imagens referentes a cada produto lv seguido do identificador do mesmo - quando o programador
fizer o interface de administrao do lado do servidor ter de ter em
conta este aspecto.
O esquema da base de dados ento:

TABELA: PRODUTOS
Id_produtos
Titulo
Autor
N_Paginas
Isbn
Preco
Mes_edicao
Ano_edicao
introducao

Auto-number; identificador interno da BD de


cada produto
Text (80); ttulo do livro
Text (60); nome do autor (es) do livro
Number; nmero de pginas do livro
Text (25); numero de fbrica do livro, algo
como os cdigos de barras
Number; o preo de venda ao pblico do livro
Number; o ms em que o livro foi editado
Number; o ano em que saiu o livro
Memo; uma introduo ao livro

198 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES


TABELA: ENCOMENDAS
Id_encomenda Auto-number; identificador da encomenda
Data
Date/Time; data em que a encomenda foi
realizada
Nome
Text (50); nome do comprador
Morada
Text (180); morada do comprador
CP
Text (9); cdigo postal do comprador
Localidade
Text (40); localidade
Telefone
Text (10); telefone de contacto do cliente
Email
Text (40); o e-mail do cliente
Total_valor
Number; valor total a pagar
Numero_visa
Text (16); nmero do carto de crdito do
cliente
Nome_visa
Text (20); nome do portador do carto de
crdito que vai pagar a encomenda
Data_visa
Text (5); data de validade do carto de
crdito

O valor do total da compra usado nesta tabela para que fique


registado o preo a pagar e no ser precisa uma pesquisa aos
produtos por cada vez que se queira saber o total final.

TABELA: PROD_ENCOMENDAS
Id_prod_encomendas
Auto-number; identificador dos
produtos encomendados referentes a cada
encomenda
Id_encomenda Number; identificador da encomenda na
tabela encomendas
Id_produto
Number; identificador dos produtos
referenciados na tabela produtos
Quantidade
Number; quantidade do produto
encomendada
Preco
Number; preo a que foi comprado o
produto

Verso digital, individual, licenciada em Jan/Fev do ano 2000, pelo Centro Atlntico, da verso 1.0 do livro 'Programao Web com ASP'

CAPTULO 7: EXEMPLOS REAIS 199

Fig. 7.11 - A relao das tabelas da BD da nossa loja

Vamos ento indicar quais os aspectos principais deste site:


1 Aspecto da Pgina inicial;
2 Formulrio de procura de produtos;
3 Apresentao de resultados da procura;
4 Carrinho de compras - criao e actualizao;
5 Sada e pagamento;
6 Aspecto grfico.

Neste site tambm vamos usar uma s ASP (como no motor de


busca) para suportar todas as tarefas do site. Vamos implementar
ento mais uma lista de vrios ficheiros *.inc (no esquecer que
podem ter outra extenso) e us-los quando acharmos necessrio,
dentro do contexto do site. O esquema de ficheiros deste site ento
o seguinte:

200 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES

Fig. 7.12 - Esquema de ficheiros da loja

Vamos ento descrever qual a participao que cada ficheiro tem


neste site:
Imagens,

Topo.jpg
ficheiro que representa a imagem de topo do site; includo no cdigo
HMTL do ficheiro topo.inc, tal como no motor de busca, claro que
com a particularidade de ser uma imagem diferente;
Bprocurar.gif
ficheiro que representa o boto que se carrega para fazermos procura de um livro; usado no ficheiro topo.inc
Brecalcular.gif
o boto que refaz os clculos no nosso carrinho de compras depois de introduzido novo produto, ou de termos alterada alguma quantidade; chamado no ficheiro carrinhor.inc
Bfinalizar.gif
ficheiro que representa o boto que se carrega para finalizarmos
uma compra online; usado no ficheiro pagar.inc
Verso digital, individual, licenciada em Jan/Fev do ano 2000, pelo Centro Atlntico, da verso 1.0 do livro 'Programao Web com ASP'

CAPTULO 7: EXEMPLOS REAIS 201

Bpagar.gif
ficheiro que representa o boto que se carrega para passarmos
fase de finalizao de pagamento de uma nova encomenda; usado
no ficheiro carrinho.inc
Carrinho.gif
como se pode prever o desenho do carrinho de compras, que
depois de carregado faz-nos aceder zona de produtos j escolhidos; chamado no ficheiro topo.inc
Casa.gif
o ficheiro que nos encaminha para a pgina inicial; chamado no
ficheiro topo.inc
Pagar.gif
faz a chamada da zona onde se voi introduzir os dados pessoais
para finalizao da compra; chamado no ficheiro topo.inc

Ficheiros da pgina,

C:\Inetpub\wwwroot\livro\loja\Default.asp
ficheiro que recebe os argumentos dos formulrios ou do campo de
endereo do browser, e consoante o recebido consoante o ficheiro
que demonstrado na zona central da pgina;
C:\Inetpub\wwwroot\livro\loja\loja\Funcoes.asp
aqui existe uma funo que usada em mais que um ficheiro, que
tal e qual a do motor de busca usada para validar as plicas usadas
nas strings, para que quando usarmos a BD no apaream erros,
visto que as mesmas so usadas pela prpria BD. Este cdigo
idntico ao do motor de busca;
C:\Inetpub\wwwroot\livro\loja\includes\Fundo.inc
ficheiro com o desenho do fundo do site (esttico a 100%);
C:\Inetpub\wwwroot\livro\loja\includes\Inicial.inc
esquema inicial. Se no existirem argumentos no link, ser este ficheiro a aparecer;

C:\Inetpub\wwwroot\livro\motordebusca\includes\Listagem.inc
depois de submetida a string de procura, aparecem todos os sites
relacionados, e este ficheiro que o vai fazer;

202 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES


C:\Inetpub\wwwroot\livro\loja\includes\Topo.inc
HTML com o desenho do topo do site (tambm como o fundo, 100%
esttico);
C:\Inetpub\wwwroot\livro\loja\includes\Pagar.inc
local onde so feitos os pagamentos, aquilo a que podemos chamar
de check-out;
C:\Inetpub\wwwroot\livro\livro.mdb
ficheiro de base de dados onde figura a tabela de dados que usamos neste exemplo.

A estrutura de directrios foi a usada para o exemplo anterior, mas o


leitor pode fazer alteraes na sua estrutura desde que todo o
ambiente o acompanhe. Entendo por ambiente a configurao do
servidor de Internet, a conexo BD, as referncias a pginas, etc.
Agora podemos ver o cdigo de todos os ficheiros e falar da funo
de cada procedimento dentro dos mesmos, se esses existirem.
O resultado do ficheiro global.asa a seguir tem tambm tudo aquilo
que foi introduzido durante este manual, mas est em negrito aquilo
que foi criado exclusivamente para a loja.
O truque est em criar um array, que ficar dentro de uma sesso,
e desta maneira toda a informao do carrinho de compras estar
definida para cada sesso (sempre diferentes e sem possibilidade
de confuso).
Cada vez que for introduzido um produto ser verificado o array para
ver se o mesmo j existe, e se existir acrescentamos mais uma
unidade. No caso de se querer introduzir a quantidade, ser feita
uma alterao.
Ter de ser feito sempre um redimensionamento do array para o
mesmo funcionar na perfeio, mas isso j vai ser visto.
(ficheiro global.asa)

<SCRIPT LANGUAGE=VBScript RUNAT=Server>


Sub Application_OnStart
Session.Timeout = 3
Application.Lock
Application(utilizadores) = 0
Application.UnLock
Application(linha1)=
Application(linha2)=
Verso digital, individual, licenciada em Jan/Fev do ano 2000, pelo Centro Atlntico, da verso 1.0 do livro 'Programao Web com ASP'

CAPTULO 7: EXEMPLOS REAIS 203


Application(linha3)=
Application(linha4)=
Application(linha5)=
Application(linha6)=
Application(linha7)=
Application(linha8)=
Application(linha9)=
Application(linha10)=
Application(linha11)=
Application(linha12)=
Application(linha13)=
Application(linha14)=
Application(linha15)=
Application(linha16)=
Application(linha17)=
Application(linha18)=
End Sub
Sub Session_OnStart
Application.Lock
Application(utilizadores) = Application(utilizadores) + 1
Application.UnLock
DADOS PARA A LOJA
Dim produtos_id(0), produtos_quantidade(0)
produtos_id(0) = 0 array de produtos no carrinho de compras
produtos_quantidade(0) = 0 array com as respectivas quantidades
vamos ento introduzir esta informao para as sesses
desta maneira cada sesso ter o seu carrinho e no
existiro confuses entre clientes. So inicializados vazios
session(matriz_produtos) = produtos_id
session(matriz_quantidade) = produtos_quantidade
FORAM DADOS PARA A LOJA
End Sub
Sub Session_OnEnd
Application.Lock
Application(utilizadores) = Application(utilizadores) 1
Application.UnLock
End Sub
Sub Application_OnEnd
End Sub
</SCRIPT>

204 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES


(ficheiro default.asp)

<!#INCLUDE FILE=includes/topo.inc>
<div align=center>
<table width=600"><tr>
<td align=top width=600">
<%
o sistema de busca dos argumentos idntico ao do motor de busca
fazer = Request.QueryString(fazer)
Select Case fazer
Case carrinho se for escolhido o carrinho vamos mostrar o carrinho
%>
<!#INCLUDE FILE=includes/carrinho.inc>
<% Case pagar neste caso o utilizador vai pagar o escolhido %>
<!#INCLUDE FILE=includes/pagar.inc>
<%
Case procura se houver procura vai-se mostrar a listagem de
resultados
%>
<!#INCLUDE FILE=includes/listagem.inc>
<%
Case Else se o argumento no existir mostramos a pgina inicial
%>
<!#INCLUDE FILE=includes/inicial.inc>
<%
End Select
%>
</td>
</tr></table></div>
<p>&nbsp;</p>
<!#INCLUDE FILE=includes/fundo.inc>

Fig. 7.13 - Aspecto da pgina inicial da Loja


Verso digital, individual, licenciada em Jan/Fev do ano 2000, pelo Centro Atlntico, da verso 1.0 do livro 'Programao Web com ASP'

CAPTULO 7: EXEMPLOS REAIS 205


A seguinte funo idntica do motor de busca. uma funo
para que no obtenhamos erro nas declaraes de SQL

(ficheiro funcoes.asp)

<%
Function tira_plicas(texto)
texto = trim(texto)
texto_temp =
For i=1 to len(texto)
if Mid(texto,i,1)= then
texto_temp=texto_temp &
else
texto_temp=texto_temp & Mid(texto,i,1)
end if
Next
tira_plicas = texto_temp
End Function
%>

(ficheiro topo.inc)

<HMTL>
<HEADER>
<TITLE>A Loja - a nova loja on-line feita com ASP</TITLE>
</HEADER>
<BODY>
<div align=center><table width=600">
<tr><td>
<img src=imagens/topo.jpg>
</td></tr>
<tr><td>
<center>
<FORM action=default.asp?fazer=procura method=POST>
<table width=400" cellpadding=0" cellspacing=0" border=0"><tr>
<td valign=top>
<font size=2" face=Verdana><a href=default.asp>
<img border=0" alt=Voltar pgina inicial src=imagens/casa.jpg>
</a>&nbsp;&nbsp;&nbsp;</td>
<td valign=top><font size=2" face=Verdana>
<a href=default.asp?fazer=carrinho>
<img border=0" alt=Ver carrinho de compras
src=imagens/carrinho.jpg></a>&nbsp;&nbsp;&nbsp;</td>
<td valign=top><font size=2" face=Verdana>
<a href=default.asp?fazer=pagar>

206 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES


<img border=0" alt=Pagar e sair da loja src=imagens/pagar.jpg>
</a>&nbsp;&nbsp;&nbsp;</td>
<td valign=top align=right><input type=text name=textoprocura
value=<%=request.form(textoprocura)%> size=12">
<br>
<% a declarao em ASP anterior para garantirmos que aparece
na caixa de procura a ltima string
queremos tambm manter a ltima escolha e por isso
vamos comparar os dados deixados pelo formulrio anterior
garantindo que os RADIO BUTTONS estejam correctos
if request.form(tipoprocura)= autor then
autor=checked assim escreveremos checked
else
if request.form(tipoprocura)= titulo then
titulo=checked
else
autor=checked
end if
end if
%>
<input type=radio <%=autor%> value=autor name=tipoprocura>autor
<input type=radio <%=titulo%> name=tipoprocura value=titulo>titulo
</td><td valign=top>
<input type=image border=0" src=imagens/bprocurar.jpg>
</td></tr></table>
</FORM>
</center>
</td></tr>
</table></div>

Fig. 7.14 - Aspecto do ficheiro topo.inc em separado

Verso digital, individual, licenciada em Jan/Fev do ano 2000, pelo Centro Atlntico, da verso 1.0 do livro 'Programao Web com ASP'

CAPTULO 7: EXEMPLOS REAIS 207


Ao acedermos sempre aos dados anteriores (submetidos pelo
formulrio), garantimos que nunca perdemos os dados enviados, e
assim deixamos o utilizador saber qual foi a ltima string de procura
que fez, e de que tipo (autor ou ttulo). Para isso basta que os campos estejam sempre iguais informao que os mesmos enviaram
na ltima insero.
(ficheiro fundo.inc)

<div align=center><table width=600">


<tr bgcolor=#409AC9"><td>
&nbsp;
</td></tr>
<tr><td>
<center><font size=2" face=ARIAL>(1999) Portugal, todos os direitos
reservados<br>para IE4+ & NN4+</font></center>
</td></tr>
</table></div>
</BODY>
</HTML>

No ficheiro seguinte iremos ento mostrar o ltimo produto disponvel


pois se todos os dias aparecer algo de novo ser uma boa maneira
de o promover.

(ficheiro inicial.inc)

<br><br>
<p><b><font size=2" face=Verdana>Use esta loja online, para procurar
e comprar o livro que tanto procura.
No se esquea de que este servio gratuito, por isso pode divulgar por
todos os seus amigos.<br>
Agradeo a sua visita e espero que goste...
</font></b></p>
<br><font face=Verdana color=blue>A mais recente novidade:
</font><br><br>
<%
Set Conn = Server.CreateObject(ADODB.Connection)
Conn.open DSN=livrodsn;
Set rs = Server.CreateObject(ADODB.Recordset)
SQLStmt = SELECT id_produto, titulo, introducao, autor, preco
SQLStmt = SQLStmt & FROM produtos ORDER BY id_produto ASC
rs.Open SQLstmt,Conn,1,2 foi executada a procura
rs.movelast vamos mover o cursor para a ltima posio
response.write <p><font size=3' face=ARIAL><b>

208 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES


response.write rs.fields(titulo) & </b></font><br>
response.write <font size=2' face=Verdana>escrito por <b>
response.write rs.fields(autor) &</b></font></p>
response.write <table><tr><td valign=top>
response.write <img border=0src=imagens/produtos/lv
response.write rs.fields(id_produto)&.gif>
da maneira anterior iremos imprimir a imagem no ecr
recorrendo ao identificador da mesma, visto o formato adoptado
para os nomes das imagens ser
sempre o mesmo lv(numero identificador).gif
response.write <br><center><small><b>
vamos formatar o nosso nmero para a moeda local (do servidor)
response.write formatcurrency(rs.fields(preco))
response.write </b></small></center>
response.write </font></td><td valign=top><font face=arial size=2'>
response.write left(rs.fields(introducao),400) & ...</font><p>
response.write [&nbsp;
<a href=default.asp?fazer=carrinho&como=adicionar&qual=
response.write rs.fields(id_produto)&>
o argumento qual vai ficar com o identificador do produto
mais tarde usado para introduzir no carrinho de compras
response.write <font size=2' face=Verdana>adicionar ao carrinho
</a></font>&nbsp;]</p>
response.write </td></tr></table>
rs.close
%>

(ficheiro listagem.inc)

<!#INCLUDE FILE=funcoes.asp><br><font face=Verdana


color=blue>
Resultado da
procura__________________________________________
</font><br><br>
<% Set Conn = Server.CreateObject(ADODB.Connection)
Conn.open DSN=livrodsn;
Set rs = Server.CreateObject(ADODB.Recordset)
stringprocura = tira_plicas(request.form(textoprocura))
SQLStmt = SELECT id_produto, titulo, introducao, autor, isbn, SQLStmt
= SQLStmt & mes_edicao, ano_edicao, n_paginas, preco FROM
produtos
SQLStmt = SQLStmt & WHERE & request.form(tipoprocura)
SQLStmt = SQLStmt & LIKE % & stringprocura & % da maneira
feita anteriormente facultado pelo formulrio de procura
no s a string, mas o campo da BD que vai ser pesquisado
Verso digital, individual, licenciada em Jan/Fev do ano 2000, pelo Centro Atlntico, da verso 1.0 do livro 'Programao Web com ASP'

CAPTULO 7: EXEMPLOS REAIS 209


e isso porque o VALUE do formulrio tem os valores iguais
aos nomes dos campos da base de dados
rs.Open SQLstmt,Conn,1,2
if rs.eof then
response.write <p>&nbsp;</p>
response.write <br><br><font face=Verdana size=2'
color=blue><b>
response.write No foram encontrados registos...</b></font><br>
response.write <p>&nbsp;</p><p>&nbsp;</p><p>&nbsp;</p>
end if
conta = 0 esta varivel vai ser utilizada para que as imagens
e disposio dos dados dos produtos alternem de linha em
linha. Mais ou menos como o mtodo usado para a mudana de cor
por cada linha da tabela
while NOT rs.EOF
response.write <p><font size=3' face=ARIAL><b>
response.write rs.fields(titulo) & </b></font><br>
response.write <font size=2' face=Verdana>escrito por <b>
response.write rs.fields(autor)
response.write </b><small><i>&nbsp;(ISBN:&rs.fields(isbn)&)
response.write </i></small></font></p>
response.write <table><tr>
if conta = 0 then
response.write <td valign=top><img width=93' heigth=103'
response.write border=0src=imagens/produtos/lv
response.write rs.fields(id_produto)&.gif>
response.write <br><center><small><b>
response.write formatcurrency(rs.fields(preco))
response.write </b></small></center>
response.write </td><td valign=top>
response.write <font face=arial size=2'>
response.write left(rs.fields(introducao),400)
response.write ...<br><b>(&nbsp;edio de
response.write rs.fields(mes_edicao)&/&rs.fields(ano_edicao)
response.write &nbsp;)</b></font>
response.write &nbsp;&nbsp;<small>livro com
response.write rs.fields(n_paginas) & pginas.</small><p>
response.write [&nbsp;
<a ref=default.asp?fazer=carrinho&como=adicionar&qual=
response.write rs.fields(id_produto)&>
response.write <font size=2' face=Verdana>adicionar ao
response.write carrinho</a></font>&nbsp;]</p>
conta = 1 a partir daqui a prxima disposio ser diferente
else
response.write <td valign=top><font face=arial size=2'>

210 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES


response.write left(rs.fields(introducao),400)
response.write ...<br><b>(&nbsp;edio de
&rs.fields(mes_edicao)&/
response.write rs.fields(ano_edicao)&&nbsp;)</b></font>
response.write &nbsp;&nbsp;<small>livro com
& rs.fields(n_paginas)
response.write pginas.</small><p>
response.write [&nbsp;
<a href=default.asp?fazer=carrinho&como=adicionar&qual=
response.write rs.fields(id_produto)&>
response.write <font size=2' face=Verdana>adicionar ao
response.write carrinho</a></font>&nbsp;]</p>
response.write </td><td valign=top>
response.write <img width=93' heigth=103' border=0'
response.write
src=imagens/produtos/lv&rs.fields(id_produto)&.gif>
response.write <br><center><small><b>
& formatcurrency(rs.fields(preco))
response.write </b></small></center>
conta = 0
end if
response.write </td></tr></table>
rs.movenext move-se para os dados seguintes
wend
rs.close
%>

Fig. 7.15 - Aspecto do site depois de uma


procura por Internet em ttulos
Verso digital, individual, licenciada em Jan/Fev do ano 2000, pelo Centro Atlntico, da verso 1.0 do livro 'Programao Web com ASP'

CAPTULO 7: EXEMPLOS REAIS 211


(ficheiro carrinho.inc)

<% este procedimento faz com que vejamos os dados que esto em
carrinho
Sub ver_carrinho()
Produtos_info = session(matriz_produtos) vamos buscar os dados
dos produtos
Quantidade_info = session(matriz_quantidade) e respectivas
quantidades
produtos_num = ubound(produtos_info) tirar o nmero de produtos
em carrinho
if produtos_num <1 then se forem menos de 1 ento est vazio
response.write <p>&nbsp</p><p>&nbsp</p><p><center>
response.write <font size=4' color=red>o carrinho ainda est
vazio..</font>
response.write </center></p><p>&nbsp</p><p>&nbsp</p>
exit sub saimos forosamente do procedimento
end if
num_produtos = 0
vamos construir a tabela
response.write <div align=center>
response.write <table width=600' border=1'
response.write bordercolor=#409AC9' cellspacing=0'><tr>
response.write <td width=20'>
response.write Qt.
response.write </td>
response.write <td>
response.write ISBN
response.write </td>
response.write <td>
response.write Titulo da Obra
response.write </td>
response.write <td>
response.write Preo
response.write </td>
response.write <td>
response.write Total
response.write </td></tr>
response.write <form action=default.asp?fazer=carrinho&
response.write como=calcula method=POST>
total_preco = 0 varivel que vai calcular o preo total da encomenda
total_produtos = 0 vai calcular o nmero total de produtos
no podemos usar o produtos_num pois este diz quantos
produtos diferentes e no quantos produtos (quantidade)
for i=1 to produtos_num
SQLStmt = SELECT id_produto, isbn, titulo, preco FROM produtos

212 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES


SQLStmt = SQLStmt & WHERE id_produto = & produtos_info(I)
rs.Open SQLstmt,Conn,1,2
response.write <tr><td width=40'><center>
response.write <input type=text name=quant&i&
response.write value= & quantidade_info(i) & size=2
maxlength=2>
response.write </center></td>
response.write <td><font face=arial size=1'>
response.write rs.fields(isbn)
response.write </font></td>
response.write <td><font face=arial size=2'><b>
response.write left(rs.fields(titulo), 34)
response.write </b></font></td>
response.write <td><font face=arial size=2'>
response.write formatCurrency(rs.fields(preco))
response.write </font></td>
response.write <td>
valor = (rs.fields(preco) * quantidade_info(i) )
response.write formatCurrency(valor)
response.write </td></tr>
aqui vamos actualizando o valor total do preo
total_preco = total_preco + (rs.fields(preco)
* quantidade_info(i) )
total_produtos = total_produtos + quantidade_info(I)
rs.close
next
response.write </table>
response.write <p><table width=460' border=1'
response.write bordercolor=#409AC9' cellspacing=1'><tr>
response.write <td bgcolor=#409AC9'>
response.write <font color=white face=Verdana size=2'>Despesas
com
response.write transportes</font><br>
response.write <small>(600$00 por encomenda e mais 200$00
response.write por cada livro )</small>
response.write </td>
response.write <td>
session(valor_d) = (600+ (200*total_produtos)) esta sesso vai
guardar o valor total por despesas em transportes na varivel de
sesso valor_d
response.write formatCurrency(session(valor_d))
response.write </td></tr><tr>
response.write <td bgcolor=#409AC9'>
response.write <font color=white face=Verdana size=2'>TOTAL
</font><br>
response.write <small>(transportes + livros)</small>

Verso digital, individual, licenciada em Jan/Fev do ano 2000, pelo Centro Atlntico, da verso 1.0 do livro 'Programao Web com ASP'

CAPTULO 7: EXEMPLOS REAIS 213


response.write </td>
response.write <td>
guardar na sesso valor_t, o valor total a pagar pelo cliente
session(valor_t) = session(valor_d) + total_preco
response.write formatCurrency( session(valor_t) )
response.write </td>
response.write </tr></table></p>
response.write <p><input type=image border=0' src=imagens/
brecalcular.jpg>
response.write <a href=default.asp?fazer=pagar>
response.write <img border=0' src=imagens/bpagar.jpg></a>
response.write </p></form></div>
End Sub
a seguir vamos criar o procedimento que faz os clculos,
como quando queremos 10 unidades de um produto e carregamos em
recalcular
Sub calcula()
Produtos_info = session(matriz_produtos) vamos buscar os produtos
em carrinho
Quantidade_info = session(matriz_quantidade) buscar as respectivas
quantidades
Produtos_num = ubound(produtos_info)
Passou = 0 para controlar se apareceu uma quantidade igual a 0
i = 1 vamos inicializar I a 1 para percorrermos todo o array
while i <= produtos_num
if passou=0 then
form = request.form(quant&i) vamos buscar o prximo valor do formulrio
else se a quantidade foi igual a 0 ento adiantamo-nos uma casa
mais que o usual
pois a posio do momento ser igual prxima
form = request.form(quant&I+1)
end if
if int(request.form(quant&i))<>0 then se o valor do formulrio for
diferente de 0
nova_quantidade = int(form) vamos aceder nova quantidade
quantidade_info(i) = nova_quantidade introduzi-la no array
else
if (i < produtos_num) then
se ainda no chegmos ao fim incrementamos a quantidade
quantidade_info(i) = quantidade_info(i+1)
for j=i to (produtos_num-1)
quantidade_info(j) = quantidade_info(j+1)
produtos_info(j) = produtos_info(j+1)

214 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES


next
passou = 1
end If
como vai ser alterado o tamanho do array o mesmo tem de usar redim
para ser redimencionado
redim Preserve produtos_info(produtos_num-1)
redim Preserve quantidade_info(produtos_num-1)
produtos_num = ubound(produtos_info)
end if
i=i+1
wend
no final actualizamos as sesses
session(matriz_produtos) = produtos_info
session(matriz_quantidade) = quantidade_info
End Sub
este procedimento adiciona um produto ao carrinho de compras
Sub adicionar(qual)
Produtos_info = session(matriz_produtos)
Quantidade_info = session(matriz_quantidade)
Produtos_num = ubound(produtos_info)
Temporario = 0 esta varivel temporria vai guardar os valores anteriores
if produtos_num>0 then se existirem mais de 0 produtos
for I=1 to produtos_num vamos percorr-los
if produtos_info(i) = qual then se acharmos o produto
temporario = I
exit for
end if
next
end if
if temporario = 0 then se no for achado nenhum produto
temporario = produtos_num + 1 vamos incrementar uma posio no array
esse incremento respondido com um redimensionamento do array
redim Preserve produtos_info(temporario)
redim Preserve quantidade_info(temporario)
vamso buscar o identificador do produto a acrescentar
produtos_info(temporario) = qual
quantidade_info(temporario) = 1 o mesmo vai-se inicializar com o
valor 1
else seno vamos acrescentar uma unidade ao produto que j
existe em array
quantidade_info(temporario) = quantidade_info(temporario) + 1
end if
session(matriz_produtos) = produtos_info
session(matriz_quantidade) = quantidade_info
End Sub

Verso digital, individual, licenciada em Jan/Fev do ano 2000, pelo Centro Atlntico, da verso 1.0 do livro 'Programao Web com ASP'

CAPTULO 7: EXEMPLOS REAIS 215


o procedimento seguinte escreve um link para se voltar pgina anterior
Sub voltar()
Response.write <p><a href=javascript:history.go(-1)>
Response.write <font face=arial size=2'><b>continuar a comprar</b>
</font></a></p>
End Sub
Set Conn = Server.CreateObject(ADODB.Connection)
Conn.open DSN=livrodsn;
Set rs = Server.CreateObject(ADODB.Recordset)
como = Request.QueryString(como)
Select Case como
Case adicionar
voltar()
adicionar(request.querystring(qual))
ver_carrinho()
Case calcula
calcula()
ver_carrinho()
Case Else
ver_carrinho()
End Select
%>

Fig. 7.16 - O carrinho de compras


depois de algumas escolhas

216 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES

Fig. 7.17 - O carrinho de compras depois


de ser feita uma actualizao nas quantidades

(ficheiro pagar.inc)

<%
este procedimento vai introduzir o formulrio que pede os dados pessoais
do cliente, para que o pagamento total seja efectuado
Sub formulario()
Vamos buscar os dados para vermos se existem produtos no carrinho
produtos_info = session(matriz_produtos)
produtos_num = ubound(produtos_info)
if produtos_num <1 then se no existirem produtos no se poder
efectuar nenhum tipo de pagamento
response.write <p>&nbsp</p><p>&nbsp</p><p><center>
response.write <font size=4' color=red>o carrinho ainda est
vazio..</font>
response.write </center></p><p>&nbsp</p><p>&nbsp</p>
exit sub
end if
%>
<div align=center>
<form action=default.asp?fazer=pagar&como=efectuar
method=POST>
<input type=hidden name=total_valor
value=<%=session(valor_t)%>>
<font face=ARIAL size=3'>Total a Pagar:&nbsp;<b>
<%=formatCurrency( session(valor_t))%> </b></font></p>
<table width=500' border=1' bordercolor=#409AC9'
cellspacing=0'><tr><td><table>
<tr><td bgcolor=#409AC9'><font face=arial color=white
size=2'><b>Dados Pessoais </b></font></td>
Verso digital, individual, licenciada em Jan/Fev do ano 2000, pelo Centro Atlntico, da verso 1.0 do livro 'Programao Web com ASP'

CAPTULO 7: EXEMPLOS REAIS 217


<td></td></tr>
<tr><td width=150'><font face=arial size=2'><b>Nome: </b></font></td>
<td><input type=text name=nome
value=<%=request.form(nome)%> size=40'></td></tr>
<tr><td><font face=arial size=2'><b>Morada: </b></font></td>
<td><TEXTAREA name=morada cols=38'
rows=2'><%=request.form(morada)%></TEXTAREA></td></tr>
<tr><td><font face=arial size=2'><b>Cdigo Postal: </b></font></td>
<td><input type=text name=cp value=<%=request.form(cp)%>
size=20'></td></tr>
<tr><td><font face=arial size=2'><b>Localidade: </b></font></td>
<td><input type=text name=localidade
value=<%=request.form(localidade)%> size=38'></td></tr>
<tr><td><font face=arial size=2'><b>Telefone: </b></font></td>
<td><input type=text name=telefone
value=<%=request.form(telefone)%> size=10'></td></tr>
<tr><td><font face=arial size=2'><b>E-Mail: </b></font></td>
<td><input type=text name=email
value=<%=request.form(email)%> size=30'></td></tr>
<tr><td bgcolor=#409AC9'><font face=arial color=white
size=2'><b>Dados do Carto VISA </b></font></td>
<td></td></tr>
<tr><td><font face=arial size=2'><b>Nome em Visa: </b></font></td>
<td><input type=text name=nome_visa
value=<%=request.form(nome_visa)%> size=26'></td></tr>
<tr><td><font face=arial size=2'><b>Numero em Visa: </b></font></td>
<td><input type=text name=numero_visa
value=<%=request.form(numero_visa)%> size=18'></td></tr>
<tr><td><font face=arial size=2'><b>Validade do Visa: </b></font></td>
<td><input type=text name=data_visa
value=<%=request.form(data_visa)%> size=5'>&nbsp;(MM/AA)
</td></tr>
</table></td></tr></table>
<p><input type=image border=0' src=imagens/bfinalizar.jpg>
</p></form></div>
<%End Sub
esta funo vai validar os dados introduzidos pelo utilizador
Function validar()
OK = 1
if len(request.form(nome)& <br>)<6 or len(request.form(nome)&
<br>)>50 then
response.write <font face=arial color=red>&nbsp;&nbsp;
response.write o nome est invlido</font><br>
OK = 0

218 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES


end if
if len(request.form(morada))<10 or len(request.form(morada))>180
then
response.write <font face=arial color=red>&nbsp;&nbsp;
response.write a morada no vlida</font><br>
OK = 0
End if
if len(request.form(cp))<4 or len(request.form(cp))>9 then
response.write <font face=arial color=red>&nbsp;&nbsp;
response.write o Cdigo Postal no vlido</font><br>
OK = 0
end if
if len(request.form(localidade))<3 or len(request.form(localidade))>40
then
response.write <font face=arial color=red>&nbsp;&nbsp;
response.write a Localidade no vlida</font><br>
OK = 0
end if
if len(request.form(telefone))<9 or len(request.form(telefone))>10 then
response.write <font face=arial color=red>&nbsp;&nbsp;
response.write o Telefone no vlido</font><br>
OK = 0
end if
if len(request.form(numero_visa))<>16 then
response.write <font face=arial color=red>&nbsp;&nbsp;
response.write o nmero do Visa est incorrecto</font><br>
OK = 0
End if
if len(request.form(nome_visa))<3 or len(request.form(nome_visa))>20
then
response.write <font face=arial color=red>&nbsp;&nbsp; o nome do
utilizador do Visa no foi aceite</font><br>
OK = 0
End if
if len(request.form(data_visa))<>5 then
response.write <font face=arial color=red>&nbsp;&nbsp;
response.write A data do Visa no est correcta</font><br>
OK = 0
End if
Validar=OK
End Function
depois de tudo validado executado o seguinte procedimento
Sub efectuar()
SQLStmt = INSERT INTO ENCOMENDAS (data, nome, morada, cp,
SQLStmt = SQLSmt & localidade, telefone,
Verso digital, individual, licenciada em Jan/Fev do ano 2000, pelo Centro Atlntico, da verso 1.0 do livro 'Programao Web com ASP'

CAPTULO 7: EXEMPLOS REAIS 219


SQLStmt = SQLStmt & email, total_valor, numero_visa, nome_visa,
data_visa)
SQLStmt = SQLStmt & VALUES( &now()&,
&request.form(nome)&,
SQLStmt = SQLStmt &
&request.form(morada)&,&request.form(cp)&,
SQLStmt = SQLStmt &
&request.form(localidade)&,&request.form(telefone)&,
SQLStmt = SQLStmt & &request.form(email)&, &session(valor_t)& ,
SQLStmt = SQLStmt & &request.form(numero_visa)
SQLStmt = SQLStmt & ,&request.form(nome_visa)&,
SQLStmt = SQLStmt & &request.form(data_visa)& )
rs.Open SQLstmt,Conn,1,2
SQLStmt = Select id_encomenda from encomendas
rs.Open SQLstmt,Conn,1,2
rs.movelast depois de introduzido vamos buscar o identificador do mesmo
ultima_encomenda = rs.fields(id_encomenda)
rs.close
produtos_info = session(matriz_produtos)
quantidade_info = session(matriz_quantidade)
produtos_num = ubound(produtos_info)
num_produtos = 0
total_preco = 0
total_produtos = 0
for i=1 to produtos_num
vamos buscar por cada produto o seu preo
SQLStmt = SELECT preco FROM produtos
SQLStmt = SQLStmt & WHERE id_produto =
& produtos_info(i)
rs.Open SQLstmt,Conn,1,2
valor = (rs.fields(preco) * quantidade_info(i) )
rs.close
SQLStmt = INSERT INTO prod_encomendas (id_encomenda,
SQLStmt = SQLStmt & id_produto, quantidade, preco)
VALUES
SQLStmt = SQLStmt &
(&ultima_encomenda&,&produtos_info(i)&,
SQLStmt = SQLStmt & quantidade_info(i)&,&valor&)
rs.Open SQLstmt,Conn,1,2
next
response.write <p>&nbsp</p><p><br><br><font face=Verdana
color=blue>
response.write A sua encomenda foi processada...</font></p>
response.write <p>&nbsp</p><p>&nbsp</p><p>&nbsp</p>
session.Abandon vamos abandonar a sesso depois de ser feita a
compra

220 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES


comeando assim uma sesso nova
End Sub
Set Conn = Server.CreateObject(ADODB.Connection)
Conn.open DSN=livrodsn;
Set rs = Server.CreateObject(ADODB.Recordset)
como = Request.QueryString(como) vamos buscar o argumento
Select Case como
Case efectuar neste caso efectuada a compra
if (validar()=1) then se os dados ficarem validados efectua-se a
compra
efectuar()
else
formulario() seno, mostrado novamente o formulrio
end if
Case Else
Formulario() sempre que no h argumento mostrado o formulrio
End Select
%>

A imagem seguinte demonstra como somos abordados ao entrar


na zona de pagamento.

Fig. 7.18 - Introduo de dados para finalizar compra


Verso digital, individual, licenciada em Jan/Fev do ano 2000, pelo Centro Atlntico, da verso 1.0 do livro 'Programao Web com ASP'

CAPTULO 7: EXEMPLOS REAIS 221

No caso do nmero do carto de crdito no estar vlido mostrado


um erro (o mesmo acontece com a maioria dos dados a introduzir)

Fig. 7.19 - Verificao do nmero do carto de crdito

Se a compra for bem sucedida recebemos a mensagem da imagem seguinte.

Fig. 7.20 - Confirmao de compra bem sucedida

Agradecimentos:
Queria agradecer a todos aqueles que ajudaram na minha formao e
percurso profissional, onde esto includos: Manuel Pacheco Vieira, Jos
Fernando Silva, Pedro Tiago Pereira e Carlos Dias.
No estrangeiro tive o apoio de duas pessoas que me apoiaram nos meus
artigos e acreditaram nas minhas capacidades, so eles Scott Mitchell
(www.4guysfromrolla.com) e Stephen Wynkoop (www.swynk.com).
Agradeo tambm s centenas de pessoas que me enviam mensagens para o
e-mail todos os meses, a pedir esclarecimentos tcnicos ou a agradecer pelo
cdigo que tenho disponvel no meu site (www.joaovieira.com).
A nvel pessoal agradeo ento s peas fundamentais na minha vida, os meus
pais, avs, Tnia Penedo e dupla Jujinha & Ritinha.

Coleco O Melhor da Internet


Os melhores sites nacionais e internacionais
da Internet organizados por profisso
ou rea de interesse

Coleco Sociedade da Informao


Os temas de fundo da Sociedade da
Informao apresentados pelos maiores
especialistas nacionais

Coleco Tecnologias
Todas as tecnologias de destaque da
Internet tratadas pela equipe de tcnicos
do Centro Atlntico

Coleco Direito das Novas Tecnologias


A nova economia, dependente das tecnologias
da informao, traz consigo novos desafios e
ameaas.
Quais as respostas dos nossos Juristas, tribunais,
compndios e legislao?

Coleco Desafios
O que nos reservam os tempos que se aproximam
em que as novas tecnologias invertem muitas das
certezas adquiridas

Coleco Solues
Solues prticas para resolver novas
questes levantadas pelas tecnologias
da sociedade da informao

Para encomendar qualquer ttulo do Centro Atlntico queira preencher esta


folha de encomenda e envi-la por fax ou correio com o seu pagamento.

Ttulo

Quant.

Preo TTotal
otal

O Melhor da Internet para o Direito


O Melhor da Internet para Informticos
O Melhor da Internet para Engenheiros
O Melhor da Internet para o Marketing
O M.Internet p/ Gestores e Empresrios

_____
_____
_____
_____
_____

*
*
*
*
*

Coleco Sociedade da Informao


Crnicas da InforFobia
Homo Conexus
* Ano 2000 e Informtica

_____ * 1.800$ = ______


_____ * 1.950$ = ______
_____ * 1.950$ = ______

Coleco Tecnologias
* Guia do Internet Explorer verso 4
* Guia do Internet Explorer verso 5
* Guia do Netscape Communicator v 4
Agentes Inteligentes
TOP 100 Internet 1999

_____
_____
_____
_____
_____

*
*
*
*
*

950$
950$
950$
950$
950$

=
=
=
=
=

2.950$
2.950$
2.950$
2.950$
2.450$

_______
_______
_______
_______
_______

=
=
=
=
=

______
______
______
______
______

Coleco Direito das Novas Tecnologias


Direito da Informtica nos tribunais .pt _____ * 2.450$ = ______
Coleco Desafios
Vertigem - Tendncias para o Sc. XXI _____ * 4.950$ = ______
O Futuro da Internet
_____ * 2.950$ = ______
Coleco Solues
O Vrus do ano 2000
O Guia do Telemvel: 99 sugestes

_____ * 1.600$ = ______


_____ * 1.250$ = ______

* Inclui CD-ROM
TOTAL = ________
Sem Despesas de envio
As encomendas directas ao Centro Atlntico no pagam custos de portes.

SIM, desejo receber os ttulos que assinalei sem qualquer despesa de envio.
Junto envio cheque/Vale n ____________ ordem do Centro Atlntico
Prefiro que debitem no meu carto de crdito emitido em nome de
_______________________________
Nmero do carto de crdito _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ Validade _ _ / _ _
Nome
___________________________________________
Morada ___________________________________________
CP
________
Localidade ______________________
Tel
________________
Fax ____________________
Caso alguns dos ttulos no estejam disponveis enviaremos os que existirem em
stock e pediremos confirmao no futuro para envio dos ttulos em falta.
Centro Atlntico - Av. D. Afonso Henriques, 1462 - 4450 Matosinhos
Fax. 21 - 321 01 85 ou 22 - 938 56 30

www.centroatlantico.pt/titulos

Coleco O Melhor da Internet

Das könnte Ihnen auch gefallen