Você está na página 1de 225

CentroAtlântico

Programação Web com

ASP - Active Server Pages


J oão Vieira
Centro A
tlântico

Programação Web com


ASP - Active Server Pages

Ediçõe
s CentroAtlântico
Portugal/2000
Reservados todos os direitos por Centro Atlântico, Lda.
Qualquer reprodução, incluindo fotocópia, só pode ser feita
com autorização expressa dos editores da obra.

Programação Web com Active Server Pages


Colecção: Tecnologias
Autor: João Vieira
Direcção gráfica: Centro Atlântico

Capa: Paulo Buchinho

© Centro Atlântico, Lda., 2000


Av. D. Afonso Henriques, 1462 - 4450 Matosinhos
Tel. 22 - 938 56 28/9 Fax. 22 - 938 56 30
Rua da Misericórdia, 76 - 1200 Lisboa
Tel. 21 - 321 01 95 Fax 21 - 321 01 85
Portugal
geral@centroatlantico.pt

www.centroatlantico.pt

Fotolitos: Centro Atlântico


Impressão e acabamento: Rolo & Filhos
1ª edição: Janeiro de 2000

ISBN: 972-8426-21-6
Depósito legal: 146.485/00

Marcas registadas: todos os termos mencionados neste livro conhecidos como sendo marcas
registadas de produtos e serviços, foram apropriadamente capitalizados. A utilização de um
termo neste livro não deve ser encarada como afectando a validade de alguma marca registada
de produto ou serviço.
O Editor e os Autores não se responsabilizam por possíveis danos morais ou físicos causados
pelas instruções contidas no livro nem por endereços Internet que não correspondam às Home-
Pages pretendidas.
Dedico este livro aos meus pais,

Maria de Jesus S. R. S ous a Vieira,


António Tiago Vieira
Índice
1. Introdução às ActiveServer Pages
1.1 Au
Dto
or 12
1.2 RequisitosparaasASP 13
1.3 ASPvs.JavaScript/VBScript 15
1.4 InstalaroservidordeInternet 16
1.5 Programar comficheirosASPeHTML 19
1.6 Conhecer o HTML (Hyper Text MarkupLanguage) em12 passos 19
1.7 SitescomrecursosdeASP 23

2. 2E.1xpre ssõ
Os prim
es es O
eiros passo
peradores
2.1.1Exemplo: ‘OláPortugal’ 28
2.1.2Exemplo: ‘OláPortugal’comvariável 28
2.1.3Exemplo: Cálculodevariáveis 29
2.1.4 Exemplo: CódigoASP embebidoemHMTL 29

2.2 IF, THEN, ELSE, ENDIF…


2.2.1Exemplo: Comparaçãoentre variáveis 30

2.3 FOR, WHILE, CASE…


2.3.1Exemplo: Comparação de variáveiscomciclos 32
2.3.2Exemplo: SelectCase 33
2.3.3Exemplo: Contadores ASP embebidos emHMTL 33
2.3.4Exemplo: HMTL embebido emcontadores ASP 34

2.4 Variáveis 35

2.5 Tabela de O
peradores
2.5.1E
xemplo: Comparaçã o de variável en
tre valores 37
2.5.2Exemplo: Utiliz
açãodetodosos operadores 38
3.Fu
nçõe
s
3.1 TabeladefunçõesbasedasASP 40

3.2 As nossas funções


3.2.1Exemplo: Nºdiasatéoano2001 48
3.2.2Exemplo: Validaroe-mail 50
3.2.3Exemplo: Criar uma ComboBox a partir de umarray 52
3.2.4 x
Eemplo: Criar umgráficoemHTML a partir de umarray 53

3.3 Uso e d SSI (Se


rver Side Includes) comas nossasun
fções
3.3.1Exemplo: UsodeumficheiroexternocomSSI 56
3.3.2Exemplo: Ficheirocomtodasas funções 57
3.3.3Exemplo: ASP que usao ficheiro comtodas as funções 58

4. Objectos
4.1 Tabela
dO
ebjectos 62

4.2 Variáveisglobaisedesessão 65

4.3 Interagir como utiliza


dor
4.3.1Exemplo: Responder aoutilizador comos dad
os recol
hidos 72
4.3.2Exemplo: Validarformulário 73
4.3.3Exemplo: Cursoonline 81
4.3.4Exemplo: Protecção de páginas compassword 88

4.4 Fich
eiro global.a
sa
4.4.1
Exemplo: Quantos utilizadores estão a visi
tar a página 100

4.4.2Exemplo: ChatemBrowser 102


4.5 Cookies, d
ados do utilizador e do servid or
4.5.1Exemplo: Recolher dados doutilizador 105
4.5.2Exemplo:Páginaspersonalizadas 107

4.6 Formataçãodestrings 108


5.Basesde d
ados
5.1 Based
sD
eadoS
/sQL 114

5.2 Construir umabasededados emMicrosoft Access 117

5.3 Conexão
à
base
de
dados 122

5.4 Inserir, ap
agar e actualizardados embases de dados
5.4.1Exemplo: Inserirdados 127
5.4.2Exemplo: Eliminardados 135
5.4.3Exemplo: Actualizardados 137

5.5 Apresentação de dados


5.5.1Exemplo: Listardadosemtabela 142
5.5.2Exemplo: Listar dadoscomimagens 144
5.5.3Exemplo: Listardadosapedido 146

5.6 Exemplos com bases eddados


5.6.1Exemplo: LivrodeVisitas 148
5.6.2Exemplo: Sondagensdeopinião 152

6.Com
pon
ent
es
6.1 IntroduçãoaosComponentes 156

6.2 Tratamento de ficheiros de texto como TextStream


6.2.1Exemplo: Históriasemfim 159
6.2.2Exemplo: Contadordeacessos 163

6.3 Componentes de e-mail


6.3.1Exemplo: Enviodee-mail comattachment 164

6.4 Criar componentes emVisual Basic 6


6.4.1Exemplo: ComponenteLivrodeVisitas 173

7.Exem
plos reais
7.1 Introdução 182
7.2 A RãM:otod
rB
eusca 183
7.3 ALojaL:ojaE-Commerce 197
Rece

Re

Peça gratuitamente o seu


e-book

Receba gratuitamente, por e-mail, a versão


digitale-book
( ) deste livro, para poder utilizar
todos os programas sem ter que os re-escrever.

Para tal, envie a cópia da factura deste livro


para o Centro Atlântico, para o e-mail
geral@centroatlantico.pt ou por correio para,
Centro Atlântico
Ap. 413
4760 V. N. Famalicão
Introdução
às Active Server 1
Pages
1.1 A
Duotor 12
1.2 RequisitosparaasASP 13
1.3 ASPvs.JavaScript/VBScript 15
1.4 InstalaroservidordeInternet 16
1.5 Programar com ficheiros ASP e HTML 19
1.6 Conhecer o HTML ( Hyper Text Markup
Languagee)m
12passos 19
1.7 Sitesc omrecursosdeASP 23
12 CENTRO ATLÂNTICO - PROGRAMAÇÃO 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 programação 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 necessário um servidor (com
certos requisitos), e conhecimentos bastante mais avançados de
programação. A definição de páginas dinâmicas na altura, consistia
na existência de ficheiros executáveis do lado do servidor que criavam
páginas HTML consoante o que o utilizadorprocurava, e que limitava
bastante os tipos de pesquisa. Quando o Perl (para programação
de páginas dinâmicas) apareceu, o panorama mudou, e as facilidades
deste tipo de programação começavam. Mesmo assim, a Microsoft
apareceu com os IDC (Internet Database Connector), que apesar
de serem de mais fácil compreensão não eram tão potentes a nível
de desenvolvimento.

Mais tarde, apareceram as ASP, que deram uma grande (e boa)


viragem na programação do lado do servidor. O programador
começava a ter uma linguagem potente e flexível onde podia
desenvolver o mais variado tipo de serviços e de soluções.

Quando comecei a trabalhar nesta linguagem estava-se a fazer a


transição do sistema IDC para as ASP. As facilidades das mesmas
deram-me hipótese de as poder experimentar onde quer que fosse.
Mesmo assim, os recursos a nível de manuais e páginas Internet
eram poucos, e tive bastantes dificuldades em me desenvolver nes-
ta área. Apesar de tudo, dois sites deram-me uma grande ajuda
(www.swynk.com e www.4guysfromrolla.com), pois muitos progra-
madores já lá deixavam os seus artigos, código e ideias. Com este
suporte on-line e alguma ajuda de programadores de todo o mundo,
comecei a desenvolver páginas, 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 dificul-
dades 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 domínio das ASP
seja o menos dificultado possível. Este livro está separado por capí-
tulos; cada capítulo está estruturado por uma parte do sistema das
ASP, e foi dada uma ordem a estes, para que os temas estivessem
ordenados por níveis de dificuldade. No final deixo alguns exem-
plos, que sei irão ser muito úteis a todos aqueles que querem algo
Versão digital, individual, licenciada em Fev/2000, pelo Centro Atlântico, da versão 1.0 do livro 'Programação Web com ASP'
CAPÍTULO 1: INTRODUÇÃO ÀS A CTIVE SERVER PAGES 13

mais que tópicos e artigos. Estes exemplos para os iniciados neces-


sitam de uma compreensão de todos os temas abordados neste
livro, mas os programadores mais avançados podem ir directamen-
te para os exemplos, e recorrer ao manual para entenderem ou re-
verem alguns aspectos da programação 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 se-
manas de vários pontos do planeta, que me dão uma ideia daquilo
que os programadores mais precisam quando começam a trabalhar
com esta tecnologia.

1.2 Requisitos para as ASP


‘ASP’ é a abreviatura de Active Server Pages. ASP são páginas
dinâmicas para a Internet, que usam uma linguagem de programa-
ção ao estilo do VB (Visual Basic). Para quem est á familiarizado
com o VB não lhe será difícil entender este código, pois as rotinas
de scripting de ambos os sistemas são quase idênticas e seguem
as mesmas regras. Se além do VB, tiver s ólidos conhecimentos de
HTML (Hyper Text Marked Language), rapidamente estará prepara-
do para programar sobre este sistema a um bom nível depois de
dominar os tópicos deste manual. Mesmo que não domine o HTML,
poderá ler o capítulo 1.6 onde estão indicados alguns dos principais
comandos (chamados Tags) do mesmo.

Este sistema foi o segundo adoptado pela Microsoft para a criação


de poderosos sites dinâmicos com acesso a bases de dados. O
primeiro sistema foi o de IDC que usava um sistema de dois fichei-
ros, um com o c ódigo HTML (HTX) que continha rotinas de chama-
da de ficheiros IDC, que por sua vez tinham as declarações de SQL
para acesso às bases de dados. Não era tão flexível, era mais lento
de se programar, e tinha certos requisitos de programação algo di-
ferentes das ASP.
14 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES

Fig. 1.1 - Esquema geral do funcionamento das ASP

Não existem requisitos em relação aos browsers a usar para aceder


aos sites criados em ASP, pois todo o código é interpretado pelo
servidor de Internet, e aquilo que chega ao utilizador final é puro
HTML gerado pelas ASP. Com a experiência, e futuros testes, vai
entender todos estes aspectos que tenho vindo a mencionar.

A nível de hardware, o programador tanto pode ter o seu computa-


dor pessoal em casa para trabalhar nos exemplos deste livro, como
trabalhar directamente no próprio servidor online. O importante é
que a partir do momento que disponibilize a sua página online, opte
em vez do PWS (Personal Web Server), pelo IIS (Internet Information
Server), pois este é mais seguro, mais potente, e suporta melhor
múltiplos sites, além de que para controlar os acessos, configurar e
controlar o seu servidor de Internet necessita mesmo do IIS (por
isso indicado para situações a nível profissional). Todo o código que
é criado em PWS funciona em IIS, quando não são usados compo-
nentes externos (DLL); a partir desse momento é necessário insta-
lar os mesmos na máquina para onde se está a exportar o código.

De outra forma, basta o leitor copiar os ficheiros que criou para um


ou outro sistema, que o mesmo aceita e interpreta da mesma ma-
neira. Claro que tem de ter em aten ção outros aspectos como a
localização das bases de dados, as suas conexões, e componentes
extra (tudo isto visto nos próximos capítulos).

Versão digital, individual, licenciada em Fev/2000, pelo Centro Atlântico, da versão 1.0 do livro 'Programação Web com ASP'
CAPÍTULO 1: INTRODUÇÃO ÀS A CTIVE SERVER PAGES 15

1.3 ASP vs JavaScript/VBScript


Muitas pessoas perguntam “…Qual a diferença entre as ASP e o
JavaScript? Ou o VBScript? Ou mesmo o t ão potente Java?…”.

Bem, as diferenças são bastantes, não só falando das ASP, mas


também de outras linguagens parecidas, como o Perl, PHP ou mes-
mo o Cold Fusion. Enquanto o JavaScript e o VBScript e o Java,
funcionam do lado do cliente (apesar de haver hipótese do Java
funcionar também a nível do servidor com servlets) as ASP funcio-
nam no servidor. Uma boa maneira de notar esta diferença entre as
ASP e o JavaScript/VBScript, é olhando para as instruções de pro-
gramação de ambos. Quando estamos no nosso browser e vamos
ver o source de um ficheiro com JavaScript ou VBScript, vemos todo
o c ódigo, e daí vem o problema desse código poder ser usado ile-
galmente por outro programador - situação muito usual. Com as
ASP, ao tentar aceder ao código, só se vê puro HTML, pois as ASP
são tratadas e processadas no servidor de Internet que por sua vez
envia a formatação online toda em HTML.

O código de JavaScript é facilmente identificado no meio do c ódigo


HTML, sendo a sua estrutura a seguinte:

<SCRIPT LANGUAGE=”JAVASCRIPT”>
{
history.go(-1);
}
</SCRIPT>

Este exemplo está a simular o botão de recuo do browser, fazendo


com que seja recuada uma página. Normalmente este código é usa-
do na seguinte situação (pelo menos aquela em que o uso mais):

<a href=”javascript : history-go(-1)”>Voltar Atrás</a>

O VBScript é no final de contas o código base das ASP, mas que


corre no lado do cliente:

<SCRIPT LANGUAGE=”VBSCRIPT”>
formatcurrency(“10000”)
</SCRIPT>

Este código formata o valor 10000, para que fique 10.000$00.


16 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES

Com o Java o problema é diferente, é muito pesado, nem todos os


browsers o suportam, e a sua programação é dispendiosa, e toma
muitos recursos, que a fazem ideal para outros campos. Este foi
então posto de parte por todos aqueles que querem sites com rápi-
do acesso a bases de dados, e flex íveis, não só na programação
mas também na utilização (interface com o utilizador), onde as ASP
e linguagens semelhantes têm 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 serviços online têm de aceder a essas
mesmas estruturas, para poderem praticar o chamado e-commerce,
que veremos também neste manual.

1.4 Instalar o servidor de Internet


O servidor de Internet é bastante fácil de instalar e a documentação
da Microsoft que vem com o pacote do software é bastante explíci-
ta. Mesmo assim vou só indicar alguns pontos para a instalação do
software.

Se está a pensar em instalar um servidor de Internet para ter pági-


nas online, a opção certa é o WindowsNT com o Option Pack 4 (de
onde vem o IIS 4) e se possível com o Service Pack 4 ou 5 do
WindowsNT. Se quiser usar sistemas mais recentes pode também
usar o Windows 2000, que vem mais seguro no aspecto dos sites
que fiquem sob sua alçada e trás já o IIS 5.

As grandes diferenças no IIS 5 serão no aspecto do uso de código e


alguns objectos novos, que não são bem novos, mas sim melhora-
mentos de alguns já usados anteriormente. A nível de performance
essa será melhor pois os cabeçalhos de HTTP (a informação que é
recolhida pelo browser, enviada pelo servidor) quando possível são
enviados comprimidos, permitindo uma redução de tamanho de in-
formação. Terá alguns wizards para instalação de sites, e um gran-
de avanço é que o programador não terá de se preocupar com as
extensões dos ficheiros, podendo colocar código ASP em qualquer
lado, pois o novo servidor vai detectar as diferen ças. Existirá uma
maneira mais prática de redireccionamento de páginas, poderá ser
executado código dinamicamente (do tipo o utilizador ter uma p ági-
na online para testar scripts no momento), melhor controlo de com-
ponentes, e o mais importante de todos, a hipótese de se criarem e
usarem classes, sistema usado por programadores em ambientes
de programação orientada por objectos.
Versão digital, individual, licenciada em Fev/2000, pelo Centro Atlântico, da versão 1.0 do livro 'Programação Web com ASP'
CAPÍTULO 1: INTRODUÇÃO ÀS A CTIVE SERVER PAGES 17

Caso contrário, 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 então que
instalasse tudo o que vem no pacote (PWS ou IIS), as consolas de
gestão, o transaction server, os exemplos, o ADO (Access Data
Obects), todos os componentes que vierem – em resumo, tudo o
que for possível instalar. Perceberá durante a leitura deste manual o
porquê desta indicação, e com a sua especialização nesta matéria
ao longo da sua vida profissional também o entenderá.

O directório onde as páginas vão 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 páginas que quiser criar. Não 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 servi ço 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 à
Managem ent Consolee escolher DefaultWeb Siteda lista do lado esquer-
do, carregando depois no botão 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
máquina para máquina. No meu caso será jvpc. Assim, quando for
preciso aceder ao servidor virtual, poder-se-á fazer no browser atra-
vés de http://jvpc/
; aparecer-lhe-ão informações do PWS, da mesma
maneira que se escrevesse no address link do seu browser localhost
.
18 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES

Fig. 1.3 - Página principal do servidor


Internet PWS, depois de instalado

Mas para os exemplos deste livro eu criei um directório semi-virtual


para trabalhar os meus ficheiros. Para tal segui os seguintes pas-
sos:
1. Criar um direct ório dentro de c:\inetpub\wwwroot\
(ex. c:\inetpub\wwwroot\livro\
)
2. Entrar na consola do PWS
3. Parar os servi ços, 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 directório
semi-virtual
6. Em Directory Fazer browse até ao directório 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 ser viços de Internet, carregar em Start
11. Fica então instalado o primeiro servidor virtual Internet
no seu PC (ex. http://pcnome/livro/
)

Não se esqueça de que os ficheiros de ASP s ó funcionam dentro do


directório que é criado para esse destino, e configurado por defeito
ou por si. Mas tudo isto est á acessível nos manuais do software.
Irei então come çar a demonstrar o aspecto do código HTML.

Versão digital, individual, licenciada em Fev/2000, pelo Centro Atlântico, da versão 1.0 do livro 'Programação Web com ASP'
CAPÍTULO 1: INTRODUÇÃO ÀS A CTIVE SERVER PAGES 19

1.5 Programar com ficheiros


ASP e HTML
As extensões dos ficheiros ASP é *.asp, e dos ficheiros HMTL é *.html
ou *.htm

Conforme a versão do servidor Internet, o programador poderá defi-


nir quais as extensões 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 n ão são compilados e sim interpreta-


dos (os *.asp no servidor e os *.html no browser), o programador esta-
rá a programar sobre ficheiros de texto, mas c om as extensões refe-
ridas. Normalmente são 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, serão necessários certos requisitos, não
só a nível de hardware como de conhecimento a nível de programa-
ção. Falo do HTML, que é necessário como base para um bom en-
tendimento de tudo aquilo que é descrito neste manual. Para isso
descreverei alguns comandos do HTML, que de linguagem de pro-
gramação 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 então indicar 12 pontos essenciais em relação ao HTML, para


que o leitor fique melhor preparado para o que vai ler nos próximos
capítulos, onde se misturará HTML com o c ódigo ASP.
20 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES

1. O c ódigo HTML que aparece no browser fica sempre entre duas


Tags - Tags são os comandos que estão entre os símbolos <>

<HTML>
<BODY>
…………….
</BODY>
</HTML>

2. Como deve ter reparado, todas as Tags que come çam com
<NOMEDATAG>têm de acabar com uma barra </NOMEDATAG>. Nem
todas o requerem, mas podemos dizer que cerca de 90% sim.

3. Para enviar conte údo para o browser de maneira a ser visível


pelo utilizador, basta escrever:

<HTML>
<BODY>
ISTO É UM TESTE
</BODY>
</HTML>

4. Para mudar-se os par âmetros 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 par ágrafo 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>
Versão digital, individual, licenciada em Fev/2000, pelo Centro Atlântico, da versão 1.0 do livro 'Programação Web com ASP'
CAPÍTULO 1: INTRODUÇÃO ÀS A CTIVE SERVER PAGES 21

6. A mudan ça de linha é feita com <BR> que funciona como que


um Enter no mesmo parágrafo:

<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 li-
nha:

<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 comentários ao código usamos


<!— —>. Dá muito jeito quando o c ódigo HTML é muito extenso,
comentando assim o que está criado em vários pontos do script:

<HTML>
<BODY>
<!—ISTO QUE AQUI ESTÁ ESCRITO NÃO APARECE NO BROWSER—>
ISTO SIM, JÁ APARECE NO BROWSER
</BODY>
</HTML>
22 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES

9. Quando é necessário 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 NÃO APARECE NO BROWSER—>
ISTO SIM, JÁ APARECE NO BROWSER
<SCRIPT LANGUAGE=”JAVASCRIPT”>
………….
</SCRIPT>
</BODY>
</HTML>

10.Uma das maneiras de recebermos dados do utilizador é através


de formulários. Podemos usar o método POST ou GET, que serão
definidos para o tipo de programação com dados dos utilizadores
via ASPs. Estes são 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 p ágina, 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>

Versão digital, individual, licenciada em Fev/2000, pelo Centro Atlântico, da versão 1.0 do livro 'Programação Web com ASP'
CAPÍTULO 1: INTRODUÇÃO ÀS A CTIVE 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 básicos


essenciais do HTML, para compreender parte daquilo que vai ser
demonstrado neste manual. A linguagem HMTL é bastante simples
e limitada. Uma boa observação a outros sites pode fazer maravi-
lhas aos seus conhecimentos de HMTL ;-)

Quando estiver no capítulo dos exemplos deste manual, e se não


estiver a perceber o código de HTML volte a consultar este capítulo
onde se introduziram as Tags que poderiam causar mais dúvidas. A
maioria das outras Tags e opções são quase óbvias aquando da
sua tradução para português.

1.7 Sites com recursos de ASP


Poderia enumerar muitas dezenas de sites com recursos a nível
das ASP, alguns dos quais eu ainda recorro. Mas vou indicar aque-
les que julgo valerem mesmo a pena, não apenas pelo conteúdo
que têm, mas também pela maneira como apresentam o conteúdo
e o organizam:

www.activeserverpages.com
Este é o site ‘Pai’ das ASP. Terá
sido em princípio o primeiro re-
lacionado com este assunto.
Tem muitos exemplos explica-
dos, e v á rios truques para
aquelas dificuldades que v ão
aparecendo enquanto progra-
mamos. É actualizado periodi-
camente há muito tempo.
24 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES

www.15seconds.com
Este é também daqueles que
todos os que estão dentro do
assunto conhecem. Tem mui-
tos artigos, de vários tipos, e
um motor de busca que vai
pesquisar vários sites de ASP.

www.swynk.com
Este site , no in ício, era dos
melhores, tinha muita informa-
ção e muito bem estruturada.
Está vocacionado para tudo o
que tiver a haver com Windows
NT, e devido ao IIS4 também
tem muito bons artigos de ASP.
Tenho uma coluna minha l á,
onde poderá recolher algumas
ideias de ASP.
Este site cresceu muito, e mui-
to depressa, por isso julgo ser
a causa dos atrasos na sua
actualização.

www.4guysfromrolla.com
Indiscutivelmente umsite a não
perder. Foi também graças a
este site que consegui alcan-
çar os objectivos, nas empre-
sas onde trabalhei com ASP.
Tem muita informação, artigos
e c ódigo. Se por lá passar vai
notar que tenho lá alguns arti-
gos.

Versão digital, individual, licenciada em Fev/2000, pelo Centro Atlântico, da versão 1.0 do livro 'Programação Web com ASP'
CAPÍTULO 1: INTRODUÇÃO ÀS A CTIVE SERVER PAGES 25

www.asphole.com
É um grupo de sites, que se
dedicam às ASP, tem também
muitos recursos, apesar de es-
tarem a ser ultrapassados por
sites mais recentes como o
Aspin.

www.aspin.com
Este site é bastante recente e
já cheguei a visitá-lo quase to-
dos os dias. Está muito bem or-
ganizado e tem bastantes te-
mas por onde pode pesquisar.

www.asptoday.com
Este é daqueles sites que
quando começar a programar
ASPs com alguma assiduida-
de irá com certeza visitar. Eles
obrigam os seus autores a es-
creverem os artigos em exclu-
sividade, sendo por isso da-
queles sites onde os artigos lá
publicados n ão são lidos em
mais lado nenhum.
Expressões e
Operadores 2
2.1 Os primeiros passos
2.1.1Exemplo: ‘OláPortugal’ 28
2.1.2 Exemplo: ‘Olá Portugal’ com variável 28
2.1.3 Exemplo: Cálculo de variáveis 29
2.1.4 Ex emplo: Código A SP e mbebido
eHmMTL 29

2.2 IF, THEN, ELSE, END IF…


2.2.1 Exemplo: Comparação entre variáveis 30

2.3 FOR, WHILE, CASE…


2.3.1 Exemplo: Comparação de variáveis
comciclos 32
2.3.2Exemplo: SelectCase 33
2.3.3 Exemplo: Contadores ASP
embebidos em HMTL 33
2.3.4 Exemplo: HMTL embebido em
contadoresASP 34

2V.4ariáveis 35

2.5 Tabela de Operadores


2.5.1 Exemplo: Comparação de variável
entrevalores 37
2.5.2 Ex emplo: Utilização d e to dos
osoperadores 38
28 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES

2.1 Os primeiros passos


Para come çar irei demonstrar-lhe, em apenas uma linha, como
poderá escrever uma frase; depois veremos o mesmo no HTML,
com variáveis e acções entre variáveis. Isto ainda antes de definir os
objectos, métodos, expressões, funções e regras das ASP. Terei
como princípio que o leitor tem conhecimentos de HTML, visto ser a
base de toda esta programação (programação Internet).

(ficheiro cpt2-1-1.asp)
<%response.write”Olá Portugal”%>

Vemos aqui algo que nos salta à vista e que são os <% %> . Como se
pode facilmente verificar, estes são os identificadores de onde co-
meça e acaba a ASP que foi constru ída, pois quando introduzirmos
código entre o HTML, teremos de definir onde estão as ASP, e estes
indicadores serão determinantes para esse propósito. Response é
um objecto das ASP que conta com bastantes m étodos. Este e o
objecto Request vão ser sem sombra de dúvidas aqueles com que
irá trabalhar mais. Encontra uma tabela no capítulo seguinte com os
objectos principais e seus métodos de maneira que sempre que
necessitar os possa encontrar mais rapidamente consultando a ta-
bela.

(ficheiro cpt2-1-2.asp)
<%
pais = “Portugal”
response.write”Olá “ & pais
%>

Este segundo exemplo demonstra uma abordagem diferente mas


com o mesmo resultado no browser. Aqui pretendo demonstrar a
maneira como se fazem ligações com o símbolo &
CAPÍTULO 2: EXPRESSÕES E OPERADORES 29

Fig 2.1 - Resultado dos ficheiros


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

Se quisermos usar variáveis numéricas, e calcular algo com elas,


temos então 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 vari áveis
(também elas dinâmicas) que não necessitam de inicialização, po-
dendo ser criadas em qualquer momento. Apesar de haver uma
maneira em que o é obrigado a fazer (com Explicit) mas só se as-
sim o definir. Outro ponto bastante agradável é de que não necessita
de marcadores para definir o final de cada linha. Por exemplo, em
a=10. Não é necessário ponto e vírgula ou outro qualquer marcador
para terminar uma linha de código.

(ficheiro cpt2-1-4.asp)
<% ‘iniciar a variável
cptvar=”passear”%>
<HTML>
<BODY>
<FONT SIZE=”6” >Eu hoje fui <%=cptvar%>, para o Alentejo…</FONT>
</BODY>
</HTML>
30 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES

Neste exemplo foi feito aquilo que de mais normal vai ser feito no
resto deste manual - usar as variáveis geradas ou não nas ASP e
introduzi-las no meio do código HTML. Repare no truque para que a
vari á vel fique entre o HTML. N ã o foi necess á ria a rotina
response.write , sendo ent ão introduzido apenas o caracter de
igualdade seguido da variável.

A plica ‘ é usada para comentar, sempre que quisermos introduzir


algum comentário ao código. Neste livro vamos usá-la com frequên-
cia para dar explicações adicionais de algumas situações a nível de
programação.

Julgo que com estes exemplos o leitor ficou a perceber como se


estrutura de um modo geral a programação em ASP.

2.2 IF, THEN, ELSE, END IF…


Vamos então iniciar alguma programação básica e essencial, aquilo
que une toda a programa çã o, e que s ão os operadores e as
expressões. Vou começar pelas expressões, e deixar uma tabela
de operadores para o final deste capítulo (visto que são bastante
poucos). Entretanto estes vão sendo usados nos próximos 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
%>
CAPÍTULO 2: EXPRESSÕES E OPERADORES 31

A expressão IF, foi aqui usada para que em conjunto com o operador
< , fizessem uma comparação. 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 M
AIS ALGO)
END IF

Ou quando as opções são várias:

IF (ALGO) THEN
(FAZALGO)
END IF
IF (ALGO2) THEN
(FAZALGO2)
END IF
IF (ALGO3) THEN
(FAZALGO3)
END IF

Mas se as opções estão em cadeia, e se uma acontecer, as outras


têm de ficar anuladas. Teremos de usar a expressão ELSE:

IF (ALGO) THEN
(FAZALGO)
ELSE
IF (ALGO2)THEN
(FAZALGO2)
ELSE
IF (ALGO3)THEN
(FAZALGO3)
ENDIF
ENDIF
END IF

Este tipo de expressões dá muito jeito aos programadores, mas


quando existem várias opções em cadeia, eu sugiro que se use a
expressão CASE; fica melhor organizado, e as confusões dentro do
código são bastante menores. Estas pequenas ‘regras’ que vou es-
crevendo neste manual, não são propriamente para serem segui-
das religiosamente. Se calhar o leitor nem vai ter muitos problemas,
mas quando o código começa a ficar muito extenso, o programa
tende a ficar confuso. Notará isso se lá voltar ao fim de uns meses
para fazer manutenção (muito comum em sites na Internet).
32 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES

2.3 FOR, WHILE, CASE…


As expressões de repetição, usadas pelas ASP, são conhecidas de
qualquer programador, não sendo por isso algo que precise de uma
especial atenção para as tentar perceber.

(ficheiro cpt2-3-1.asp)
<%
a= 4
b=12
if a < b then ‘ comparação entre dois valores
for I=0 to a ‘ ciclo FOR
response.write “ a(“ & a & ”) é maior que “ & I & “<br>”
‘ o símbolo <br> em HTML simboliza mudança de linha
‘ no mesmo parágrafo
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=I–1
wend ‘ final de ciclo WHILE
end if
end if
%>

Neste caso aproveitei código de um exemplo inteiro, para lhe dar


mais umas linhas com este ciclo WHILE. Inicialmente faz-se a pri-
meira comparação, que se repetirá enquanto a mesma for válida.
Neste caso enquanto b for menor que I, o ciclo (loop) vai sendo con-
cretizado.

A minha expressão de repetição favorita, é a CASE, muito flexível e


rápida. Por mais tarde que eu volte a mexer no código, fico a sempre
perceber o que lá se passa em minutos.
CAPÍTULO 2: EXPRESSÕES E OPERADORES 33

(ficheiro cpt2-3-2.asp)
<%
resposta = 4
Select case resposta
case “1” response.write “ Não é ” & resposta
case “2” response.write “ Não é ” & resposta
case “3” response.write “Acertou é ” & resposta
case “4” response.write “ Não é ” & resposta
case else response.write”Desconhecido….”
end select
%>

Neste casea comparação é feita por hipóteses em função de uma


resposta (variável resposta
), tendo-se atenção à mesma, iremos fa-
zer uma comparação com as hipóteses possíveis (1, 2, 3 e 4 s ão as
únicas possíveis) e executar a declaração correspondente (se acer-
tou ou se n ão 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 lei-
tor 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 programação com bases de da-
dos. Introduzindo o valor que se quer dentro de cada célula da tabe-
la, é o truque que srcina, as grandes tabelas dos sites de comércio-
electrónico. Além de texto, pode introduzir um novo esquema de ta-
belas e/ou imagens.
34 CENTRO ATLÂNTICO - PROGRAMAÇÃO 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 opção das Tags de HTML, para que
não fosse preciso repetir a mesma 8 vezes. Este é já um pensa-
mento a seguir pelo programador de ASP - tentar evitar escrever
muitas linhas de código, e sim optimizar ao m áximo todas as fun-
ções que vier a criar.

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


CAPÍTULO 2: EXPRESSÕES E OPERADORES 35

2.4 Variáveis
Nas ASP, as variáveis são também, como no Visual Basic, dinâmi-
cas, não sendo por isso necessária a sua inicialização. Seja como
for, é ‘má’ programação usar variáveis globais sem controlo sobre
as mesmas. Deve-se usar, mas não em excesso, assim como se
devem sempre inicializar as mesmas, não só para melhor controlo,
mas também para melhor performance. Para que não se ‘desleixe’
com as variáveis, use o código <% Option Explicit %> no início de cada
página para que tenha de inicializar sempre as variáveis. Assim, as
alocações de memória, para as variáveis dinâmicas, serão feitas
com uma melhor estrutura, ficando por esse motivo beneficiado o
desempenho das suas páginas.

Para inicializar uma variável em ASP basta usar Dim . Para criar-
mos a variável ‘xpto’ usamos então <%Dim xpto%>

Temos nas ASP, alguns tipos de variáveis a considerar:

- variáveis usuais (usadas no momento, e que, como são


din â micas, podem ser criadas a qualquer altura sem
inicialização das mesmas; podemos incluir os arrays neste gru-
po, que podem ser passados para as variáveis de sessão).
Normalmente quando as inicializamos usamos a expressão
Dim variável

- variáveis Application (usadas como globais no site pois to-


dos os utilizadores têm acesso à mesma);

- vari áveis de sessão/Session (usadas para acompanharem


toda uma sessão de acesso por parte de um utilizador, mas só
acessíveis por este, e não por todos como as de Application).
36 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES

2.5 Operadores
Apesar de já terem sido praticamente todos usados neste capítulo,
vou então deixar uma pequena tabela dos operadores, para referên-
cia.
Os operadores de comparação e igualdade são os seguintes:

TIPO DE OPERADOR DESCRIÇÃO


= 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 são os operadores principais das ASP, e será com estes que
iremos trabalhar ao longo deste manual. Estes operadores não se-
rão usados única e exclusivamente no código de ASP, mas também
aquando do uso de declarações de SQL.
CAPÍTULO 2: EXPRESSÕES E OPERADORES 37

Quando queremos fazer comparações múltiplas podemos então 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 aritméticos temos então uma outra tabela:

TIPO DE OPERADOR DESCRIÇÃO

^ Usado para expoente,


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

* Multiplicador,
(2*5)

/ Divisão para retornar valor singular…


(a / b)

\ Divisão inteira…
(a \ b)

+ Soma …
(a+b)
Este valor também funciona para
concatenação tal como o símbolo &

- Diferença…
(a–b)

MOD Resto da divisão…


( a MOD b )

Podemos então demonstrar todos os operadores aritméticos da ta-


bela anterior, num ficheiro de ASP.
38 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES

(ficheiro cpt2-5-2.asp)
<%
a=2
b=8
c = 10
st1 =”Desta maneira”
st2 = “ também 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 = ‘ também 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
código, pode recorrer à seguinte imagem, que julgo responder a
qualquer dúvida com que possa ter ficado.

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

Estes operadores são muito importantes na medida em que todo o


tipo de estatísticas, contas, comparações e cálculos extra os irão
requerer. No dia a dia, as empresas precisam de certas situações
resolvidas que por vezes não têm solução nas funções pré-defini-
das das ASP, e nessa altura terá de ser o leitor a desenvolver as
suas próprias funções, por meio destes operadores de base.
Funções
3
3.1 Tabela de funçõesbasedasASP 40

3.2 As nossas funções


3.2.1 Exemplo: N º dias até oano2001 48
3.2.2 Exemplo: Validaroe-mail 50
3.2.3 Exemplo: Criar uma ComboBox
a partir de um array 52
3.2.4 Exemplo: Criar um gr áfico em HTML
a partir de um array 53

3.3 Uso de SSI (Server Side Includes)


com as nossas fun ções
3.3.1 Exemplo: Uso de um ficheiro
externocomSSI 56

3.3.2 Ex emplo: Ficheiro com todas


as funções 57
3.3.3 Ex emplo: ASP que usa o f icheiro
com todas as funções 58
40 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES

3.1 Tabela de Funções base das ASP


Um dos aspectos que mais se destaca nas ASP s ão as suas
funções, e a facilidade de manuseamento das mesmas. Existem
funções que facilitam muito a vida a quem faz a programação de
v ários sites . A recursividade é um dos pontos fortes quando
programamos, e as funções ajudam nesse aspecto.

A tabela seguinte, tal como a tabela de objectos que existe no próxi-


mo capítulo, vão de encontro a tudo aquilo que este manual se refe-
re - a programação de potentes sites interactivos e dinâmicos. Será
a partir deste capítulo que o leitor se irá confrontar com exemplos
realmente essenciais para a programação do dia a dia de sites pro-
fissionais. Espero que estas tabelas vão de encontro às necessida-
des do leitor, que quer procurar rapidamente aquela função ou ob-
jecto que necessita no momento em que está a programar. A tabela
está por ordem alfabética para facilitar a procura de qualquer uma
das funções que possa ser necessária. As funções são da versão
2.00 das ASP, pertencente ao VBScript V4.

TABELA DE FUNÇÕES DAS ASP

Função Descrição

Abs() Esta função serve para devolver números


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 variável. São muito
usados para simplificar actos muito comuns em
programação, a todos os níveis. Um array é
constituído por vários valores que estão
separados por uma posição. O array
variavel(“João”, 3, 1200, “Sol”), tem 4 posições. As
posições de um array começam sempre do 0.
Para acedermos aos dados que esta tem, basta
indicarmos a posição que nos interessa.
Ex. variavel(“João”, 3, 1200, “Sol”)
Response.write variavel(0) ‘ devolve João
Response.write variavel(1) ‘ devolve 3
Response.write variavel(3) ‘ devolve Sol
CAPÍTULO 3: FUNÇÕES 41

Asc() Devolve o número 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 expressão for


falsa, caso contrário True
Ex. Cbool(32=32) ‘ devolve True
Cbool(10=32) ‘ devolve False

CByte() Transforma qualquer valor (do tipo não Byte) para


o tipo Byte
Ex. CByte(225.1278) ‘ devolve 225

CCur() Idêntico a CByte(), mas neste caso para


o tipo de moeda usado.

CDate() Converte uma expressão que tende para uma


Data, numa Data validada, não sendo necessário
usar IsDate()
Ex. variavel1 = Cdate( “Dezembro 1, 1990”)
‘ a variável1 fica com uma data válida

CDbl() Converte um valor (do tipo não Double)


para o tipo Double

Chr() Ao contrário da função 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 não Intenger)


para o tipo Integer

CLng() Converte um valor (do tipo não Long)


para o tipo Long

Cos() Devolve o coseno de um ângulo


42 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES

CreateObject() Cria uma referência a um objecto externo


Ex.
“Projecto.Objecto”)
Set Objecto=Server.CreateObject(

Csng() Converte um valor (do tipo não Single)


para o tipo Single

CStr() Converte um valor (do tipo não 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 função serve para o programador obter uma


data posterior ou anterior àquela que pretende
usar para cálculo.
Podemos querer saber qual o dia referente a 20
dias depois da data pretendida, ou 1 mês, ou 2
anos.
A expressão usa 3 campos, o primeiro para
introduzirmos o campo de data por onde quere-
mos calcular a diferença, o segundo campo para
o valor numérico dessa diferença, e no final a data
de início.
O campo do caracter que define o tipo de diferen-
ça aceita as seguintes opções:
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 diferença entre duas datas escolhendo


um dos campos de comparação explicados em
DateAdd()
Ex. DateDiff(“d”, Now, “31-Jan-1999”)
‘ devolve a diferença entre a data de hoje
e o dia 31 de Janeiro de 1999
CAPÍTULO 3: FUNÇÕES 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,


mês e dia

DateValue() Devolve uma data válida daquela que é pedida

Day() Devolve o dia do mês 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 expressão
Ex. variavel1(“Internet”,”Sites”,”Hosting”,”Portugal”)
Filter(variavel1,”Si”) ‘ devolve Sites

Fix() Devolve o inteiro de um qualquer valor


Transforma um valor normal numérico
FormatCurrency()
para valor monetário.
Ex. FormatCurrency(32420) ‘ devolve 32.420$00

Funciona como FormatCurrency()


FormatDateTime()
mas para datas

Formata um número da maneira que nos convém


FormatNumber()

Devolve uma percentagem do universo que o


FormatPercent()
programador pretende
Ex. FormatPercent(23/230) ‘ devolve 10,00%

GetObject() Devolve a referência a um objecto

Hex() Transforma um valor para resultado hexadecimal

Hour() Devolve a hora de uma expressão


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

InStr() Devolve a posição de uma string dentro


de outra a contar do início
Ex. InStr(1,”Hoje é um bom dia para se
programar”, “ra”) ‘ devolve 21
44 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES

InStrRev() Devolve a posição 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 relação a uma variável,


validando-a no caso de ser ou não um array

IsDate() Devolve True ou False em relação a uma string,


validando-a no caso de esta ser dotipo Date ou não

IsEmpty() Valida uma variável, para ver se a mesma


está ou não vazia

IsNull() Valida uma variável para ver se a mesma


é Null ou não

IsNumeric() Valida uma string/valor para ver se o mesmo é


numérico ou não

IsObject() Valida um Objecto, certificando-se se o mesmo


o é ou não

Join() Junta todas as variáveis 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 dimensão de um array

LCase() Devolve uma string em ‘lower case’


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

Len() Devolve o tamanho de uma string


Ex. Len(“Vamos programar ASP.”)
‘ devolve 20
CAPÍTULO 3: FUNÇÕES 45

Log() Devolve o logaritmo de um dado número

LTrim() Devolve uma string sem espaços do lado esquerdo


Ex. LTrim(“ Isto é um teste.”)
‘ devolve “Isto é um teste.”

Mid() Serve para termos um número dado de


caracteres de uma string, a partir de uma dada
posição
Ex. Mid(“Vamos programar ASP.”, 7, 9 )
‘ devolve “programar”

Minute() Devolve o minuto de uma data/hora

Month() Devolve o valor correspondente ao mês de uma


dada data
Ex. Month(date())
‘ devolve o valor do mês em que
estiver a testar o código

MonthDate() Devolve o nome do mês (por extensão)


Ex. MonthDate(10) ‘ devolve “Outubro”

Now() Devolve a data e hora corrente

Oct() Devolve o valor octal de um dado número

Replace() Altera certo caracter/string por outro dado


Ex. replace(“yyXiiXppX22fXjX” , ”X” , ”P” )
‘ devolve “yyPiiPppP22fPjP”

RGB() Devolve um valor representativo de uma cor. A


expressão é estruturada por RGB(vermelho,
verde, azul)
Os valores usados vão de 0 a 255
Ex. RGB(22,233,143)
‘ devolve 9431318

Right() Funciona como a função Left() mas a


contar da direita

Rnd() Retorna um valor aleatório

Round() Faz arredondamento a valores numéricos


Ex. Round(23,77) ‘ devolve 24
46 CENTRO ATLÂNTICO - PROGRAMAÇÃO 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 número de espaços numa string


Ex. response.write “Teste“ & Space(12) & “Feito…”
‘devolve “Teste Feito…”

Split() Divide uma string num array, escolhendo o critério


de separação
Ex. resultado = Split(“IstoKéKmaisKumKteste.”, “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 são iguais ou não.
A estrutura desta função é StrComp(var1,var2,tipo)
Var1 e var2 são duas strings à escolha, o tipo
pode ser definido por 0 (comparação entre
binários) ou 1 (comparação 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 número de vezes definido
Ex. String(“C”,10) ‘ devolve “CCCCCCCCCC”

Tan() Devolve a tangente de um determinado número


CAPÍTULO 3: FUNÇÕES 47

Time() Devolve a hora do sistema

TimeSerial() Devolve uma hora para hora,


minuto e segundos especificados

TimeValue() Devolve uma hora válida daquela que é pedida

TypeName() Devolve o tipo de variável 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 dimensão 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 variável a validar.
Os n úmeros possíveis de resposta são:
0–V azio 1 – Null
2 –I nteger 3 – Long
4 –S ingle 5 – Double
6 –C urrency 7 – Date
8 – String 9 – Object
10 –E rror 11– Boolean
12 –V ariant 13– Data Access Object
(DAO)
17 –B yte 8192– Array

WeekDay() Devolve o dia da semana de uma dada data


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

Devolve por extenso o dia da semana de uma


WeekDayName()
dada data
Ex. WeekDayName (1)
ou
WeekDayName(WeekDay “Outubro
( ”))
10, 1999
‘ devolvem ambas as expressões domingo

Year() Devolve o ano de uma dada data


48 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES

Apesar da existência de um número considerável de funções nas


ASP estas vingam não pela quantidade das mesmas, mas sim, nos
objectos que existem. Com os objectos que as ASP disponibilizam,
o leitor poderá criar potentes funções próprias, ou componentes pa-
ra estas em Visual Basic.
Este assuntos serão abordados noutros capítulos, mas que não te-
rão nexo se o leitor não conhecer o funcionamento de procedimen-
tos e funções em ASP, ou até mesmo o uso de ficheiros externos.
Neste capítulo ainda não irá aprender como interagir com o utilizador,
mas sim tratar de todo o tipo de dados e/ou variáveis que lhe pode-
rão aparecer.

3.2 As nossas Funções


O leitor tem acesso a todas as fun ções disponíveis pelas ASP 2.00,
e a partir de agora pode definir as suas pr óprias funções. Não es-
quecer que as ASP 3.00 vêm com o Windows 2000 e o seu IIS5,
como indicado no primeiro capítulo. Nos próximos casos as fun-

ções que
recem na vprograma
ão ser criadas
ção deserão para
sites situações que por vezes apa-
Internet.
Neste primeiro exemplo criou-se uma função que devolve o número
de dias que faltam até ao ano 2001 a partir de uma dada data.

(ficheiro cpt3-2-1.asp)
<%
Function a2001(data) ‘ início da função
If IsDate(data) then ‘ se for uma data for válida
‘ então envia-se a diferença entre datas
a2001 = DateDiff(“d”,data,”Janeiro 1, 2001")
else‘ enviamos
‘ caso contrário
a data como inválida, em forma de informação
a2001 = “Data inválida...”
end if ‘ final do if
End Function ‘ final da função

Response.Write “Hoje é “ & now() & “<br><br>” ‘ escreve a data


corrente
‘ escreve-se então o resultado
Response.write “Faltam “ & a2001(now()) & “ dias até ao ano 2001.”
%>
CAPÍTULO 3: FUNÇÕES 49

Foram usadas as seguintes funções:

IsDate() para nos certificarmos se a dada data tinha


realmente um formato válido de data;
DateDiff() que retorna o n úmero de dias até ao ano 2001
(o número de dias pois é isso que foi
estabelecido, aquando do campo “d”);
Now() dá-nos a data corrente, que inclui
as horas.

Como se viu, as funções têm uma estrutura própria:

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 função é simples, basta o uso do nome


da função em qualquer ponto do código.

No próximo exemplo pretende-se saber se um e-mail é válido. Desta


maneira o programa valida algo que perturba muitos programado-
res, para tentarem que o input dos utilizadores seja o mais correcto
possível, e os e-mails introduzidos sejam o mais correctos.
50 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES

(ficheiro cpt3-2-2.asp)
<%
Function valmail(email) ‘ início da função
‘ se o tamanho do e-mail for menor que 5 dificilmente será válido(a@a.c)
If Len(email) <= 5 Then
Valmail=False else
‘se não existir um @ também não é válido
If InStr(1, email, “@”, 1) < 2 Then
valmail=False
Else
‘ o ponto final é também importante
If InStr(1,email, “.”, 1) < 4 Then
Valmail=False
Else
Valmail=True
End If
End If
End If
End Function ‘ final da função

if valmail(“o_meu_email@algum_email.com”) then
Response.Write”O e-mail o_meu_email@algum_email.com é
válido.<br>”
Else
Response.Write”O e-mail o_meu_email@algum_email.com não é
válido.<br>”
End if
if valmail(“tentar@iludir”) then
Response.Write “O e-mail tentar@iludir é válido.<br>”
Else
Response.Write “O e-mail tentar@iludir não é válido.<br>”
End if
%>

Foram usadas as seguintes funções:


Len() retorna o tamanho de uma string, para
sabermos se tem o tamanho mínimo
pretendido para um e-mail normal
InStr() muito usado para nos certificarmos da
existência do símbolo @ ou de um ponto
final, sempre usado antes da extensão
do domínio.

O leitor tem assim, uma fun ção que lhe valida todos os e-mails que
receber como input.
CAPÍTULO 3: FUNÇÕES 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 den-
tro das regras que foram pré-definidas. O leitor pode alterar as re-
gras para a validação do e-mail. Outro ponto que por vezes nos toca
é referente à criação dinâmica de ComboBox. Estas caixas, usadas
em formulários do HTML, têm um aspecto conhecido por todos os
programadores: carrega-se num botão que faz aparecer uma lista
com várias opções. Neste exemplo será criada uma função para
criar essa caixa (ComboBox) a partir de um array. No capítulo de
bases de dados, esta mesma função é alterada para se poder criar
com dados retirados de uma base de dados real.

Neste momento é criada uma ComboBox. O código HTML é sim-


ples de se perceber. Em relação ao ciclo FOR, este vai-se repetindo
enquanto não chegar ao limite do tamanho do Array com a fun ção
Ubound() .
52 CENTRO ATLÂNTICO - PROGRAMAÇÃO 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) ‘ inicialização de array

Ardados(0) = “Alentejo”
Ardados(1) = “Minho”
Ardados(2) = “Algarve”
Ardados(3) = “Beira-Litoral”

%>
<form>
Viajar Para ? <%=criacaixa()%>
</form>

Foram usadas as seguintes funções:


UBound() retorna o tamanho de um array, necessário
neste caso para sabermos até que
ponto podemos ir com o ciclo FOR.

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


CAPÍTULO 3: FUNÇÕES 53

Como se pode ver, foi usada a linha <%@ Language=”VBScript” %>


que serve para o programador ter acesso mais facilitado ao código
ASP, que é conhecido como o VBScript do lado do servidor. O IIS
interpreta código, e acaba por percorrer todas as linhas, quer te-
nham ASP ou n ão, se indicarmos no ínicio do ficheiro de que se trata
de um ficheiro com VBScript, a sua performance será melhorada,
mas não é essencial o uso desta linha no ínicio do código.
Algo também muito comum são os gráficos correspondentes a opi-
niões, ou outros, para transmitir informação a partir dos dados em
bases de dados. No exemplo seguinte pode-se perceber o truque de
criar gráficos em HTML, que servem para esse mesmo propósito. O
código seguinte é bastante explícito nesse ponto. O truque é o de
controlar o tamanho das células das tabelas de HTML com os valo-
res 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 ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES

Os gráficos foram criados de uma maneira mais ‘primária’ por as-


sim dizer, pois existe a hipótese de se utilizar componentes comer-
ciais que criam ficheiros de extensão GIF em tempo real com todo
o tipo de gráficos que se podem encontrar, por exemplo, no Microsoft
Excel. Desta maneira, os gráficos são de barras e muito mais rápi-
dos a processar.

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

Como se pode ver pela imagem, o gr áfico é coerente, e as barras


percebem-se bastante bem. O programador pode controlar melhor
o tamanho do gráfico, pode usar imagens ou mesmo outras cores.
A imagem que podemos ver é o resultado do gráfico no Internet
Explorer (IE). No Netscape o resultado é algo diferente, mas isso
tem a haver com a maneira como esse traduz o código HTML em
relação às tabelas. Mas no resultado percebe-se sempre o mesmo,
por isso não existem problemas em usar este tipo de c ódigo para
gerar gráficos de barras.

3.3 Uso de SSI (Server Side Includes)


com as nossas funções
Os SSI, v ão ser certamente algo que o leitor vai usar bastante, pois
além de poder separar o código HTML em vários ficheiros, e estruturar
a página principal da maneira que lhe convém (dinamicamente), pode
ter algo como que uma biblioteca de funções própria. Digamos que
o programador tem várias funções que usa normalmente nos sites
CAPÍTULO 3: FUNÇÕES 55

que mant ém, ou que repete bastante nas várias p áginas de um


mesmo site. Com os SSI, o programador introduz todas as fun ções
que quer num ficheiro, que por sua vez é chamado no início do códi-
go ASP. A partir daí todas as funções desse ficheiro estão acessí-
veis na programação dessa página ASP. Devemos usar os SSI para
aquele tipo de código que sabemos vai ser alterado em várias pági-
nas. Dessa maneira, bastará alterar uma vez, para que todas as
páginas fiquem actualizadas com o novo código.

A maneira de se chamar um ficheiro dentro de um ASP (uso de


SSI), tenha ele parte de c ódigo HTML, ou de ASP, é <!—#INCLUDE
FILE=”ficheiro.inc”—> . Este c ódigo é introduzido no código HTML,
e não no de ASP. Mas tem de estar num ficheiro de ASP e não no de
um de HTML - um pouco confuso! Vejamos então os seguintes fi-
cheiros, criados a partir de tudo aquilo que temos vindo a criar neste
capítulo, e recorrendo ao uso de SSI (chamada de ficheiros exterio-
res para complementar a programação).

Vamos então criar um ficheiro que tem o nosso topo de página HTML
por defeito. Esse ficheiro ficará com uma extensão 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 Funções:</font></b></td>
</tr>
</table>
</center>
</div>
<div align=”right”><%=FormatDateTime(Now(),2)%></div><br>

Foram usadas as seguintes funções:

FormatDateTime() formata a da ta escolhida, neste caso


com um Formato de tipo 2;
Now() é usada para que seja formatada a
data corrente.
56 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES

Depois de criado um ficheiro para os topos de todas as páginas


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 código 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 fun ções que foram criadas neste capítu-
lo, e usá-las todas na mesma página, sem termos de ter todo o
código das funções na ASP que programamos.
CAPÍTULO 3: FUNÇÕES 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 inválida...”
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
EndIf If
End
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 ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES

Como foi visto o ficheiro cpt3-3-2.asp tem todas as funções criadas


neste capítulo. Iremos incluí-lo com a potencialidade dos SSI numa
outra página que usaremos para demonstrar as funções. Foi altera-
do o nome de um dos arrays, para que não existissem conflitos
entre ambas as fun çõ es. De futuro, as fun çõ es recebem os
parâmetros, para não nos preocuparmos com este tipo de situa-
ções. Vemos então no exemplo a seguir, introduzido através de SSI,
o ficheiro cpt-3-3-2.asp . Para as ASP é como se todo aquele código
estivesse presente no ficheiro, tomando todas as funções como lo-
cais. A partir deste momento podemos utilizar o ficheiro e todas as
suas funções.

(ficheiro cpt3-3-3.asp)
<!—#INCLUDE FILE=”cpt3-3-2.asp”—>
<!—#INCLUDE FILE=”cpt3-3-1.inc”—>
<p>
Iremos agora ver todos as funções do capítulo a funcionar,<br>
e não precisamos de as ter neste ficheiro.<br>
Desta maneira temo-las em todos os ASP que quisermos sem termos de<br>
escrever o código 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 é
válido.<br>”
Else
Response.Write “O e-mail o_meu_email@algum_email.com não é
válido.<br>”
End if
if valmail(“tentar@iludir”) then
Response.Write “O e-mail tentar@iludir é válido.<br>”
Else
Response.Write “O e-mail tentar@iludir não é válido.<br>”
End if

Dim ardados(3) ‘ inicialização de array

Ardados(0) = “Alentejo”
ardados(1) = “Minho”
ardados(2) = “Algarve”
ardados(3) = “Beira-Litoral”

%>
CAPÍTULO 3: FUNÇÕES 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 explícito daquilo que se


pretendia. Temos todas as funções a funcionar, e podendo funcionar
em todos os ficheiros ASP que o programador tiver para o seu site,
com apenas a inserção de uma linha de c ódigo no topo de cada
página ASP.

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

Agora o leitor poderá estender toda a sua programação num só fi-


cheiro, pelo menos as funções que acha virem a ser aquelas que
mais vai utilizar.
Objectos
4
4.1TabeladeObjectos 62

4.2 Variáveis globais e de sessão 65

4.3 Interagir com o utilizador


4.3.1 Exemplo: Responder ao utilizado r
com os dados recolhidos 72
4.3.2 Exemplo: Validar formulário 73
4.3.3Exemplo:C ursoonline 81
4.3.4 Exem plo: Protecção de páginas
com password 88

4.4 Ficheiro global.asa


4.4.1 Exemplo: Quantos utilizadores estão
a visitar a página 1 00
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: Páginas personalizadas 1 07

4.6 Formatação de strings 1 08


62 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES

4.1 Tabela de Objectos


Os objectos que as ASP t êm por defeito parecem ser poucos, mas
os seus m étodos s ão os suficientes para que o leitor consiga
alcançar 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

O b je c t o s Métodos e suas funções

Response · Redirect
usado para redireccionarmos o utilizador para
outra página. Usado normalmente para controlo
de utilizadores e acessos.

· Cookies
mecanismo para deixar informações do lado do
cliente com variada informação (dentro das
cookies existem outros métodos para o seu
controlo, como veremos depois em pormenor).

· Write
é esta a maneira para enviar informação para o
browser.

· CacheControl
desta maneira controlamos se a página pode
deixar que se faça cache da mesma nos
browsers (por defeito não deixa fazer cache).

· Charset
uma maneira de definirmos o tipo de caracteres
a usar.

· ContentType
para definir o tipo de informação que vai ser
passada, usado normalmente para UpLoad onde
definimos que queremos passar não só informa-
ção usual, mas também binária, srcin ária de
ficheiros.
CAPÍTULO 4: OBJECTOS 63

· Expires
uma maneira de definir o tempo que uma página
ficará activa e deixará de estar disponível. Neste
caso definimos ao fim de quanto tempo expirará.

· ExpireAbsolute
idêntico ao Expires, com a diferença que se pode
controlar, não com o valor que define ao fim de
quanto tempo, mas sim com uma data que
define a altura em que deixa de estar disponível.

· IsClientConnected – desta maneira controla-


mos se o cliente ainda está ligado.

· Status
define o código que está no HTTP header.

· AddHeader
Ajusta dinamicamente a informação 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 vêm
da página anterior, depois de submetermos um
formulário com o método GET.

· Form
este método permite-nos obter os dados enviados
por um formulário que esteja com o método POST.

· ServerVariables
usa-se muito este método para identificar os tipos
de browsers que o cliente está a usar, os IPs do
mesmo, a página de onde o cliente veio, assim
como variadas informações sobre o servidor que
está a ser usado.
64 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES

Server · HTMLEncode
o método que formata a informação que o utilizador
insere. Esta formatação é muito importante devido
a alguns símbolos serem reconhecidos pelo HTML,
e por esse motivo o layout pode não ter o aspecto
planeado

· URLEncode
parecido com o HTMLEncode, mas formata astring
de maneira a ser v álida para usar na linha de
address dos browsers.

· CreateObject
é esta a maneira como iremos aceder a objectos
exteriores, assim como componentes criados por
nós ou outros. Os componentes de ASP s ão fi-
cheiros de extensão DLL, especiais para os ASPs,
possíveis com o VB ou o VC++ (Visual C++).

· MapPath
é com este método que trabalharemos os nossos
ficheiros localmente (no servidor).

Session · Timeout
as sessões do servidor têm um limite, ao fim do
qual toda a informação contida nas sessions
desaparecem. Desta maneira poderemos
controlar o tempo que as sessões estão activas.

· SessionID
este é o método que nos dá o nuúmero da sessão
do cliente corrente. São uma espécie de
impressão digital das sessões.

· Abandon
força a finalização das sessões.

Application A variável global, mas idêntica para todos os


utilizadores, ao contrário das sessions que são
variáveis do tipo global, mas só para o cliente que
está nessa sessão.

TextStream · Cre ateTextFile


método de criação de ficheiros de texto.
· OpentextFile
método de leitura dos ficheiros de texto.
CAPÍTULO 4: OBJECTOS 65

A estrutura de um objecto e seu m étodo é do tipo objecto.método,


logo, para criar-mos, por exemplo, um cookie , usamos
response.cookies, e para obter o valor introduzido na cookie, usare-
mos então request.cookies.
Depois de se ver esta tabela, muitas questões ficam no ar, em rela-
ção a vários métodos que aqui descrevemos. A sua grande maioria
vai ser aprofundada nos próximos capítulos, mas iremos tratar alguns
deles ainda neste capítulo, assim como desenvolver exemplos reais
de como usufruir ao máximo destes objectos.

4.2 Variáveis globais e de sessão


As variáveis globais/sessão, serão uma das hipóteses que o pro-
gramador terá para poder passar dados de base de uma página
para a outra. Normalmente quando se passa de uma p ágina para
outra, as variáveis da primeira página deixam de funcionar numa
segunda. A maneira de ultrapassar este obstáculo é usando os ob-
jectos Application e Session. Apesar de ambos os objectos serem
usados para variáveis globais, cada um tem um objectivo diferente,
e um comportamento diferente dentro do contexto da programação
de páginas ASP. Para o leitor perceber como ambas funcionam ex-
plica-se então como funciona o servidor de Internet que suporta as
ASP:

O servidor Internet faz um controlo de acessos às páginas que con-


tém sob sua alçada, e por isso cria um ID para cada acesso HTTP
que é feito na m áquina onde está instalado e a correr. Desta forma o
servidor consegue fazer uma estatística mais pormenorizada, que a
grande maioria dos outros não 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 sessão, 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 sessão, que se pode aceder por
session.TimeOut . Cada pessoa que está a aceder ao site tem um
ID diferente, assim como que cada sessão é diferente, podendo o
programador usar as sessões, para passar de variáveis de uma
página para outra, visto que a liga ção apenas se quebra no desligar
do browser, ou no atingir do limite de tempo das sess ões. Pode-se
ver pelo código seguinte o ID de uma sessão e o tempo limite que
está por defeito no servidor.
66 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES

(ficheiro cpt4-2-1.asp)
<%
Response.Write “O numero desta sessão é “ & session.SessionID
Response.Write “<br>O tempo de validade de uma sessão é de “
Response.write session.Timeout & “ minutos.”
%>

Foram usadas os seguintes objectos:

Response.Write objecto usado para escrita, tanto em


cookies, browser, headers, etc.
Session.SessionID a maneira de saber qual o c ódigo da
sessão no momento.
Session.Timeout devolve o tempo de expira ção das
sessões, definido no momento.

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

Podemos então usar o objecto Session para passarmos todo o tipo


de variáveis de uma páginas ASP para outra. Aqui ent ão está um
exemplo em que passamos uma string entre duas páginas. Ter em
atenção de que estas variáveis ficam acessíveis não s ó na página
que se corre em seguida, mas em todas aquelas que pertencerem
a esse site. Por isso se para chegar-mos a um ficheiro C começan-
do em A, tenhamos de passar por B, a sessão criada em A continua
activa.
CAPÍTULO 4: OBJECTOS 67

(ficheiro cpt4-2-2.asp)
<%
Response.Write “<br>O tempo de validade de uma sessão é 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 variável de sessão
Session(“”Teste””),”
Response.Write “que contém a string ‘“ & session(“Teste”) & “‘ .”
%>
<br><br><a href=”cpt4-2-3.asp”>carregue aqui para passar à próxima
página</a>

Foram usadas os seguintes objectos:

Session( “Teste”) a maneira de saber qual o c ódigo da


sessão no momento;
Session.TimeOut neste ficheiro us ámos este objecto
com este método, de maneira a
alterarmos o tempo limite de uma
sess ão.

A possibilidade de podermos alterar o tempo limite de uma ses são é


muito importante, tanto para sites de protecção por password, como
para sites mais pesados, onde necessitamos de mais tempo, pois
uma página que demore muito tempo a abrir, ou a processar algo
bastante pesado, possa demorar mais de 1 minuto, e nessa altura a
sessão deveria ter um mínimo de 2 minutos. Aqui tamb ém pudemos
ver como é possível usar “ “ dentro de uma string, ou então lá criar
algo com os mesmos. Visto que as “ “ são 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 então a possibilidade de ver como


se altera o objecto que controla o tempo das sessões, e como criar
uma sessão nossa, e lá introduzir dados que queiramos estarem
acessíveis em uma ou v árias páginas.

Este ficheiro vai chamar um outro ( cpt4-2-3.asp) para que o leitor se


aperceba da maneira como foi possível criar uma sessão própria e
aceder à mesma, a partir de outras páginas.
68 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES

(ficheiro cpt4-2-3.asp)

Podemos ver que a variável de sessão trazida da página anterior é


<strong><font face=”ARIAL” color=”RED” size=3><%=Session(“Teste”)%>
</font></strong>

Aqui nada de novo a não ser a maneira como foi acedida a sessão
criada no ficheiro anterior. Não parece nada de especial mas de cer-
teza que vai usar muitas vezes nas suas páginas ASP. Nos seminári-
os da Microsoft, os seus apresentadores aconselham sempre o
mínimo uso destas variáveis, para que não atrapalhem a performance
do servidor Web. Não aconselho que isto seja levado à risca, mas
se estiver de posse de um servidor que tem uma m édia de 10.000
acessos diários, aí a recomendação da Microsoft deve ser levada
mais a sério. Caso contrário, e por experiência própria, não existem
motivos de preocupação se usar este tipo de variáveis em excesso.

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

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


CAPÍTULO 4: OBJECTOS 69

As imagens são bem elucidativas em relação ao uso de uma ses-


são criada pelo programador. Da mesma maneira que criada uma
sessão para suportar uma string, o leitor poderá usar para criar um
array ou número. As hipóteses são imensas, e a programação a
este nível é bastante facilitada com este objecto.

Outro objecto que é usado para tratar de vari áveis globais é


Application, que é criado e acessível tal como se faz com as ses-
sões, com a particularidade que para o alterarmos tem-se de seguir
certas regras.

A grande diferença entre Application e Session é que enquanto as


variáveis criadas pelo segundo são acedidas apenas pelo utilizador
do momento, ou por aquele a quem pertence um SessionID, as va-
riáveis Application são 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 variáveis globais

Pelo esquema pode-se reparar que para cada utilizador existe uma
sessão independente, enquanto a variável de Application é igual para
todos.
Vemos então um exemplo de como criar e aceder a uma variável de
Application. Repare que existem dois métodos Lock e UnLock para
que a mesma possa ser alterada. Para aceder à mesma não é ne-
cessário usar as regras ditas anteriormente, e visíveis no exemplo
seguinte:
70 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES

(ficheiro cpt4-2-4.asp)

<%
Application.Lock
Application(“Teste2”) = “Uma variável acessível por todos os utilizadores...”
Application.UnLock
Response.Write “ Avariável Application(“”Teste2"”) é > “
Response.Write Application(“Teste2”) & “ <“
%>

Foram usados os seguintes objectos:

Application.Lock serve para trancar a vari ável aos


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

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


CAPÍTULO 4: OBJECTOS 71

4.3 Interagir com o utilizador


Aquilo que realmente faz a diferença entre as páginas estáticas e as
páginas dinâmicas é a possibilidade de resposta aos utilizadores
em tempo real. Podem-se programar páginas que recebendo um
input de um utilizador, estas respondem de acordo com os dados
recolhidos, e isso não se pode fazer apenas com HMTL, e outros
recursos b ásicos.

Para se recolher dados do utilizador é necessário criar uma estrutu-


ra que permite o utilizador inseri-los, de maneira que o programador
possa trabalhar com os mesmos. Em primeiro lugar é criado um
formulário HTML, que tanto pode estar numa simples página HTML,
como numa página ASP. O utilizador pode ter uma p ágina HTML
com o formulário que depois de submetido vai buscar um ficheiro
ASP, onde o programador pode recolher os dados e trabalhar sobre
eles. Ou então o programador numa mesma página ASP controla o
input que é feito, e conforme o estado em que o contexto se enco n-
tra, conforme a acção que é accionada. Mas com os ficheiros de
exemplo seguintes, o leitor vai perceber as diferenças.

(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 vari ável aos


utilizadores, de maneira a poder ser
alterada a variável;
Application(“Teste2”) da mesma maneira que se usa as
Sessions, pode-se criar uma
variável e aceder à mesma;
Application.UnLock usado para depois que é alterada a
variável, tirando o Lock.
72 CENTRO ATLÂNTICO - PROGRAMAÇÃO 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á acessível pelo número de telefone
<strong><%=Request.Form(“telefone”)%></strong> !

Foram usados os seguintes objectos e funções:


Request.Form(...) mecanismo para ir buscar os dados
que vinham do formulário anterior
onde estava o método POST .

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

Nesta primeira imagem vemos o formulário 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


CAPÍTULO 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á acessível pelo número 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’ algorítmica.

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


74 CENTRO ATLÂNTICO - PROGRAMAÇÃO 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 diferença que neste segundo exemplo usa-
mos sempre o mesmo ficheiro. Isto pode ser bom para poupan ça
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 vários ficheiros ASP a tratar dos dados.

Já foi visto como criar um formulário, como obter os dados aí cria-


dos, 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 aplicação. Digamos que temos um
site que serve para simular uma atribuição de bolsa de estudo. Pre-
tendemos o nome do aluno, a data de nascimento, a média do últi-
mo ano e o rendimento mensal dos pais. Vamos criar uma fórmula
(de forma alguma a usada na realidade), onde todos os alunos on-
line podem ficar a saber se vale a pena candidatarem-se ou não.
Vamos então dizer ao aluno que tem hip ótese ao candidatar-se num
dos seguintes casos:
- rendimento mensal dos pais menor ou igual a 80.000$00 e média
maior que 11 valores;
CAPÍTULO 4: OBJECTOS 75

- rendimento mensal entre 80.000$00 e 100.000$00 e média maior


que 13 valores;

- rendimento mensal entre 100.000$00 e 160.000$00 e média


maior que 16;

- média maior que 18;

- o aluno não pode ter menos de 10 anos e mais de 28.

Não vamos aprofundar muito com questões das quantidades envol-


vidas, mas vamos então pedir os dados necessários para que pos-
samos dizer se tem hipótese ou não no caso de se candidatar. Além
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 n ível e poderemos ent ão criar um
pequeno curso online que demonstra muito genericamente uma das
grandes potencialidades da Internet, a formação online.

Continuando então, vamos criar o formulário com as perguntas, e


não esquecendo os nomes de cada Tag de input, nomes esses que
serão os identificadores no uso do objecto request.

Vamos por partes, neste caso vamos estudar a estrutura a desen-


volver. Separemos por partes o que vai ser feito:

- Formulário de pedido de dados do aluno;

- Validação dos dados do aluno;

- Apresentação do resultado.

Estas 3 fases distintas podem ser feitas em 3 procedimentos dife-


rentes. Criaremos um procedimento formulario(), dados_validar() e
resposta(). Ficamos assim com os 3 pontos definidos. Basta agora
criar o código que os vai colocar em produção.

Comecemos pelo formulário que vai pedir os dados ao utilizador:


76 CENTRO ATLÂNTICO - PROGRAMAÇÃO 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>Média 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%>
CAPÍTULO 4: OBJECTOS 77

Fig. 4.10 - Resultado do formulário do ficheiro cpt4-3-3.asp

Como o leitor deve ter reparado foram introduzidos como variáveis


por defeito alguns Request.Form (), isto porque não queremos que
o utilizador perca os dados por cada vez que faça um erro ou que
queira voltar atrás, na sua simulação. Desta forma garantimos que
os dados estão sempre nos sítios certos. No caso de se recomeçar
uma simulação, por defeito os Headers dos ficheiros HTML ficam
em branco à espera de novo Submit do formul ário. A vari ável
session( “erro”) serve para mostrar uma mensagem de aviso em
relação aos dados que foram introduzidos incorrectamente, que ten-
tamos manter cada vez que tudo estiver validado e correcto, para
que quando se recomece o formulário ainda lá esteja essa mesma
mensagem.

Assim, com este código, ficamos com um formulário que além de


receber input do utilizador, envia os dados para uma nova fase, que
é a fase de validação.
Para validar-mos estes dados precisamos de os receber, e para
isso foi usado no código inicial o seguinte código:

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 ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES

Este código é introduzido antes de se usarem os procedimentos


pois queremos que as variáveis sejam dadas como variáveis públi-
cas dentro deste ficheiro ASP. Desta forma, é mais fácil tratar os
dados e escusamos de estar sempre a usar o código Request.Form
(“…..”), bastando assim apenas o nome que atribuímos a cada um
dos argumentos que são passados. A variável Data fica com uma
formatação diferente, pois queremos construir uma data real, para
que no uso da função IsDate() disponhamos à partida de algo se-
melhante para validação.

<%Sub dados_validar()%>
<%
session(“erro”) = “”
‘ se não for data a variável de sessão fica com o erro correspondente
if not(IsDate(data)) then
session(“erro”) = “* A data está inválida...<br>”
else
if (not(IsNumeric(media))OR ((media<0)OR(media>20))) then
session(“erro”) = “* A média é inválida...<br>”
else
if not(IsNumeric(rendimento)) then
session(“erro”) = “* O rendimento está inválido...<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 variáveis que o formulário


apanhou do utilizador, e validadas conforme aquilo que se pretendia:
a data validada como data e o rendimento e m édia do aluno como
números, para que não sejam aceites letras ou outros caracteres
idênticos. E no final é chamado o formulario() ou o procedimento
resposta(), conforme o que se pretende. No caso de existir algum
erro nas variáveis que foram pedidas, o utilizador é enviado nova-
mente para o formulário, que mantém os dados anteriores, visto que
os est á sempre a apanhar com Request.Form(). Caso contrário, e
visto que está tudo certo, o utilizador recebe a resposta em relação
à sua simulação. Esta resposta é dada a partir do código que vemos
a seguir.
CAPÍTULO 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%>
O Aluno</font>
<p align=”center”><b><font color=”#800000" face=”Arial” size=”3"><br>
<font face=”Arial” size=”4" color=”#FF0000"><%=nome%></font>
<font color=”#800000" face=”Arial” size=”3"> ,&nbsp;<br>com ademédia
</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 = “ não tem “
end if
end if
end if
end if
Response.Write mensagem%>
<font color=”#800000" face=”Arial” size=”3">direito<br>à bolsa de
</font>
estudo.<br></font></b></p><br>
<%
else%>
<br><center><strong><font face=’ARIAL’ color=’red’ size=’3'>
Não é 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 simulação</a>
</center>
</div>
<%End Sub%>
80 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES

Fig. 4.11 - Resultado de validação do ficheiro cpt4-3-3.asp

Na imagem anterior, obteve-se uma resposta do formulário em rela-


ção à média que o utilizador introduziu, que não sendo válida, pede
para que seja corrigida. Este tipo de correcção é feito também para
outras vari áveis, e o procedimento em si é o mesmo, mas com
mensagens de erro diferentes, correspondendo a cada uma das si-
tuações de validação.

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


CAPÍTULO 4: OBJECTOS 81

Como podemos ver na imagem anterior, a resposta que se obteve


foi negativa, depois de se terem efectuadas as comparações com
os requisitos definidos para a atribuição 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 são correspondentes aos
dados que o utilizador introduziu. Neste caso é usado o DateDiff (),
para que os alunos com uma idade não válida para as bolsas sejam
avisados disso. No caso contrário é enviada a resposta em relação
ao apoio por Bolsa de Estudo.

Introduziu-se um link para o caso do utilizador querer recomeçar a


simulação. Será aqui que tudo recomeçará, tendo em conta que a
variável de sessão tem de estar vazia, ou o último erro continuaria a
aparecer apesar de ser uma nova simulação. Por isso esta função
começa com a sessão de erro a ser limpa, pois para se ter chegado
a este ponto era porque as variáveis estavam correctas.
Depois desta explicação, podemos ver o código 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 média 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 ATLÂNTICO - PROGRAMAÇÃO 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 = “ não 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'>
Não é possível 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 simulação</a>
</center>
</div>
<%End Sub%>

<%Sub dados_validar()%>
<%
session(“erro”) = “”
if not(IsDate(data)) then
session(“erro”) = “* A data está inválida...<br>”
else
if (not(IsNumeric(media))OR ((media<0)OR(media>20))) then
session(“erro”) = “* A média é inválida...<br>”
else
if not(IsNumeric(rendimento)) then
session(“erro”) = “* O rendimento está inválido...<br>”
end if
end if
end if
CAPÍTULO 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>Média 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 ATLÂNTICO - PROGRAMAÇÃO 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 funções:

Session () usado neste caso para que tenhamos uma


variável que guarde o tipo de erro que foi
achado nos dados introduzidos pelo
utilizador;
DateDiff () DateDiff (), assim como est á explicado na
tabela de funções, serve para devolver uma
diferença 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 variável é depois usada para sabermos
se o mesmo reúne condições para poder
receber resposta da aplicação;
IsDate () O IsDate, devolve True ou False, conforme
a data indicada seja ou não uma data válida;
IsNumeric () Como o IsDate, este tamb ém é booleano, e
indica se a variável é numérica ou não;
Request.Form () Esta é a maneira de o programa aceder aos
dados submetidos pelo último formulário.

No seguinte exemplo é criado um curso online, bastante simples,


de resposta múltipla. Este exemplo é importante, pois, caso o leitor
o compreenda terá uma boa noção das potencialidades das variá-
veis de sessão, e passagem de parâmetros entre vários procedi-
mentos.

Necessitamos claro, de perguntas, respectivas respostas, valida-


ção das respostas, e uma apresentação do resultado depois do tes-
te.
CAPÍTULO 4: OBJECTOS 85

Definimos então alguns procedimentos:


- Procedimentos de perguntas (onde teremos um formulário de per-
gunta e respostas, que neste exemplo são 5, devido a serem 5 per-
guntas);
- Um procedimento, para enviar o total do teste, e respectiva men-
sagem de aprovação ou reprovação.

Todos os procedimentos de perguntas terão então o aspecto do có-


digo da seguinte tabela, mas com a diferen ça 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”>Qualo código 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”>Não sei</font></td>
</tr>
86 CENTRO ATLÂNTICO - PROGRAMAÇÃO 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 código usado é praticamente


HTML puro, com a excepção do uso de uma variável de sessão que
serve para podermos controlar em que pergunta vai o teste, de ma-
neira 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
próximo capítulo), pode criar vários tipos de testes usando apenas
um procedimento para todos eles.
Será então num outro procedimento, depois de todas as perguntas
terem sido respondidas, que todas as variáveis serão limpas, de
maneira a que se possa responder a um novo teste, ou tentar nova
sorte. Nesta fase, será feita uma validação de todas as respostas e
incrementada uma variável com o total de valores do teste - alterada
consoante a qualidade das respostas dadas.
CAPÍTULO 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 distinção!</font></strong>”
end if
end if
end if
end if
%>

Como se pode observar, todas as variáveis de sessão devolvem as


respostas, que conforme estejam certas ou n ã o ir ã o ser
determinantes no desenvolvimento da variável local total, para a nota
final do teste online.
Observando todo o código, teremos então uma noção mais real da-
quilo que se pretende, pois com as primeiras linhas de c ódigo se
pode perceber como todos os procedimentos são geridos.

Fig. 4.14
88 CENTRO ATLÂNTICO - PROGRAMAÇÃO 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”>Qualo código 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”>Não 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%>
CAPÍTULO 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 variável global, acessível
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”>Não 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 ATLÂNTICO - PROGRAMAÇÃO 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%”><fontface=”Arial”>I
nternetInformationServer</font></td>
</tr>
<tr>
<td width=”7%” align=”right”><input type=”radio” value=”resposta4"
checked name=”pergunta3"></td>
<td width=”93%”><font face=”Arial”>Não 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%>
CAPÍTULO 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 função que devolve uma diferença 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”>Não 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 ATLÂNTICO - PROGRAMAÇÃO 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”>Não 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%>
CAPÍTULO 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 distinção!</font></strong>”
end if
end if
end if
end if
%>
<br><br><center><a href=”cpt4-3-4.asp”>recomeçar</a></center>
<%session(“pergunta1”) = “”
session(“pergunta2”) = “”
session(“pergunta3”) = “”
session(“pergunta4”) = “”
session(“pergunta5”) = “”0%>
session(“npergunta”)
<%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 ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES

Foram usados os seguintes objectos e funções:


Session () muito usado neste exemplo, este objecto
tem tanto o n úmero 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 formulário.

Para acabar esta parte do capítulo, vamos ver como podemos pro-
teger as nossas páginas ASP, de maneira a só serem acedidas de-
pois de introdução de login e password, e controlando o tempo que
estes têm de activação. Parece algo que requer alguma programa-
ção mais avançada, mas será o exemplo onde terá de ser escrito
um m ínimo de código de programação. Tudo o que o leitor tem de
criar é um ficheiro, formulário onde o utilizador irá introduzir o login e
a password, a mensagem de erro, e o envio para a página principal
do site protegido, que por sua vez, só pode ser acedido depois do
login e password serem validados.

Vamos então dividir o ficheiro de entrada e validação de dados em 3


partes: a primeira
por interm édio de parte será aquela
um formul em que ser
ário, a segunda ão pedidos
parte os dados
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 então ter de receber dados, que vamos introduzir em variá-


veis de sessão, de maneira a que possamos ter os dados activos
durante o tempo que definirmos em Session.TimeOut Quando
reiniciamos a página e esses dados estiverem incorrectos, envia-
mos o utilizador para uma mensagem de erro, caso contrário, será
encaminhado para a primeira página protegida. As páginas protegi-
das deverão então ter apenas 3 linhas de c ódigo, de maneira a com-
pararmos o login e password que estão em variáveis de sessão.
(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”>
CAPÍTULO 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 password
e errados...</font>
<br><br><a href=”cpt4-3-5.asp”>tente de novo</a></center>
<%End Sub%>
<%
session.Timeout = 4 ‘ o tempo que as sessões vão 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 formulário
formulario
else ‘ senão vamos ver o que têm as sessões no momento
if ((session(“login”)<>”xpto” and session(“password”)<>”123") AND
Request.Querystring(“todo”)=”in”) then
erro ‘ neste caso o login e password não são validados
else
Response.Redirect(“cpt4-3-5test.asp”) ‘aqui o utilizador é
validado positivamente
end if
end if
%>
96 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES

Foram usados os seguintes objectos e funções:


Session () ter á as variáveis que simbolizam o login e
password. Estas serão comparadas no
início de cada página protegida, de maneira
a assegurar se o utilizador está validado ou
não;
Session.Timeout () neste exemplo este m étodo é usado
para definirmos o tempo em que as sessões
estão activas, ou seja, os minutos em que
as sessões est ão activas, depois da
inactividade ocorrente no site.

Agora que vimos o código que recebe e valida a entrada de um


utilizador vamos ver uma normal página ASP, que está protegida, a
qual só é possível ao utilizador aceder, se validada a sua entrada no
formulário. No início de todas as páginas ASP que queremos prote-
gidas, fazemos uma comparação das variáveis de sessão de ma-
neira a sabermos se estas são válidas ou não.

(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 vindoa esta página...</font>
</center>

Como ficou demonstrado, é simples a maneira de se poder proteger


páginas de um site. Além deste caso, o utilizador pode fazer uma
conexão a uma base de dados, e usar apenas uma variável de ses-
são que diz sim ou não, conforme seja validada ou não depois de
inquirida a base de dados.

4.4 Ficheiro Global.asa


Muitos programadores de ASP têm um certo receio de mexer neste
ficheiro, ou até mesmo de programar usando o mesmo. Não há que
ter receio em mexer neste ficheiro, que acima de tudo é uma
tecnologia importante para certas soluções online, e que é uma das
armas das ASP em relação a outras linguagens semelhantes. Quan-
do entramos num site em servidor IIS existem 4 fases distintas que
vou identificar de maneira a poder continuar com o meu raciocínio:
CAPÍTULO 4: OBJECTOS 97

1. o primeiro utilizador entra e o servidor fica alerta;


2. o utilizador começa uma nova sessão, e essas sessões
que ele cria são as que utilizamos para variáveis globais, e
para definir o tempo de ac ção das mesmas.
3. o utilizador sai do site e a sua sess ão 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 expli-


cação do ponto de vista pr ático.

O ficheiro Global.Asa, é algo como que o controlador dos acessos


ao site que o programador criou, ou estiver a desenvolver. Este fi-
cheiro tem apenas 4 funções 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 código dentro de cada
uma destas zonas para nosso benefício. Por exemplo, o leitor quer
que seja introduzido num ficheiro de texto o endereço IP de cada
utilizador que entra nosite. Basta escrever dentro da segunda função
do ficheiro Global.Asa o código 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 média no
site, basta criarmos um registo de tempo de entrada na segunda
função, e um na terceira fun ção, e mais tarde fazermos DateDiff()
para sabermos a média 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 ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES

Como podemos ver tem apenas 4 procedimentos que são percorri-


dos em determinadas situações.
Este ficheiro tem de estar localizado no directório 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


directório virtual, onde queremos ter o site

Fig. 4.16 - Directório onde o ficheiro


global.asa tem de ficar em função do
site virtual da imagem anterior
CAPÍTULO 4: OBJECTOS 99

Agora para testarmos a potencialidade deste ficheiro vamos saber


quantos utilizadores estão neste momento no nosso site. Para isso
basta criarmos uma variável 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 vari-
ável será 4. Se um deles sair passará a ser 3 pois houve uma ses-
são que acabou. Da mesma maneira, por cada utilizador que entre
no site essa mesma variável irá ser incrementada. Passando da
teoria à prática vamos então 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 funções:

Session.Timeout () onde se define o tempo que vai


durar cada sessão. Se o utilizador
ficar inactivo durante um certo
período de tempo (em minutos), a
função Session.OnEnd() activa-se e
processa uma saída do site. Aqui va–
mos definir esse tempo em minutos;
100 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES

Application.Lock () é o método usado para trancar a


variável, de maneira que possa ser
alterada sem intervenções externas.
Um meio de protecção dos dados
que estão lá incluídos;
Application (“utilizadores”) desta maneira obtemos uma
variável global, onde todos os
utilizadores têm acesso, de maneira
que todos podem aceder aos dados
relativos ao número de utilizadores
do site em questão;
Application.UnLock () neste m étodo destranca-se a
variável depois da mesma ter sido
alterada.

Depois de termos este ficheiro no local certo e com o código acima


descrito, está na hora de acedermos à variável de maneira a saber-
mos quantos utilizadores estão online. Para isso basta apenas uma
linha de código ASP, dentro do HTML que o leitor achar apropriado
para a apresentação 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 funções:


Application () aqui usado para podermos escrever
no browser o número de utilizadores que
estão a navegar no nosso site.

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


CAPÍTULO 4: OBJECTOS 101

Como podemos ver nesta imagem, existem 4 utilizadores no site. O


leitor pode obter este valor abrindo várias janelas no browser e entrar
neste mesmo site virtual.
Esta é uma das formas de usar o global.asa para nosso benefício.
Outra maneira é tentar criar um chat para os utilizadores do site. O
truque está em criarmos várias variáveis do tipo Application() e ir
actualizando cada uma delas conforme a introdução de informação
por parte dos utilizadores. Ao entrar uma nova linha de texto actuali-
zam-se as variáveis, igualando a mais recente à imediatamente an-
terior e assim consecutivamente. O ficheiro global.asa vai entrar aqui
novamente - será onde as variáveis vão ser inicializadas.
Neste exemplo teremos três ficheiros: um para controlar os frames,
pois para este exemplo teremos de usar dois ficheiros em simult â-
neo, outro onde se mostram as frases, com um auto-refresh de 8
segundos, e outro ainda para o formulário de introdução de mensa-
gens.

(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 são uma t écnica para se conseguir no mesmo ecr ã


visualizar várias páginas em simultâneo. Usam-se muito em sites
muito complexos, e quando se pretende dar uma sensação de tele-
visão com vários botões 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 páginas, assim como os espaços, e ta-
manho de apresentação de cada uma das páginas.

<frameset FRAMEBORDER=”0" BORDER=”false” framespacing=”0"


rows=”90,60">

Vamos então configurar cada uma das páginas que vão ser criadas
para colocar o chat em funcionamento dentro do esquema deframes.

<FRAME SRC=”cpt4-3-7top.asp” SCROLLING=”no”>


<FRAME SRC=”cpt4-3-7.asp” SCROLLING=”no”>
102 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES

E acabamos por finalizar o código HTML para a criação das frames.


A partir daqui vamos criar os ficheiros ASP que vão trabalhar com
as variáveis que guardam os textos do chat. O primeiro será aquele
que introduz a informação introduzida pelo utilizador para as variá-
veis globais, que vão aparecer em todas as diferentes sessões, per-
mitindo 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>
CAPÍTULO 4: OBJECTOS 103

Foram usados os seguintes objectos e funções:

Application (“ linha…n…”) variáveis que guardam todas


as mensagens que vão sendo
deixadas. Cada vez que uma nova é
introduzida, todas se vão igualando
de maneira a andar uma casa para
cima.

Precisamos agora de um ficheiro que mostra os dados no ecr ã


(browser). Será então o próximo ficheiro que vai tratar dessa função,
de reparar na Meta Tag usada (pelo HTML), para refrescar a página
por cada número 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 seg uinte imagem. A intro-


dução no formulário do anterior Nick usado serve para facilitar a
utilização pois o utilizador, em princípio, estará sempre a usar o
mesmo Nick .
104 CENTRO ATLÂNTICO - PROGRAMAÇÃO 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 número de utilizadores em simultâ-
neo, o programa pode além de os contabilizar, guardar o valor num
ficheiro de texto ou numa base de dados, assim como todos os da-
dos das máquinas dos mesmos. As opções são várias, cabendo ao
programador conhecer o funcionamento deste ficheiro, e usufruir ao
máximo 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 vêm, e até o tempo gasto nas páginas.
Normalmente a melhor maneira de recolher dados do lado do cliente
é usando JavaScript, mas esta tecnologia está sempre dependente
da capacidade de interpretação dos browsers. As ASP t êm uma al-
ternativa para recolher este tipo de dados (apesar de não se conse-
guir todos os que se conseguem com JavaScript), que se usam
muito nestas ocasiões. Essas alternativas ASP além de recolherem
dados do lado do cliente, também disponibilizam dados do compu-
CAPÍTULO 4: OBJECTOS 105

tador que está a suportar a página, podendo o webmaster de um site


criar uma página protegida para conhecer os dados da sua máqui-
na. Estas informações são dadas como variáveis especiais do ser-
vidor, e para acedermos a elas usamos o objecto ServerVariables().
Necessitamos ent ão de saber que tipo de vari áveis de servidor
existem para podermos tirar partido das mesmas. Para obtermos
todas as que podemos obter basta corrermos o seguinte código ASP.

(ficheiro cpt4-3-8.asp)
<TABLE border=”1" bordercolor=”black” cellspacing=”0">
<TR><TD><B>Variáveis</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 funções:

For Each / Next () Usamos esta express ão para


percorrermos todos os eventos
possíveis com o objecto
ServerVariables;
Request.ServerVariables () devolve o conteúdo da informação
que pretendemos tanto do servidor
como do cliente.
Podemos pedir uma informação por
“HTTP_COOKIE”)
Request.ServerVariables(
ou Request.ServerVariables(13).

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


106 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES

Este tipo de variáveis vão permitir ultrapassar muitas lacunas a nível


de programação de páginas dinâmicas. Da mesma maneira que
nos servimos destas variáveis para usarmos as potencialidades do
JavaScript, usamos também o método Cookies para podermos usar
os mesmos em ASP.

As variáveis de sessão resolvem muitos problemas na programa-


ção, mas o uso de cookies nunca deixa de ser uma realidade. Eles
são muito usados para adapta ção de sites conforme o tipo de
utilizador. Os cookies são ficheiros criados no lado do utilizador para
guardarem variáveis que o programa necessite de ter de cada má-
quina que visite o site. Vamos ver como as cookies funcionam, de
uma maneira que o leitor poderá ficar com muitas ideias em rela ção
a soluções válidas para os sites que vai criar. Temos o exemplo de
alguns sites portugueses que dão a hipótese ao utilizador de confi-
gurar os dados que aparecem na página inicial. Isto não seria possível
sem o recurso a cookies, e o exemplo que vou demonstrar vai ser
usado para algo parecido. Pretende-se uma página onde o utilizador
configura alguns aspectos da mesma, e por cada vez que a for visi-
tar essa configuração pessoal está activa. Isto tudo porque um fi-
cheiro foi criado no computador do utilizador, com variáveis lá incor-
poradas criadas pela ASP, aquando das configurações do próprio
utilizador.

(ficheiro cpt4-3-9.asp)

olá, não é indiscrição mas será que está a usar<br>


uma máquina com as seguintes configurações:<br>
<%=Request.ServerVariables(“HTTP_USER_AG ENT”)%><br>
Já agora, o seu IP não será
<%=Request.ServerVariables(“REMOTE_ADDR”)%> ?
<br><br>Obrigado pelas informações...

Pelo código anterior julgo que fica clara a maneira como se usa m e
acedem às variáveis do servidor…

Os cookies têm alguns métodos que vão ser explorados neste exem-
plo. Os cookies aqui criados foram feitos como se de objectos se
tratassem criando-se uma estrutura OCOOKIE que detém várias
variáveis. A este ‘array’ de cookies vai-se acrescentar uma validade,
que é definida em dias, usando-se (DATE + número de dias) para a
activar.
CAPÍTULO 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 activação 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 funções:

Response.Cookies (“OCOOKIE”) terá as variáveis que


simbolizam o login e password. Estas serão
comparadas no início de cada página
protegida, de maneira a assegurar se o
utilizador está validado ou não;
108 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES

Response.Cookies (“OCOOKIE”)(“……”) neste exemplo


este método é usado para definirmos nomes
de cookies em "2º grau" - podemos ter
várias variáveis associadas a um mesmo
cookie ;
Response.Cookies (“OCOOKIE”).Expires Com o método
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 têm alguns inconvenientes, pois qualquer utilizador mais


experiente pode acedê-las e apagar aquilo que foi criado. Por isso,
não se recomenda muito o uso das mesmas para sites críticos.
Consideram-se sites críticos aqueles que movimentam dados de
muita import ância, e que t êm uma ac ção determinante para os
utilizadores e para a própria empresa proprietária do site.

4.6 Formatação de strings


Quando temos uma string é normal querermos alterá-la, pois o for-
mato com que nos chega pode não ser o apropriado para os nossos
fins. Temos então nessa altura que alterar (formatar) essa string de
CAPÍTULO 4: OBJECTOS 109

maneira a ficar no formato que mais nos convém. Existem vários


tipos de formato. Vamos identificar alguns e depois experimentar
com uma p ágina onde todos est ão a funcionar. Podemos então
formatar strings, n úmeros e datas:

formatDateTime(“12-01-1995 12:12:00”,1)
Obtém-se assim uma data por extenso, onde até se inclui o dia da
semana. É uma formatação útil para quando queremos uma maior
descrição de uma data, para apresentar cálculos, ou apenas para
páginas que suportam calendários feitos em ASP.

Response.Write formatCurrency(“12312321”)
Podemos formatar um qualquer número para a nossa moeda. O
resultado do número em questão será então em escudos.

Response.Write FormatNumber(“4231,22345553”,5)
Quando precisamos de obter um número e temos de definir as ca-
sas decimais, podemos usar esta função para essa mesma tarefa.

FormatPercent(15/67)
Esta função é muito útil quando fazemos estatísticas num site, ou
quando temos um gráfico, como por exemplo, de uma dada vota-
ção. Somam-se todos os votos, separam-se os que s ão referentes
a um assunto, e usamos esta função para sabermos a que percen-
tagem 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 fóruns, devido às Tags de HTML, pois se os dados do
utilizador não forem controlados este pode alterar o funcionamento
do site, com dados abusivos, e não aceites. Para que não seja pos-
sível ao utilizador escrever Tags de HMTL a funcionar no site, usa-
mos este método.

Server.URLEncode(http://www.joaovieira.com/)
Esta função não é muito usada, mas sempre que for preciso formatar
uma string, de maneira a ela servir como refer ência para outro site,
que tem espaços no link ou outra formatação estranha, usa-se este
método para se obter a string certa para esse efeito

Depois de revistos alguns tipos de formatação, vamos então escre-


ver o nosso ficheiro exemplo, para vermos tudo a funcionar. É sem-
pre a melhor maneira de perceber - experimentar, alterar valores ou
alterar algum código.
110 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES

(ficheiro cpt4-3-11.asp)
str1 = “12-01-1995 12:12:00”
Response.Write str1 & “ <strong>(não formatada)</strong><br>”
Response.Write formatDateTime(str1,1) & “ (formatada com opção 1 de
FormatDateTime)<br><br>”

str2 = “12-01-1995 12:12:00”


Response.Write str2 & “ <strong>(não formatada)</strong><br>”
Response.Write formatDateTime(str2,3) & “ (formatada com opção 3 de
FormatDateTime)<br><br>”

str3 = “12312321”
Response.Write str3 & “ <strong>(não formatada)</strong><br>”
Response.Write formatCurrency(str3) & “ (formatada)<br><br>”

str4 = “4231,22345553”
Response.Write str4 & “ <strong>(não formatada)</strong><br>”
Response.Write FormatNumber(str4,5) & “ (formatada com formatNumber
para 5 casas decimais)<br><br>”

str5 = “15/67”
Response.Write str5 & “ <strong>(não 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>(não formatada)</strong><br>”
Response.Write Server.HTMLEncode(str6) & “ (formatada com
Server.HTMLEncode)<br><br>”

str7 = “http://www.joaovieira.com/”
Response.Write str7 & “ <strong>(não formatada)</strong><br>”
Response
.Write Server.UR
LEncode(str7) &
“ (formatadacom
Server.URLEncode)<br><br>”

Foram usados os seguintes objectos e funções:


FormatDateTime () Servimo-nos desta fun ção para
formatar uma string que continha
uma data/hora;
FormatNumber () formatou-se um n úmero com certas
casas decimais definidas na própria
função;
FormatPercent ( ) obteve-se um valor que fez a
percentagem de um número
solitário em relação à soma de um
grupo de números;
CAPÍTULO 4: OBJECTOS 111

Server.HTMLEncode () formatou-se assim todo o


código HTML;
Server.URLEncode () obteve-se uma string válida
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 capítulo. Vimos que qualquer tipo


de formatação pode ser da maior importância, pois os problemas de
validação, e não só, assim o exigem. Poder íamos ter quase um livro
só para formatação de strings, números, datas etc. Porque por ve-
zes 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.
Basesde d
ados
5
5.1BasesdeDados/SQL 114

5.2 Construir uma base de dados


emMicrosofA
t ccess 117

5.3 Conexão àb asededados 12 2

5.4 Inserir, apagar e actualizar dados


em bases de dados
5.4.1Exemplo:Inserirdados 1 27
5.4.2Exemplo:Eliminardados 13 5
5.4.3 Exemplo: Actualizar dados 1 37

5.5 Apresentação de dados

5.5.1 Exemplo: Listar dados em tabela 1 42


5.5.2 Exemplo: Listar dados com imagens 144
5.5.3 Exemplo: Listar dados a pedido 14 6

5.6 Exemplos com bases de dados


5.6.1 Exemplo:Livro de Visitas 14 8
5.6.2 Exemplo: Sondagens de opinião 1 52
114 CENTRO ATLÂNTICO - PROGRAMAÇÃO 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 pro-
gramação Internet. A grande vantagem destas linguagens é a hipó-
tese de se aceder a bases de dados, e, por conseguinte, disponibilizar
informação dinâmica online. Desta maneira pode-se vender online,
ter revistas com informação online, abrir Bancos, Seguradoras, e
outros tipos de empreendimentos online. Não vamos propriamente
ver como se abre o maior negócio do século (deixo isso para o lei-
tor), mas poderemos ver como se processam algumas partes des-
ses sistemas, e como solucionar certos problemas. O livro de visi-
tas, muito procurado, pois todos gostamos de ter um no nosso site,
é um exemplo de como podemos disponibilizar um serviço interactivo
online sem precisar de muita manutenção. Um e-zine, jornal online,
é mais um exemplo de como se podem criar pequenas comunida-
des dedicadas a um certo assunto.

Os sistemas de gestão 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 configuração do Windows, com software
externo) necessários para se ligar via ODBC (sistema que faz uma
ponte entre bases de dados independentemente dos sistemas
operativos das mesmas). Os exemplos que vão ser demonstrados
neste livro são feitos em MSAccess, visto ser indiscutivelmente a
base de dados mais acessível para Windows (para Linux teríamos
outras soluções também muito utilizadas). De referir que via ODBC
é indiferente a base de dados em relação ao código de programação,
visto que ser á usado puro c ódigo SQL para qualquer tipo de
intervenção nos dados. O ODBC é o sistema (que encontramos no
control panel) para criarmos uma ligação com qualquer tipo de BD
suportado pelo servidor (ou pelo menos referente aos drivers que
estiverem instalados).
Uma base de dados é constituída por tabelas, algumas delas ligadas
entre si. Podemos, por exemplo, ter uma tabela de contactos
pessoais para guardar um código identificador, nome, telefone e e-
mail.
Ficaria qualquer coisa do tipo:

TABELA: CONTACTOS

ID Nome Telefone EMail


CAPÍTULO 5: BASES DE DADOS 115

Mas só isto não chega. Precisamos de saber que tipo de campos é


que vamos usar, e para isso teremos uma tabela onde definimos
além do tipo, o tamanho disponível 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 possível de ser usada numa base de
dados. Vamos então 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 Jo ão 219886675 Joao@joao.pt
2 Carlos 324444332 Carlos@carlos.pt
3 Rui 234343444 Rui@rui.pt
4 Pedro 332442433 Pedro@pedro.pt

Pode-se ver então mais facilmente como se processa (teoricamente)


a criação de uma tabela em base de dados, e como ela comporta os
dados que lhe são fornecidos.

Agora, a maneira como estes dados s ão introduzidos, e como


podemos aceder aos mesmos, já requer uma linguagem própria de
bases de dados. O SQL (Structured Query Language), criada no
início dos anos 70 pela IBM, é desde então usada como standard
em todas as bases de dados relacionais até hoje criadas.

O SQL é a linguagem padr ão para a defini ção, actualiza ção e


pesquisa de bases de dados. Qualquer linguagem de terceira ou
quarta gera ção que trabalhe com bases de dados decerto que
embebe expressões de SQL, quer estejemos a falar de ambientes
de bases de dados MSAccess, Informix, SQLServer ou Oracle.
O SQL cont ém poucos comandos, o que faz que com alguma
experiência se possam fazer maravilhas.
O sistema é simples: as ASP usam uma conex ão 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 conexão à base de
dados possamos usufruir de várias hipóteses de como programar
116 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES

com as mesmas.
A estrutura base do SQL é a seguinte:

SELECT [ DISTINCT | ALL] coluna1, coluna2, …


FROM tabela WHERE (situação) GROUP BY
HAVING
UNION | INTERSECT (usar para mais de um SELECT)
ORDER BY (ordenar por coluna)

Neste caso apenas obtemos dados, e não alteramos os dados já


existentes. Para isso é necessário outro tipo de expressões. Por
exemplo, para inserir,

INSERT INTO tabela (coluna1, coluna2, …)


VALUES (‘dados1’, ‘dados2’, …)

Para apagar os dados de uma tabela basta,

DELETE FROM tabela

Ou então se apenas pretendermos eliminar um único registo (linha),

DELETE FROM tabela WHERE coluna1 = ‘dados1’

Podemos também actualizar dados, e nesse caso escreveríamos,

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 começam com a letra J,
basta escrever a seguinte expressão SQL:

SELECT * FROM CONTACTOS WHERE nome like ‘J%’

As plicas ‘ são usadas sempre que se compara uma string. Para


valores num é ricos tal j á n ã o é preciso. As datas por vezes
necessitam de #data# , como nas bases de dados da Microsoft.
CAPÍTULO 5: BASES DE DADOS 117

No caso de se querer introduzir um novo registo já será necessário


um manuseamento diferente dos dados; usaremos então 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á então a ter a seguinte estrutura:

TABELA: CONTACTOS

ID as number Nome as varchar(50) Telefone as varchar(14) EMail as varchar(22)

1 Jo ão 219886675 Joao@joao.pt
2 Carlos 324444332 Carlos@carlos.pt
3 Rui 234343444 Rui@rui.pt
4 Pedro 332442433 Pedro@pedro.pt
5 Ricardo 288889999 Ricardo@ricardo.pt

Podemos, para nos ajudar, contar com os seguintes operadores


válidos no SQL:
OPERADOR DESCRIÇÃO
= Paraigualar
> Maiorque …
< Menorque …
<= Menorouigual
>= Maiorouigual
>
< Diferente

5.2 Construir uma base de dados


em MSAccess
Depois daquilo que foi visto inicialmente neste capítulo, e olhando
para o que vai ser feito, o leitor pode pensar que quase não vale a
pena conhecer mais das expressões de SQL. É um engano, pois
mais cedo ou mais tarde se o leitor não conhecer o essencial destas
expressões, o trabalho com as novas linguagens Internet decorrerá
muito mais lento e menos vantajoso.
118 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES

Foi adoptado para este livro a base de dados Microsoft Access, pois
é a mais acessível de todas, mas é indiferente aquando de uma
conexão via ODBC.
A ideia é criar uma base de dados para contactos. O propósito não é
propriamente a vantagem comercial, ou t écnica, mas sim um
exemplo perceptível, para se usar nos exemplos de introdução 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 análise 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 opções para criarmos um novo ficheiro, ou usarmos um j á
existente. Vamos escolher a opção para iniciarmos um novo ficheiro.

Fig. 5.1 - Escolha da criação de um novo


ficheiro para base de dados em MSAccess
CAPÍTULO 5: BASES DE DADOS 119

Depois de iniciarmos a opção anterior, fica então a opção de esco-


lhermos 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 opção mais visível será NEW
(dentro da zona de Tables, como ilustra a seguinte figura).

Fig.5.3 - Aspecto da consola de


manutenção e criação da base de dados
120 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES

Carregamos em NEW, e vamos escolher a opção Design View como


maneira esquemática da criação da tabela que pretendemos para a
base de dados.

Fig. 5.4 - Escolha de esquema para


a criação da tabela CONTACTOS

Criamos ent ão a estrutura pretendida neste exerc ício, da tabela


CONTACTOS. O esquema a criar é como o que está na figura. Não
há muito a explicar no funcionamento do MSAccess neste campo,
mas qualquer manual, ou site sobre este tipo de base de dados ex-
plica o que for necessário. Não esquecer de definir o campo EMAIL
a permitir aceitar valores nulos, pois nem todas as pessoas têm e-
mail. Para isto basta na parte debaixo do esquema de cria ção da
tabela, e notab General,um YES no campo que dizAllow Zero Length.
Se o leitor não quiser ter problemas na programação, e para estar
mais à vontade, pode repetir este passo para todos os campos
(excepto na chave primária, como é óbvio).

Fig. 5.5 - Esquema da tabela CONTACTOS no MSAccess


CAPÍTULO 5: BASES DE DADOS 121

Ao sair depois da criação do esquema da BD, será pedido o nome


da tabela. Neste livro o nome adoptado para esta será o de CON-
TACTOS. Para melhor percepção dos exemplos que iremos apre-
sentar, 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 então acessível na consola do MSAccess a tabela que


foi então criada. Ficamos assim com uma base de dados j á algo
estruturada.

Fig. 5.7 - Tabela CONTACTOS acessível


no MSAccess depois de criada

Normalmente, nas bases de dados empresariais, as tabelas são


criadas com comandos do tipo CREATE TABLE que só por si daria
para mais um capítulo, por isso também a adopção do MSAccess,
que cria toda a estrutura depois de termos feito apenas alguns es-
quemas a nível visual.
122 CENTRO ATLÂNTICO - PROGRAMAÇÃO 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 Conexão à base de dados


Normalmente a conexão às bases de dados pelas ASP é feito pelo
ADO, que por sua vez usa uma conexão ODBC. Esta conexão é
feita sem se saber se a base de dados é MSAccess ou não. O que
interessa é que a mesma seja feita com sucesso. Vai-se criar a co-
nexão via ODBC, mas vai ser exemplificado também uma maneira
de se conectar à BD MSAccess sem ser necessário o uso do ODBC,
liga çã o essa mais conhecida internacionalmente por DSNLess
Connection (visto que para o uso de ODBC a conexão processa-se
com DSN= …).

Para ser feita esta conexão temos de saber onde temos o ficheiro da
BD, e o nome que achamos ser o mais fácil, ou acessível para uso
dentro da programação 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 se-
guinte.

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 conso-


la…
CAPÍTULO 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 opção System DSN, podendo ver as


liga ções que j á est ão criadas. O mais normal é o leitor n ão ter
nenhuma, mas isso não é problema pois o que interessaé que aquela
que deseja criar fique lá disponível.

Fig. 5.10 - Zona onde se vai criar o identificador


da conexão ODBC para o uso da BD em ASP
124 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES

O leitor carrega em ADD, para inicializar o processo de criação da


conexão.

Fig. 5.11 - Escolha do tipo de BD, para conexão

Na imagem anterior o leitor poderia escolher em vez do MSAccess


outras BD, como por exemplo, Oracle, SQL Server, Informix ou mes-
mo um ficheiro de Excel. Neste exemplo vamos escolher o MSAccess,
mas caso a opção fosse outra seria nesta altura que deveria tomar
essa decisão, e depois ir criar a liga ção com base num ficheiro dife-
rente do MSAccess. A chamada que vai serfeita das ASP comqueries
vai aceder a tabelas e colunas, independentemente da base de dados
em questão. No entanto, para utilização de funções especiais não
conformes a norma ANSI do SQL, temos que ter consciência que tal
pode não ser compatível com outras bases de dados. Por exemplo,
no Oracle, pode-se usar to_char () e to_date (), mas não funcionam
noutras bases de dados.

Fig. 5.12 - Zona de criação da conexão à BD


CAPÍTULO 5: BASES DE DADOS 125

Dentro da zona de criação da conexão, o programador vai ter de


seguir 2 passos importantes e nem por isso (ter em atenção a figura
anterior) muito complexos.
1 – Criar um nome para aceder à conexão, neste caso livrodsn
2 – Carregar no bot ão SELECT e escolher o ficheiro da base de
dados, neste caso livro.mdb

ão
Fig. 5.13 - Imagem da consola depois de criada a conex

Depois destes passos, se aparecer livrodsn como na imagem ante-


rior, a conexão 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 conexão que foi criado ‘livrodsn‘.
O primeiro passo será criar um objecto de conexão à BD,

Set Conn = Server.CreateObject(“ADODB.Connection”)

Depois deste passo vamos usar o método open, próprio do objecto


que foi criado,

Conn.open “DSN=livrodsn;”

Desta maneira acabámos de fazer uma conexão à BD. Tudo o que


agora é preciso é de uma maneira de podermos trabalhar os dados
referentes à BD que est á nessa conex ão. Vamos ent ão usar o
RecordSet, mais um tipo de objectos, mas desta maneira, para o
controlo de dados.
126 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES

Podemos então criar um objecto RecordSet com o seguinte código,

Set rs = Server.CreateObject(“ADODB.Recordset”)

Depois das fases anteriores, tudo o que tem de fazer para controlar
a BD é criar uma declaração de SQL e accionar a mesma, isto da
seguinte maneira,

SQLStmt= “SELECT … FRO


M …”
rs.Open SQLstmt,Conn,1,2

Desta maneira o leitor já fez uma procura na BD, apesar de não


fazer uma saída para o browser, mas isso será visto nas próximas
linhas.

A estrutura completa para uma conexão à BD, e fazer uma alteração


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 declaração de SQL é apenas um exemplo e não funciona como


está. Vamos ver exemplos válidos já a seguir. Ou se possuir conhe-
cimentos 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 extensão da conexão 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 directório e por isso na variável


DBQ não foi preciso indicar a morada onde a mesma está.
Ficam assim vistas duas maneiras de nos conectarmos à BD. Nor-
CAPÍTULO 5: BASES DE DADOS 127

malmente os sites de aluguer de espaço fazem-se pagar por cada


conexão que é feita por DSN, fazendo com que a maioria dos progra-
madores opte por fazer uma conexão directa como no segundo caso
agora visto. O leitor ir á optar por aquela que mais lhe convém, desde
que não se esqueça que se mais tarde for mudada a BD pode ter de
alterar o código em todos os ficheiros, o que com a ligação via DSN
já não seria preciso.

5.4 Inserir, apagar e actualizar dados


em base de dados
Vamos então começar por ver como podemos inserir dados na BD,
e aproveitaremos para fazer inserções de duas maneiras diferen-
tes.
Na primeira forçamos no código a inserção dos dados, como pode-
mos 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 “Introduzi
do comsucesso
...”

Foram usados os seguintes objectos/métodos:


Server.CreateObject(“ADODB.Connection”) a maneira com
que criamos o objecto de conexão à BD;
Server.CreateObject(“ADODB.Recordset”) criação do
recordset que nos permitirá trabalhar com a
BD;
conn.Open ”DSN=…” serviu para abrir a BD com a
conexão via DSN, referente à BD em
questão;
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 ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES

Podemos também criar um ficheiro ASP onde temos um formul ário


para introdução de dados por parte do utilizador, que depois é valida-
do e introduzido na BD.

Iremos então criar alguns procedimentos para a execução deste fi-


cheiro de introdução de dados via formulário.

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 introdução de dados para o utilizador. De reparar que foi
introduzido o Request.Form(“…”), para que cada vez que se tenha
de repetir a introdução de dados devido a um campo ser inválido, o
utilizador não tenha de introduzir tudo de novo.

O argumento para sabermos o que se vai seguir é fazer (o argumen-


to que vem da linha de comando do link quando se chama a página
pagina.asp?fazer=... ), como podemos ver neste caso ficar á
fazer=introduzir, que ao iniciarmos a página validaremos para saber o
que vai ser executado, para mostrar o formulário ou receber e enviar
os dados introduzidos.

Depois da introdução dos dados, verificamos que os recebemos e


que queremos introduzir na BD, mas para isso temos de os validar
primeiro, pois certos campos têm de ter um certo número de carac-
teres, assim como o campo idade tem de ser numérico.
CAPÍTULO 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 não 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 não é
válida...</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 número 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 número 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 devolve r


uma mensagem de erro

ário do ficheirocpt5-4-2.asp
Fig. 5.14 - Aspecto do formul ,
com um campo em que se tentam introduzir dadosálidos
inv
130 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES

Fig. 5.15 - Erro de validação do campo


idade do ficheiro cpt5-4-2.asp

Depois de tudo validado o utilizador poderá repetir novamente, devi-


do à inclusão de um link que dá essa hipótese.

Fig. 5.16 - Mensagem de confirmação de


introdução de dados do ficheiro cpt5-4-2.asp
CAPÍTULO 5: BASES DE DADOS 131

Depois da validação, corremos o procedimento introducao_dados


que é onde estará o c ódigo de conexão e declaração SQL, neces-
sários 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 introdução dos dados, fica a nossa página completa. Note-


-se que toda a introdução de dados é feita via SQL, para que no
futuro não tenha problemas de portar o código para algum sistema
diferente. Usamos o Exit Sub, para que não corra logo a seguir à
introdução dos dados, sendo nosso objectivo mostrar o texto de erro
e pedir novos dados puxando o formulário novamente.

O resultado final da nossa página é então 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 ATLÂNTICO - PROGRAMAÇÃO 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 não 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 não é
válida...</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 número 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 número 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”
CAPÍTULO 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 c ódigo,

if request.querystring(“fazer”) = “introduzir” then


validar_dados
else
formulario_introducao
end if

serve para sabermos qual a acção a prosseguir, pois no nosso for-


mulário criamos o argumento fazer, para podermos controlar se
mostramos o formulário ou se vamos actuar na BD, com dados j á
introduzidos.

Agora, podemos deparar com uma situação em que o utilizador quer


apagar um contacto. Nesta altura é necessário disponibilizar uma
lista de contactos existentes, de maneira ao utilizador escolher aquele
que quer apagar. Uma das maneiras possíveis (e a que vamos usar),
é a de criar uma ComboBox com todos os nomes, e um botão de
apagar junto da mesma.

Primeiro precisamos de um procedimento onde temos o formulário


que inclui a tal ComboBox e o botão para apagar.
134 CENTRO ATLÂNTICO - PROGRAMAÇÃO 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 número do ID do


contacto, número esse que será a referência futura na declaração
de SQL, de forma a sabermos qual o contacto a eliminar.

ário do ficheirocpt5-4-3.asp
Fig. 5.17 - Aspecto do formul
CAPÍTULO 5: BASES DE DADOS 135

No procedimento para apagar, tudo o que se tem a fazer é receber o


número (identificador) do contacto que pretende apagar, introduzir
esse valor na declaração de SQL, e executar a mesma. O contacto
fica então apagado, é devolvida uma mensagem ao utilizador que
diz que o processo foi executado com sucesso. Introduziu-se tam-
bém 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 ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES

O ficheiro com todo o código fica então 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
%>
CAPÍTULO 5: BASES DE DADOS 137

Ao criar e apagar dados em bases de dados, o utilizador começa ao


longo do tempo a necessitar de fazer actualizações nos contactos,
como o e-mail e o número de telefone. É por isso que aparece agora
o próximo ficheiro para actualizar dados já existentes. A f órmula vai
ser um pouco a mesma que foi vista. Vamos então ter a ComboBox,
só que nesta escolhemos o contacto, depois serão devolvidos os
dados desse, preparados para actualização.

Foi usado um procedimento que já tinha sido criado aquando da


inserção de novos contactos – referimo-nos à validação da informa-
ção. Vamos também usar o formulário de apresentação e recepção
dos dados, criado anteriormente, ficando por fazer apenas o código
de inicialização, e os procedimentos de alteração dos dados.

O esquema aqui vai mudar, na medida em que é necessário guar-


dar a variável que representa a identificação da linha da tabela a
alterar (o identificador é a chave da tabela). Isto porque será feita
uma escolha num formulário. De seguida passamos para a zona
onde o utilizador poderá alterar os dados do identificador escolhido
anteriormente, e no final faz-se uma execução da alteração feita na
fase anterior, com uma declaração 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 Alteração”></center>
</form>
</td></tr></table></div>
<%End Sub%>
138 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES

Repare-se que a maneira de obtermos o valor que vem na resp osta


da execu çã o 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 declaração pode
ser múltipla.
Desta maneira, os dados foram introduzidos nos campos certos no
formulário, e o utilizador ter á a hipótese de os alterar. A seguir, de-
pois da submissão desses novos dados, é preciso validar os mes-
mos, e se tudo estiver correcto, introduzi-los na BD, como no proce-
dimento 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 então 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%>
CAPÍTULO 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 não 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 não é
válida.</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 ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES

o número 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 número 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 Alteração”></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
CAPÍTULO 5: BASES DE DADOS 141

select case request.querystring(“fazer”)


case “alterar” alterar
case “executar” validar_dados
case else formulario_principal
end select%>

O c ódigo,

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


disponível durante as páginas, pois é com ele que podemos locali-
zar, nas declarações de SQL, se o tamanho do mesmo é vazio, e o
retorno do formulário estiver preenchido. Vamos então preencher a
variável de sessão contacto, com o identificador que vem do formu-
lário.

Para controlarmos qual dos procedimentos a executar, além de de-


terminarmos a variável argumento fazer, temos que depois buscar o
valor que esta detém, e correr o procedimento que se identifica com
esse comando, com o seguinte código:

select case request.querystring(“fazer”)


case “alterar” alterar
case “executar” validar_dados
case else formulario_principal
end select

Ficam então assim descritas as três situações que o leitor vai en-
contrar quando começar a trabalhar com as ASP: Introduzir, apagar
e actualizar dados em BD parece ser por vezes difícil 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 vários recordsets e por vezes várias conexões, o que
será mais trabalhoso, e pedirá um esforço intelectual maior.
142 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES

5.5 Apresentação de dados


Podemos apresentar os dados de várias maneiras mas normalmente
são usadas as tabelas de HMTL (tratadas no primeiro capítulo deste
manual) para chegarmos a esse objectivo.
Além da conexão à BD, necessitaremos então de executar declara-
ções de SQL, como já foi feito. A diferença aqui é que vamos ter de
percorrer uma a uma e colocar os dados nos locais que nos con-
vém.
O método movenext, que funciona com o objecto recordset, é o
passo a seguir por cada vez que queremos percorrer a resposta da
nossas declaração 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(“telef one”)%></td>
<td bgcolor=”#<%=cor%>” ><%=Rs.Fields(“email”)%></td>
</tr>
<%rs.MoveNext
if cor=”99CCFF” then
cor=”9999FF”
else
cor=”99CCFF”
end if
wend
%></table>
CAPÍTULO 5: BASES DE DADOS 143

Foram usados os seguintes objectos e funções:

Rs.Fields() a maneira com que podemos aceder aos


dados dentro dos campos que pretendemos;
Rs.Movenext () usamos este método para podermos
movimentar o cursor que anda pela base de
dados.

O resultado é aquele que se pode ver na imagem seguinte - uma


estrutura apresentável, que pode servir de Report para muitos tipos
de dados. Repare no truque da mudança de cor por linha, para faci-
litar a pesquisa dos dados.

Fig. 5.19 - Aspecto da resposta do ficheirocpt5-5-1.asp

O c ódigo,

if cor=”99CCFF” then
cor=”9999FF”
else
cor=”99CCFF”
end if

é então o pequeno truque para que possamos alternar as cores das


linhas. Iniciamos a variável cor com um valor, e, dentro do loop, va-
mos validar a mesma, de maneira que ela troque pela cor oposta.
144 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES

Agora digamos que queremos criar uma tabela dinâmica, que vai
fazer uso de imagens. Neste caso para aqueles que têm e para os
que não têm 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 não está vazio, e nesse caso mostrar ou não a imagem refe-
rente 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(“telef one”)%></td>
</tr>
<%rs.MoveNext
if cor=”99CCFF” then
cor=”9999FF”
else
cor=”99CCFF”
end if
wend
%></table>
CAPÍTULO 5: BASES DE DADOS 145

Foram usados os seguintes objectos e funções:

Len () aqui usado para testar o tamanho do e-mail.


Se for menor que um é porque é inexistente,
e nesse caso não 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 endereço definido.

Como se pode verificar foi aproveitado o código do ficheiro cpt5-5-


1.asp. Para este caso bastou-nos alterar a ordem de apresentação
dos dados, e validar o campo de e-mail.

Fig. 5.20 - Aspecto da resposta do ficheirocpt5-5-2.asp

Algo que é muito usado nas páginas Internet é a pesquisa nas bases
de dados da existência de um dado utilizador, e é esse exemplo que
vamos apresentar de seguida.
146 CENTRO ATLÂNTICO - PROGRAMAÇÃO 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(“telef one”)%></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%>
CAPÍTULO 5: BASES DE DADOS 147

O resultado deste exercício pode ser visto nas imagens seguintes,


onde vamos experimentar o código com a introdução de jo que por
sua vez vai listar todas as ocorrências do mesmo.

ário do ficheirocpt5-5-3.asp
Fig. 5.21 - Aspecto do formul

Fig. 5.22 - Aspecto da resposta do ficheiro


cpt5-5-3.asp
,
ências com jo
depois da procura de todas as ocorr

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 c ódigo HTML, mas isso já pertence ao de-
senvolvimento profissional das aplicações que irá desenvolver de-
pois de ler este manual.
148 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES

5.6 Exemplos com bases de dados


Um dos exemplos mais utilizados que recorrem às bases de dados
são os famosos livro de visitas, que al ém de serem simples de
desenvolver, servem depois para serem aproveitados noutras
aplicações para a Internet com as ASP.
Para começar vamos criar uma tabela na nossa BD; a mesma que
usámos para os contactos, com os campos básicos 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 construção do esquema para o livro de visitas.
O livro de visitas não é mais que uma tabela, como as que já vimos,
com dados, mas com uma apresenta ção diferente. Al ém dessa
apresentação dos dados temos também um formulário de introdução
de dados. Um truque, se assim se pode chamar, introduzido neste
exemplo, é o de refrescar a p ágina depois de ser submetido o
formulário, para que o argumento não fique no link de caminho do
browser. O problema de o argumento ficar no link é que ao fazer
refresh na página, os dados são introduzidos novamente, mas se
chamar a página novamente sem argumento esse problema fica
resolvido. Mas para nos apercebermos disto vamos ver o código
fonte desta página 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
CAPÍTULO 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 não
foram válidos.</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 ATLÂNTICO - PROGRAMAÇÃO 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 funções:

Len() estafun ção serve aqui para podermos


medir o tamanho das strings que são
enviadas do formulário. Assim poderemos
ver se estão vazias, ou se estão dentro dos
requisitos mínimos, impostos pelo
programa;
Left() devolveos n caracteres da esquerda de uma
determinada string. Digamos que temos um
campo que não pode ter mais de 30
caracteres na BD e assim nós forçamos
esse limite;
Replace () foi aqui usado por causa das plicas ‘ , que
ao serem usadas nas declarações de SQL
dão erro, pois o próprio SQL usa as
mesmas para limitação de código;
Response.Redirect () o truque que aqui foi feito com
este objecto e método, era de maneira a que
o argumento ?fazer=introduzir n ão 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.
CAPÍTULO 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 conclu ído. O leitor nesta altura terá
concerteza menos dificuldades em assimilar tudo aquilo que vai
sendo feito no código, por isso não nos preocupamos com grandes
explicações nestes exemplos finais.

Algo que muitas empresas cada vez mais anseiam em ter nos seus
sites s ão as sondagens de opinião - uma maneira de conhecerem
as tend ê ncias, que em muito pode ajudar no di á logo com o
consumidor. Vamos então ver os conceitos básicos para criar uma
sondagem de opinião, e deixar o utilizador saber qual est á a ser a
tendência. A estrutura vai ser bastante simples:

Temos um pequeno formulário com duas hipóteses, onde vamos


usar radiobuttons, muito usados no HTML. Estes botões vão ter neste
exemplo duas hip óteses, Sim ou Não, e vai ser a í que a nossa
sondagem se vai centrar. Temos então a pergunta e as possíveis
respostas. Temos de ter uma nova tabela na base de dados que vai
ter de ser actualizada por cada vez que alguém escolher uma das
hipóteses.

Vamos então começar por construir a tabela que n ão vai ter mais de
três campos.
152 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES

TABELA SONDAGEM
ID_sondagem as autonumber
Resposta as Text (5)
Valor as number

Vamos então fazer um formulário 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=”Não” name=”sondagem”></font></td>
CAPÍTULO 5: BASES DE DADOS 153

<center>
<td width=”60"><font size=”3" face=”Arial”>Não</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 inicialização da conexão à


base de dados é sempre feita no início do código (sabendo que os
procedimentos e funções s ó actuam se chamados).

Fig. 5.24 - Aspecto da resposta do


ficheiro cpt5-6-2.asp - a Sondagem
154 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES

Como se pode ver pela imagem, a apresentação é clara e o conteú-


do o essencial. O leitor pode utilizar os dados que são recolhidos da
BD para criar gráficos, ou outras formas de apresentação. A tabela
foi criada de maneira a que possa ter todo o tipo de sondagens,
independentemente do número de respostas possíveis. Depois deste
capítulo existe ainda mais uma matéria para enriquecer os seus pro-
gramas com ASP que é a criação e uso de componentes, que va-
mos ver já nas próximas páginas.
Com
ponent
es
6
6.1 IntroduçãoaosComponentes 1 56

6.2 Tratamento de ficheiros de texto


com o TextStream
6.2.1 Exe mplo: Hist óriasemfim 1 59
6.2.2 Exemplo: Contador de acessos 1 63

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
dV
e isitas 1 73
156 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES

6.1 Introdução aos Componentes


Os componentes das ASP são ficheiros ActiveX que servem para
melhorar o desempenho das páginas ASP, visto que são rápidos e
permitem o desenvolvimento de fun ções reutilizáveis (que desta
maneira podem ficar acessíveis para outras páginas). Se explorar-
mos bem o funcionamento das ASP vemos que os componentes
são 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 métodos e objectos que precisamos para construir as nossas
páginas dinâmicas.

Mas por vezes podemos querer aceder a certas funções que não
são possíveis com as ASP. Para isso podemos aceder a outras como
o Visual Basic (por exemplo), criando um componente nesta lingua-
gem.

Neste capítulo vai-se então demonstrar como se podem programar


componentes ASP em Visual Basic 6, para posterior uso nas nos-
sas páginas ASP.

Com o tempo, o leitor vai cada vez mais usar este tipo de programa-
ção, pois facilita a mesma, e para aqueles que vendem os seus
serviços, podem salvaguardar o seu código desta maneira.
Existem alguns componentes que vêm com as ASP, assim como o
CDO (componente de e-mail) que vem com o IIS, o TextStream,
que é próprio 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 são
grátis, e um dos locais onde pode tentar encontrá-los é em http://
www.aspfree.com ou http://www.15seconds.com . Estes sites têm
listagens dos componentes disponíveis, ordenados por temas, e por
tipo de disponibilidade (Free, Trial, Comercial, Demo, etc.).

Durante este capítulo o leitor vai aprender a instalar componentes


exteriores, desde encontrá-los na Internet, fazer o seu download e a
seguir instalá-los, sendo explicado também como instalar o seu pró-
prio componente, criado em Visual Basic.

Depois de ter lido este livro, e ultrapassadas todas as dúvidas, o


leitor estará então preparado para programar as ASP a alto n ível,
bastando apenas alguma prática adicional.
CAPÍTULO 6: COMPONENTES 157

6.2 Tratamento de ficheiros de


texto com o TextStream
Este objecto do componente FileSystemObject não necessita de
instalação 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 informação de rápido acesso, ou mesmo criar
páginas HMTL no momento, do tipo dar a hipótese aos utilizadores
de criarem uma página sua em função de um template do site. Des-
ta forma toda a p ágina pode ser gerada com este componente e
ficar disponível no momento, e num nível mais alto, ser enviada por
attach via e-mail para o utilizador. Além destas funções o leitor pode
também fazer procura de ficheiros, e movê-los no servidor.
As tabelas abaixo servem para ter uma noção daquilo que se pode
fazer com este objecto, e quais as p ropriedades e métodos para tal.

TABELA DE MÉTODOS DO TEXTSTREAM

M étod o T ipo Descriçã o


Read I np ut Este método vai ler os caracteres um a um.
R ead L in e I np ut Como o nome indica, desta forma lê-se
uma linha inteira.
ReadAll I np ut Lê-se toda a informação que está no
ficheiro.
Write Output Escreve toda a informação que
quisermos introduzir, não mudando de

linha,
escritasendo
logo aa seguir
informaação seguinte
esta.
W r i teL i n e Output Escreve a informação enviada,
mudando de seguida de linha.
WriteBlankLines Output Introduz uma linha vazia.

Skip Input Salta um número específico de


caracteres.
SkipLine I n pu t Muda de linha.
158 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES

TABELA DE PROPRIEDADES DO TEXTSTREAM

P r o p r i ed a d e Descriçã o

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

Line Devolve o número da linha onde vamos.

Column Devolve o número de caracteres que foram


percorridos desde o início da linha.

AtEndOfStream Desta maneira o leitor vai saber se já chegou ao


fim do ficheiro.

Uma maneira fácil de perceber o seu processo é o de escrever e ler


as linhas de texto do ficheiro criado. Vamos então criar uma página
ASP, que faz uma emulação de um jogo que é uma história em que
cada pessoa vai acrescentando um parágrafo. No final a hist ória até
pode ter nexo, ou pode mesmo ser a maior confusão. Mas isto serve
apenas para o leitor ter a percepção de como são usados estes
ficheiros, e como este componente funciona.
Primeiro de tudo vamos fazer uns ficheiros de teste, para nos aper-
cebermos daquilo que vamos usar.

Para abrir uma conexão 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 informação lá escrita é usada a estrutura,

Set ObjectoFicheiro = CreateObject(“Scripting.fileSystemObject”)


Set LerTexto = ObjectoFicheiro.OpenTextFile
(Server.MapPath(“ficheiro.txt”),1)
CAPÍTULO 6: COMPONENTES 159

Desta maneira podemos então 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: Alinha lidaé: <b>” & LerTexto.Readline & “</b>”
Set LerTexto = nothing
%>

Foram usados os seguintes objectos/métodos:

CreateObject(“Scripting.FileSystemObject”) conexão ao
componente. Desta forma ficamos com um
objecto criado com a imagem do mesmo;
CreateTextFile () forma com que se define a criação de um
ficheiro de texto;
EscreveTexto.WriteLine () Escrita de uma linha de texto,
com mudança 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 então 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 ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES

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

E desta maneira vamos então criar a ASP da história que nunca


acaba. A estrutura é um pouco básica, mas que necessita de expli-
cação prévia. Passamos então à sua estruturação:

1. Formulário para input do utilizador;


2. Procedimento de escrita de nova linha para a história;
3. Procedimento de leitura de texto;
4. Procedimento para saber se j á existe ficheiro.

O facto de procurarmos se já existe um ficheiro de história deve-se


ao facto de que o FileSytem devolve erro se não encontrar o ficheiro.
Desta forma criamos um por cada vez que ele n ão existir.

A maneira de sabermos se o ficheiro existe é de usar o próprio com-


ponente e usar um método chamado FileExists. Assim, poderemos
então construir todo o código.
CAPÍTULO 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 Parágrafo: <input type=”text” name=”linha” size=”60"
MaxLength=”140"><br>
<input type=”submit” name=”submeter” Value=”Acrescentar”>
</FORM>
</p>
<%
End Sub
162 CENTRO ATLÂNTICO - PROGRAMAÇÃO 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/métodos:

ProcuraFicheiro.FileExists() este comando devolve True


ou False consoante exista o ficheiro
que procuramos ou não;
len() Foiaquiusadoparatermosa
certeza que a linha enviada pelo
utilizador não est á vazia, e nesse
caso não é inserida uma linha em
branco no ficheiro;
LerTexto.AtEndOfStream Este código, e no contexto em
que foi inserido (no loop), vai
percorrer linha a linha,
possibilitando-nos escrever cada
linha da história, na formatação 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 história que nunca acaba
CAPÍTULO 6: COMPONENTES 163

O resultado da história 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 incluído 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 r esultado é então
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á tínhamos de ter criado um ficheiro de texto c( ontador.txt)


com o valor em que queríamos inicializar a contagem, neste caso,
zero. Por cada entrada no site o valor é incrementado, podendo o
leitor testar, fazendo múltiplos refrescamentos da página.

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


164 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES

Muitas outras funcionalidades se podem dar a este componente.


Por vezes o simples envio de informação via Internet entre sites dis-
tintos necessita deste tipo de tratamento - ficheiros de informação
que são trocados, e normalmente sempre em formato ASCII.

6.3 Componentes de e-mail


Este tipo de componentes (e-mail) são muito importantes na cons-
trução de sites dinâmicos. É uma das maneiras de fazer chegar
informação ao utilizador num nível mais pessoal. Normalmente ne-
cessitamos de preencher o campo de e-mail noutros sites, pois dis-
so depende a recepção de uma password, ou de um ficheiro que
não é possível fazer download pois tem de ser pedido aos seus res-
ponsáveis. Com estes componentes o leitor pode fazer algo seme-
lhante. Vários componentes estão disponíveis na Internet, assim
como o ASPEmail (www.aspemail.com) ou o Jmail que s ão grátis e
qualquer pessoa os pode usar.

Ficam então todos os passos para termos acesso ao componente


Jmail, que existe há alguns anos e funcionou sempre na perfeição.
Para fazer download deste componente tem de se dirigir a http://
tech.dimac.net, e procurar o ficheiro w3Jmail.
Depois do download, a instalação é simples, pois trata-se de um
ficheiro executável, e não de um DLL solto. Neste site existem tam-
bém exemplos de código em que se usa o Jmail. Cabe ao leitor
explorar estes pontos mais a fundo. Seja como for são aqui demons-
trados dois exemplos válidos 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 endereço 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” ‘ endereço para onde
queremos enviar o e-mail
Corpo = “Texto quevai 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-mínima 3-máxima
JMail.Execute
%>
CAPÍTULO 6: COMPONENTES 165

Foram usados os seguintes objectos/métodos :


Server.CreateObject(“JMail.SMTPMail”) Cria-se assim a
conexão 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 t ítulo da
mensagem;
JMail.AddRecipient () Escrevemos aqui para quem vamos
enviar o e-mail;
JMail.Body () Aqui fica a constru ção do corpo da
mensagem;
Jmail.Priority () Aqui definimos a prioridade do e-mail:
1-mínimo, 2-médio, 3-máximo;
JMail.Execute() S ó depois deste comando é que o
e-mail é enviado. Primeiro são as
configurações e depois é que é
executada a função geral.

Este exemplo tratava apenas do envio de um e-mail, sem nenhum


propósito especial. Agora imaginemos que o leitor quer ter no seu
site um ficheiro com anedotas e, para que os outros possam ter
acesso, têm de indicar o e-mail para que as mesmas lhes sejam
enviadas. Entra então assim o conceito do próximo exemplo: Temos
um campo de um formulário onde os utilizadores vão introduzir o
seu e-mail, de maneira a poderem receber um documento que con-
tém 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 estão as piadas”
Jmail.AddRecipient request.form(“email”)
Corpo = “Aqui estão 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 ATLÂNTICO - PROGRAMAÇÃO 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/métodos:

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 páginas dinâmicas. As utilizações possíveis para os com-
ponentes de e-mail são imensas. Numa delas, o leitor pode criar
uma newsletter, onde todos os utilizadores estão em BD, e quando
sai uma nova notícia uma página ASP pode-se encarregar de aenviar
para todos os registados em BD. O envio de passwords para quem
as perdeu é também uma das muitas funcionalidades dadas a este
tipo de componentes. Assim como a confirmação de assinaturas e
serviços que deste componente precisem para terem alguma funci-
onalidade. 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 divulgação de novas, fazendo
com que o tráfego do site aumente por cada novidade que apareça.
CAPÍTULO 6: COMPONENTES 167

6.4 Criar componentes em


Visual Basic 6
Para criarmos o componente previsto necessitamos apenas de al-
gum conhecimento de Visual Basic (VB). O Visual Basic é uma das
bases das ASP e como as duas linguagens são derivadas de VBScript
não vão existir muitos problemas. Até mesmo o leitor que já se sen-
te confortável na programação com ASP, e que nunca usou VB, não
vai ter muitas dificuldades em aperceber-se daquilo que vai ser feito.
O exemplo que vai ser criado não é nada de muito difícil, é algo aliás
bastante simples, que serve apenas para ver como se devem criar
componentes, instalá-los e usá-los. Vamos então criar um exemplo
que usa o código já usado do Livro de Visitas, e que neste cas o fica
dentro de um componente DLL para ASP. Outra particularidade des-
te exemplo é que vamos dar hipótese à pessoa que o estiver a usar
de poder fazer algumas alterações.

Vamos então, antes de mais, inicializar o Visual Basic (este exem-


plo 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 ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES

Vamos então definir as propriedades do projecto que iniciámos. 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 configuração como a da pró-


xima figura.

Fig. 6.6 - Consola de propriedades do projecto


CAPÍTULO 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 pro-
jecto com o nome que mais lhe convenha. Depois disto carregamos
em OK e vamos ent ão mudar o nome da nossa classe, que é criada
por defeito aquando da inicia ção do ActiveX DLL project, para
livrovisitas (visto ser este o nosso objectivo).

Fig. 6.7 - Alterar o nome da nossa


classe para livrovisitas

Mas é necessária haver uma interacção entre ASPs e a DLL que


vamos criar, pois as mesmas só interagem com DLLs específicas.
Temos então de ir buscar uma referência para o VB saber que está
a compilar para o propósito que temos em vista.

Fig. 6.8 - Entrar na consola de referências


170 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES

Depois de entrarmos na consola de referências vamos então esco-


lher duas referências: 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 (escolhe-
mos para este caso pois vamos usar bases de dados, caso contrá-
rio seria desnecessário).

Fig. 6.9 - Referências necessárias para este projecto

Depois de escolhidas as referências, e de termos seguido as pas-


sagens já referidas, vamos então começar a criar as primeiras li-
nhas de código VB para o nosso componente.

Antes de tudo vamos criar uma tabela de dados que julgamos se-
rem válidos para dar hipótese do Livro de Visitas ser configurável
por pessoas estranhas ao código do componente. Digamos que o
utilizador tem de ter a hip ótese de usar um ficheiro com o nome que
quiser para usar o componente, a cor das caixas onde estão as
mensagens, e a cor das letras do site, e das caixas.

Desta maneira o utilizador do componente tem hipótese de configu-


rar os dados à sua vontade.

No VB precisamos de configurar certos objectos que nas ASP te-


mos 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 c ódigo,
CAPÍTULO 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 então reconhecer a conexão à BD e definição do Recordset


que vamos usar para aceder à BD. De resto são as inicializações
das variáveis que vão compensar os objectos das ASP.
Para definirmos os procedimentos que são acessíveis do exterior
basta definirmos se são 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 são os seguintes:

Public Sub OnStartPage(psc As ScriptingContext)


End Sub

Public Sub OnEndPage()


End Sub

Deve ter reparado no tipopsc. Este serve para entrarmos noscripting


da linguagem ASP, que no fundo é um sistema de texto corrido, para
interpretação.

Os procedimentos que vamos usar são os seguintes:


Public Sub CorLetras(cor As String)
Vai ser usado para introduzir a cor das letras numa variável de ses-
são, variável essa que será posteriormente usada;

Public Sub ficheiro(ficheiro As String)


Aqui introduzimos numa variável de sessão o nome do ficheiro que
suporta o livro de visitas. Vai influenciar no redireccionamente e no
Action do formulário HTML;
172 CENTRO ATLÂNTICO - PROGRAMAÇÃO 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 men-
sagens;

Public Sub OnStartPage(psc As ScriptingContext)


Procedimento base que suporta tudo aquilo que deve ser inicializado
antes de se começar a correr o código;

Public Sub inicio()


Procedimento que terá as primeiras linhas de código, que antes es-
tavam fora dos procedimentos do livro de visitas;

Private Sub Introduzir()


Este é o procedimento que já usávamos antes no livro de visitas,
aqui com algumas alterações pois temos de escrever o código 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 então ver parte do queé feito no procedimento OnStartPage ():

Set msc = psc‘chamamos o objecto de scripting inicializado


Set mapplicat ion‘ definimos como usar as variáveis
ion = msc.Applicat
Application
‘ definimos como usufruir do request
Set mrequest= msc.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 variável de ses-


são chamada Ficheiro com um texto ficheiro.asp faz,

msession(“Ficheiro”) = “ficheiro.asp”
CAPÍTULO 6: COMPONENTES 173

Se quisermos ter um valor inserido por um formulário com o nome


email fazemos,

Mrequest.form(“email”)

E assim para todos as outras emulações criadas para os objectos.


O leitor depois saberá qual o melhor uso a dar a cada uma. Tudo o
resto poderá ser código base do VB, que será de onde se poderá
tirar maior partido.

Vamos então ver o ficheiro livrovisitas.cls - a classe que foi criada


no VB para suportar o nosso livro de vis itas.

(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 ATLÂNTICO - PROGRAMAÇÃO 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 e-
mail: </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'>
CAPÍTULO 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 não
foram válidos.</font>”
End If
End Sub
176 CENTRO ATLÂNTICO - PROGRAMAÇÃO 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 com-
ponente. Tudo se passa como se fosse um ASP excepto as chama-
das dos objectos base das ASP.

Para testarmos este código necessitamos de fazer Run do mesmo,


e logo de seguida ir a um ASP que busca este c omponente. No VB6
existe essa vantagem - não necessitamos de instalar o componente
para o testar; basta carregar em RUN no VB, ir ao browser e abrir a
página que chama o componente. Neste caso é uma página 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 possíveis do compo-


nente, busca-se o componente através de Serve.CreateObject onde
a estrutura é,

Server.CreateObject(“NomeProjecto.NomeClasse”)

Depois o uso é básico e de fácil compreensão.


CAPÍTULO 6: COMPONENTES 177

Fig. 6.10 - Aspecto do livro de visitas depois


de correr o código no VB e aberta a página ASP

Não 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 fi-
cheiro 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 compilação do projecto


178 CENTRO ATLÂNTICO - PROGRAMAÇÃO 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 directório do componente fica então,

Fig. 6.13 - Directório onde está o componente criado


CAPÍTULO 6: COMPONENTES 179

4. Instalação do componente, depois de escolhido o


directório onde o guardar (lembrar que o componente
LivroASP.DLL pode ser usado separado. Pode copiar
esse ficheiro para outro servidor e us á-lo então).
O direct ório escolhido para ter os componentes foi
D:\InetPub\WWWRoot\Componentes\LivroASP.DLL

Fig. 6.14 - Directório onde foi colocado


o componente para entrar em produção

Depois de introduzido o componente no directório escolhido para


produção, vamos, dentro desse mesmo directório, correr a seguinte
linha de comando em,

Start > Run


D:\InetPub\WWWRoot\Componentes\regsvr32 LivroASP.DLL

Fig. 6.15 - Instalar o componente


180 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES

Depois de correr a linha descrita é devolvida uma mensagem de


sucesso, depois da qual temos o nosso componente acessível no
nosso servidor.

Fig. 6.16 - Resposta de instalação


com sucesso do componente

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


contr ário fa ça um Find , pois este est á por defeito instalado no
Windows.
Está agora disponível este componente para qualquer site que quei-
ra 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

Dispon í veis em http://www.vb-web-directory.com/microsof/


ms_dload.shtml ou no site da Microsoft.

Se o seu componente não funcionar noutro servidor, faça uma insta-


lação dos componentes (RunTime) indicados acima. No Windows
98 não tem problemas com esta situa ção, seja como for fica assim
então o aviso. Estes ficheiros encontram-se também ou na máqui-
na que tem o VB instalado, ou em sites de programação na Internet.
Podem estar disponíveis como ficheiros executáveis, ou como com-
ponentes soltos, que se instalam da mesma maneira que o compo-
nente que criámos neste capítulo.
Exemplos reais
7
7.1 Introdução 1 82

7.2 A RãM
: otodr e
Busca 18 3

7.3ALoja:LojaE-Commerce 1 97
182 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES

7.1 Introdução
Este capítulo foi introduzido neste manual, n ão para mais uma expli-
cação detalhada linha a linha, mas para inspirar o leitor a desenvol-
vimentos mais complexos com as ASP. Vamos apresentar dois
exemplos que decerto incluem respostas para muitos problemas
que lhe são familiares.
O esquema de ambos é muito parecido, ao ponto de serem usados
ficheiros idênticos em ambas as aplicações. Estes exemplos têm
muito em comum, tais como, ficheiros, fun ções, métodos de busca
de dados e muito mais. Mas o mais importante é que ambos usam
apenas um ficheiro ASP e os outros são de apoio para a construção
do primeiro, que é 80% dinâmico. Teremos 3 zonas desse ficheiro, o
topo, o fundo e o centro. O centro é a zona mais dinâmica, onde
vamos escolher consoante a resposta do nosso Querystring ou
formulário, os dados a mostrar no browser.

O esquema é então sempre o seguinte:

Fig. 7.1 - Esquema dos exemplos deste capítulo

Versão digi
tal, individual,icenciada
l em Jan
/Fev do ano 2000
, pelo Centro Atlânti
co, da versão 1.0 do
ivrol 'Programaçãoeb
WcomASP'
CAPÍTULO 7: EXEMPLOS REAIS 183

Pelo esquema vimos que existem ficheiros que estão incluídos na


ASP, isso graças 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 dinami-


camente. Um exemplo de como fazer esse uso é com o argumento
que vem com o link no browser. Digamos que temos duas hipóteses:
se o argumento ‘fazer ’ for sim, apresentamos o ficheiro com código
HTML a representar ‘certo’ (pode não ser um ficheiro HTML, pode ter
funções ASP), se for ‘não’, apresentamos o ficheiro ‘errado’.
Vejamos então:

No browser temos o link http://pc/livro/default.asp?fazer=sim


Teremos no código ASP o seguinte:

fazer = request.querystring(“fazer”)
<%if fazer=”sim” then%>
<!—#INCLUDE FILE=”certo.inc”—>
<%else%>

<!—#INCLUDE
<%end if%> FILE=”errado.inc”—>

E desta maneira manipulamos a apresentação, no browser, dos


dados com um só ficheiro ASP. Claro que se estiver a programar
um site com muitos acessos esta não será a maneira mais indicada,
mas se n ão contar com mais de mil acessos di ários pode estar
descansado. Seja como for, estes exemplos servem para lhe dar a
conhecer alguns truques usados por profissionais na programação
de sites. Claro que nada disto é uma invenção de última hora, os
mesmos recursos são usados por muitos mas de maneira diferente.

7.2 A Rã – Motor de Busca


Este é sem sombra de d úvidas daqueles exemplos que muitos que-
rem estudar e perceber como se podem ultrapassar alguns proble-
mas. Não é nenhum exemplo para sites ‘Industriais’, mas por aqui o
leitor ficará com as ideias arrumadas e com os conhecimentos su-
ficientes para criar algo mais avançado do que este exemplo. O es-
quema de uso de ficheiros foi explicado no início deste capítulo, ago-
ra precisamos é de ver como estruturar a base de dados e definir
184 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES

quais as funções que vamos precisar em função dos procedimen-


tos que o site deverá ter. Podemos então desde logo identificar algu-
mas etapas, mas para não ficar muito confuso vamos começar pe-
las bases de dados, e logo de seguida esquematizar o esqu ema de
ficheiros que vão ser usados. Não é demais lembrar que neste capí-
tulo não é prioridade explicar o que se faz em cada linha (apesar d e
muitos pontos serem explicados) mas sim, apresentar uma solu-
ção, e demonstrar como torná-la consistente na prática.

Iremos ter então apenas uma tabela para guardar os dados que
acharmos necessários (claro que o leitor poderá criar uma BD dife-
rente, esta serve apenas de orientação inicial).

Achou-se que para este exemplo a data, o título do site, uma descri-
ção e a morada do próprio seriam suficientes.

Ficando o nosso ficheiro em MSAccess (o usado deste o início do


manual) com o seguinte aspecto na consola de Design.

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

Versão digi
tal, individual,icenciada
l em Jan
/Fev do ano 2000
, pelo Centro Atlânti
co, da versão 1.0 do
ivrol 'Programaçãoeb
WcomASP'
CAPÍTULO 7: EXEMPLOS REAIS 185

O esquema é então o seguinte:

TABELA: MOTORBUSCA
id_motor Auto-number; o i dentificador do link
url Text(250);o link da página registada
titulo Text(80);ot ítulo da página
descricao Memo; uma breve descri ção do que trata o site
data Date/Time; data em que foi inserido o link no
motor de busca

Podemos então começar 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 página inicial;


2 – Formulário de procura de dados;
3 – Formulário de registo de site;
4 – Apresentação de dados;
5 – Resultado de procura de sites;
6 – Aspecto gráfico.

Como vamos usar uma só ASP para suportar todas as tarefas do


site, vamos implementar o que foi visto na lista em v ários ficheiros
*.inc (pode ter outra extensão) e usá-los quando achamos necessário,
dentro da estratégia do site. Fica então assim o esquema seguinte
para se ter uma noção do que vai acontecer, e onde aparecem os
ficheiros de que falamos:

Fig. 7.3 - Esquema de ficheiros do motor de busca


186 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES

Ficamos assim com uma ideia dos ficheiros que vão ser usados e
quais as hierarquias envolvidas nos mesmos. Vamos então descre-
ver o que cada ficheiro tem:

Imagens,

C:\Inetpub\wwwroot\livro\motordebusca\imagens\Topo.jpg
ficheiro que representa a imagem de topo do site, incluído no
código HMTL do ficheiro topo.inc

C:\Inetpub\wwwroot\livro\motordebusca\imagens\Bprocurar.gif
ficheiro que representa o botão 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 botão para registarmos os sites que
queiram figurar na BD do motor de busca; é chamado no ficheiro
registar.inc

Ficheiros da página,

C:\Inetpub\wwwroot\livro\motordebusca\Default.asp
ficheiro que recebe os argumentos dos formulários ou da linha de
comando do browser, e consoante o recebido consoante o ficheiro
que é demonstrado na zona central da página;

C:\Inetpub\wwwroot\livro\loja\motordebusca\Funcoes.asp
aqui existe uma função que é usada em mais que um ficheiro, cuja
função é validar as plicas usadas nas strings, para que quando
usarmos a BD não apareçam erros, visto que as mesmas são
usadas pela própria BD;

C:\Inetpub\wwwroot\livro\motordebusca\includes\Fundo.inc
ficheiro com o desenho do fundo do site (estático a 100%);

C:\Inetpub\wwwroot\livro\motordebusca\includes\Inicial.inc
esquema inicial, se não 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;

Versão digi
tal, individual,icenciada
l em Jan
/Fev do ano 2000
, pelo Centro Atlânti
co, da versão 1.0 do
ivrol 'Programaçãoeb
WcomASP'
CAPÍTULO 7: EXEMPLOS REAIS 187

C:\Inetpub\wwwroot\livro\motordebusca\includes\Procura.inc
é simplesmente o formulário 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 formulário 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 dosite (também como o fundo, 100%
estático);

C:\Inetpub\wwwroot\livro\livro.mdb
ficheiro de base de dados onde figura a tabela de dados que
usamos neste exemplo.

A estrutura de directórios pode ser alterada pelo leitor desde que


todo o ambiente o acompanhe. Pretendo por ambiente referir-me à
configuração do servidor de Internet, à conexão à BD, às referências
a páginas, etc.

Agora podemos ir ver o código de todos os ficheiros e falar da função


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”>página
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 então 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 formulário de busca
‘ e incluir a listagem de sites identificados com essa procura
%>
<!—#INCLUDE FILE=”includes/procura.inc”—>
<!—#INCLUDE FILE=”includes/listagem.inc”—>
188 CENTRO ATLÂNTICO - PROGRAMAÇÃO 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 não existir argumento introduzimos a página 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 seguin-


te. Reparar que neste exemplo o argumento fazer não existe, e por
isso os ficheiros introduzidos no meio do código são os correspon-
dentes em Case Else.

Fig. 7.4 - Aspecto geral da página principal


Versão digi
tal, individual,icenciada
l em Jan
/Fev do ano 2000
, pelo Centro Atlânti
co, da versão 1.0 do
ivrol 'Programaçãoeb
WcomASP'
CAPÍTULO 7: EXEMPLOS REAIS 189

(ficheiro funcoes.asp)
<%
‘ esta função serve exclusivamente para acrescentar uma plica
‘ por cada uma que existir nas strings a usar em declarações de SQL
Function tira_plicas(texto)
Texto = trim(texto) ‘ desta maneira tiramos os espaços em branco ao
‘ início e fim da string
texto_temp = “” ‘ esta é uma string temporária onde vamos construir
‘ uma string que não 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 função ( função corrente = valor )
End Function
%>

O ficheiro funcoes.asp é como que uma biblioteca que recorremos


que tem funções generalistas. Nestes exemplos só o usei para uma
função, mas o leitor poderá usar para vários tipos de funções.
Depois de fazermos #INCLUDE de um destes ficheiros, todas as
funções e procedimentos aí existentes são usados como se ao código
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 ATLÂNTICO - PROGRAMAÇÃO 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>

imeira página
O ficheiro inicial representa tudo aquilo que aparece na pr
aquando da chamada do site. Além de incluirmos o formulário de
pesquisa pertencente ao ficheiro procura.inc, introduzimos também
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 adicio-
nar os seus links ou procurar a página que tanto procura.
Não se esqueça de que este serviço é gratuito, por isso pode divulgá-lo
por todos os seus amigos.<br>
Agradeço 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 ‘ variável para controlamros o número de registos a mostrar
‘ na primeira página, ou, página inicial
‘ enquanto não 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)

Versão digi
tal, individual,icenciada
l em Jan
/Fev do ano 2000
, pelo Centro Atlânti
co, da versão 1.0 do
ivrol 'Programaçãoeb
WcomASP'
CAPÍTULO 7: EXEMPLOS REAIS 191

‘ usa-se a função left para controlarmos o número de caracteres da


descrição
‘ 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 número de
links a ver
rs.movenext ‘ movemos o cursor da Base de Dados para a próxima
posição
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 ATLÂNTICO - PROGRAMAÇÃO 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 então a função que está em funcoes.asp para
tirar as plicas
‘ da string que vem do formulário de procura
stringprocura = tira_plicas(request.form(“textoprocura”))
‘ depois da plica retirada fazemos então a declaração 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(
SQLStmt = SQLStmt & “ ORDER“ADODB.Recordset
BY data DESC ””)
rs.Open SQLstmt,Conn,1,2
if rs.eof then ‘ se chegarmos ao final da BD então nada existe
response.write “<p>&nbsp;</p>”
response.write “<br><br><font face=’Verdana’ size=’2'
color=’blue’><b>”
response.write “Não 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
Versão digi
%>
tal, individual,icenciada
l em Jan
/Fev do ano 2000
, pelo Centro Atlânti
co, da versão 1.0 do
ivrol 'Programaçãoeb
WcomASP'
CAPÍTULO 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 função 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 não existir esse link
rs.close
procura_repetido = 0 ‘ a função devolve o número 0
else ‘ caso contrário
rs.close
procura_repetido = 1 ‘ a função acha e devolve 1
end if
End Function

‘ no procedimento seguinte é posto o formulário de registo no browser para


preenchimento
Sub formulario_registo()%>
194 CENTRO ATLÂNTICO - PROGRAMAÇÃO 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>título do site</b></font>
<input type=”text” name=”titulo” size=”30"><br>
<font face=”ARIAL” color=”white”>&nbsp;<b>breve descrição
</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 formulário
urlsite = request.form(“urlsite”) ‘ dados do formulário no campo urlsite
titulo = request.form(“titulo”) ‘ dados do formulário no campo título
descricao = request.form(“descricao”) ‘ dados do formulário no campo
descricao
OK=1 ‘ esta variável vai controlar se aparecem erros
‘ com o valor 1, sabemos que não existem erros
‘ nos dados introduzidos em formulário
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 não é
válido</font>”
Else
‘ vamos também certificar-nos do tamanho das strings
‘ pois estas têm 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 não é
válido</font>”
end if
end if

Versão digi
tal, individual,icenciada
l em Jan
/Fev do ano 2000
, pelo Centro Atlânti
co, da versão 1.0 do
ivrol 'Programaçãoeb
WcomASP'
CAPÍTULO 7: EXEMPLOS REAIS 195

if Len(titulo)<4 or len(titulo)>80 then


OK = 0
response.write “&nbsp;<font color=’red’>”
response.write “ - o título dado para o site não é válido</font>”
end if
if Len(descricao)<12 or len(descricao)>400 then
OK = 0
response.write “&nbsp;<font color=’red’>”
response.write “ - a descrição do site não é válido</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 então não 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 formulário 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 não for introduzir vamos pedir os dados mostrando o formulário
Formulario_registo()
end if
%>
196 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES

Fig. 7.8 - Formulário de registo de site

No caso de um dos campos que vem do formul ário n ão ter a


informação correcta, além de não ser introduzido, são mostradas
mensagens de erro tal como se vê na figura seguinte pois o url não
é válido.

Fig. 7.9 - Erro dado devido ao URL não ser válido

Depois de uma correcta introdu çã o de dados obtemos uma


mensagem de aprovação.

Fig. 7.10 - Resposta depois do registo efectuado

Versão digi
tal, individual,icenciada
l em Jan
/Fev do ano 2000
, pelo Centro Atlânti
co, da versão 1.0 do
ivrol 'Programaçãoeb
WcomASP'
CAPÍTULO 7: EXEMPLOS REAIS 197

7.3 A Loja: Loja E-Commerce


Este exemplo terá uma estrutura mais complexa devido ao volume
de dados que estarão envolvidos, mas a nível profissional é uma
estrutura muito simples que em nada vai complicar a vida àqueles
que vivem da programação com bases de dados.

A BD terá então de ter uma tabela em que guardaremos a informa-


ção de todos os produtos, outra para a informa ção das encomen-
das recebidas, e claro a última que guarda a informação dos produ-
tos que pertencem a cada uma das encomendas. Não vamos já
falar da maneira como organizar isso tudo a nível de programação,
mas é necessário o leitor saber o que vai ser usado neste exemplo.
O uso de ficheiros é idêntico ao do exemplo do motor de busca. Só
temos que estruturar a base de dados e definir as fun ções que va-
mos precisar em função 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 produ-
to é lv seguido do identificador do mesmo - quando o programador
fizer o interface de administração do lado do servidor terá de ter em
conta este aspecto.

O esquema da base de dados é então:

TABELA: PRODUTOS

Id_produtos Auto-number; identificador interno da BD de


cada produto
Titulo Text(80);t ítulo do livro
Autor Text (60); nome do autor (es) do livro
N_Paginas Number; n úmero de páginas do livro
Isbn Text(25);numerode f ábrica do livro, algo
como os códigos de barras
Preco Number;opre ço de venda ao público do livro
Mes_edicao Number; o m ês em que o livro foi editado
Ano_edicao Number; o ano em que saiu o livro
introducao Memo; uma introdu ção ao livro
198 CENTRO ATLÂNTICO - PROGRAMAÇÃO 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);c ódigo 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); n úmero do cartão de crédito do
cliente
Nome_visa Text (20); nome do portador do cart ão de
crédito que vai pagar a encomenda
Data_visa Text (5); data de validade do cart ão de
crédito

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


registado o pre ço a pagar e n ão 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;pre ço a que foi comprado o
produto

Versão digi
tal, individual,icenciada
l em Jan
/Fev do ano 2000
, pelo Centro Atlânti
co, da versão 1.0 do
ivrol 'Programaçãoeb
WcomASP'
CAPÍTULO 7: EXEMPLOS REAIS 199

Fig. 7.11 - A relação das tabelas da BD da nossa loja

Vamos então indicar quais os aspectos principais deste site:

1 – Aspecto da Página inicial;


2 – Formulário de procura de produtos;
3 – Apresentação de resultados da procura;
4 – Carrinho de compras - criação e actualização;
5 – Saída e pagamento;
6 – Aspecto gráfico.

Neste site também vamos usar uma só ASP (como no motor de


busca) para suportar todas as tarefas do site. Vamos implementar
então mais uma lista de v ários ficheiros *.inc (não esquecer que
podem ter outra extensão) e usá-los quando acharmos necessário,
dentro do contexto do site. O esquema de ficheiros deste site é então
o seguinte:
200 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES

Fig. 7.12 - Esquema de ficheiros da loja

Vamos então descrever qual a participação que cada ficheiro tem


neste site:

Imagens,

Topo.jpg
ficheiro que representa a imagem de topo do site; incluído no código
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 botão que se carrega para fazermos pro-
cura de um livro; é usado no ficheiro topo.inc

Brecalcular.gif
é o botão que refaz os cálculos no nosso carrinho de compras de-
pois de introduzido novo produto, ou de termos alterada alguma quan-
tidade; é chamado no ficheiro carrinhor.inc

Bfinalizar.gif
ficheiro que representa o botão que se carrega para finalizarmos
uma compra online; usado no ficheiro pagar.inc

Versão digi
tal, individual,icenciada
l em Jan
/Fev do ano 2000
, pelo Centro Atlânti
co, da versão 1.0 do
ivrol 'Programaçãoeb
WcomASP'
CAPÍTULO 7: EXEMPLOS REAIS 201

Bpagar.gif
ficheiro que representa o botão que se carrega para passarmos à
fase de finalização 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á escolhi-
dos; é chamado no ficheiro topo.inc

Casa.gif
é o ficheiro que nos encaminha para a página inicial; é chamado no
ficheiro topo.inc

Pagar.gif
faz a chamada da zona onde se vãoi introduzir os dados pessoais
para finalização da compra; é chamado no ficheiro topo.inc

Ficheiros da página,

C:\Inetpub\wwwroot\livro\loja\Default.asp
ficheiro que recebe os argumentos dos formulários ou do campo de
endereço do browser, e consoante o recebido consoante o ficheiro
que é demonstrado na zona central da página;

C:\Inetpub\wwwroot\livro\loja\loja\Funcoes.asp
aqui existe uma função 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 não apareçam erros,
visto que as mesmas são usadas pela própria BD. Este código é
idêntico ao do motor de busca;

C:\Inetpub\wwwroot\livro\loja\includes\Fundo.inc
ficheiro com o desenho do fundo do site (estático a 100%);

C:\Inetpub\wwwroot\livro\loja\includes\Inicial.inc
esquema inicial. Se não existirem argumentos no link, será este fi-
cheiro 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 ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES

C:\Inetpub\wwwroot\livro\loja\includes\Topo.inc
HTML com o desenho do topo do site (também como o fundo, 100%
estático);

C:\Inetpub\wwwroot\livro\loja\includes\Pagar.inc
local onde são 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 usa-
mos neste exemplo.

A estrutura de directórios foi a usada para o exemplo anterior, mas o


leitor pode fazer altera ções na sua estrutura desde que todo o
ambiente o acompanhe. Entendo por ambiente a configuração do
servidor de Internet, a conexão à BD, as referências a páginas, etc.

Agora podemos ver o código de todos os ficheiros e falar da função


de cada procedimento dentro dos mesmos, se esses existirem.

O resultado do ficheiro global.asa a seguir tem tamb ém 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 sessão,
e desta maneira toda a informa ção do carrinho de compras estará
definida para cada sessão (sempre diferentes e sem possibilidade
de confusão).
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 alteração.
Terá de ser feito sempre um redimensionamento do array para o
mesmo funcionar na perfeição, 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”)=””
Versão digi
tal, individual,icenciada
l em Jan
/Fev do ano 2000
, pelo Centro Atlânti
co, da versão 1.0 do
ivrol 'Programaçãoeb
WcomASP'
CAPÍTULO 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 prod utos _id(0), prod uto s_quantid ade(0)
produtos_id(0) = 0 ‘ array de produtos no carrinho de compras
produtos_quantidade(0) = 0 ‘ array com as respectivas quantidades
‘ vamos então introduzir esta informação para as sessões
‘ desta maneira cada sessão terá o seu carrinho e não
‘ existirão confusões entre clientes. São inicializados vazios
session(“m atriz_produtos”) = pr odutos_id
sessi on(“matriz_quanti dade”) = prod utos _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 ATLÂNTICO - PROGRAMAÇÃO 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 é idêntico 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 não existir mostramos a página 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 página inicial da Loja

Versão digi
tal, individual,icenciada
l em Jan
/Fev do ano 2000
, pelo Centro Atlânti
co, da versão 1.0 do
ivrol 'Programaçãoeb
WcomASP'
CAPÍTULO 7: EXEMPLOS REAIS 205

A seguinte função é idêntica à do motor de busca. É uma função


para que não obtenhamos erro nas declarações 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 à página 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 ATLÂNTICO - PROGRAMAÇÃO 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 declaração em ASP anterior é para garantirmos que aparece
‘ na caixa de procura a última string
‘ queremos também manter a última escolha e por isso
‘ vamos comparar os dados deixados pelo formulário 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

Versão digi
tal, individual,icenciada
l em Jan
/Fev do ano 2000
, pelo Centro Atlânti
co, da versão 1.0 do
ivrol 'Programaçãoeb
WcomASP'
CAPÍTULO 7: EXEMPLOS REAIS 207

Ao acedermos sempre aos dados anteriores (submetidos pelo


formulário), 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 título). Para isso basta que os cam-
pos estejam sempre iguais à informação que os mesmos enviaram
na última inserção.

(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 então mostrar o último produto disponível


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.
Não se esqueça de que este serviço é gratuito, por isso pode divulgar por
todos os seus amigos.<br>
Agradeço 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 posição
response.write “<p><font size=’3' face=’ARIAL’><b>”
208 CENTRO ATLÂNTICO - PROGRAMAÇÃO 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=’0’src=’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 número 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 formulário de procura
‘ não só a string, mas o campo da BD que vai ser pesquisado
Versão digi
tal, individual,icenciada
l em Jan
/Fev do ano 2000
, pelo Centro Atlânti
co, da versão 1.0 do
ivrol 'Programaçãoeb
WcomASP'
CAPÍTULO 7: EXEMPLOS REAIS 209

‘ e isso porque o VALUE do formulário 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 “Não foram encontrados registos...</b></font><br>”
response.write “<p>&nbsp;</p><p>&nbsp;</p><p>&nbsp;</p>”
end if
conta = 0 ‘ esta variável vai ser utilizada para que as imagens
‘ e disposição dos dados dos produtos alternem de linha em
‘ linha. Mais ou menos como o método usado para a mudança 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=’0’src=’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;edição 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”) &”páginas.</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 próxima disposição será diferente
else
response.write “<td valign=’top’><font face=’arial’ size=’2'>”
210 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES

response.write left(rs.fields(“introducao”),400)
response.write “...<br><b>(&nbsp;edição 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 “ páginas.</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 títulos

Versão digi
tal, individual,icenciada
l em Jan
/Fev do ano 2000
, pelo Centro Atlânti
co, da versão 1.0 do
ivrol 'Programaçãoeb
WcomASP'
CAPÍTULO 7: EXEMPLOS REAIS 211

(ficheiro carrinho.inc)
<% ‘ este procedimento faz com que vejamos os dados que estão 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 número de produtos
em carrinho
if produtos_num <1 then ‘ se forem menos de 1 então 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 forçosamente 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 “Preço”
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 ‘ variável que vai calcular o preço total da encomenda
total_produtos = 0 ‘ vai calcular o número total de produtos
‘ não podemos usar o produtos_num pois este diz quantos
‘ produtos diferentes e não quantos produtos (quantidade)
for i=1 to produtos_num
SQLStmt = “SELECT id_produto, isbn, titulo, preco FROM produtos”
212 CENTRO ATLÂNTICO - PROGRAMAÇÃO 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 preço
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 sessão vai
‘ guardar o valor total por despesas em transportes na variável de
sessão 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>”
Versão digi
tal, individual,icenciada
l em Jan
/Fev do ano 2000
, pelo Centro Atlânti
co, da versão 1.0 do
ivrol 'Programaçãoeb
WcomASP'
CAPÍTULO 7: EXEMPLOS REAIS 213

response.write “</td>”
response.write “<td>”
‘ guardar na sessão 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 cálculos,


‘ 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 próximo valor do formulário
else ‘ se a quantidade foi igual a 0 então adiantamo-nos uma casa
mais que o usual
‘ pois a posição do momento será igual à próxima
form = request.form(“quant”&I+1)
end if
if int(request.form(“quant”&i))<>0 then ‘ se o valor do formulário 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 não chegámos 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 ATLÂNTICO - PROGRAMAÇÃO 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 sessões
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 variável temporária 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 não for achado nenhum produto
temporario= produtos_num+ 1 ‘ vamos incrementaruma posiçãono array
‘ esse incremento é respondido com um redimensionamentodo 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 ‘ senão 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
Versão digi
tal, individual,icenciada
l em Jan
/Fev do ano 2000
, pelo Centro Atlânti
co, da versão 1.0 do
ivrol 'Programaçãoeb
WcomASP'
CAPÍTULO 7: EXEMPLOS REAIS 215

‘ o procedimento seguinte escreve um link para se voltar à página 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 ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES

Fig. 7.17 - O carrinho de compras depois


de ser feita uma actualização nas quantidades

(ficheiro pagar.inc)
<%
‘ este procedimento vai introduzir o formulário 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 não existirem produtos não 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>
Versão digi
tal, individual,icenciada
l em Jan
/Fev do ano 2000
, pelo Centro Atlânti
co, da versão 1.0 do
ivrol 'Programaçãoeb
WcomASP'
CAPÍTULO 7: EXEMPLOS REAIS 217

<td></td></tr>
<tr><td width=’150'><fontface=’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>Código 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 Cartão 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 função 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á inválido</font><br>”
OK = 0
218 CENTRO ATLÂNTICO - PROGRAMAÇÃO 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 não é válida</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 Código Postal não é válido</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 não é válida</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 não é válido</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 número 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 não 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 não 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,”
Versão digi
tal, individual,icenciada
l em Jan
/Fev do ano 2000
, pelo Centro Atlânti
co, da versão 1.0 do
ivrol 'Programaçãoeb
WcomASP'
CAPÍTULO 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 introduzidovamos buscar o identificadordo 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 preço
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 INTOprod_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 sessão depois de ser feita a
compra
220 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES

‘ começando assim uma sessão 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() ‘ senão, é mostrado novamente o formulário
end if
Case Else
Formulario()‘ sempre que não há argumentoé mostrado o formulário
End Select
%>

A imagem seguinte demonstra como somos abordados ao entrar


na zona de pagamento.

Fig. 7.18 - Introdução de dados para finalizar compra

Versão digi
tal, individual,icenciada
l em Jan
/Fev do ano 2000
, pelo Centro Atlânti
co, da versão 1.0 do
ivrol 'Programaçãoeb
WcomASP'
CAPÍTULO 7: EXEMPLOS REAIS 221

No caso do número do cartão de crédito não estar válido é mostrado


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

Fig. 7.19 - Verificação do número do cartão de crédito

Se a compra for bem sucedida recebemos a mensagem da ima-


gem seguinte.

Fig. 7.20 - Confirmação de compra bem sucedida


Agradecimentos:

Queria agradecer a todos aqueles que ajudaram na minha formação e


percurso profissional, onde estão incluídos: 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, são eles Scott Mitchell
(www.4guysfromrolla.com) e Stephen Wyn
koopwww.swynk.com
( ).

Agradeço também às centenas de pessoas que me enviam mensagens para o


e-mail todos os meses, a pedir esclarecimentos técnicos ou a agradecer pelo
código que tenho disponível nosite (www.joaovieira.com).
meu

A nível pessoal agradeço então às peças fundamentais na minha vida, os meus


pais, avós, Tânia Penedo e à dupla Jujinha & Ritinha.
Colecçã
o O Melhor d
a Internet
O s melhores sites na ciona is e interna ciona is
da In ternet o rg anizad os por prof issão
ou área de interesse

C
O ol
s ecçã
temasodeSocieda
fundo de daInfor
da Sociedad emação
da
Inf orma ção apresentados p elo s ma io res
especiali sta s na ciona is

Colecçã
o Tecnologias
Tod as as tecnol og ia s de desta que da
Int ernet tr ata das pela equip e de t é
cni cos
do Centro Atlâ ntico

Colecçã
o Direito da
s Novas Tecnologias
A nova ec onomia , depend ente da s tecnolog ias
da informa ção, traz consig o novos desaf ios e
amea ças.
Q uai s as respostas do s nossos Jurista s, trib una is,
compêndios e legislação?

Colecçã
o Desafios
O que no s reservam os temp os que se ap roxima m
em que as novas tecnolog ia s invertem muitas da s
certezas ad quirid as

Colecçã
o Sol
uçõe
s
Soluções práticas para resolver novas
questões levan ta da s pelas tecnolo gi as
da socied ade da informação
Para
Pa ra encom
encom endar qualquer
qualqu ert tít
ítulo do Cent ro A t lânt ico q ueira preencher est a
f olha de encom enda e e nv iá-la por f ax ou c orreio com o seu pagament o.

Título Quant. Preço Total


Colecção O Melhor da Internet
w
O Melhor da Internet para o Direito _____ * 950$ = _______ w
O Melhor da Internet para Informáticos _____ * 950$ = _______ w
O Melhor da Internet para Engenheiros _____ * 950$ = _______
O Melhor da Internet para o Marketing _____ * 950$ = _______
.c
O M.Internet p/ Gestores e Empresários _____ * 950$ = _______ e
Colecção Sociedade da Informação
tn
CrónicasdaInforFobia _____ * 1.800$ = ______ r
HomoConexus _____ * 1.950$=______
o
* Ano 2000 e Inform ática _____ * 1.950$ = ______
a
tl
Colecção Tecnologias a
* Guia do Internet Explorer vers ão 4 _____ * 2.950$ = ______ n
* Guia do Internet Explorer vers ão 5 _____ * 2.950$ = ______ ti
* Guia do Netscape Communicator v 4 _____ * 2.950$ = ______ c
AgentesInteligentes _____ * 2.950$ = ______ o
TOP 100 Internet 1999 _____ * 2.450$ = ______ p.
Colecção Direito das Novas Tecnologias /t
Direito da Informática nos tribunais .pt _____ * 2.450$ = ______
ti
Colecção Desafios u
Vertigem - Tendências para o Séc. XXI _____ * 4.950$ = ______ ol
OFuturoda Internet _____ * 2.950$ = ______ s
Colecção Soluções
O Vírusdoano2000 _____ * 1 .600$ = ______
O Guia do Telemóvel: 99 sugestões _____ * 1 .250$ = ______

* Inclui CD-ROM
TOTAL = ________
Sem Despesas de envio
As encomendas directas ao Centro Atl ântico não pagam custos de portes.

SIM, desejo receber os títulos que assinalei sem qualquer despesa de envio.
• Junto envio cheque/Vale nº ____________ à ordem do Centro Atlântico
• Prefiro que debitem no meu cartão de crédito emitido em nome de
_______________________________
Número do cartão de crédito _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ Validade _ _ / _ _
Nome ___________________________________________
Morada ____ _______ _______ ____ _______ ____ _______ ___
CP ________ Localidade ______________________
Tel ________________ Fax ____________________

Caso alguns dos títulos não estejam disponíveis enviaremos os que existirem em
stock e pediremos confirmação no futuro para envio dos títulos em falta.
Centro Atlântico - Av. D. Afonso Henriques, 1462 - 4450 Matosinhos
Fax. 21 - 321 01 85 ou 22 - 938 56 30

Você também pode gostar