Beruflich Dokumente
Kultur Dokumente
Joo Vieira
Centro Atlntico
geral@centroatlantico.pt
www.centroatlantico.pt
ISBN: 972-8426-21-6
Depsito legal: 146.485/00
Marcas registadas: todos os termos mencionados neste livro conhecidos como sendo marcas
registadas de produtos e servios, foram apropriadamente capitalizados. A utilizao de um
termo neste livro no deve ser encarada como afectando a validade de alguma marca registada
de produto ou servio.
O Editor e os Autores no se responsabilizam por possveis danos morais ou fsicos causados
pelas instrues contidas no livro nem por endereos Internet que no correspondam s HomePages pretendidas.
ndice
1. Introduo s Active Server Pages
1.1
1.2
1.3
1.4
1.5
1.6
1.7
Do Autor
Requisitos para as ASP
ASP vs. JavaScript / VBScript
Instalar o servidor de Internet
Programar com ficheiros ASP e HTML
Conhecer o HTML (Hyper Text Markup Language) em 12 passos
Sites com recursos de ASP
12
13
15
16
19
19
23
2. Expresses e Operadores
2.1
2.2
2.3
Os primeiros passos
2.1.1 Exemplo: Ol Portugal
2.1.2 Exemplo: Ol Portugal com varivel
2.1.3 Exemplo: Clculo de variveis
2.1.4 Exemplo: Cdigo ASP embebido em HMTL
IF, THEN, ELSE, END IF
2.2.1 Exemplo: Comparao entre variveis
28
28
29
29
30
32
33
33
34
2.4
Variveis
35
2.5
Tabela de Operadores
2.5.1 Exemplo: Comparao de varivel entre valores 37
2.5.2 Exemplo: Utilizao de todos os operadores
38
3. Funes
3.1
40
3.2
As nossas funes
3.2.1 Exemplo: N dias at o ano 2001
3.2.2 Exemplo: Validar o e-mail
3.2.3 Exemplo: Criar uma ComboBox a partir de um array
3.2.4 Exemplo: Criar um grfico em HTML a partir de um array
48
50
52
53
56
57
58
3.3
4. Objectos
4.1
Tabela de Objectos
62
4.2
65
4.3
72
73
81
88
Ficheiro global.asa
4.4.1 Exemplo: Quantos utilizadores esto a visitar a pgina
4.4.2 Exemplo: Chat em Browser
100
102
105
107
Formatao de strings
108
4.4
4.5
4.6
5. Bases de dados
5.1
114
5.2
117
5.3
122
5.4
127
135
137
Apresentao de dados
5.5.1 Exemplo: Listar dados em tabela
5.5.2 Exemplo: Listar dados com imagens
5.5.3 Exemplo: Listar dados a pedido
142
144
146
148
152
5.5
5.6
6. Componentes
6.1
156
6.2
159
163
Componentes de e-mail
6.3.1 Exemplo: Envio de e-mail com attachment
164
173
6.3
6.4
7. Exemplos reais
7.1
7.2
7.3
Introduo
A R: Motor de Busca
A Loja: Loja E-Commerce
182
183
197
Rece
Re
Introduo
s Active Server
Pages
1.1 Do Autor
12
13
15
16
19
Language) em 12 passos
1.7 Sites com recursos de ASP
19
23
1.1 Do Autor
Escrevi este livro, acima de tudo, para dar algum apoio a todos
aqueles que querem iniciar-se neste tema de programao Internet
do lado do servidor. Quando comecei a pesquisar estes assuntos,
h alguns anos, a realidade era muito diferente para conseguir
programar neste tipo de sistemas. Seria necessrio um servidor (com
certos requisitos), e conhecimentos bastante mais avanados de
programao. A definio de pginas dinmicas na altura, consistia
na existncia de ficheiros executveis do lado do servidor que criavam
pginas HTML consoante o que o utilizador procurava, e que limitava
bastante os tipos de pesquisa. Quando o Perl (para programao
de pginas dinmicas) apareceu, o panorama mudou, e as facilidades
deste tipo de programao comeavam. Mesmo assim, a Microsoft
apareceu com os IDC (Internet Database Connector), que apesar
de serem de mais fcil compreenso no eram to potentes a nvel
de desenvolvimento.
Mais tarde, apareceram as ASP, que deram uma grande (e boa)
viragem na programao do lado do servidor. O programador
comeava a ter uma linguagem potente e flexvel onde podia
desenvolver o mais variado tipo de servios e de solues.
Quando comecei a trabalhar nesta linguagem estava-se a fazer a
transio do sistema IDC para as ASP. As facilidades das mesmas
deram-me hiptese de as poder experimentar onde quer que fosse.
Mesmo assim, os recursos a nvel de manuais e pginas Internet
eram poucos, e tive bastantes dificuldades em me desenvolver nesta rea. Apesar de tudo, dois sites deram-me uma grande ajuda
(www.swynk.com e www.4guysfromrolla.com), pois muitos programadores j l deixavam os seus artigos, cdigo e ideias. Com este
suporte on-line e alguma ajuda de programadores de todo o mundo,
comecei a desenvolver pginas, e tudo foi correndo normalmente.
Quando me senti preparado comecei a escrever artigos para estes
mesmos sites, para apoiar aqueles que iriam ter as mesmas dificuldades que eu tive.
Com este livro quero fazer o mesmo, apoiar todos os que querem
entrar nesta rea, e tentar que o caminho para o domnio das ASP
seja o menos dificultado possvel. Este livro est separado por captulos; cada captulo est estruturado por uma parte do sistema das
ASP, e foi dada uma ordem a estes, para que os temas estivessem
ordenados por nveis de dificuldade. No final deixo alguns exemplos, que sei iro ser muito teis a todos aqueles que querem algo
Verso digital, individual, licenciada em Fev/2000, pelo Centro Atlntico, da verso 1.0 do livro 'Programao Web com ASP'
Verso digital, individual, licenciada em Fev/2000, pelo Centro Atlntico, da verso 1.0 do livro 'Programao Web com ASP'
Verso digital, individual, licenciada em Fev/2000, pelo Centro Atlntico, da verso 1.0 do livro 'Programao Web com ASP'
11.Para ter um texto que vai ter a outra pgina, tem de fazer o link
com a Tag <A> </A>
<HTML>
<BODY>
<FORM NAME=nomedoformulario METHOD=POST>
O seu nome:<INPUT NAME=nome><BR>
O seu telefone:<INPUT NAME=email><BR>
<INPUT TYPE=SUBMIT>
</FORM>
<A HREF=outrapagina.html>Pode seguir por aqui</A>
</BODY>
</HTML>
Verso digital, individual, licenciada em Fev/2000, pelo Centro Atlntico, da verso 1.0 do livro 'Programao Web com ASP'
www.activeserverpages.com
Este o site Pai das ASP. Ter
sido em princpio o primeiro relacionado com este assunto.
Tem muitos exemplos explicados, e vrios truques para
aquelas dificuldades que vo
aparecendo enquanto programamos. actualizado periodicamente h muito tempo.
www.15seconds.com
Este tambm daqueles que
todos os que esto dentro do
assunto conhecem. Tem muitos artigos, de vrios tipos, e
um motor de busca que vai
pesquisar vrios sites de ASP.
www.swynk.com
Este site, no incio, era dos
melhores, tinha muita informao e muito bem estruturada.
Est vocacionado para tudo o
que tiver a haver com Windows
NT, e devido ao IIS4 tambm
tem muito bons artigos de ASP.
Tenho uma coluna minha l,
onde poder recolher algumas
ideias de ASP.
Este site cresceu muito, e muito depressa, por isso julgo ser
a causa dos atrasos na sua
actualizao.
www.4guysfromrolla.com
Indiscutivelmente um site a no
perder. Foi tambm graas a
este site que consegui alcanar os objectivos, nas empresas onde trabalhei com ASP.
Tem muita informao, artigos
e cdigo. Se por l passar vai
notar que tenho l alguns artigos.
Verso digital, individual, licenciada em Fev/2000, pelo Centro Atlntico, da verso 1.0 do livro 'Programao Web com ASP'
www.asphole.com
um grupo de sites, que se
dedicam s ASP, tem tambm
muitos recursos, apesar de estarem a ser ultrapassados por
sites mais recentes como o
Aspin.
www.aspin.com
Este site bastante recente e
j cheguei a visit-lo quase todos os dias. Est muito bem organizado e tem bastantes temas por onde pode pesquisar.
www.asptoday.com
Este daqueles sites que
quando comear a programar
ASPs com alguma assiduidade ir com certeza visitar. Eles
obrigam os seus autores a escreverem os artigos em exclusividade, sendo por isso daqueles sites onde os artigos l
publicados no so lidos em
mais lado nenhum.
Expresses e
Operadores
2.1 Os primeiros passos
2.1.1 Exemplo: Ol Portugal
2.1.2 Exemplo: Ol Portugal com varivel
2.1.3 Exemplo: Clculo de variveis
2.1.4 Exemplo: Cdigo ASP embebido
em HMTL
28
28
29
29
32
33
33
34
2.4 Variveis
35
37
38
(ficheiro cpt2-1-1.asp)
<%response.writeOl Portugal%>
Vemos aqui algo que nos salta vista e que so os <% %>. Como se
pode facilmente verificar, estes so os identificadores de onde comea e acaba a ASP que foi construda, pois quando introduzirmos
cdigo entre o HTML, teremos de definir onde esto as ASP, e estes
indicadores sero determinantes para esse propsito. Response
um objecto das ASP que conta com bastantes mtodos. Este e o
objecto Request vo ser sem sombra de dvidas aqueles com que
ir trabalhar mais. Encontra uma tabela no captulo seguinte com os
objectos principais e seus mtodos de maneira que sempre que
necessitar os possa encontrar mais rapidamente consultando a tabela.
(ficheiro cpt2-1-2.asp)
<%
pais = Portugal
response.writeOl & pais
%>
(ficheiro cpt2-1-3.asp)
<%
a = 10
b=2
response.write a * b
%>
Como j deve ter verificado, este tipo de linguagem usa variveis
(tambm elas dinmicas) que no necessitam de inicializao, podendo ser criadas em qualquer momento. Apesar de haver uma
maneira em que o obrigado a fazer (com Explicit) mas s se assim o definir. Outro ponto bastante agradvel de que no necessita
de marcadores para definir o final de cada linha. Por exemplo, em
a=10. No necessrio ponto e vrgula ou outro qualquer marcador
para terminar uma linha de cdigo.
(ficheiro cpt2-1-4.asp)
(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
%>
(ficheiro cpt2-3-1.asp)
<%
a= 4
b=12
if a < b then comparao entre dois valores
for I=0 to a ciclo FOR
response.write a( & a & ) maior que & I & <br>
o smbolo <br> em HTML simboliza mudana de linha
no mesmo pargrafo
next I final de ciclo FOR
else
if a>b then
I=a
While b<I ciclo WHILE
Response.write b( & b & ) menor que & I & <br>
I=I1
wend final de ciclo WHILE
end if
end if
%>
<%
resposta = 4
Select case resposta
case 1 response.write No & resposta
case 2 response.write No & resposta
case 3 response.write Acertou & resposta
case 4 response.write No & resposta
case else response.writeDesconhecido.
end select
%>
Neste case a comparao feita por hipteses em funo de uma
resposta (varivel resposta), tendo-se ateno mesma, iremos fazer uma comparao com as hipteses possveis (1, 2, 3 e 4 so as
nicas possveis) e executar a declarao correspondente (se acertou ou se no acertou).
(ficheiro cpt2-3-3.asp)
<CENTER><TABLE BORDER=1>
<% contador = 1
while contador<6%>
<TR>
<TD BGCOLOR=RED>
<FONT COLOR=WHITE><%=contador%></FONT></TD>
<TD><%=(contador-1)%></TD>
<TD><%=(contador+1)%></TD>
<TD><%=(contador*100)%></TD>
</TR>
<%
contador = contador + 1
wend
%>
</TABLE></CENTER>
Neste caso, fui usar novamente o WHILE, mas com o intuito do leitor perceber a potencialidade de trabalhar com tabelas - no final de
contas aquilo que mais vai usar se o destino que pretende dar aos
seus conhecimentos de ASP for a programao com bases de dados. Introduzindo o valor que se quer dentro de cada clula da tabela, o truque que origina, as grandes tabelas dos sites de comrcioelectrnico. Alm de texto, pode introduzir um novo esquema de tabelas e/ou imagens.
(ficheiro cpt2-3-4.asp)
<% contador = 1
while contador<8
%><FONT face=ARIAL size=<%=contador%>>TESTE</FONT><BR>
<%contador=contador + 1
wend
%>
Neste caso, foi-se alterar uma opo das Tags de HTML, para que
no fosse preciso repetir a mesma 8 vezes. Este j um pensamento a seguir pelo programador de ASP - tentar evitar escrever
muitas linhas de cdigo, e sim optimizar ao mximo todas as funes que vier a criar.
2.4 Variveis
Nas ASP, as variveis so tambm, como no Visual Basic, dinmicas, no sendo por isso necessria a sua inicializao. Seja como
for, m programao usar variveis globais sem controlo sobre
as mesmas. Deve-se usar, mas no em excesso, assim como se
devem sempre inicializar as mesmas, no s para melhor controlo,
mas tambm para melhor performance. Para que no se desleixe
com as variveis, use o cdigo <% Option Explicit %> no incio de cada
pgina para que tenha de inicializar sempre as variveis. Assim, as
alocaes de memria, para as variveis dinmicas, sero feitas
com uma melhor estrutura, ficando por esse motivo beneficiado o
desempenho das suas pginas.
Para inicializar uma varivel em ASP basta usar Dim . Para criarmos a varivel xpto usamos ento <%Dim xpto%>
2.5 Operadores
Apesar de j terem sido praticamente todos usados neste captulo,
vou ento deixar uma pequena tabela dos operadores, para referncia.
Os operadores de comparao e igualdade so os seguintes:
TIPO DE OPERADOR
DESCRIO
Igualar a
if a = b
c=d
<
Menor do que
if a < b
while c < x
>
Maior do que
if a > b
while c > x
<=
if a <= b
while c <= x
>=
if a >= b
while c >= x
<>
Diferente de
if a <> b
while c <> x
<% a = 10
b = 20
c = Teste
If a > 9 AND a <=20 then
Response.write (a) est entre 9 e 20 <br>
End if
%>
DESCRIO
Multiplicador,
(2*5)
Diviso inteira
(a \ b)
Soma
(a+b)
Este valor tambm funciona para
concatenao tal como o smbolo &
Diferena
(ab)
MOD
Resto da diviso
( a MOD b )
Podemos ento demonstrar todos os operadores aritmticos da tabela anterior, num ficheiro de ASP.
<%
a=2
b=8
c = 10
st1 =Desta maneira
st2 = tambm podemos concatenar strings.
Response.Write a = 2<br>
Response.Write b = 8<br>
Response.Write c = 10<br>
Response.write st1 = Desta maneira<br>
Response.write st2 = tambm podemos concatenar strings.<br>
Response.Write <br><br>
Response.Write - b^a -> & b^a & <br>
Response.Write - a*b -> & a*b & <br>
Response.Write - c/a -> & c/a & <br>
Response.Write - a\b -> & a\b & <br>
Response.Write - a-b -> & a-b & <br>
Response.Write - a+b -> & a+b & <br>
Response.Write - c MOD a -> & c MOD a & <br>
Response.Write - st1 + st2 -> & st1+st2 & <br>
%>
E para se perceber um pouco melhor o que est a acontecer neste
cdigo, pode recorrer seguinte imagem, que julgo responder a
qualquer dvida com que possa ter ficado.
Funes
3
40
48
50
52
53
56
57
58
Descrio
Abs()
Array()
CAPTULO 3: FUNES 41
Asc()
Atn()
CBool()
CByte()
CCur()
CDate()
CDbl()
Chr()
CInt()
CLng()
Cos()
CStr()
Date()
DateAdd()
DateDiff()
CAPTULO 3: FUNES 43
DatePart()
DateSerial()
DateValue()
Day()
Exp()
Filter()
Fix()
Devolve o inteiro de um qualquer valor
FormatCurrency()Transforma um valor normal numrico
para valor monetrio.
Ex. FormatCurrency(32420) devolve 32.420$00
FormatDateTime() Funciona como FormatCurrency()
mas para datas
FormatNumber() Formata um nmero da maneira que nos convm
FormatPercent() Devolve uma percentagem do universo que o
programador pretende
Ex. FormatPercent(23/230) devolve 10,00%
GetObject()
Hex()
Hour()
InStr()
IsArray()
IsDate()
IsEmpty()
IsNull()
IsNumeric()
IsObject()
Join()
LBound()
LCase()
Left()
Len()
CAPTULO 3: FUNES 45
Log()
LTrim()
Mid()
Minute()
Month()
MonthDate()
Now()
Oct()
Replace()
RGB()
Right()
Rnd()
Round()
Sgn()
Sin()
Space()
Split()
Sqr()
StrComp()
Tan()
CAPTULO 3: FUNES 47
Time()
TimeSerial()
TimeValue()
TypeName()
UBound()
Ucase()
VarType()
WeekDay()
(ficheiro cpt3-2-1.asp)
<%
Function a2001(data) incio da funo
If IsDate(data) then se for uma data for vlida
ento envia-se a diferena entre datas
a2001 = DateDiff(d,data,Janeiro 1, 2001")
else caso contrrio
enviamos a data como invlida, em forma de informao
a2001 = Data invlida...
end if final do if
End Function final da funo
Response.Write Hoje & now() & <br><br> escreve a data
corrente
escreve-se ento o resultado
Response.write Faltam & a2001(now()) & dias at ao ano 2001.
%>
CAPTULO 3: FUNES 49
Foram usadas as seguintes funes:
IsDate()
DateDiff()
Now()
<%
Function valmail(email) incio da funo
se o tamanho do e-mail for menor que 5 dificilmente ser vlido(a@a.c)
If Len(email) <= 5 Then
Valmail=False else
se no existir um @ tambm no vlido
If InStr(1, email, @, 1) < 2 Then
valmail=False
Else
o ponto final tambm importante
If InStr(1,email, ., 1) < 4 Then
Valmail=False
Else
Valmail=True
End If
End If
End If
End Function final da funo
if valmail(o_meu_email@algum_email.com) then
Response.WriteO e-mail o_meu_email@algum_email.com
vlido.<br>
Else
Response.WriteO e-mail o_meu_email@algum_email.com no
vlido.<br>
End if
if valmail(tentar@iludir) then
Response.Write O e-mail tentar@iludir vlido.<br>
Else
Response.Write O e-mail tentar@iludir no vlido.<br>
End if
%>
Foram usadas as seguintes funes:
Len()
retorna o tamanho de uma string, para
sabermos se tem o tamanho mnimo
pretendido para um e-mail normal
InStr()
muito usado para nos certificarmos da
existncia do smbolo @ ou de um ponto
final, sempre usado antes da extenso
do domnio.
O leitor tem assim, uma funo que lhe valida todos os e-mails que
receber como input.
CAPTULO 3: FUNES 51
= Alentejo
= Minho
= Algarve
= Beira-Litoral
%>
<form>
Viajar Para ? <%=criacaixa()%>
</form>
Foram usadas as seguintes funes:
UBound()
retorna o tamanho de um array, necessrio
neste caso para sabermos at que
ponto podemos ir com o ciclo FOR.
CAPTULO 3: FUNES 53
Como se pode ver, foi usada a linha <%@ Language=VBScript %>
que serve para o programador ter acesso mais facilitado ao cdigo
ASP, que conhecido como o VBScript do lado do servidor. O IIS
interpreta cdigo, e acaba por percorrer todas as linhas, quer tenham ASP ou no, se indicarmos no nicio do ficheiro de que se trata
de um ficheiro com VBScript, a sua performance ser melhorada,
mas no essencial o uso desta linha no nicio do cdigo.
Algo tambm muito comum so os grficos correspondentes a opinies, ou outros, para transmitir informao a partir dos dados em
bases de dados. No exemplo seguinte pode-se perceber o truque de
criar grficos em HTML, que servem para esse mesmo propsito. O
cdigo seguinte bastante explcito nesse ponto. O truque o de
controlar o tamanho das clulas das tabelas de HTML com os valores indicados pelo programa, que os pode aceder de qualquer lado,
mas neste exemplo indicados array a array.
(ficheiro cpt3-2-4.asp)
CAPTULO 3: FUNES 55
que mantm, ou que repete bastante nas vrias pginas de um
mesmo site. Com os SSI, o programador introduz todas as funes
que quer num ficheiro, que por sua vez chamado no incio do cdigo ASP. A partir da todas as funes desse ficheiro esto acessveis na programao dessa pgina ASP. Devemos usar os SSI para
aquele tipo de cdigo que sabemos vai ser alterado em vrias pginas. Dessa maneira, bastar alterar uma vez, para que todas as
pginas fiquem actualizadas com o novo cdigo.
A maneira de se chamar um ficheiro dentro de um ASP (uso de
SSI), tenha ele parte de cdigo HTML, ou de ASP, <!#INCLUDE
FILE=ficheiro.inc> . Este cdigo introduzido no cdigo HTML,
e no no de ASP. Mas tem de estar num ficheiro de ASP e no no de
um de HTML - um pouco confuso! Vejamos ento os seguintes ficheiros, criados a partir de tudo aquilo que temos vindo a criar neste
captulo, e recorrendo ao uso de SSI (chamada de ficheiros exteriores para complementar a programao).
Vamos ento criar um ficheiro que tem o nosso topo de pgina HTML
por defeito. Esse ficheiro ficar com uma extenso diferente (*.inc)
para se poder diferenciar dos outros. Pode-se criar HMTL e ASP
nesse mesmo ficheiro.
(ficheiro cpt3-3-1.inc)
<div align=center>
<center>
<table border=0" width=80% bgcolor=#0000FF>
<tr>
<td width=100%><b><font face=Arial color=#FFFFFF>A
Listagem das minhas Funes:</font></b></td>
</tr>
</table>
</center>
</div>
<div align=right><%=FormatDateTime(Now(),2)%></div><br>
(ficheiro cpt3-3-1.asp)
<!#INCLUDE FILE=cpt3-3-1.inc>
<p>
Aqui poder-se- escrever qualquer cdigo HTML,<br>
ou at mesmo de ASP.
</p>
CAPTULO 3: FUNES 57
(ficheiro cpt3-3-2.asp)
<!#INCLUDE FILE=cpt3-3-2.asp>
<!#INCLUDE FILE=cpt3-3-1.inc>
<p>
Iremos agora ver todos as funes do captulo a funcionar,<br>
e no precisamos de as ter neste ficheiro.<br>
Desta maneira temo-las em todos os ASP que quisermos sem termos de<br>
escrever o cdigo todo de novo, ou de passar o tempo<br>
no Copy & Paste...</p><br>
<%Response.Write Hoje & now() & <br>
Response.write Faltam & a2001(now()) & dias at ao ano
2001.<br><br>
if valmail(o_meu_email@algum_email.com) then
Response.Write O e-mail o_meu_email@algum_email.com
vlido.<br>
Else
Response.Write O e-mail o_meu_email@algum_email.com no
vlido.<br>
End if
if valmail(tentar@iludir) then
Response.Write O e-mail tentar@iludir vlido.<br>
Else
Response.Write O e-mail tentar@iludir no vlido.<br>
End if
Dim ardados(3) inicializao de array
Ardados(0) = Alentejo
ardados(1) = Minho
ardados(2) = Algarve
ardados(3) = Beira-Litoral
%>
CAPTULO 3: FUNES 59
<br><br><form id=form1 name=form1>
Viajar Para? <%=criacaixa()%>
</form><br>
<%
Dim ardados2(3,3)
Ardados2(0,0) = Primeiro
ardados2(0,1) = 100
ardados2(1,0) = Segundo
ardados2(1,1) = 40
ardados2(2,0) = Terceiro
ardados2(2,1) = 60
ardados2(3,0) = Quarto
ardados2(3,1) = 18
criagrafico()
%>
O resultado na imagem seguinte bastante explcito daquilo que se
pretendia. Temos todas as funes a funcionar, e podendo funcionar
em todos os ficheiros ASP que o programador tiver para o seu site,
com apenas a insero de uma linha de cdigo no topo de cada
pgina ASP.
Agora o leitor poder estender toda a sua programao num s ficheiro, pelo menos as funes que acha virem a ser aquelas que
mais vai utilizar.
Objectos
62
65
72
73
81
88
108
Response
Redirect
usado para redireccionarmos o utilizador para
outra pgina. Usado normalmente para controlo
de utilizadores e acessos.
Cookies
mecanismo para deixar informaes do lado do
cliente com variada informao (dentro das
cookies existem outros mtodos para o seu
controlo, como veremos depois em pormenor).
Write
esta a maneira para enviar informao para o
browser.
CacheControl
desta maneira controlamos se a pgina pode
deixar que se faa cache da mesma nos
browsers (por defeito no deixa fazer cache).
Charset
uma maneira de definirmos o tipo de caracteres
a usar.
ContentType
para definir o tipo de informao que vai ser
passada, usado normalmente para UpLoad onde
definimos que queremos passar no s informao usual, mas tambm binria, originria de
ficheiros.
CAPTULO 4: OBJECTOS 63
Expires
uma maneira de definir o tempo que uma pgina
ficar activa e deixar de estar disponvel. Neste
caso definimos ao fim de quanto tempo expirar.
ExpireAbsolute
idntico ao Expires, com a diferena que se pode
controlar, no com o valor que define ao fim de
quanto tempo, mas sim com uma data que
define a altura em que deixa de estar disponvel.
IsClientConnected desta maneira controlamos se o cliente ainda est ligado.
Status
define o cdigo que est no HTTP header.
AddHeader
Ajusta dinamicamente a informao que est no
HTTP header.
Request
Cookies
neste caso ser usado para ir buscar os cookies
criados com o objecto response.
Querystring
desta maneira poderemos obter os valores que vm
da pgina anterior, depois de submetermos um
formulrio com o mtodo GET.
Form
este mtodo permite-nos obter os dados enviados
por um formulrio que esteja com o mtodo POST.
ServerVariables
usa-se muito este mtodo para identificar os tipos
de browsers que o cliente est a usar, os IPs do
mesmo, a pgina de onde o cliente veio, assim
como variadas informaes sobre o servidor que
est a ser usado.
HTMLEncode
o mtodo que formata a informao que o utilizador
insere. Esta formatao muito importante devido
a alguns smbolos serem reconhecidos pelo HTML,
e por esse motivo o layout pode no ter o aspecto
planeado
URLEncode
parecido com o HTMLEncode, mas formata a string
de maneira a ser vlida para usar na linha de
address dos browsers.
CreateObject
esta a maneira como iremos aceder a objectos
exteriores, assim como componentes criados por
ns ou outros. Os componentes de ASP so ficheiros de extenso DLL, especiais para os ASPs,
possveis com o VB ou o VC++ (Visual C++).
MapPath
com este mtodo que trabalharemos os nossos
ficheiros localmente (no servidor).
Session
Timeout
as sesses do servidor tm um limite, ao fim do
qual toda a informao contida nas sessions
desaparecem. Desta maneira poderemos
controlar o tempo que as sesses esto activas.
SessionID
este o mtodo que nos d o numero da sesso
do cliente corrente. So uma espcie de
impresso digital das sesses.
Abandon
fora a finalizao das sesses.
Application
TextStream
CreateTextFile
mtodo de criao de ficheiros de texto.
OpentextFile
mtodo de leitura dos ficheiros de texto.
CAPTULO 4: OBJECTOS 65
A estrutura de um objecto e seu mtodo do tipo objecto.mtodo,
logo, para criar-mos, por exemplo, um cookie , usamos
response.cookies, e para obter o valor introduzido na cookie, usaremos ento request.cookies.
Depois de se ver esta tabela, muitas questes ficam no ar, em relao a vrios mtodos que aqui descrevemos. A sua grande maioria
vai ser aprofundada nos prximos captulos, mas iremos tratar alguns
deles ainda neste captulo, assim como desenvolver exemplos reais
de como usufruir ao mximo destes objectos.
<%
Response.Write O numero desta sesso & session.SessionID
Response.Write <br>O tempo de validade de uma sesso de
Response.write session.Timeout & minutos.
%>
CAPTULO 4: OBJECTOS 67
(ficheiro cpt4-2-2.asp)
<%
Response.Write <br>O tempo de validade de uma sesso de &
session.Timeout & minutos.
session.Timeout = 10
Response.Write <br> Depois de alterado passou a & session.Timeout
session(Teste) = Isto um teste
Response.Write <br>Entretanto foi criada uma varivel de sesso
Session(Teste),
Response.Write que contm a string & session(Teste) & .
%>
<br><br><a href=cpt4-2-3.asp>carregue aqui para passar prxima
pgina</a>
CAPTULO 4: OBJECTOS 69
As imagens so bem elucidativas em relao ao uso de uma sesso criada pelo programador. Da mesma maneira que criada uma
sesso para suportar uma string, o leitor poder usar para criar um
array ou nmero. As hipteses so imensas, e a programao a
este nvel bastante facilitada com este objecto.
Outro objecto que usado para tratar de variveis globais
Application, que criado e acessvel tal como se faz com as sesses, com a particularidade que para o alterarmos tem-se de seguir
certas regras.
A grande diferena entre Application e Session que enquanto as
variveis criadas pelo segundo so acedidas apenas pelo utilizador
do momento, ou por aquele a quem pertence um SessionID, as variveis Application so acedidas por todos os utilizadores, todos os
SessionID. Fica assim um esquema para o leitor perceber melhor
como isto funciona.
Pelo esquema pode-se reparar que para cada utilizador existe uma
sesso independente, enquanto a varivel de Application igual para
todos.
Vemos ento um exemplo de como criar e aceder a uma varivel de
Application. Repare que existem dois mtodos Lock e UnLock para
que a mesma possa ser alterada. Para aceder mesma no necessrio usar as regras ditas anteriormente, e visveis no exemplo
seguinte:
<%
Application.Lock
Application(Teste2) = Uma varivel acessvel por todos os utilizadores...
Application.UnLock
Response.Write Avarivel Application(Teste2") >
Response.Write Application(Teste2) & <
%>
CAPTULO 4: OBJECTOS 71
(ficheiro cpt4-3-1.html)
O utilizador <strong>
<%=Request.Form(nome)%></strong>,
tem <strong><%=Request.Form(idade)%></strong> anos<br>
e est acessvel pelo nmero de telefone
<strong><%=Request.Form(telefone)%></strong> !
Foram usados os seguintes objectos e funes:
Request.Form(...)
mecanismo para ir buscar os dados
que vinham do formulrio anterior
onde estava o mtodo POST.
CAPTULO 4: OBJECTOS 73
(ficheiro cpt4-3-2.asp)
<%Sub usar_dados()%>
O utilizador <strong><%=Request.Form(nome)%></strong>,
tem <strong><%=Request.Form(idade)%></strong> anos<br>
e est acessvel pelo nmero de telefone
<strong><%=Request.Form(telefone)%></strong> !
<%End Sub%>
<%Sub formulario()%>
<form action=cpt4-3-2.asp method=POST id=form1 name=form1>
Nome: <input type=text name=nome size=20"><br>
Idade: <input type=text name=idade size=2" Maxlength=2"><br>
Telefone: <input type=text name=telefone size=12"
Maxlength=14"><br>
<input type=submit value=Enviar name=submeter>
</form>
<%End Sub%>
<%
if Request.Form(submeter)= then
formulario
else
usar_dados
end if
%>
Usando um s ficheiro ASP simulamos os dois ficheiros anteriores,
num s, poupando burocracia algortmica.
CAPTULO 4: OBJECTOS 75
- rendimento mensal entre 80.000$00 e 100.000$00 e mdia maior
que 13 valores;
- rendimento mensal entre 100.000$00 e 160.000$00 e mdia
maior que 16;
- mdia maior que 18;
- o aluno no pode ter menos de 10 anos e mais de 28.
No vamos aprofundar muito com questes das quantidades envolvidas, mas vamos ento pedir os dados necessrios para que possamos dizer se tem hiptese ou no no caso de se candidatar. Alm
de dizermos isso, vamos calcular a idade do aluno pela data de
nascimento. Desta forma o leitor perceber mais alguns pontos de
desenvolvimento ASP a este nvel e poderemos ento criar um
pequeno curso online que demonstra muito genericamente uma das
grandes potencialidades da Internet, a formao online.
Continuando ento, vamos criar o formulrio com as perguntas, e
no esquecendo os nomes de cada Tag de input, nomes esses que
sero os identificadores no uso do objecto request.
Vamos por partes, neste caso vamos estudar a estrutura a desenvolver. Separemos por partes o que vai ser feito:
- Formulrio de pedido de dados do aluno;
- Validao dos dados do aluno;
- Apresentao do resultado.
Estas 3 fases distintas podem ser feitas em 3 procedimentos diferentes. Criaremos um procedimento formulario(), dados_validar() e
resposta(). Ficamos assim com os 3 pontos definidos. Basta agora
criar o cdigo que os vai colocar em produo.
Comecemos pelo formulrio que vai pedir os dados ao utilizador:
<%Sub formulario()%>
<p align=center><I><b>
<font size=4" color=#800000">Simulador de Bolsas de
Estudo</font></b></I>
<br>
<div align=center>
<center>
<FORM name=bolsa method=POST>
<table border=0" width=400" bgcolor=#CED299"><tr>
<td width=100% align=left>
<strong>
<font size=2" face=ARIAL color=RED>
<%=session(erro)%></font></strong>
<font face=Arial><b>Nome: </b></font>
<input type=text name=nome size=44"
value=<%=Request.Form(nome)%> maxlength=50">
<font face=Arial><b><br>Data de Nascimento:</b></font>
<input type=text name=dia size=2" value=<%=Request.Form(dia)%>
maxlength=2"><input type=text name=mes maxlength=2"
value=<%=Request.Form(mes)%> size=2">- 19
<input type=text name=ano size=2" maxlength=2"
value=<%=Request.Form(ano)%>><b>
<font face=Arial><br>Mdia do ltimo ano:</font></b>
<input type=text name=media value=<%=Request.Form(media)%>
size=2" maxlength=2">valores<b>
<font face=Arial><br>Rendimento mensal dos pais:</font></b>
<input type=text name=rendimento
value=<%=Request.Form(rendimento)%> maxlength=7" size=7">$00
<p align=center><input type=submit value=Simular
name=submeter><br></p>
</td>
</tr></table>
</FORM>
</center>
</div>
<%End Sub%>
CAPTULO 4: OBJECTOS 77
CAPTULO 4: OBJECTOS 79
<%Sub resposta()%>
<%session(erro) = %>
<div align=center>
<center>
<table border=0" width=400" bgcolor=#CED299">
<tr><td width=100% align=left>
<%idade = DateDiff(yyyy, data, Now)
if (idade>10 and idade<28) then%>
<p align=center><b><font color=#800000" face=Arial size=3"><br>
O Aluno</font>
<font face=Arial size=4" color=#FF0000"><%=nome%></font>
<font color=#800000" face=Arial size=3"> , <br>com a mdia de </font>
<font face=Arial size=4" color=#FF0000"><%=media%></font>
<font color=#800000" face=Arial size=3">valores<br>nascido em </font>
<font face=Arial size=4" color=#FF0000"><%=data%></font>
<font color=#800000" face=Arial size=3"><br></font>
<font face=Arial size=4" color=#FF0000">
<% if ((rendimento<=80000)AND(media>11)) then
mensagem = tem
else
if ((rendimento>80000 AND rendimento<100000) AND
(media>13)) then
mensagem = tem
else
if ((rendimento>=100000 AND rendimento<160000) AND
(media>16)) then
mensagem = tem
else
if (media>18) then
mensagem = tem
else
mensagem = no tem
end if
end if
end if
end if
Response.Write mensagem%>
</font>
<font color=#800000" face=Arial size=3">direito<br> bolsa de
estudo.<br></font></b></p><br>
<%
else%>
<br><center><strong><font face=ARIAL color=red size=3'>
No possivel concorrer bolsa de estudo<br> com <%=idade%>
anos.</font></strong></center><br>
<%end if%>
</td></tr></table>
<br><br><a href=cpt4-3-3.asp>repetir a simulao</a>
</center>
</div>
<%End Sub%>
Na imagem anterior, obteve-se uma resposta do formulrio em relao mdia que o utilizador introduziu, que no sendo vlida, pede
para que seja corrigida. Este tipo de correco feito tambm para
outras variveis, e o procedimento em si o mesmo, mas com
mensagens de erro diferentes, correspondendo a cada uma das situaes de validao.
CAPTULO 4: OBJECTOS 81
Como podemos ver na imagem anterior, a resposta que se obteve
foi negativa, depois de se terem efectuadas as comparaes com
os requisitos definidos para a atribuio de bolsa ao estudante.
Teve-se o cuidado de se criar uma tabela com um texto de resposta
por defeito, que s altera as zonas que so correspondentes aos
dados que o utilizador introduziu. Neste caso usado o DateDiff (),
para que os alunos com uma idade no vlida para as bolsas sejam
avisados disso. No caso contrrio enviada a resposta em relao
ao apoio por Bolsa de Estudo.
Introduziu-se um link para o caso do utilizador querer recomear a
simulao. Ser aqui que tudo recomear, tendo em conta que a
varivel de sesso tem de estar vazia, ou o ltimo erro continuaria a
aparecer apesar de ser uma nova simulao. Por isso esta funo
comea com a sesso de erro a ser limpa, pois para se ter chegado
a este ponto era porque as variveis estavam correctas.
Depois desta explicao, podemos ver o cdigo por completo, para
percebermos melhor o seu funcionamento.
(ficheiro cpt4-3-3.asp)
<%Sub resposta()%>
<%session(erro) = %>
<div align=center>
<center>
<table border=0" width=400" bgcolor=#CED299">
<tr><td width=100% align=left>
<%idade = DateDiff(yyyy, data, Now)
if (idade>10 and idade<28) then%>
<p align=center><b><font color=#800000" face=Arial size=3"><br>
O Aluno</font>
<font face=Arial size=4" color=#FF0000"><%=nome%></font>
<font color=#800000" face=Arial size=3"> , <br>com a mdia de </font>
<font face=Arial size=4" color=#FF0000"><%=media%></font>
<font color=#800000" face=Arial size=3">valores<br>nascido em </font>
<font face=Arial size=4" color=#FF0000"><%=data%></font>
<font color=#800000" face=Arial size=3"><br></font>
<font face=Arial size=4" color=#FF0000">
<% if ((rendimento<=80000)AND(media>11)) then
mensagem = tem
else
if ((rendimento>80000 AND
CAPTULO 4: OBJECTOS 83
if session(erro)<> then
formulario
else
resposta
end if
%>
<%End Sub%>
<%Sub formulario()%>
<p align=center><i><b><font size=4" color=#800000">Simulador de
Bolsas de Estudo</font></b></i>
<br>
<div align=center>
<center>
<FORM name=bolsa method=POST>
<table border=0" width=400" bgcolor=#CED299"><tr>
<td width=100% align=left>
<strong><font size=2" face=ARIAL color=RED><%=session(erro)%>
</font></strong>
<font face=Arial><b>Nome: </b></font>
<input type=text name=nome size=44"
value=<%=Request.Form(nome)%> maxlength=50">
<font face=Arial><b><br>Data de Nascimento:</b></font>
<input type=text name=dia size=2" value=<%=Request.Form(dia)%>
maxlength=2"><input type=text name=mes maxlength=2"
value=<%=Request.Form(mes)%> size=2">- 19
<input type=text name=ano size=2" maxlength=2"
value=<%=Request.Form(ano)%>><b>
<font face=Arial><br>Mdia do ltimo ano:</font></b>
<input type=text name=media value=<%=Request.Form(media)%>
size=2" maxlength=2">valores<b>
<font face=Arial><br>Rendimento mensal dos pais:</font></b>
<input type=text name=rendimento
value=<%=Request.Form(rendimento)%> maxlength=7" size=7">$00
<p align=center><input type=submit value=Simular
name=submeter><br></p>
</td>
</tr></table>
</FORM>
</center>
</div>
<%End Sub%>
CAPTULO 4: OBJECTOS 85
Definimos ento alguns procedimentos:
- Procedimentos de perguntas (onde teremos um formulrio de pergunta e respostas, que neste exemplo so 5, devido a serem 5 perguntas);
- Um procedimento, para enviar o total do teste, e respectiva mensagem de aprovao ou reprovao.
Todos os procedimentos de perguntas tero ento o aspecto do cdigo da seguinte tabela, mas com a diferena de que cada um tem
as suas perguntas e respostas, parte essa que ter de ser alterada.
<%Sub Pergunta1()%>
<%session(npergunta)=1%>
<div align=center>
<center>
<table border=0" width=500" bgcolor=#B8CFCF>
<tr>
<td width=100%><b><font face=Arial>Pergunta > <i>1 / 5<br>
<br>
</i></font></b>
<FORM name=pergunta1" action=cpt4-3-4.asp method=POST>
<p>
<font face=Arial>Qual o cdigo para escrever no browser?</font></p>
<div align=center>
<center>
<table border=0" width=300">
<tr>
<td width=7% align=right><input type=radio value=resposta1"
name=pergunta1"></td>
<td width=93%><font face=Arial>Request.Write ()</font></td>
</tr>
<tr>
<td width=7% align=right><input type=radio value=resposta2"
name=pergunta1"></td>
<td width=93%><font face=Arial>Session(escrever)</font></td>
</tr>
<tr>
<td width=7% align=right><input type=radio value=resposta3"
name=pergunta1"></td>
<td width=93%><font face=Arial>Response.Write ()</font></td>
</tr>
<tr>
<td width=7% align=right><input type=radio value=resposta4"
checked name=pergunta1"></td>
<td width=93%><font face=Arial>No sei</font></td>
</tr>
Como se pode ver este um teste de ASP. O leitor pode fazer testes
de tudo o que quiser, e com o uso de bases de dados (a ver em
prximo captulo), pode criar vrios tipos de testes usando apenas
um procedimento para todos eles.
Ser ento num outro procedimento, depois de todas as perguntas
terem sido respondidas, que todas as variveis sero limpas, de
maneira a que se possa responder a um novo teste, ou tentar nova
sorte. Nesta fase, ser feita uma validao de todas as respostas e
incrementada uma varivel com o total de valores do teste - alterada
consoante a qualidade das respostas dadas.
CAPTULO 4: OBJECTOS 87
<%Sub total_respostas ( )%>
<%session(pergunta5) = Request.Form(pergunta5)
total = 0
if session(pergunta1) = resposta3 then total = total + 4
if session(pergunta2) = resposta2 then total = total + 6
if session(pergunta3) = resposta3 then total = total + 3
if session(pergunta4) = resposta1 then total = total + 2
if session(pergunta5) = resposta3 then total = total + 5
Response.Write <center><strong>Teve & total & valores neste
teste...<strong><br><br>
if total < 10 then
Response.Write <strong><font size=4' color=RED>REPROVADO
</font></strong>
Else
if (total > 10 AND total <= 11) then
Response.Write <strong><font size=4' color=BLUE>APROVADO
tangente...</font></strong>
Else
if (total >= 12 AND total < 17) then
Response.Write <strong><font size=4' color=BLUE>APROVADO
</font></strong>
Else
if (total >= 18 AND total<=20) then
Response.Write<strong><font size=4' color=BLUE>APROVADO
com distino!</font></strong>
end if
end if
end if
end if
%>
Como se pode observar, todas as variveis de sesso devolvem as
respostas, que conforme estejam certas ou no iro ser
determinantes no desenvolvimento da varivel local total, para a nota
final do teste online.
Observando todo o cdigo, teremos ento uma noo mais real daquilo que se pretende, pois com as primeiras linhas de cdigo se
pode perceber como todos os procedimentos so geridos.
Fig. 4.14
<%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 > <i>1 / 5<br>
<br>
</i></font></b>
<FORM name=pergunta1" action=cpt4-3-4.asp method=POST>
<p>
<font face=Arial>Qual o cdigo para escrever no browser?</font></p>
<div align=center>
<center>
<table border=0" width=300">
<tr>
<td width=7% align=right><input type=radio value=resposta1"
name=pergunta1"></td>
<td width=93%><font face=Arial>Request.Write ()</font></td>
</tr>
<tr>
<td width=7% align=right><input type=radio value=resposta2"
name=pergunta1"></td>
<td width=93%><font face=Arial>Session(escrever)</font></td>
</tr>
<tr>
<td width=7% align=right><input type=radio value=resposta3"
name=pergunta1"></td>
<td width=93%><font face=Arial>Response.Write ()</font></td>
</tr>
<tr>
<td width=7% align=right><input type=radio value=resposta4"
checked name=pergunta1"></td>
<td width=93%><font face=Arial>No sei</font></td>
</tr>
</table>
</center>
</div>
<p align=center><input type=submit value=Responder
name=submeter></p>
</FORM>
</td>
</tr>
</table>
</center>
</div>
<%End Sub%>
CAPTULO 4: OBJECTOS 89
<%Sub Pergunta2()%>
<%session(pergunta1) = Request.Form(pergunta1)
session(npergunta)=2%>
<div align=center>
<center>
<table border=0" width=500" bgcolor=#B8CFCF>
<tr>
<td width=100%><b><font face=Arial>Pergunta > <i>2 / 5<br>
<br>
</i></font></b>
<FORM name=pergunta2" action=cpt4-3-4.asp method=POST>
<p>
<font face=Arial>Como se cria uma varivel global, acessvel
por<br>todos os utilizadores?</font></p>
<div align=center>
<center>
<table border=0" width=300">
<tr>
<td width=7% align=right><input type=radio value=resposta1"
name=pergunta2"></td>
<td width=93%><font face=Arial>Session ()</font></td>
</tr>
<tr>
<td width=7% align=right><input type=radio value=resposta2"
name=pergunta2"></td>
<td width=93%><font face=Arial>Application ()</font></td>
</tr>
<tr>
<td width=7% align=right><input type=radio value=resposta3"
name=pergunta2"></td>
<td width=93%><font face=Arial>x = 1</font></td>
</tr>
<tr>
<td width=7% align=right><input type=radio value=resposta4"
checked name=pergunta2"></td>
<td width=93%><font face=Arial>No sei</font></td>
</tr>
</table>
</center>
</div>
<p align=center><input type=submit value=Responder
name=submeter></p>
</FORM>
</td>
</tr>
</table>
</center>
</div>
<%End Sub%>
CAPTULO 4: OBJECTOS 91
<%Sub Pergunta4()%>
<%session(pergunta3) = Request.Form(pergunta3)
session(npergunta)=4%>
<div align=center>
<center>
<table border=0" width=500" bgcolor=#B8CFCF>
<tr>
<td width=100%><b><font face=Arial>Pergunta > <i>4 / 5<br>
<br>
</i></font></b>
<FORM name=pergunta4" action=cpt4-3-4.asp method=POST>
<p>
<font face=Arial>Qual a funo que devolve uma diferena entre
duas datas?</font></p>
<div align=center>
<center>
<table border=0" width=300">
<tr>
<td width=7% align=right><input type=radio value=resposta1"
name=pergunta4"></td>
<td width=93%><font face=Arial>DateDiff ()</font></td>
</tr>
<tr>
<td width=7% align=right><input type=radio value=resposta2"
name=pergunta4"></td>
<td width=93%><font face=Arial>IsDate ()</font></td>
</tr>
<tr>
<td width=7% align=right><input type=radio value=resposta3"
name=pergunta4"></td>
<td width=93%><font face=Arial>Date ()</font></td>
</tr>
<tr>
<td width=7% align=right><input type=radio value=resposta4"
checked name=pergunta4"></td>
<td width=93%><font face=Arial>No sei</font></td>
</tr>
</table>
</center>
</div>
<p align=center><input type=submit value=Responder
name=submeter></p>
</FORM>
</td>
</tr>
</table>
</center>
</div>
<%End Sub%>
CAPTULO 4: OBJECTOS 93
<%Sub total_respostas()%>
<%session(pergunta5) = Request.Form(pergunta5)
total = 0
if session(pergunta1) = resposta3 then total = total + 4
if session(pergunta2) = resposta2 then total = total + 6
if session(pergunta3) = resposta3 then total = total + 3
if session(pergunta4) = resposta1 then total = total + 2
if session(pergunta5) = resposta3 then total = total + 5
Response.Write <center><strong>Teve & total & valores neste
teste...<strong><br><br>
if total < 10 then
Response.Write <strong><font size=4' color=RED>REPROVADO</
font></strong>
Else
if (total > 10 AND total <= 11) then
Response.Write <strong><font size=4' color=BLUE>APROVADO
tangente...</font></strong>
Else
if (total >= 12 AND total < 17) then
Response.Write <strong><font size=4' color=BLUE>APROVADO
</font></strong>
Else
if (total >= 18 AND total<=20) then
Response.Write<strong><font size=4' color=BLUE>APROVADO
com distino!</font></strong>
end if
end if
end if
end if
%>
<br><br><center><a href=cpt4-3-4.asp>recomear</a></center>
<%session(pergunta1) =
session(pergunta2) =
session(pergunta3) =
session(pergunta4) =
session(pergunta5) =
session(npergunta) = 0%>
<%End Sub%>
<%
Select case session(npergunta)
case 1 Pergunta2
case 2 Pergunta3
case 3 Pergunta4
case 4 Pergunta5
case 5 total_respostas
case else Pergunta1
end select
%>
<%Sub formulario%>
<FORM action=cpt4-3-5.asp?todo=in method=POST>
<div align=center>
<center>
<table border=1" width=250" bgcolor=#FFCCFF>
<tr>
<td width=100%>
<center><font size=4">Controlo de Acessos</font></center>
</center>
<div align=center>
CAPTULO 4: OBJECTOS 95
<table border=0" width=96%>
<tr>
<td width=50%>
<p align=right><font face=Arial>Login:</font></td>
<center><center>
<td width=50%><input type=text name=login size=8"></td>
</tr>
</center></center>
<tr>
<td width=50%>
<p align=right><font face=Arial>Password:</font></td>
<center><center>
<td width=50%><input type=password name=password
size=8"></td>
</tr>
</table><br><input type=submit name=submete
value=Submeter><br>
</center>
</div>
</td>
</tr>
</table>
</center>
</div>
</FORM>
<%End Sub%>
<%Sub erro%>
<center><br><br><br>
<font face=ARIAL color=RED size=6">ERRO, login e password errados...</font>
<br><br><a href=cpt4-3-5.asp>tente de novo</a></center>
<%End Sub%>
<%
session.Timeout = 4 o tempo que as sesses vo estar activas
session(login) = Request.Form(login) vamos buscar os ltimos dados de login
session(password) = Request.Form(password) e de password
if Request.Querystring(todo) = then se o argumento estiver todo limpo
vamos ao formulrio
formulario
else seno vamos ver o que tm as sesses no momento
if ((session(login)<>xpto and session(password)<>123") AND
Request.Querystring(todo)=in) then
erro neste caso o login e password no so validados
else
Response.Redirect(cpt4-3-5test.asp) aqui o utilizador
validado positivamente
end if
end if
%>
<%if ( session ( login ) <> xpto and session( password )<> 123 ) then
Response.Redirect(cpt4-3-5erro.asp)
end if%>
<center><br><br><br>
<font face=ARIAL color=BLUE size=6">Bem vindo a esta pgina...</font>
</center>
Como ficou demonstrado, simples a maneira de se poder proteger
pginas de um site. Alm deste caso, o utilizador pode fazer uma
conexo a uma base de dados, e usar apenas uma varivel de sesso que diz sim ou no, conforme seja validada ou no depois de
inquirida a base de dados.
CAPTULO 4: OBJECTOS 97
1. o primeiro utilizador entra e o servidor fica alerta;
2. o utilizador comea uma nova sesso, e essas sesses
que ele cria so as que utilizamos para variveis globais, e
para definir o tempo de aco das mesmas.
3. o utilizador sai do site e a sua sesso acaba;
4. o ltimo utilizador do site sai e o servidor Internet deixa
de estar alerta.
Depois de vistas estas 4 fases, posso agora demonstrar esta explicao do ponto de vista prtico.
O ficheiro Global.Asa, algo como que o controlador dos acessos
ao site que o programador criou, ou estiver a desenvolver. Este ficheiro tem apenas 4 funes distintas: a primeira aquela que
activada quando o site fica activo; a segunda activada por cada
vez que entra um utilizador; a terceira activada por cada vez que
sai um utilizador do site, e a quarta activada quando o site deixa de
ter utilizadores. Desta maneira, podemos criar cdigo dentro de cada
uma destas zonas para nosso benefcio. Por exemplo, o leitor quer
que seja introduzido num ficheiro de texto o endereo IP de cada
utilizador que entra no site. Basta escrever dentro da segunda funo
do ficheiro Global.Asa o cdigo que cria essa linha no ficheiro de
controlo, para ter a certeza que cada acesso registado. Ou se
quisermos saber quanto tempo cada utilizador passa em mdia no
site, basta criarmos um registo de tempo de entrada na segunda
funo, e um na terceira funo, e mais tarde fazermos DateDiff()
para sabermos a mdia que cada utilizador gasta no nosso site.
O esquema de um ficheiro Global.Asa o seguinte:
<SCRIPT LANGUAGE=VBScript RUNAT=Server>
Sub Application_OnStart
End Sub
Sub Session_OnStart
End Sub
Sub Session_OnEnd
End Sub
Sub Application_OnEnd
End Sub
</SCRIPT>
CAPTULO 4: OBJECTOS 99
Agora para testarmos a potencialidade deste ficheiro vamos saber
quantos utilizadores esto neste momento no nosso site. Para isso
basta criarmos uma varivel que se incrementa no procedimento
Session_OnStart(), e que se decrementa no Session_OnEnd(). Desta
maneira se estiverem 4 utilizadores ao mesmo tempo no site a varivel ser 4. Se um deles sair passar a ser 3 pois houve uma sesso que acabou. Da mesma maneira, por cada utilizador que entre
no site essa mesma varivel ir ser incrementada. Passando da
teoria prtica vamos ento editar o nosso ficheiro Global.Asa, que
suportar o controlo dos acessos ao site.
(ficheiro global.asa)
(ficheiro cpt4-3-7.html)
<HTML>
<HEAD><TITLE>Chat</TITLE></HEAD>
<frameset FRAMEBORDER=0" BORDER=false framespacing=0"
rows=90,60">
<FRAME SRC=cpt4-3-7top.asp SCROLLING=no>
<FRAME SRC=cpt4-3-7.asp SCROLLING=no>
</FRAMESET>
</HTML>
Os frames so uma tcnica para se conseguir no mesmo ecr
visualizar vrias pginas em simultneo. Usam-se muito em sites
muito complexos, e quando se pretende dar uma sensao de televiso com vrios botes para mudar de canal (neste caso para mudar
de local no site).
Nos frames, primeiro criamos a linha que define a espessura das
margens que separam as pginas, assim como os espaos, e tamanho de apresentao de cada uma das pginas.
<frameset FRAMEBORDER=0" BORDER=false framespacing=0"
rows=90,60">
Vamos ento configurar cada uma das pginas que vo ser criadas
para colocar o chat em funcionamento dentro do esquema de frames.
<FRAME SRC=cpt4-3-7top.asp SCROLLING=no>
<FRAME SRC=cpt4-3-7.asp SCROLLING=no>
<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>
<HTML>
<HEAD>
<META HTTP-EQUIV=REFRESH CONTENT=8;cpt4-3-7top.asp>
</HEAD>
<%=Application(linha18)%><BR>
<%=Application(linha17)%><BR>
<%=Application(linha16)%><BR>
<%=Application(linha15)%><BR>
<%=Application(linha14)%><BR>
<%=Application(linha13)%><BR>
<%=Application(linha12)%><BR>
<%=Application(linha11)%><BR>
<%=Application(linha10)%><BR>
<%=Application(linha9)%><BR>
<%=Application(linha8)%><BR>
<%=Application(linha7)%><BR>
<%=Application(linha6)%><BR>
<%=Application(linha5)%><BR>
<%=Application(linha4)%><BR>
<%=Application(linha3)%><BR>
<%=Application(linha2)%><BR>
<%=Application(linha1)%><BR>
</HTML>
O resultado aquele que podemos ver na seguinte imagem. A introduo no formulrio do anterior Nick usado serve para facilitar a
utilizao pois o utilizador, em princpio, estar sempre a usar o
mesmo Nick.
Request.ServerVariables ()
(ficheiro cpt4-3-9.asp)
Pelo cdigo anterior julgo que fica clara a maneira como se usam e
acedem s variveis do servidor
Os cookies tm alguns mtodos que vo ser explorados neste exemplo. Os cookies aqui criados foram feitos como se de objectos se
tratassem criando-se uma estrutura OCOOKIE que detm vrias
variveis. A este array de cookies vai-se acrescentar uma validade,
que definida em dias, usando-se (DATE + nmero de dias) para a
activar.
formatDateTime(12-01-1995 12:12:00,1)
Obtm-se assim uma data por extenso, onde at se inclui o dia da
semana. uma formatao til para quando queremos uma maior
descrio de uma data, para apresentar clculos, ou apenas para
pginas que suportam calendrios feitos em ASP.
Response.Write formatCurrency(12312321)
Podemos formatar um qualquer nmero para a nossa moeda. O
resultado do nmero em questo ser ento em escudos.
Response.Write FormatNumber(4231,22345553,5)
Quando precisamos de obter um nmero e temos de definir as casas decimais, podemos usar esta funo para essa mesma tarefa.
FormatPercent(15/67)
Esta funo muito til quando fazemos estatsticas num site, ou
quando temos um grfico, como por exemplo, de uma dada votao. Somam-se todos os votos, separam-se os que so referentes
a um assunto, e usamos esta funo para sabermos a que percentagem pertence esse assunto no universo.
Server.HTMLEncode(Hoje dia de praia, <font color=RED size=4'>
tu vais</font> ?)
J alguns sites tiveram problemas nos seus dados, como Livros de
Visitas, e fruns, devido s Tags de HTML, pois se os dados do
utilizador no forem controlados este pode alterar o funcionamento
do site, com dados abusivos, e no aceites. Para que no seja possvel ao utilizador escrever Tags de HMTL a funcionar no site, usamos este mtodo.
Server.URLEncode(http://www.joaovieira.com/)
Esta funo no muito usada, mas sempre que for preciso formatar
uma string, de maneira a ela servir como referncia para outro site,
que tem espaos no link ou outra formatao estranha, usa-se este
mtodo para se obter a string certa para esse efeito
Depois de revistos alguns tipos de formatao, vamos ento escrever o nosso ficheiro exemplo, para vermos tudo a funcionar. sempre a melhor maneira de perceber - experimentar, alterar valores ou
alterar algum cdigo.
Bases de dados
114
117
122
127
135
137
142
144
146
148
152
TABELA: CONTACTOS
ID Nome Telefone EMail
Ficou assim criada uma tabela possvel de ser usada numa base de
dados. Vamos ento demonstrar esta mesma tabela mas com dados
j introduzidos depois de ter sido criada.
TABELA: CONTACTOS
ID as number Nome as varchar(50) Telefone as varchar(14) EMail as varchar(22)
1
2
3
4
Joo
Carlos
Rui
Pedro
219886675
324444332
234343444
332442433
Joao@joao.pt
Carlos@carlos.pt
Rui@rui.pt
Pedro@pedro.pt
TABELA: CONTACTOS
ID as number Nome as varchar(50) Telefone as varchar(14) EMail as varchar(22)
1
2
3
4
5
Joo
Carlos
Rui
Pedro
Ricardo
219886675
324444332
234343444
332442433
288889999
Joao@joao.pt
Carlos@carlos.pt
Rui@rui.pt
Pedro@pedro.pt
Ricardo@ricardo.pt
DESCRIO
Para igualar
Maior que
Menor que
Menor ou igual
Maior ou igual
Diferente
Depois destes passos, se aparecer livrodsn como na imagem anterior, a conexo est feita, e o leitor pode preparar-se para programar
em ASP com acesso BD.
A maneira mais usual de se conectar BD por via do DSN, onde se
indica neste caso o nome da conexo que foi criado livrodsn.
O primeiro passo ser criar um objecto de conexo BD,
Set Conn = Server.CreateObject(ADODB.Connection)
Depois deste passo vamos usar o mtodo open, prprio do objecto
que foi criado,
Conn.open DSN=livrodsn;
Desta maneira acabmos de fazer uma conexo BD. Tudo o que
agora preciso de uma maneira de podermos trabalhar os dados
referentes BD que est nessa conexo. Vamos ento usar o
RecordSet, mais um tipo de objectos, mas desta maneira, para o
controlo de dados.
Depois das fases anteriores, tudo o que tem de fazer para controlar
a BD criar uma declarao de SQL e accionar a mesma, isto da
seguinte maneira,
SQLStmt = SELECT FROM
rs.Open SQLstmt,Conn,1,2
Depois de tudo validado o utilizador poder repetir novamente, devido incluso de um link que d essa hiptese.
<%
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>
O cdigo,
if request.querystring(fazer) = introduzir then
validar_dados
else
formulario_introducao
end if
serve para sabermos qual a aco a prosseguir, pois no nosso formulrio criamos o argumento fazer, para podermos controlar se
mostramos o formulrio ou se vamos actuar na BD, com dados j
introduzidos.
Agora, podemos deparar com uma situao em que o utilizador quer
apagar um contacto. Nesta altura necessrio disponibilizar uma
lista de contactos existentes, de maneira ao utilizador escolher aquele
que quer apagar. Uma das maneiras possveis (e a que vamos usar),
a de criar uma ComboBox com todos os nomes, e um boto de
apagar junto da mesma.
Primeiro precisamos de um procedimento onde temos o formulrio
que inclui a tal ComboBox e o boto para apagar.
<%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>
<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
%>
<%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%>
O cdigo,
if len(session(contacto)) = 0 and len(Request.Form(contacto))<>0 then
session(contacto) = Request.Form(contacto)
end if
Para controlarmos qual dos procedimentos a executar, alm de determinarmos a varivel argumento fazer, temos que depois buscar o
valor que esta detm, e correr o procedimento que se identifica com
esse comando, com o seguinte cdigo:
select case request.querystring(fazer)
case alterar alterar
case executar validar_dados
case else formulario_principal
end select
Ficam ento assim descritas as trs situaes que o leitor vai encontrar quando comear a trabalhar com as ASP: Introduzir, apagar
e actualizar dados em BD parece ser por vezes difcil mas isso s
se pode dizer depois de conhecidos os objectivos. Por vezes para
se actualizar uma tabela preciso percorrer outras, e o programa
ter de abrir vrios recordsets e por vezes vrias conexes, o que
ser mais trabalhoso, e pedir um esforo intelectual maior.
<%
Set Conn = Server.CreateObject(ADODB.Connection)
Conn.open DSN=livrodsn;
Set rs = Server.CreateObject(ADODB.Recordset)
SQLStmt = SELECT * FROM contactos
rs.Open SQLstmt,Conn,1,2
%>
<table border=0" width=580" cellpadding=4" cellspacing=0">
<tr>
<td width=170"><b>Nome</b></td>
<td width=50" align=right><b>Idade</b></td>
<td width= align=right><b>Telefone</b></td>
<td width=><b>E-Mail</b></td>
</tr>
<% cor=99CCFF
while not rs.EOF%>
<tr>
<td bgcolor=#<%=cor%>><%=Rs.Fields(nome)%></td>
<td bgcolor=#<%=cor%> align=right><%=Rs.Fields(idade)%></td>
<td bgcolor=#<%=cor%>
align=right><%=Rs.Fields(telefone)%></td>
<td bgcolor=#<%=cor%> ><%=Rs.Fields(email)%></td>
</tr>
<%rs.MoveNext
if cor=99CCFF then
cor=9999FF
else
cor=99CCFF
end if
wend
%></table>
O cdigo,
if cor=99CCFF then
cor=9999FF
else
cor=99CCFF
end if
ento o pequeno truque para que possamos alternar as cores das
linhas. Iniciamos a varivel cor com um valor, e, dentro do loop, vamos validar a mesma, de maneira que ela troque pela cor oposta.
<%
Set Conn = Server.CreateObject(ADODB.Connection)
Conn.open DSN=livrodsn;
Set rs = Server.CreateObject(ADODB.Recordset)
SQLStmt = SELECT * FROM contactos
rs.Open SQLstmt,Conn,1,2
%>
<table border=0" width=580" cellpadding=4" cellspacing=0">
<tr>
<td width=32" align=right><font size=1"><b>e-mail</b></font></td>
<td width=170"><b>Nome</b></td>
<td width=50" align=right><b>Idade</b></td>
<td width= align=right><b>Telefone</b></td>
</tr>
<% cor=99CCFF
while not rs.EOF%>
<tr>
<td align=right><%
if len(Rs.Fields(email))>1 then
Response.write <a href=mailto:&Rs.Fields(email)&>
Response.Write <img border=0' src=carta.jpg></a>
end if
%></td>
<td bgcolor=#<%=cor%>><%=Rs.Fields(nome)%></td>
<td bgcolor=#<%=cor%> align=right><%=Rs.Fields(idade)%></td>
<td bgcolor=#<%=cor%>
align=right><%=Rs.Fields(telefone)%></td>
</tr>
<%rs.MoveNext
if cor=99CCFF then
cor=9999FF
else
cor=99CCFF
end if
wend
%></table>
Algo que muito usado nas pginas Internet a pesquisa nas bases
de dados da existncia de um dado utilizador, e esse exemplo que
vamos apresentar de seguida.
<%Sub Listagem()
Set Conn = Server.CreateObject(ADODB.Connection)
Conn.open DSN=livrodsn;
Set rs = Server.CreateObject(ADODB.Recordset)
SQLStmt = SELECT * FROM contactos WHERE nome like % &
Request.Form(nome) & %
rs.Open SQLstmt,Conn,1,2
%>
<table border=0" width=580" cellpadding=4" cellspacing=0">
<tr>
<td width=32" align=right><font size=1"><b>e-mail</b></font></td>
<td width=170"><b>Nome</b></td>
<td width=50" align=right><b>Idade</b></td>
<td width= align=right><b>Telefone</b></td>
</tr>
<% cor=99CCFF
while not rs.EOF%>
<tr>
<td align=right><%
if len(Rs.Fields(email))>1 then
Response.write <a href=mailto:&Rs.Fields(email)&>
Response.Write <img border=0' src=carta.jpg></a>
End if
%></td>
<td bgcolor=#<%=cor%>><%=Rs.Fields(nome)%></td>
<td bgcolor=#<%=cor%> align=right><%=Rs.Fields(idade)%></td>
<td bgcolor=#<%=cor%>
align=right><%=Rs.Fields(telefone)%></td>
</tr>
<%rs.MoveNext
if cor=99CCFF then
cor=9999FF
else
cor=99CCFF
end if
wend
%></table>
<br><a href=cpt5-5-3.asp>fazer nova procura</a>
<%End Sub%>
<%Sub formulario_procura%>
<form action=cpt5-5-3.asp?fazer=procura method=POST>
String para Procura : <input type=text name=nome size=22">
<input type=submit value=Procurar>
</form>
<%End Sub%>
<%select case request.querystring(fazer)
case procura listagem
case else formulario_procura
end select%>
<%
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
<%
Sub Introduzir()
SQLStmt = UPDATE sondagem SET valor = valor+1 WHERE
resposta = & Request.Form(sondagem) &
Rs.Open SQLstmt,Conn,1,2
Response.Redirect(cpt5-6-2.asp)
End Sub
Set Conn = Server.CreateObject(ADODB.Connection)
Conn.open DSN=livrodsn;
Set rs = Server.CreateObject(ADODB.Recordset)
if Request.QueryString(fazer)=introduzir then
introduzir
end if
%>
<div align=center>
<table border=0" width=400">
<tr>
<td width=100%>
<p align=center><font size=3" face=Arial><b>Acha que este livro
o ajudou?</b></font> </p>
<div align=center>
<table border=0" width=100">
<tr>
<td width=26">
<form action=cpt5-6-2.asp?fazer=introduzir method=POST>
<p align=right><font size=3" face=Arial><input type=radio
value=Sim name=sondagem></font></td>
<center>
<td width=60"><font size=3" face=Arial>Sim</font></td>
</tr>
</center>
<tr>
<td width=26">
<p align=right><font size=3" face=Arial><input type=radio
value=No name=sondagem></font></td>
Componentes
156
159
163
164
173
Tipo
Descrio
Read
Input
ReadLine
Input
ReadAll
Input
Write
WriteLine
Skip
Input
SkipLine
Input
Muda de linha.
Descrio
AtEndOfLine
Line
Column
(ficheiro cpt6-2-1.asp)
<%
Response.Write processo : Vai ser criada uma linha de texto.<br><br>
Set ObjectoFicheiro = CreateObject(Scripting.fileSystemObject)
Set EscreveTexto = ObjectoFicheiro.CreateTextFile
(Server.MapPath(ficheiro.txt),True)
EscreveTexto.WriteLine(Este linha est no ficheiro de texto...)
EscreveTexto.Close
Response.Write processo: Escreveu uma linha de texto.<br><br>
Response.Write processo: Vai ler linha de texto.<br><br>
Set LerTexto = ObjectoFicheiro.OpenTextFile
(Server.MapPath(ficheiro.txt),1)
Response.Write processo: A linha lida : <b> & LerTexto.Readline & </b>
Set LerTexto = nothing
%>
(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 | & LerTexto.ReadLine & <br>
Wend
Set LerTexto = nothing
End Sub
Sub formulario()
%>
<br><br><p><FORM action=cpt6-2-2.asp method=POST>
Novo Pargrafo: <input type=text name=linha size=60"
MaxLength=140"><br>
<input type=submit name=submeter Value=Acrescentar>
</FORM>
</p>
<%
End Sub
<%
Set ObjectoFicheiro = CreateObject(Scripting.fileSystemObject)
Set LerTexto = ObjectoFicheiro.OpenTextFile
(Server.MapPath(contador.txt),1)
Valor = LerTexto.ReadLine
Set LerTexto = nothing
Set EscreveTexto = ObjectoFicheiro.CreateTextFile
(Server.MapPath(contador.txt),True)
EscreveTexto.WriteLine(valor+1)
EscreveTexto.Close
Response.Write Houveram & (valor+1) & acessos...<br>
%>
Neste caso j tnhamos de ter criado um ficheiro de texto (contador.txt)
com o valor em que queramos inicializar a contagem, neste caso,
zero. Por cada entrada no site o valor incrementado, podendo o
leitor testar, fazendo mltiplos refrescamentos da pgina.
<%
Set Jmail = Server.CreateObject(JMail.SMTPMail)
JMail.ServerAddress = mail.servidor.pt aqui fica o servidor de e-mail
JMail.Sender = remetente@servidor.pt aqui fica o endereo de quem
envia o e-mail
JMail.Subject = Titulo do E-Mail aqui fica o titulo do e-mail / subject
JMail.AddRecipient receptor@servidor.pt endereo para onde
queremos enviar o e-mail
Corpo = Texto que vai no e-mail... & Chr(13) & chr(12) & Chr(13) & chr(12)
corpo = corpo & Chr(13) & chr(12) & Obrigado
JMail.Body = corpo envio do corpo da mensagem
Jmail.Priority = 3 implementar prioridade 1-mnima 3-mxima
JMail.Execute
%>
<%
Sub enviar_piada()
Set Jmail = Server.CreateObject(JMail.SMTPMail)
Jmail.ServerAddress = mail.servidor.pt
Jmail.Sender = seuemail@seuservidor.pt
Jmail.Subject = Aqui esto as piadas
Jmail.AddRecipient request.form(email)
Corpo = Aqui esto as piadas.doc em attachment. & Chr(13) & chr(12)
& Chr(13) & chr(12)
Corpo = corpo & Chr(13) & chr(12) & Obrigado
Jmail.Body = corpo
Jmail.AddAttachment d:/piadas.doc
Jmail.Priority = 2
Jmail.Execute
%>
Fig.6.4
Depois de escolhidas as referncias, e de termos seguido as passagens j referidas, vamos ento comear a criar as primeiras linhas de cdigo VB para o nosso componente.
Antes de tudo vamos criar uma tabela de dados que julgamos serem vlidos para dar hiptese do Livro de Visitas ser configurvel
por pessoas estranhas ao cdigo do componente. Digamos que o
utilizador tem de ter a hiptese de usar um ficheiro com o nome que
quiser para usar o componente, a cor das caixas onde esto as
mensagens, e a cor das letras do site, e das caixas.
Desta maneira o utilizador do componente tem hiptese de configurar os dados sua vontade.
No VB precisamos de configurar certos objectos que nas ASP temos como certos, para que os precisamos de inicializar no VB falamos de Response, Request, Session etc.
Para isso temos de inicializar todas as chamadas dos objectos das
ASP, e para isso temos o seguinte cdigo,
msession(Ficheiro) = ficheiro.asp
Ficamos assim com o ficheiro que ir gerir todo o processo do componente. Tudo se passa como se fosse um ASP excepto as chamadas dos objectos base das ASP.
Para testarmos este cdigo necessitamos de fazer Run do mesmo,
e logo de seguida ir a um ASP que busca este componente. No VB6
existe essa vantagem - no necessitamos de instalar o componente
para o testar; basta carregar em RUN no VB, ir ao browser e abrir a
pgina que chama o componente. Neste caso uma pgina com a
seguinte estrutura:
(ficheiro cpt6-4-1.asp)
<%
Set lv = Server.CreateObject(LivroASP.livrovisitas)
Lv.Ficheiro(cpt6-4-1.asp)
lv.CorLetras(Green)
lv.CorLetrasCaixas(#F60000)
lv.CorCaixas(#C6C6FF)
lv.inicio
%>
Como se pode ver define-se todos os dados possveis do componente, busca-se o componente atravs de Serve.CreateObject onde
a estrutura ,
Server.CreateObject(NomeProjecto.NomeClasse)
Exemplos reais
7.1 Introduo
182
183
197
7.1 Introduo
Este captulo foi introduzido neste manual, no para mais uma explicao detalhada linha a linha, mas para inspirar o leitor a desenvolvimentos mais complexos com as ASP. Vamos apresentar dois
exemplos que decerto incluem respostas para muitos problemas
que lhe so familiares.
O esquema de ambos muito parecido, ao ponto de serem usados
ficheiros idnticos em ambas as aplicaes. Estes exemplos tm
muito em comum, tais como, ficheiros, funes, mtodos de busca
de dados e muito mais. Mas o mais importante que ambos usam
apenas um ficheiro ASP e os outros so de apoio para a construo
do primeiro, que 80% dinmico. Teremos 3 zonas desse ficheiro, o
topo, o fundo e o centro. O centro a zona mais dinmica, onde
vamos escolher consoante a resposta do nosso Querystring ou
formulrio, os dados a mostrar no browser.
O esquema ento sempre o seguinte:
Verso digital, individual, licenciada em Jan/Fev do ano 2000, pelo Centro Atlntico, da verso 1.0 do livro 'Programao Web com ASP'
Imagens,
C:\Inetpub\wwwroot\livro\motordebusca\imagens\Topo.jpg
ficheiro que representa a imagem de topo do site, includo no
cdigo HMTL do ficheiro topo.inc
C:\Inetpub\wwwroot\livro\motordebusca\imagens\Bprocurar.gif
ficheiro que representa o boto que se carrega para pesquisarmos
no motor, usado no ficheiro procura.inc
C:\Inetpub\wwwroot\livro\motordebusca\imagens\Bregistar.gif
como o nome indica o boto para registarmos os sites que
queiram figurar na BD do motor de busca; chamado no ficheiro
registar.inc
Ficheiros da pgina,
C:\Inetpub\wwwroot\livro\motordebusca\Default.asp
ficheiro que recebe os argumentos dos formulrios ou da linha de
comando do browser, e consoante o recebido consoante o ficheiro
que demonstrado na zona central da pgina;
C:\Inetpub\wwwroot\livro\loja\motordebusca\Funcoes.asp
aqui existe uma funo que usada em mais que um ficheiro, cuja
funo validar as plicas usadas nas strings, para que quando
usarmos a BD no apaream erros, visto que as mesmas so
usadas pela prpria BD;
C:\Inetpub\wwwroot\livro\motordebusca\includes\Fundo.inc
ficheiro com o desenho do fundo do site (esttico a 100%);
C:\Inetpub\wwwroot\livro\motordebusca\includes\Inicial.inc
esquema inicial, se no existirem argumentos no link, ser este
ficheiro a aparecer;
C:\Inetpub\wwwroot\livro\motordebusca\includes\Listagem.inc
depois de submetida a string de procura, aparecem todos os sites
relacionados, e este ficheiro que o vai fazer;
Verso digital, individual, licenciada em Jan/Fev do ano 2000, pelo Centro Atlntico, da verso 1.0 do livro 'Programao Web com ASP'
(ficheiro default.asp)
<!#INCLUDE FILE=includes/topo.inc>
<div align=center>
<table width=600"><tr>
<td align=top width=600">
<center><font size=2" face=Verdana><a href=default.asp>pgina
inicial</a>
<a href=default.asp?fazer=registar>registar site
</a> </font></center>
<%
fazer = Request.QueryString(fazer) vamos buscar o argumento fazer
Select Case fazer vamos ento chamar o ficheiro consoante o
argumento
Case procura se o argumento for procura foi submetida uma busca
e se foi submetida uma busca vamos mostrar o formulrio de busca
e incluir a listagem de sites identificados com essa procura
%>
<!#INCLUDE FILE=includes/procura.inc>
<!#INCLUDE FILE=includes/listagem.inc>
<%
esta funo serve exclusivamente para acrescentar uma plica
por cada uma que existir nas strings a usar em declaraes de SQL
Function tira_plicas(texto)
Texto = trim(texto) desta maneira tiramos os espaos em branco ao
incio e fim da string
texto_temp = esta uma string temporria onde vamos construir
uma string que no tem uma plica sozinha
For i=1 to len(texto) loop para percorrer a string
if Mid(texto,i,1)= then se achar plica acrescenta mais uma
texto_temp=texto_temp &
else
texto_temp=texto_temp & Mid(texto,i,1)
end if
Next
Tira_plicas = texto_temp ao fazermos esta igualdade estamos
a devolver o resultado desta funo ( funo corrente = valor )
End Function
%>
O ficheiro funcoes.asp como que uma biblioteca que recorremos
que tem funes generalistas. Nestes exemplos s o usei para uma
funo, mas o leitor poder usar para vrios tipos de funes.
Depois de fazermos #INCLUDE de um destes ficheiros, todas as
funes e procedimentos a existentes so usados como se ao cdigo
do ficheiro inicial pertencessem.
(ficheiro topo.inc)
<HMTL>
<HEADER>
<TITLE>A R - o novo motor de busca com ASP</TITLE>
</HEADER>
<BODY>
<div align=center><table width=600">
<tr><td>
<img src=imagens/topo.jpg>
</td></tr>
</table></div>
<br><br>
<p><font size=2" face=Verdana>Use este motor de busca, para adicionar os seus links ou procurar a pgina que tanto procura.
No se esquea de que este servio gratuito, por isso pode divulg-lo
por todos os seus amigos.<br>
Agradeo a sua visita e espero que goste...
</font></p>
<br><font face=Verdana color=blue>Os ltimos links adicionados
foram:</font><br><br>
<%
Set Conn = Server.CreateObject(ADODB.Connection)
Conn.open DSN=livrodsn;
Set rs = Server.CreateObject(ADODB.Recordset)
SQLStmt = SELECT url, titulo, data, descricao
SQLStmt = SQLStmt & FROM motorbusca ORDER BY data DESC
rs.Open SQLstmt,Conn,1,2
voltas=0 varivel para controlamros o nmero de registos a mostrar
na primeira pgina, ou, pgina inicial
enquanto no forem demonstrados os ltimos 5 links o loop executa-se
while NOT rs.EOF and voltas<5
response.write <p><font size=2' face=ARIAL>
response.write > <b><font size=3'><a href=
response.write rs.fields(url) & target=_blank>
response.write rs.fields(titulo) & </a></font></b><br>
response.write left(rs.fields(descricao),400)
Verso digital, individual, licenciada em Jan/Fev do ano 2000, pelo Centro Atlntico, da verso 1.0 do livro 'Programao Web com ASP'
(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> <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>
(ficheiro registar.inc)
<%
esta primeira funo vai ver se o site que queremos registar j existe
Function procura_repetido( link )
SQLStmt = SELECT url FROM MOTORBUSCA WHERE
url = &link&
rs.Open SQLstmt,Conn,1,2
if rs.eof then se no existir esse link
rs.close
procura_repetido = 0 a funo devolve o nmero 0
else caso contrrio
rs.close
procura_repetido = 1 a funo acha e devolve 1
end if
End Function
no procedimento seguinte posto o formulrio de registo no browser para
preenchimento
Sub formulario_registo()%>
TABELA: PRODUTOS
Id_produtos
Titulo
Autor
N_Paginas
Isbn
Preco
Mes_edicao
Ano_edicao
introducao
TABELA: PROD_ENCOMENDAS
Id_prod_encomendas
Auto-number; identificador dos
produtos encomendados referentes a cada
encomenda
Id_encomenda Number; identificador da encomenda na
tabela encomendas
Id_produto
Number; identificador dos produtos
referenciados na tabela produtos
Quantidade
Number; quantidade do produto
encomendada
Preco
Number; preo a que foi comprado o
produto
Verso digital, individual, licenciada em Jan/Fev do ano 2000, pelo Centro Atlntico, da verso 1.0 do livro 'Programao Web com ASP'
Topo.jpg
ficheiro que representa a imagem de topo do site; includo no cdigo
HMTL do ficheiro topo.inc, tal como no motor de busca, claro que
com a particularidade de ser uma imagem diferente;
Bprocurar.gif
ficheiro que representa o boto que se carrega para fazermos procura de um livro; usado no ficheiro topo.inc
Brecalcular.gif
o boto que refaz os clculos no nosso carrinho de compras depois de introduzido novo produto, ou de termos alterada alguma quantidade; chamado no ficheiro carrinhor.inc
Bfinalizar.gif
ficheiro que representa o boto que se carrega para finalizarmos
uma compra online; usado no ficheiro pagar.inc
Verso digital, individual, licenciada em Jan/Fev do ano 2000, pelo Centro Atlntico, da verso 1.0 do livro 'Programao Web com ASP'
Bpagar.gif
ficheiro que representa o boto que se carrega para passarmos
fase de finalizao de pagamento de uma nova encomenda; usado
no ficheiro carrinho.inc
Carrinho.gif
como se pode prever o desenho do carrinho de compras, que
depois de carregado faz-nos aceder zona de produtos j escolhidos; chamado no ficheiro topo.inc
Casa.gif
o ficheiro que nos encaminha para a pgina inicial; chamado no
ficheiro topo.inc
Pagar.gif
faz a chamada da zona onde se voi introduzir os dados pessoais
para finalizao da compra; chamado no ficheiro topo.inc
Ficheiros da pgina,
C:\Inetpub\wwwroot\livro\loja\Default.asp
ficheiro que recebe os argumentos dos formulrios ou do campo de
endereo do browser, e consoante o recebido consoante o ficheiro
que demonstrado na zona central da pgina;
C:\Inetpub\wwwroot\livro\loja\loja\Funcoes.asp
aqui existe uma funo que usada em mais que um ficheiro, que
tal e qual a do motor de busca usada para validar as plicas usadas
nas strings, para que quando usarmos a BD no apaream erros,
visto que as mesmas so usadas pela prpria BD. Este cdigo
idntico ao do motor de busca;
C:\Inetpub\wwwroot\livro\loja\includes\Fundo.inc
ficheiro com o desenho do fundo do site (esttico a 100%);
C:\Inetpub\wwwroot\livro\loja\includes\Inicial.inc
esquema inicial. Se no existirem argumentos no link, ser este ficheiro a aparecer;
C:\Inetpub\wwwroot\livro\motordebusca\includes\Listagem.inc
depois de submetida a string de procura, aparecem todos os sites
relacionados, e este ficheiro que o vai fazer;
<!#INCLUDE FILE=includes/topo.inc>
<div align=center>
<table width=600"><tr>
<td align=top width=600">
<%
o sistema de busca dos argumentos idntico ao do motor de busca
fazer = Request.QueryString(fazer)
Select Case fazer
Case carrinho se for escolhido o carrinho vamos mostrar o carrinho
%>
<!#INCLUDE FILE=includes/carrinho.inc>
<% Case pagar neste caso o utilizador vai pagar o escolhido %>
<!#INCLUDE FILE=includes/pagar.inc>
<%
Case procura se houver procura vai-se mostrar a listagem de
resultados
%>
<!#INCLUDE FILE=includes/listagem.inc>
<%
Case Else se o argumento no existir mostramos a pgina inicial
%>
<!#INCLUDE FILE=includes/inicial.inc>
<%
End Select
%>
</td>
</tr></table></div>
<p> </p>
<!#INCLUDE FILE=includes/fundo.inc>
(ficheiro funcoes.asp)
<%
Function tira_plicas(texto)
texto = trim(texto)
texto_temp =
For i=1 to len(texto)
if Mid(texto,i,1)= then
texto_temp=texto_temp &
else
texto_temp=texto_temp & Mid(texto,i,1)
end if
Next
tira_plicas = texto_temp
End Function
%>
(ficheiro topo.inc)
<HMTL>
<HEADER>
<TITLE>A Loja - a nova loja on-line feita com ASP</TITLE>
</HEADER>
<BODY>
<div align=center><table width=600">
<tr><td>
<img src=imagens/topo.jpg>
</td></tr>
<tr><td>
<center>
<FORM action=default.asp?fazer=procura method=POST>
<table width=400" cellpadding=0" cellspacing=0" border=0"><tr>
<td valign=top>
<font size=2" face=Verdana><a href=default.asp>
<img border=0" alt=Voltar pgina inicial src=imagens/casa.jpg>
</a> </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> </td>
<td valign=top><font size=2" face=Verdana>
<a href=default.asp?fazer=pagar>
Verso digital, individual, licenciada em Jan/Fev do ano 2000, pelo Centro Atlntico, da verso 1.0 do livro 'Programao Web com ASP'
(ficheiro inicial.inc)
<br><br>
<p><b><font size=2" face=Verdana>Use esta loja online, para procurar
e comprar o livro que tanto procura.
No se esquea de que este servio gratuito, por isso pode divulgar por
todos os seus amigos.<br>
Agradeo a sua visita e espero que goste...
</font></b></p>
<br><font face=Verdana color=blue>A mais recente novidade:
</font><br><br>
<%
Set Conn = Server.CreateObject(ADODB.Connection)
Conn.open DSN=livrodsn;
Set rs = Server.CreateObject(ADODB.Recordset)
SQLStmt = SELECT id_produto, titulo, introducao, autor, preco
SQLStmt = SQLStmt & FROM produtos ORDER BY id_produto ASC
rs.Open SQLstmt,Conn,1,2 foi executada a procura
rs.movelast vamos mover o cursor para a ltima posio
response.write <p><font size=3' face=ARIAL><b>
(ficheiro listagem.inc)
<% este procedimento faz com que vejamos os dados que esto em
carrinho
Sub ver_carrinho()
Produtos_info = session(matriz_produtos) vamos buscar os dados
dos produtos
Quantidade_info = session(matriz_quantidade) e respectivas
quantidades
produtos_num = ubound(produtos_info) tirar o nmero de produtos
em carrinho
if produtos_num <1 then se forem menos de 1 ento est vazio
response.write <p> </p><p> </p><p><center>
response.write <font size=4' color=red>o carrinho ainda est
vazio..</font>
response.write </center></p><p> </p><p> </p>
exit sub saimos forosamente do procedimento
end if
num_produtos = 0
vamos construir a tabela
response.write <div align=center>
response.write <table width=600' border=1'
response.write bordercolor=#409AC9' cellspacing=0'><tr>
response.write <td width=20'>
response.write Qt.
response.write </td>
response.write <td>
response.write ISBN
response.write </td>
response.write <td>
response.write Titulo da Obra
response.write </td>
response.write <td>
response.write Preo
response.write </td>
response.write <td>
response.write Total
response.write </td></tr>
response.write <form action=default.asp?fazer=carrinho&
response.write como=calcula method=POST>
total_preco = 0 varivel que vai calcular o preo total da encomenda
total_produtos = 0 vai calcular o nmero total de produtos
no podemos usar o produtos_num pois este diz quantos
produtos diferentes e no quantos produtos (quantidade)
for i=1 to produtos_num
SQLStmt = SELECT id_produto, isbn, titulo, preco FROM produtos
Verso digital, individual, licenciada em Jan/Fev do ano 2000, pelo Centro Atlntico, da verso 1.0 do livro 'Programao Web com ASP'
Verso digital, individual, licenciada em Jan/Fev do ano 2000, pelo Centro Atlntico, da verso 1.0 do livro 'Programao Web com ASP'
(ficheiro pagar.inc)
<%
este procedimento vai introduzir o formulrio que pede os dados pessoais
do cliente, para que o pagamento total seja efectuado
Sub formulario()
Vamos buscar os dados para vermos se existem produtos no carrinho
produtos_info = session(matriz_produtos)
produtos_num = ubound(produtos_info)
if produtos_num <1 then se no existirem produtos no se poder
efectuar nenhum tipo de pagamento
response.write <p> </p><p> </p><p><center>
response.write <font size=4' color=red>o carrinho ainda est
vazio..</font>
response.write </center></p><p> </p><p> </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: <b>
<%=formatCurrency( session(valor_t))%> </b></font></p>
<table width=500' border=1' bordercolor=#409AC9'
cellspacing=0'><tr><td><table>
<tr><td bgcolor=#409AC9'><font face=arial color=white
size=2'><b>Dados Pessoais </b></font></td>
Verso digital, individual, licenciada em Jan/Fev do ano 2000, pelo Centro Atlntico, da verso 1.0 do livro 'Programao Web com ASP'
Agradecimentos:
Queria agradecer a todos aqueles que ajudaram na minha formao e
percurso profissional, onde esto includos: Manuel Pacheco Vieira, Jos
Fernando Silva, Pedro Tiago Pereira e Carlos Dias.
No estrangeiro tive o apoio de duas pessoas que me apoiaram nos meus
artigos e acreditaram nas minhas capacidades, so eles Scott Mitchell
(www.4guysfromrolla.com) e Stephen Wynkoop (www.swynk.com).
Agradeo tambm s centenas de pessoas que me enviam mensagens para o
e-mail todos os meses, a pedir esclarecimentos tcnicos ou a agradecer pelo
cdigo que tenho disponvel no meu site (www.joaovieira.com).
A nvel pessoal agradeo ento s peas fundamentais na minha vida, os meus
pais, avs, Tnia Penedo e dupla Jujinha & Ritinha.
Coleco Tecnologias
Todas as tecnologias de destaque da
Internet tratadas pela equipe de tcnicos
do Centro Atlntico
Coleco Desafios
O que nos reservam os tempos que se aproximam
em que as novas tecnologias invertem muitas das
certezas adquiridas
Coleco Solues
Solues prticas para resolver novas
questes levantadas pelas tecnologias
da sociedade da informao
Ttulo
Quant.
Preo TTotal
otal
_____
_____
_____
_____
_____
*
*
*
*
*
Coleco Tecnologias
* Guia do Internet Explorer verso 4
* Guia do Internet Explorer verso 5
* Guia do Netscape Communicator v 4
Agentes Inteligentes
TOP 100 Internet 1999
_____
_____
_____
_____
_____
*
*
*
*
*
950$
950$
950$
950$
950$
=
=
=
=
=
2.950$
2.950$
2.950$
2.950$
2.450$
_______
_______
_______
_______
_______
=
=
=
=
=
______
______
______
______
______
* Inclui CD-ROM
TOTAL = ________
Sem Despesas de envio
As encomendas directas ao Centro Atlntico no pagam custos de portes.
SIM, desejo receber os ttulos que assinalei sem qualquer despesa de envio.
Junto envio cheque/Vale n ____________ ordem do Centro Atlntico
Prefiro que debitem no meu carto de crdito emitido em nome de
_______________________________
Nmero do carto de crdito _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ Validade _ _ / _ _
Nome
___________________________________________
Morada ___________________________________________
CP
________
Localidade ______________________
Tel
________________
Fax ____________________
Caso alguns dos ttulos no estejam disponveis enviaremos os que existirem em
stock e pediremos confirmao no futuro para envio dos ttulos em falta.
Centro Atlntico - Av. D. Afonso Henriques, 1462 - 4450 Matosinhos
Fax. 21 - 321 01 85 ou 22 - 938 56 30
www.centroatlantico.pt/titulos