Você está na página 1de 225

Centro Atlntico

Programao Web com ASP - Active Server Pages

Joo Vieira
Centro Atlntico

Programao Web com ASP - Active Server Pages

Edies Centro Atlntico Portugal/2000

Reservados todos os direitos por Centro Atlntico, Lda. Qualquer reproduo, incluindo fotocpia, s pode ser feita com autorizao expressa dos editores da obra.

Programao Web com Active Server Pages Coleco: Tecnologias Autor: Joo Vieira Direco grfica: Centro Atlntico Capa: Paulo Buchinho

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

geral@centroatlantico.pt www.centroatlantico.pt

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

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

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

Dedico este livro aos meus pais, Maria de Jesus S. R. Sousa Vieira, Antnio Tiago Vieira

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 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 FOR, WHILE, CASE 2.3.1 Exemplo: Comparao de variveis com ciclos 2.3.2 Exemplo: Select Case 2.3.3 Exemplo: Contadores ASP embebidos em HMTL 2.3.4 Exemplo: HMTL embebido em contadores ASP Variveis Tabela de Operadores 2.5.1 Exemplo: Comparao de varivel entre valores 37 2.5.2 Exemplo: Utilizao de todos os operadores 28 28 29 29

2.2

30

2.3

32 33 33 34 35

2.4 2.5

38

3. Funes
3.1 3.2 Tabela de funes base das ASP 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 Uso de SSI (Server Side Includes) com as nossas funes 3.3.1 Exemplo: Uso de um ficheiro externo com SSI 3.3.2 Exemplo: Ficheiro com todas as funes 3.3.3 Exemplo: ASP que usa o ficheiro com todas as funes 40 48 50 52 53

3.3

56 57 58

4. Objectos
4.1 4.2 4.3 Tabela de Objectos Variveis globais e de sesso Interagir com o utilizador 4.3.1 Exemplo: Responder ao utilizador com os dados recolhidos 4.3.2 Exemplo: Validar formulrio 4.3.3 Exemplo: Curso online 4.3.4 Exemplo: Proteco de pginas com password Ficheiro global.asa 4.4.1 Exemplo: Quantos utilizadores esto a visitar a pgina 4.4.2 Exemplo: Chat em Browser Cookies, dados do utilizador e do servidor 4.5.1 Exemplo: Recolher dados do utilizador 4.5.2 Exemplo: Pginas personalizadas Formatao de strings 62 65

72 73 81 88

4.4

100 102

4.5

105 107 108

4.6

5. Bases de dados
5.1 5.2 5.3 5.4 Bases de Dados / SQL Construir uma base de dados em Microsoft Access Conexo base de dados Inserir, apagar e actualizar dados em bases de dados 5.4.1 Exemplo: Inserir dados 5.4.2 Exemplo: Eliminar dados 5.4.3 Exemplo: Actualizar dados 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 Exemplos com bases de dados 5.6.1 Exemplo: Livro de Visitas 5.6.2 Exemplo: Sondagens de opinio 114 117 122 127 135 137

5.5

142 144 146 148 152

5.6

6. Componentes
6.1 6.2 Introduo aos Componentes Tratamento de ficheiros de texto com o TextStream 6.2.1 Exemplo: Histria sem fim 6.2.2 Exemplo: Contador de acessos Componentes de e-mail 6.3.1 Exemplo: Envio de e-mail com attachment Criar componentes em Visual Basic 6 6.4.1 Exemplo: Componente Livro de Visitas 156 159 163 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

Pea gratuitamente o seu e-book

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

Introduo s Active Server Pages


1.1 Do Autor 1.2 Requisitos para as ASP 1.3 ASP vs. JavaScript / VBScript 1.4 Instalar o servidor de Internet 1.5 Programar com ficheiros ASP e HTML 1.6 Conhecer o HTML (Hyper Text Markup

1
12 13 15 16 19 19 23

Language) em 12 passos
1.7 Sites com recursos de ASP

12 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES

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

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

1.2 Requisitos para as ASP


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

14 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES

Fig. 1.1 - Esquema geral do funcionamento das ASP

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

CAPTULO 1: INTRODUO S ACTIVE SERVER PAGES 15

1.3 ASP vs JavaScript/VBScript


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

16 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES


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

1.4 Instalar o servidor de Internet


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

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

Fig. 1.2 - Aspecto da consola do PWS

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

18 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES

Fig. 1.3 - Pgina principal do servidor Internet PWS, depois de instalado

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

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

CAPTULO 1: INTRODUO S ACTIVE SERVER PAGES 19

1.5 Programar com ficheiros ASP e HTML


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

1.6 Conhecer o HTML (Hyper Text Markup Language) em 12 passos


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

20 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES


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

2. Como deve ter reparado, todas as Tags que comeam com <NOMEDATAG> tm de acabar com uma barra </NOMEDATAG>. Nem todas o requerem, mas podemos dizer que cerca de 90% sim.

3. Para enviar contedo para o browser de maneira a ser visvel pelo utilizador, basta escrever: <HTML> <BODY> ISTO UM TESTE </BODY> </HTML>

4. Para mudar-se os parmetros dos textos escritos usada a Tag <FONT>, onde poder mudar o tamanho das letras, a cor e at mesmo o tipo de letra: <HTML> <BODY> <FONT FACE=ARIAL COLOR=GREEN SIZE=5>ISTO UM TESTE</FONT> </BODY> </HTML>

5. Para simular um pargrafo existe a Tag <P> <HTML> <BODY> <P><FONT FACE=ARIAL COLOR=GREEN SIZE=5>ISTO UM TESTE</FONT></P> E ISTO J OUTRO TESTE </BODY> </HTML>

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

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

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

22 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES


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

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

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

CAPTULO 1: INTRODUO S ACTIVE SERVER PAGES 23 12. Para mostrar uma imagem no browser use a Tag <IMG> <HTML> <BODY> <IMG SRC=nomedaimagem.gif> </BODY> </HTML>

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

1.7 Sites com recursos de ASP


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

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

24 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES

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

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

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

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

CAPTULO 1: INTRODUO S ACTIVE SERVER PAGES 25

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

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

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

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

2
28 28 29 29

2.2 IF, THEN, ELSE, END IF 2.2.1 Exemplo: Comparao entre variveis 30 2.3 FOR, WHILE, CASE 2.3.1 Exemplo: Comparao de variveis com ciclos 2.3.2 Exemplo: Select Case 2.3.3 Exemplo: Contadores ASP embebidos em HMTL 2.3.4 Exemplo: HMTL embebido em contadores ASP 2.4 Variveis 2.5 Tabela de Operadores 2.5.1 Exemplo: Comparao de varivel entre valores 2.5.2 Exemplo: Utilizao de todos os operadores

32 33 33 34 35

37 38

28 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES

2.1 Os primeiros passos


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

(ficheiro cpt2-1-1.asp)

<%response.writeOl Portugal%>

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

(ficheiro cpt2-1-2.asp)

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

Este segundo exemplo demonstra uma abordagem diferente mas com o mesmo resultado no browser. Aqui pretendo demonstrar a maneira como se fazem ligaes com o smbolo &

CAPTULO 2: EXPRESSES E OPERADORES 29

Fig 2.1 - Resultado dos ficheiros cpt1-4-1.asp e cpt1-4-2.asp

Se quisermos usar variveis numricas, e calcular algo com elas, temos ento o exemplo seguinte:

(ficheiro cpt2-1-3.asp)

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

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

30 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES


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

2.2 IF, THEN, ELSE, END IF


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

(ficheiro cpt2-2-1.asp)

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

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

32 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES

2.3 FOR, WHILE, CASE


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

(ficheiro cpt2-3-1.asp)

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

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

CAPTULO 2: EXPRESSES E OPERADORES 33


(ficheiro cpt2-3-2.asp)

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

(ficheiro cpt2-3-3.asp)

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

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

34 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES

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

(ficheiro cpt2-3-4.asp)

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

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

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

CAPTULO 2: EXPRESSES E OPERADORES 35

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

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

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

36 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES

2.5 Operadores
Apesar de j terem sido praticamente todos usados neste captulo, vou ento deixar uma pequena tabela dos operadores, para referncia. Os operadores de comparao e igualdade so os seguintes: TIPO DE OPERADOR = DESCRIO Igualar a if a = b c=d Menor do que if a < b while c < x Maior do que if a > b while c > x Menor ou igual do que if a <= b while c <= x Maior ou igual do que if a >= b while c >= x Diferente de if a <> b while c <> x

<

>

<=

>=

<>

Estes so os operadores principais das ASP, e ser com estes que iremos trabalhar ao longo deste manual. Estes operadores no sero usados nica e exclusivamente no cdigo de ASP, mas tambm aquando do uso de declaraes de SQL.

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

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

Nos operadores aritmticos temos ento uma outra tabela: TIPO DE OPERADOR ^ DESCRIO Usado para expoente, (Para o caso de 26, temos nas ASP , (2^6)) Multiplicador, (2*5) Diviso para retornar valor singular (a / b) Diviso inteira (a \ b) Soma (a+b) Este valor tambm funciona para concatenao tal como o smbolo & Diferena (ab) Resto da diviso ( a MOD b )

MOD

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

38 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES


(ficheiro cpt2-5-2.asp)

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

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

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

Funes

3
40 48 50 52 53

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

56 57 58

40 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES

3.1 Tabela de Funes base das ASP


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

TABELA DE FUNES DAS ASP Funo Abs() Descrio Esta funo serve para devolver nmeros absolutos, sejam eles de que tipo forem. Ex. variavel = Abs(23.34) devolve 23.34 variavel = Abs(-23.34) devolve 23.34 Os arrays servem para definirmos listas de valores dentro de uma mesma varivel. So muito usados para simplificar actos muito comuns em programao, a todos os nveis. Um array constitudo por vrios valores que esto separados por uma posio. O array variavel(Joo, 3, 1200, Sol), tem 4 posies. As posies de um array comeam sempre do 0. Para acedermos aos dados que esta tem, basta indicarmos a posio que nos interessa. Ex. variavel(Joo, 3, 1200, Sol) Response.write variavel(0) devolve Joo Response.write variavel(1) devolve 3 Response.write variavel(3) devolve Sol

Array()

CAPTULO 3: FUNES 41 Asc() Devolve o nmero ASCII de um caracter Ex. variavel1 = Asc(C) devolve 67 variavel2 = Asc(1) devolve 49 Serve para calcular o arco-tangente de um valor Ex. Atn(1) devolve 0,785398163397448 Retorna True ou False: False se a expresso for falsa, caso contrrio True Ex. Cbool(32=32) devolve True Cbool(10=32) devolve False Transforma qualquer valor (do tipo no Byte) para o tipo Byte Ex. CByte(225.1278) devolve 225 Idntico a CByte(), mas neste caso para o tipo de moeda usado. Converte uma expresso que tende para uma Data, numa Data validada, no sendo necessrio usar IsDate() Ex. variavel1 = Cdate(Dezembro 1, 1990) a varivel1 fica com uma data vlida Converte um valor (do tipo no Double) para o tipo Double Ao contrrio da funo Asc(), esta converte os valores ASCII para o caracter correspondente Ex. Chr(67) devolve C Chr(49) devolve 1 Converte um valor (do tipo no Intenger) para o tipo Integer Converte um valor (do tipo no Long) para o tipo Long

Atn()

CBool()

CByte()

CCur()

CDate()

CDbl()

Chr()

CInt()

CLng()

Cos()

Devolve o coseno de um ngulo

42 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES


CreateObject() Cria uma referncia a um objecto externo Ex. Set Objecto=Server.CreateObject(Projecto.Objecto) Csng() Converte um valor (do tipo no Single) para o tipo Single Converte um valor (do tipo no String) para o tipo String Ex. CStr(123) devolve uma string 123 Devolve a Data corrente no servidor Internet Ex. response.write Date() Esta funo serve para o programador obter uma data posterior ou anterior quela que pretende usar para clculo. Podemos querer saber qual o dia referente a 20 dias depois da data pretendida, ou 1 ms, ou 2 anos. A expresso usa 3 campos, o primeiro para introduzirmos o campo de data por onde queremos calcular a diferena, o segundo campo para o valor numrico dessa diferena, e no final a data de incio. O campo do caracter que define o tipo de diferena aceita as seguintes opes: h horas n minutos s segundos yyyy anos q quarto anual m meses do ano y dias do ano d dias w dias da semana ww semanas do ano Ex. DateAdd(m, 1, 31-Jan-2000) devolve 29-Fev-2000 DateAdd(d, 1, 31-Jan-2000) devolve 1-Fev-2000 Devolve a diferena entre duas datas escolhendo um dos campos de comparao explicados em DateAdd() Ex. DateDiff(d, Now, 31-Jan-1999) devolve a diferena entre a data de hoje e o dia 31 de Janeiro de 1999

CStr()

Date()

DateAdd()

DateDiff()

CAPTULO 3: FUNES 43 DatePart() dada uma certa data e obtemos em que altura do ano acontece usando os valores de campo de DateAdd() Ex. DatePart(q, 31-Set-2000) devolve o quarto do ano em que a data se aplica Devolve uma data para especificados ano, ms e dia Devolve uma data vlida daquela que pedida Devolve o dia do ms de uma data Ex. Day(31-Set-2000) devolve 31 Devolve a exponencial de um valor Pesquisa um array, para procura de um valor ou expresso Ex. variavel1(Internet,Sites,Hosting,Portugal) Filter(variavel1,Si) devolve Sites

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() Devolve a referncia a um objecto Transforma um valor para resultado hexadecimal Devolve a hora de uma expresso Ex. Hour(Now()) devolve a hora do momento Devolve a posio de uma string dentro de outra a contar do incio Ex. InStr(1,Hoje um bom dia para se programar, ra) devolve 21

InStr()

44 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES


InStrRev() Devolve a posio de uma string dentro de outra a contar do fim Ex. InStr(1,Hoje um bom dia para se programar, ma,35,0) devolve 33 Devolve True ou False em relao a uma varivel, validando-a no caso de ser ou no um array Devolve True ou False em relao a uma string, validando-a no caso de esta ser do tipo Date ou no Valida uma varivel, para ver se a mesma est ou no vazia Valida uma varivel para ver se a mesma Null ou no Valida uma string/valor para ver se o mesmo numrico ou no Valida um Objecto, certificando-se se o mesmo o ou no Junta todas as variveis dentro de um array, criando uma s. Ex. variavel(0) = Hoje variavel(0) = est variavel(0) = bom variavel(0) = tempo. variavel2 = Join(variavel) a variavel2 ficar igual a Hoje est bom tempo. Devolve o menor valor da dimenso de um array Devolve uma string em lower case Ex. LCase(Estamos em Setembro.) devolve estamos em setembro. Devolve um certo nmero de caracteres a contar do lado esquerdo da string Ex. Left(Vamos programar ASP.,3) devolve Vam Devolve o tamanho de uma string Ex. Len(Vamos programar ASP.) devolve 20

IsArray()

IsDate()

IsEmpty()

IsNull()

IsNumeric()

IsObject()

Join()

LBound() LCase()

Left()

Len()

CAPTULO 3: FUNES 45 Log() LTrim() Devolve o logaritmo de um dado nmero Devolve uma string sem espaos do lado esquerdo Ex. LTrim( Isto um teste.) devolve Isto um teste. Serve para termos um nmero dado de caracteres de uma string, a partir de uma dada posio Ex. Mid(Vamos programar ASP., 7, 9 ) devolve programar Devolve o minuto de uma data/hora Devolve o valor correspondente ao ms de uma dada data Ex. Month(date()) devolve o valor do ms em que estiver a testar o cdigo Devolve o nome do ms (por extenso) Ex. MonthDate(10) devolve Outubro Devolve a data e hora corrente Devolve o valor octal de um dado nmero Altera certo caracter/string por outro dado Ex. replace(yyXiiXppX22fXjX , X , P ) devolve yyPiiPppP22fPjP Devolve um valor representativo de uma cor. A expresso estruturada por RGB(vermelho, verde, azul) Os valores usados vo de 0 a 255 Ex. RGB(22,233,143) devolve 9431318 Funciona como a funo Left() mas a contar da direita Retorna um valor aleatrio Faz arredondamento a valores numricos Ex. Round(23,77) devolve 24

Mid()

Minute() Month()

MonthDate()

Now() Oct() Replace()

RGB()

Right()

Rnd() Round()

46 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES


Second() Sgn() Devolve os segundos de uma dada hora Devolve o sinal de um valor Ex. Sgn(2) devolve 1 Sgn(-12) devolve 1 Sgn(0) devolve 0 Devolve o seno de um ngulo indicado Introduz um dado nmero de espaos numa string Ex. response.write Teste & Space(12) & Feito devolve Teste Feito Divide uma string num array, escolhendo o critrio de separao Ex. resultado = Split(IstoKKmaisKumKteste., K, -1, 1) devolve ; resultado(0) = Isto resultado(1) = resultado(2) = mais resultado(3) = um resultado(4) = teste. Devolve a raiz quadrada de um valor Compara duas strings, devolvendo um valor, no que respeita se so iguais ou no. A estrutura desta funo StrComp(var1,var2,tipo) Var1 e var2 so duas strings escolha, o tipo pode ser definido por 0 (comparao entre binrios) ou 1 (comparao entre textos) Ex. var1 = Teste var2 = TesTE StrComp( var1, var2) devolve 1 StrComp( var1, var2, 0) devolve 1 StrComp( var1, var2, 1) devolve 0

Sin() Space()

Split()

Sqr() StrComp()

StrReverse() Devolve uma string dada, invertendo-a Ex. StrReverse(123456) devolve 654321 String() Devolve repetidamente um caracter escolhido um nmero de vezes definido Ex. String(C,10) devolve CCCCCCCCCC Devolve a tangente de um determinado nmero

Tan()

CAPTULO 3: FUNES 47 Time() TimeSerial() Devolve a hora do sistema Devolve uma hora para hora, minuto e segundos especificados Devolve uma hora vlida daquela que pedida Devolve o tipo de varivel que estamos a usar Ex. TypeName(ASP) devolve String TypeName(12.40) devolve Double. TypeName(NullVar) devolve Null TypeName(ArrayVar) devolve Variant(). TypeName(6) devolve Integer Devolve o maior valor da dimenso de um array Devolve uma string em upper case Ex. LCase(Estamos em Setembro.) devolve ESTAMOS EM SETEMBRO. Parecido com TypeName(), mas devolve um valor correspondente aos dados da varivel a validar. Os nmeros possveis de resposta so: 0 Vazio 1 Null 2 Integer 3 Long 4 Single 5 Double 6 Currency 7 Date 8 String 9 Object 10 Error 11 Boolean 12 Variant 13 Data Access Object (DAO) 17 Byte 8192 Array Devolve o dia da semana de uma dada data Ex. WeekDay (Outubro 10, 1999) devolve 1 que representa Domingo

TimeValue() TypeName()

UBound() Ucase()

VarType()

WeekDay()

WeekDayName() Devolve por extenso o dia da semana de uma dada data Ex. WeekDayName (1) ou WeekDayName(WeekDay (Outubro 10, 1999)) devolvem ambas as expresses domingo Year() Devolve o ano de uma dada data

48 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES


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

3.2 As nossas Funes


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

(ficheiro cpt3-2-1.asp)

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

CAPTULO 3: FUNES 49 Foram usadas as seguintes funes: IsDate() DateDiff() para nos certificarmos se a dada data tinha realmente um formato vlido de data; que retorna o nmero de dias at ao ano 2001 (o nmero de dias pois isso que foi estabelecido, aquando do campo d); d-nos a data corrente, que inclui as horas.

Now()

Como se viu, as funes tm uma estrutura prpria: Function nome_da_funcao(variavel1, variavel2, variaveln) . Nome_da_funcao = resposta End Function

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

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

50 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES


(ficheiro cpt3-2-2.asp)

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

CAPTULO 3: FUNES 51

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

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

52 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES


(ficheiro cpt3-2-3.asp)

<%@ Language=VBScript %> <% Function criacaixa() %><select size=1" name=nome><% For I=0 to UBound(ardados) %> <option><%=ardados(I)%></option> <% Next %></select><% End Function Dim ardados(3) inicializao de array Ardados(0) Ardados(1) Ardados(2) Ardados(3) = Alentejo = Minho = Algarve = Beira-Litoral

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

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

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

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

54 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES


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

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

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

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


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

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

(ficheiro cpt3-3-1.inc)

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

Foram usadas as seguintes funes: FormatDateTime() Now() formata a data escolhida, neste caso com um Formato de tipo 2; usada para que seja formatada a data corrente.

56 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES


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

(ficheiro cpt3-3-1.asp)

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

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

Para perceber melhor a grande vantagem das SSI vamos criar um ficheiro ASP com todas as funes que foram criadas neste captulo, e us-las todas na mesma pgina, sem termos de ter todo o cdigo das funes na ASP que programamos.

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

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

58 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES


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

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

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

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

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

Objectos

4
62 65 72 73 81 88

4.1 Tabela de Objectos 4.2 Variveis globais e de sesso 4.3 Interagir com o utilizador 4.3.1 Exemplo: Responder ao utilizador com os dados recolhidos 4.3.2 Exemplo: Validar formulrio 4.3.3 Exemplo: Curso online 4.3.4 Exemplo: Proteco de pginas com password

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

108

62 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES

4.1 Tabela de Objectos


Os objectos que as ASP tm por defeito parecem ser poucos, mas os seus mtodos so os suficientes para que o leitor consiga alcanar os objectivos pretendidos para o seu site. A maneira de usar os objectos bastante simples, e intuitiva, funcionando como os objectos das outras linguagens. TABELA DE OBJECTOS DAS ASP Objectos Response Mtodos e suas funes Redirect usado para redireccionarmos o utilizador para outra pgina. Usado normalmente para controlo de utilizadores e acessos. Cookies mecanismo para deixar informaes do lado do cliente com variada informao (dentro das cookies existem outros mtodos para o seu controlo, como veremos depois em pormenor). Write esta a maneira para enviar informao para o browser. CacheControl desta maneira controlamos se a pgina pode deixar que se faa cache da mesma nos browsers (por defeito no deixa fazer cache). Charset uma maneira de definirmos o tipo de caracteres a usar. ContentType para definir o tipo de informao que vai ser passada, usado normalmente para UpLoad onde definimos que queremos passar no s informao usual, mas tambm binria, originria de ficheiros.

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

Request

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

64 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES


Server HTMLEncode o mtodo que formata a informao que o utilizador insere. Esta formatao muito importante devido a alguns smbolos serem reconhecidos pelo HTML, e por esse motivo o layout pode no ter o aspecto planeado URLEncode parecido com o HTMLEncode, mas formata a string de maneira a ser vlida para usar na linha de address dos browsers. CreateObject esta a maneira como iremos aceder a objectos exteriores, assim como componentes criados por ns ou outros. Os componentes de ASP so ficheiros de extenso DLL, especiais para os ASPs, possveis com o VB ou o VC++ (Visual C++). MapPath com este mtodo que trabalharemos os nossos ficheiros localmente (no servidor). Session Timeout as sesses do servidor tm um limite, ao fim do qual toda a informao contida nas sessions desaparecem. Desta maneira poderemos controlar o tempo que as sesses esto activas. SessionID este o mtodo que nos d o numero da sesso do cliente corrente. So uma espcie de impresso digital das sesses. Abandon fora a finalizao das sesses. Application A varivel global, mas idntica para todos os utilizadores, ao contrrio das sessions que so variveis do tipo global, mas s para o cliente que est nessa sesso. CreateTextFile mtodo de criao de ficheiros de texto. OpentextFile mtodo de leitura dos ficheiros de texto.

TextStream

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

4.2 Variveis globais e de sesso


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

66 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES


(ficheiro cpt4-2-1.asp)

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

Foram usadas os seguintes objectos: Response.Write Session.SessionID Session.Timeout objecto usado para escrita, tanto em cookies, browser, headers, etc. a maneira de saber qual o cdigo da sesso no momento. devolve o tempo de expirao das sesses, definido no momento.

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

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

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

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

Foram usadas os seguintes objectos: Session(Teste) Session.TimeOut a maneira de saber qual o cdigo da sesso no momento; neste ficheiro usmos este objecto com este mtodo, de maneira a alterarmos o tempo limite de uma sesso.

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

68 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES


(ficheiro cpt4-2-3.asp)

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

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

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

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

Fig. 4.4 - Funcionamento das variveis globais

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

70 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES


(ficheiro cpt4-2-4.asp)

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

Foram usados os seguintes objectos: Application.Lock serve para trancar a varivel aos utilizadores, de maneira a poder ser alterada a varivel; Application(Teste2) da mesma maneira que se usa as Sessions, pode-se criar uma varivel e aceder mesma; Application.UnLock usado para depois que alterada a varivel, tirando o Lock.

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

CAPTULO 4: OBJECTOS 71

4.3 Interagir com o utilizador


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

(ficheiro cpt4-3-1.html)

<form action=cpt4-3-1.asp method=POST> Nome: <input type=text name=nome size=20"><br> Idade: <input type=text name=idade size=2" Maxlength=2"><br> Telefone: <input type=text name=telefone size=12" Maxlength=14"><br> <input type=submit value=Enviar> </form>

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

72 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES


(ficheiro cpt4-3-1.asp)

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

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

Nesta primeira imagem vemos o formulrio em que o utilizador vai introduzir os seus dados, e temos a imagem que mostra os dados que o mesmo disponibilizou.

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

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

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

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

74 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES

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

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

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

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

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

76 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES

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

CAPTULO 4: OBJECTOS 77

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

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

78 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES


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

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

80 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES

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

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

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

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

(ficheiro cpt4-3-3.asp)

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

82 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES


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

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

84 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES


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

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

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

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

86 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES


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

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

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

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

Fig. 4.14

88 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES


(ficheiro cpt4-3-4.asp)

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

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

90 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES


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

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

92 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES


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

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

94 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES


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

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

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

96 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES


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

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

4.4 Ficheiro Global.asa


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

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

98 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES


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

Fig. 4.15 - Como deve estar configurado o nosso directrio virtual, onde queremos ter o site

Fig. 4.16 - Directrio onde o ficheiro global.asa tem de ficar em funo do site virtual da imagem anterior

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

<SCRIPT LANGUAGE=VBScript RUNAT=Server> Sub Application_OnStart Session.Timeout = 3 Application.Lock Application(utilizadores) = 0 Application.UnLock End Sub Sub Session_OnStart Application.Lock Application(utilizadores) = Application(utilizadores) + 1 Application.UnLock End Sub Sub Session_OnEnd Application.Lock Application(utilizadores) = Application(utilizadores) - 1 Application.UnLock End Sub Sub Application_OnEnd End Sub </SCRIPT> Foram usados os seguintes objectos e funes: Session.Timeout () onde se define o tempo que vai durar cada sesso. Se o utilizador ficar inactivo durante um certo perodo de tempo (em minutos), a funo Session.OnEnd() activa-se e processa uma sada do site. Aqui va mos definir esse tempo em minutos;

100 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES


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

Application.Lock ()

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

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

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

(ficheiro cpt4-3-7.html)

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

102 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES


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

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

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

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

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

104 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES

Fig. 4.18 - Imagem geral do chat

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

4.5 Cookies, dados do Utilizador e do servidor


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

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

<TABLE border=1" bordercolor=black cellspacing=0"> <TR><TD><B>Variveis</B></TD> <TD><B>Conteudo</B></TD></TR> <%For Each nome In Request.ServerVariables%> <TR><TD><%=nome%></TD> <TD><%=Request.ServerVariables(nome)%> </TD></TR> <%Next %> </TABLE> Foram usados os seguintes objectos e funes: For Each / Next () Usamos esta expresso para percorrermos todos os eventos possveis com o objecto ServerVariables; devolve o contedo da informao que pretendemos tanto do servidor como do cliente. Podemos pedir uma informao por Request.ServerVariables(HTTP_COOKIE) ou Request.ServerVariables(13).

Request.ServerVariables ()

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

106 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES


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

(ficheiro cpt4-3-9.asp)

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

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

CAPTULO 4: OBJECTOS 107


(ficheiro cpt4-3-10.asp)

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

108 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES


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

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

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

4.6 Formatao de strings


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

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

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

110 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES


(ficheiro cpt4-3-11.asp)

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

CAPTULO 4: OBJECTOS 111 Server.HTMLEncode () Server.URLEncode () formatou-se assim todo o cdigo HTML; obteve-se uma string vlida de se usar num qualquer link de um qualquer browser.??????

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

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

Bases de dados

5
114 117 122

5.1 Bases de Dados / SQL 5.2 Construir uma base de dados em Microsoft Access 5.3 Conexo base de dados 5.4 Inserir, apagar e actualizar dados em bases de dados 5.4.1 Exemplo: Inserir dados 5.4.2 Exemplo: Eliminar dados 5.4.3 Exemplo: Actualizar dados 5.5 Apresentao de dados 5.5.1 Exemplo: Listar dados em tabela 5.5.2 Exemplo: Listar dados com imagens 5.5.3 Exemplo: Listar dados a pedido 5.6 Exemplos com bases de dados 5.6.1 Exemplo: Livro de Visitas 5.6.2 Exemplo: Sondagens de opinio

127 135 137

142 144 146

148 152

114 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES

5.1 Bases de dados


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

TABELA: CONTACTOS
ID Nome Telefone EMail

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

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

TABELA: CONTACTOS
ID as number Nome as varchar(50) Telefone as varchar(14) EMail as varchar(22) 1 2 3 4 Joo Carlos Rui Pedro 219886675 324444332 234343444 332442433 Joao@joao.pt Carlos@carlos.pt Rui@rui.pt Pedro@pedro.pt

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

116 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES


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

Neste caso apenas obtemos dados, e no alteramos os dados j existentes. Para isso necessrio outro tipo de expresses. Por exemplo, para inserir, INSERT INTO tabela (coluna1, coluna2, ) VALUES (dados1, dados2, )

Para apagar os dados de uma tabela basta, DELETE FROM tabela

Ou ento se apenas pretendermos eliminar um nico registo (linha), DELETE FROM tabela WHERE coluna1 = dados1

Podemos tambm actualizar dados, e nesse caso escreveramos, UPDATE FROM tabela SET coluna1 = novo_dado1 WHERE coluna2 = dado2

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

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

A nossa tabela passar ento a ter a seguinte estrutura:

TABELA: CONTACTOS
ID as number Nome as varchar(50) Telefone as varchar(14) EMail as varchar(22) 1 2 3 4 5 Joo Carlos Rui Pedro Ricardo 219886675 324444332 234343444 332442433 288889999 Joao@joao.pt Carlos@carlos.pt Rui@rui.pt Pedro@pedro.pt Ricardo@ricardo.pt

Podemos, para nos ajudar, contar com os seguintes operadores vlidos no SQL: OPERADOR = > < <= >= <> DESCRIO Para igualar Maior que Menor que Menor ou igual Maior ou igual Diferente

5.2 Construir uma base de dados em MSAccess


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

118 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES


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

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

Fig. 5.1 - Escolha da criao de um novo ficheiro para base de dados em MSAccess

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

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

A zona de trabalho do MSAccess aparece, e deparamo-nos com uma pequena consola vazia, onde a opo mais visvel ser NEW (dentro da zona de Tables, como ilustra a seguinte figura).

Fig.5.3 - Aspecto da consola de manuteno e criao da base de dados

120 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES


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

Fig. 5.4 - Escolha de esquema para a criao da tabela CONTACTOS

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

Fig. 5.5 - Esquema da tabela CONTACTOS no MSAccess

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

Fig. 5.6 - Escolha do nome a dar tabela CONTACTOS

Depois fica ento acessvel na consola do MSAccess a tabela que foi ento criada. Ficamos assim com uma base de dados j algo estruturada.

Fig. 5.7 - Tabela CONTACTOS acessvel no MSAccess depois de criada

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

122 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES


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

5.3 Conexo base de dados


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

Fig. 5.8 - Atalho para a zona onde se encontra o controlo de ODBC

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

CAPTULO 5: BASES DE DADOS 123

Fig. 5.9 - Escolha do cone que simboliza a entrada para a zona de controlo ODBC

Escolha nos Tabs superiores a opo System DSN, podendo ver as ligaes que j esto criadas. O mais normal o leitor no ter nenhuma, mas isso no problema pois o que interessa que aquela que deseja criar fique l disponvel.

Fig. 5.10 - Zona onde se vai criar o identificador da conexo ODBC para o uso da BD em ASP

124 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES


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

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

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

Fig. 5.12 - Zona de criao da conexo BD

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

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

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

126 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES


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

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

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

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

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

5.4 Inserir, apagar e actualizar dados em base de dados


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

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

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

128 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES


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

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

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

Fig. 5.14 - Aspecto do formulrio do ficheiro cpt5-4-2.asp, com um campo em que se tentam introduzir dados invlidos

130 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES

Fig. 5.15 - Erro de validao do campo idade do ficheiro cpt5-4-2.asp

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

Fig. 5.16 - Mensagem de confirmao de introduo de dados do ficheiro cpt5-4-2.asp

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

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

132 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES


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

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

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

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

134 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES


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

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

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

Fig. 5.18 - Aspecto da resposta do ficheiro cpt5-4-3.asp, depois do comando apagar

136 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES


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

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

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

138 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES


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

Toda a estrutura fica ento completa, da seguinte maneira:


(ficheiro cpt5-4-4.asp)

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

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

140 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES


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

CAPTULO 5: BASES DE DADOS 141 select case request.querystring(fazer) case alterar alterar case executar validar_dados case else formulario_principal end select%>

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

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

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

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

142 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES

5.5 Apresentao de dados


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

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

CAPTULO 5: BASES DE DADOS 143 Foram usados os seguintes objectos e funes: Rs.Fields() a maneira com que podemos aceder aos dados dentro dos campos que pretendemos; Rs.Movenext () usamos este mtodo para podermos movimentar o cursor que anda pela base de dados. O resultado aquele que se pode ver na imagem seguinte - uma estrutura apresentvel, que pode servir de Report para muitos tipos de dados. Repare no truque da mudana de cor por linha, para facilitar a pesquisa dos dados.

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

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

144 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES


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

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

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

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

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

146 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES


(ficheiro cpt5-5-3.asp)

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

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

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

Fig. 5.22 - Aspecto da resposta do ficheiro cpt5-5-3.asp, depois da procura de todas as ocorrncias com jo

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

148 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES

5.6 Exemplos com bases de dados


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

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

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

150 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES


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

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

CAPTULO 5: BASES DE DADOS 151

Fig. 5.23 - Aspecto da resposta do ficheiro cpt5-6-1.asp - O Livro de Visitas

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

152 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES


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

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

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

Fig. 5.24 - Aspecto da resposta do ficheiro cpt5-6-2.asp - a Sondagem

154 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES


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

Componentes

6
156 159 163

6.1 Introduo aos Componentes 6.2 Tratamento de ficheiros de texto com o TextStream 6.2.1 Exemplo: Histria sem fim 6.2.2 Exemplo: Contador de acessos 6.3 Componentes de e-mail 6.3.1 Exemplo: Envio de e-mail com attachment 6.4 Criar componentes em Visual Basic 6 6.4.1 Exemplo: Componente Livro de Visitas

164

173

156 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES

6.1 Introduo aos Componentes


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

CAPTULO 6: COMPONENTES 157

6.2 Tratamento de ficheiros de texto com o TextStream


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

TABELA DE MTODOS DO TEXTSTREAM Mtodo Read ReadLine ReadAll Write Tipo Input Input Input Descrio Este mtodo vai ler os caracteres um a um. Como o nome indica, desta forma l-se uma linha inteira. L-se toda a informao que est no ficheiro.

Output Escreve toda a informao que quisermos introduzir, no mudando de linha, sendo a informao seguinte escrita logo a seguir a esta. Output Escreve a informao enviada, mudando de seguida de linha.

WriteLine

WriteBlankLines Output Introduz uma linha vazia.

Skip SkipLine

Input Input

Salta um nmero especfico de caracteres. Muda de linha.

158 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES


TABELA DE PROPRIEDADES DO TEXTSTREAM Propriedade AtEndOfLine Line Column Descrio Maneira de o leitor saber se chegou ao fim da linha. Devolve o nmero da linha onde vamos. Devolve o nmero de caracteres que foram percorridos desde o incio da linha.

AtEndOfStream Desta maneira o leitor vai saber se j chegou ao fim do ficheiro.

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

Para escrevermos num ficheiro vamos usar a estrutura, Set ObjectoFicheiro = CreateObject(Scripting.fileSystemObject) Set EscreveTexto = ObjectoFicheiro.CreateTextFile (Server.MapPath(ficheiro.txt),True)

Para lermos a informao l escrita usada a estrutura, Set ObjectoFicheiro = CreateObject(Scripting.fileSystemObject) Set LerTexto = ObjectoFicheiro.OpenTextFile (Server.MapPath(ficheiro.txt),1)

CAPTULO 6: COMPONENTES 159 Desta maneira podemos ento criar linhas de texto e l-las logo a seguir.

(ficheiro cpt6-2-1.asp)

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

Foram usados os seguintes objectos/mtodos: CreateObject(Scripting.FileSystemObject) conexo ao componente. Desta forma ficamos com um objecto criado com a imagem do mesmo; CreateTextFile () forma com que se define a criao de um ficheiro de texto; EscreveTexto.WriteLine () Escrita de uma linha de texto, com mudana de linha; EscreveTexto.Close Fechar o objecto de escrita de texto; OpenTextFile () Abrir o ficheiro de texto para leitura;

LerTexto.Readline () Ler uma linha do ficheiro de texto; LerTexto = nothing Limpar o objecto de leitura de texto.

Podemos ento visualizar o resultado obtido pelo nosso exemplo, em que na mesma ASP criamos um ficheiro de texto, com uma linha, e logo a seguir vamos buscar essa mesma linha e escrev-la no browser.

160 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES

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

E desta maneira vamos ento criar a ASP da histria que nunca acaba. A estrutura um pouco bsica, mas que necessita de explicao prvia. Passamos ento sua estruturao: 1. 2. 3. 4. Formulrio para input do utilizador; Procedimento de escrita de nova linha para a histria; Procedimento de leitura de texto; Procedimento para saber se j existe ficheiro.

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

CAPTULO 6: COMPONENTES 161

(ficheiro cpt6-2-2.asp)

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

162 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES


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

Fig. 6.2 - Resultado do ficheiro cpt6-2-2.asp - a histria que nunca acaba

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

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

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

164 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES


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

6.3 Componentes de e-mail


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

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

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

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

166 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES


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

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

CAPTULO 6: COMPONENTES 167

6.4 Criar componentes em Visual Basic 6


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

Fig.6.4

- Escolha do tipo de projecto

168 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES


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

Fig. 6.5 - Abrir Propriedades do projecto

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

Fig. 6.6 - Consola de propriedades do projecto

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

Fig. 6.7 - Alterar o nome da nossa classe para livrovisitas

Mas necessria haver uma interaco entre ASPs e a DLL que vamos criar, pois as mesmas s interagem com DLLs especficas. Temos ento de ir buscar uma referncia para o VB saber que est a compilar para o propsito que temos em vista.

Fig. 6.8 - Entrar na consola de referncias

170 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES


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

Fig. 6.9 - Referncias necessrias para este projecto

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

CAPTULO 6: COMPONENTES 171

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

Os procedimentos que vamos usar so os seguintes: Public Sub CorLetras(cor As String) Vai ser usado para introduzir a cor das letras numa varivel de sesso, varivel essa que ser posteriormente usada;

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

172 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES


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

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

msession(Ficheiro) = ficheiro.asp

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

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

174 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES


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

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

176 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES


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

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

(ficheiro cpt6-4-1.asp)

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

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

Depois o uso bsico e de fcil compreenso.

CAPTULO 6: COMPONENTES 177

Fig. 6.10 - Aspecto do livro de visitas depois de correr o cdigo no VB e aberta a pgina ASP

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

Fig. 6.11 - Fazer a compilao do projecto

178 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES


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

Fig. 6.12 - Escolher o nome do ficheiro

3. O directrio do componente fica ento,

Fig. 6.13 - Directrio onde est o componente criado

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

Fig. 6.14 - Directrio onde foi colocado o componente para entrar em produo

Depois de introduzido o componente no directrio escolhido para produo, vamos, dentro desse mesmo directrio, correr a seguinte linha de comando em, Start > Run D:\InetPub\WWWRoot\Componentes\regsvr32 LivroASP.DLL

Fig. 6.15 - Instalar o componente

180 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES


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

Fig. 6.16 - Resposta de instalao com sucesso do componente

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

Exemplos reais

7
182 183 197

7.1 Introduo 7.2 A R: Motor de Busca 7.3 A Loja: Loja E-Commerce

182 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES

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

Fig. 7.1 - Esquema dos exemplos deste captulo


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

CAPTULO 7: EXEMPLOS REAIS 183

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

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

7.2 A R Motor de Busca


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

184 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES


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

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

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

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

Fig. 7.3 - Esquema de ficheiros do motor de busca

186 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES


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

Imagens,

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

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

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

(ficheiro default.asp)

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

188 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES


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

Fig. 7.4 - Aspecto geral da pgina principal


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

CAPTULO 7: EXEMPLOS REAIS 189


(ficheiro funcoes.asp)

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

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

Figura. 7.5 - Imagem do topo do site

190 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES


(ficheiro fundo.inc)

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

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

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

(ficheiro procura.inc)

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

Fig. 7.6 - Tabela de procura

192 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES


(ficheiro listagem.inc)

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

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

Fig. 7.7 - Resultado da procura feita por Internet nos sites existentes em BD

(ficheiro registar.inc)

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

194 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES


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

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

196 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES

Fig. 7.8 - Formulrio de registo de site

No caso de um dos campos que vem do formulrio no ter a informao correcta, alm de no ser introduzido, so mostradas mensagens de erro tal como se v na figura seguinte pois o url no vlido.

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

Depois de uma correcta introdu o de dados obtemos uma mensagem de aprovao.

Fig. 7.10 - Resposta depois do registo efectuado


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

CAPTULO 7: EXEMPLOS REAIS 197

7.3 A Loja: Loja E-Commerce


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

TABELA: PRODUTOS Id_produtos Titulo Autor N_Paginas Isbn Preco Mes_edicao Ano_edicao introducao Auto-number; identificador interno da BD de cada produto Text (80); ttulo do livro Text (60); nome do autor (es) do livro Number; nmero de pginas do livro Text (25); numero de fbrica do livro, algo como os cdigos de barras Number; o preo de venda ao pblico do livro Number; o ms em que o livro foi editado Number; o ano em que saiu o livro Memo; uma introduo ao livro

198 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES


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

O valor do total da compra usado nesta tabela para que fique registado o preo a pagar e no ser precisa uma pesquisa aos produtos por cada vez que se queira saber o total final.

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

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

CAPTULO 7: EXEMPLOS REAIS 199

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

Vamos ento indicar quais os aspectos principais deste site: 1 Aspecto da Pgina inicial; 2 Formulrio de procura de produtos; 3 Apresentao de resultados da procura; 4 Carrinho de compras - criao e actualizao; 5 Sada e pagamento; 6 Aspecto grfico.

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

200 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES

Fig. 7.12 - Esquema de ficheiros da loja

Vamos ento descrever qual a participao que cada ficheiro tem neste site: Imagens,

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

CAPTULO 7: EXEMPLOS REAIS 201

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

Ficheiros da pgina,

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

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

202 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES


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

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

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

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

204 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES


(ficheiro default.asp)

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

Fig. 7.13 - Aspecto da pgina inicial da Loja


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

CAPTULO 7: EXEMPLOS REAIS 205 A seguinte funo idntica do motor de busca. uma funo para que no obtenhamos erro nas declaraes de SQL

(ficheiro funcoes.asp)

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

(ficheiro topo.inc)

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

206 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES


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

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

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

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

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

No ficheiro seguinte iremos ento mostrar o ltimo produto disponvel pois se todos os dias aparecer algo de novo ser uma boa maneira de o promover.

(ficheiro inicial.inc)

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

208 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES


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

(ficheiro listagem.inc)

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

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

210 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES


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

Fig. 7.15 - Aspecto do site depois de uma procura por Internet em ttulos
Verso digital, individual, licenciada em Jan/Fev do ano 2000, pelo Centro Atlntico, da verso 1.0 do livro 'Programao Web com ASP'

CAPTULO 7: EXEMPLOS REAIS 211


(ficheiro carrinho.inc)

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

212 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES


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

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

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

214 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES


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

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

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

Fig. 7.16 - O carrinho de compras depois de algumas escolhas

216 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES

Fig. 7.17 - O carrinho de compras depois de ser feita uma actualizao nas quantidades

(ficheiro pagar.inc)

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

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

218 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES


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

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

220 CENTRO ATLNTICO - PROGRAMAO WEB COM ACTIVE SERVER PAGES


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

A imagem seguinte demonstra como somos abordados ao entrar na zona de pagamento.

Fig. 7.18 - Introduo de dados para finalizar compra


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

CAPTULO 7: EXEMPLOS REAIS 221

No caso do nmero do carto de crdito no estar vlido mostrado um erro (o mesmo acontece com a maioria dos dados a introduzir)

Fig. 7.19 - Verificao do nmero do carto de crdito

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

Fig. 7.20 - Confirmao de compra bem sucedida

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

Coleco O Melhor da Internet


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

Coleco Sociedade da Informao


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

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

Coleco Direito das Novas Tecnologias


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

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

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

Para encomendar qualquer ttulo do Centro Atlntico queira preencher esta folha de encomenda e envi-la por fax ou correio com o seu pagamento.

Ttulo
Coleco O Melhor da Internet

Quant. _____ _____ _____ _____ _____ * * * * *

Preo T otal Total

www.centroatlantico.pt/titulos

O Melhor da Internet para o Direito O Melhor da Internet para Informticos O Melhor da Internet para Engenheiros O Melhor da Internet para o Marketing O M.Internet p/ Gestores e Empresrios Coleco Sociedade da Informao Crnicas da InforFobia Homo Conexus * Ano 2000 e Informtica 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$

= = = = =

_______ _______ _______ _______ _______

_____ * 1.800$ = ______ _____ * 1.950$ = ______ _____ * 1.950$ = ______ _____ _____ _____ _____ _____ * * * * * 2.950$ 2.950$ 2.950$ 2.950$ 2.450$ = = = = = ______ ______ ______ ______ ______

Coleco Direito das Novas Tecnologias Direito da Informtica nos tribunais .pt _____ * 2.450$ = ______ Coleco Desafios Vertigem - Tendncias para o Sc. XXI _____ * 4.950$ = ______ O Futuro da Internet _____ * 2.950$ = ______ Coleco Solues O Vrus do ano 2000 O Guia do Telemvel: 99 sugestes * Inclui CD-ROM TOTAL = ________ Sem Despesas de envio
As encomendas directas ao Centro Atlntico no pagam custos de portes.

_____ * 1.600$ = ______ _____ * 1.250$ = ______

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

Você também pode gostar