Professional Documents
Culture Documents
Joo Vieira
Centro Atlntico
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
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
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
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
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
1
12 13 15 16 19 19 23
Language) em 12 passos
1.7 Sites com recursos de ASP
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.
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 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.
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 .
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'
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>
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.
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.
www.15seconds.com Este tambm daqueles que todos os que esto dentro do assunto conhecem. Tem muitos artigos, de vrios tipos, e um motor de busca que vai pesquisar vrios sites de ASP.
www.swynk.com Este site, no incio, era dos melhores, tinha muita informao e muito bem estruturada. Est vocacionado para tudo o que tiver a haver com Windows NT, e devido ao IIS4 tambm tem muito bons artigos de ASP. Tenho uma coluna minha l, onde poder recolher algumas ideias de ASP. Este site cresceu muito, e muito depressa, por isso julgo ser a causa dos atrasos na sua actualizao.
www.4guysfromrolla.com Indiscutivelmente um site a no perder. Foi tambm graas a este site que consegui alcanar os objectivos, nas empresas onde trabalhei com ASP. Tem muita informao, artigos e cdigo. Se por l passar vai notar que tenho l alguns artigos.
Verso digital, individual, licenciada em Fev/2000, pelo Centro Atlntico, da verso 1.0 do livro 'Programao Web com ASP'
www.asphole.com um grupo de sites, que se dedicam s ASP, tem tambm muitos recursos, apesar de estarem a ser ultrapassados por sites mais recentes como o Aspin.
www.aspin.com Este site bastante recente e j cheguei a visit-lo quase todos os dias. Est muito bem organizado e tem bastantes temas por onde pode pesquisar.
www.asptoday.com Este daqueles sites que quando comear a programar ASPs com alguma assiduidade ir com certeza visitar. Eles obrigam os seus autores a escreverem os artigos em exclusividade, sendo por isso daqueles sites onde os artigos l publicados no so lidos em mais lado nenhum.
Expresses e Operadores
2.1 Os primeiros passos 2.1.1 Exemplo: Ol Portugal 2.1.2 Exemplo: Ol Portugal com varivel 2.1.3 Exemplo: Clculo de variveis 2.1.4 Exemplo: Cdigo ASP embebido em HMTL
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
(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)
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 &
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>
(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).
(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.
<% resposta = 4 Select case resposta case 1 response.write No & resposta case 2 response.write No & resposta case 3 response.write Acertou & resposta case 4 response.write No & resposta case else response.writeDesconhecido. end select %> Neste case a comparao feita por hipteses em funo de uma resposta (varivel resposta), tendo-se ateno mesma, iremos fazer uma comparao com as hipteses possveis (1, 2, 3 e 4 so as nicas possveis) e executar a declarao correspondente (se acertou ou se no acertou).
(ficheiro cpt2-3-3.asp)
<CENTER><TABLE BORDER=1> <% contador = 1 while contador<6%> <TR> <TD BGCOLOR=RED> <FONT COLOR=WHITE><%=contador%></FONT></TD> <TD><%=(contador-1)%></TD> <TD><%=(contador+1)%></TD> <TD><%=(contador*100)%></TD> </TR> <% contador = contador + 1 wend %> </TABLE></CENTER>
Neste caso, fui usar novamente o WHILE, mas com o intuito do leitor perceber a potencialidade de trabalhar com tabelas - no final de contas aquilo que mais vai usar se o destino que pretende dar aos seus conhecimentos de ASP for a programao com bases de dados. Introduzindo o valor que se quer dentro de cada clula da tabela, o truque que origina, as grandes tabelas dos sites de comrcioelectrnico. Alm de texto, pode introduzir um novo esquema de tabelas e/ou imagens.
(ficheiro cpt2-3-4.asp)
<% contador = 1 while contador<8 %><FONT face=ARIAL size=<%=contador%>>TESTE</FONT><BR> <%contador=contador + 1 wend %>
Neste caso, foi-se alterar uma opo das Tags de HTML, para que no fosse preciso repetir a mesma 8 vezes. Este j um pensamento a seguir pelo programador de ASP - tentar evitar escrever muitas linhas de cdigo, e sim optimizar ao mximo todas as funes que vier a criar.
2.4 Variveis
Nas ASP, as variveis so tambm, como no Visual Basic, dinmicas, no sendo por isso necessria a sua inicializao. Seja como for, m programao usar variveis globais sem controlo sobre as mesmas. Deve-se usar, mas no em excesso, assim como se devem sempre inicializar as mesmas, no s para melhor controlo, mas tambm para melhor performance. Para que no se desleixe com as variveis, use o cdigo <% Option Explicit %> no incio de cada pgina para que tenha de inicializar sempre as variveis. Assim, as alocaes de memria, para as variveis dinmicas, sero feitas com uma melhor estrutura, ficando por esse motivo beneficiado o desempenho das suas pginas.
Para inicializar uma varivel em ASP basta usar Dim . Para criarmos a varivel xpto usamos ento <%Dim xpto%>
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).
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.
<% 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.
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
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()
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()
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()
RGB()
Right()
Rnd() Round()
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
(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
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.
<% 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
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().
<%@ 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.
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() %>
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.
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.
(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>
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 %>
<!#INCLUDE FILE=cpt3-3-2.asp> <!#INCLUDE FILE=cpt3-3-1.inc> <p> Iremos agora ver todos as funes do captulo a funcionar,<br> e no precisamos de as ter neste ficheiro.<br> Desta maneira temo-las em todos os ASP que quisermos sem termos de<br> escrever o cdigo todo de novo, ou de passar o tempo<br> no Copy & Paste...</p><br> <%Response.Write Hoje & now() & <br> Response.write Faltam & a2001(now()) & dias at ao ano 2001.<br><br> if valmail(o_meu_email@algum_email.com) then Response.Write O e-mail o_meu_email@algum_email.com vlido.<br> Else Response.Write O e-mail o_meu_email@algum_email.com no vlido.<br> End if if valmail(tentar@iludir) then Response.Write O e-mail tentar@iludir vlido.<br> Else Response.Write O e-mail tentar@iludir no vlido.<br> End if Dim ardados(3) inicializao de array Ardados(0) = Alentejo ardados(1) = Minho ardados(2) = Algarve ardados(3) = Beira-Litoral %>
CAPTULO 3: FUNES 59 <br><br><form id=form1 name=form1> Viajar Para? <%=criacaixa()%> </form><br> <% Dim ardados2(3,3) Ardados2(0,0) = Primeiro ardados2(0,1) = 100 ardados2(1,0) = Segundo ardados2(1,1) = 40 ardados2(2,0) = Terceiro ardados2(2,1) = 60 ardados2(3,0) = Quarto ardados2(3,1) = 18 criagrafico() %> O resultado na imagem seguinte bastante explcito daquilo que se pretendia. Temos todas as funes a funcionar, e podendo funcionar em todos os ficheiros ASP que o programador tiver para o seu site, com apenas a insero de uma linha de cdigo no topo de cada pgina ASP.
Agora o leitor poder estender toda a sua programao num s ficheiro, pelo menos as funes que acha virem a ser aquelas que mais vai utilizar.
Objectos
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
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.
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.
<% 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.
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.
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.
CAPTULO 4: OBJECTOS 69 As imagens so bem elucidativas em relao ao uso de uma sesso criada pelo programador. Da mesma maneira que criada uma sesso para suportar uma string, o leitor poder usar para criar um array ou nmero. As hipteses so imensas, e a programao a este nvel bastante facilitada com este objecto. Outro objecto que usado para tratar de variveis globais Application, que criado e acessvel tal como se faz com as sesses, com a particularidade que para o alterarmos tem-se de seguir certas regras. A grande diferena entre Application e Session que enquanto as variveis criadas pelo segundo so acedidas apenas pelo utilizador do momento, ou por aquele a quem pertence um SessionID, as variveis Application so acedidas por todos os utilizadores, todos os SessionID. Fica assim um esquema para o leitor perceber melhor como isto funciona.
Pelo esquema pode-se reparar que para cada utilizador existe uma sesso independente, enquanto a varivel de Application igual para todos. Vemos ento um exemplo de como criar e aceder a uma varivel de Application. Repare que existem dois mtodos Lock e UnLock para que a mesma possa ser alterada. Para aceder mesma no necessrio usar as regras ditas anteriormente, e visveis no exemplo seguinte:
<% Application.Lock Application(Teste2) = Uma varivel acessvel por todos os utilizadores... Application.UnLock Response.Write Avarivel Application(Teste2") > Response.Write Application(Teste2) & < %>
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.
CAPTULO 4: OBJECTOS 71
(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.
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.
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.
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.
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:
<%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
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)
CAPTULO 4: OBJECTOS 79 <%Sub resposta()%> <%session(erro) = %> <div align=center> <center> <table border=0" width=400" bgcolor=#CED299"> <tr><td width=100% align=left> <%idade = DateDiff(yyyy, data, Now) if (idade>10 and idade<28) then%> <p align=center><b><font color=#800000" face=Arial size=3"><br> O Aluno</font> <font face=Arial size=4" color=#FF0000"><%=nome%></font> <font color=#800000" face=Arial size=3"> , <br>com a mdia de </font> <font face=Arial size=4" color=#FF0000"><%=media%></font> <font color=#800000" face=Arial size=3">valores<br>nascido em </font> <font face=Arial size=4" color=#FF0000"><%=data%></font> <font color=#800000" face=Arial size=3"><br></font> <font face=Arial size=4" color=#FF0000"> <% if ((rendimento<=80000)AND(media>11)) then mensagem = tem else if ((rendimento>80000 AND rendimento<100000) AND (media>13)) then mensagem = tem else if ((rendimento>=100000 AND rendimento<160000) AND (media>16)) then mensagem = tem else if (media>18) then mensagem = tem else mensagem = no tem end if end if end if end if Response.Write mensagem%> </font> <font color=#800000" face=Arial size=3">direito<br> bolsa de estudo.<br></font></b></p><br> <% else%> <br><center><strong><font face=ARIAL color=red size=3'> No possivel concorrer bolsa de estudo<br> com <%=idade%> anos.</font></strong></center><br> <%end if%> </td></tr></table> <br><br><a href=cpt4-3-3.asp>repetir a simulao</a> </center> </div> <%End Sub%>
Na imagem anterior, obteve-se uma resposta do formulrio em relao mdia que o utilizador introduziu, que no sendo vlida, pede para que seja corrigida. Este tipo de correco feito tambm para outras variveis, e o procedimento em si o mesmo, mas com mensagens de erro diferentes, correspondendo a cada uma das situaes de validao.
CAPTULO 4: OBJECTOS 81 Como podemos ver na imagem anterior, a resposta que se obteve foi negativa, depois de se terem efectuadas as comparaes com os requisitos definidos para a atribuio de bolsa ao estudante. Teve-se o cuidado de se criar uma tabela com um texto de resposta por defeito, que s altera as zonas que so correspondentes aos dados que o utilizador introduziu. Neste caso usado o DateDiff (), para que os alunos com uma idade no vlida para as bolsas sejam avisados disso. No caso contrrio enviada a resposta em relao ao apoio por Bolsa de Estudo. Introduziu-se um link para o caso do utilizador querer recomear a simulao. Ser aqui que tudo recomear, tendo em conta que a varivel de sesso tem de estar vazia, ou o ltimo erro continuaria a aparecer apesar de ser uma nova simulao. Por isso esta funo comea com a sesso de erro a ser limpa, pois para se ter chegado a este ponto era porque as variveis estavam correctas. Depois desta explicao, podemos ver o cdigo por completo, para percebermos melhor o seu funcionamento.
(ficheiro cpt4-3-3.asp)
<%Sub resposta()%> <%session(erro) = %> <div align=center> <center> <table border=0" width=400" bgcolor=#CED299"> <tr><td width=100% align=left> <%idade = DateDiff(yyyy, data, Now) if (idade>10 and idade<28) then%> <p align=center><b><font color=#800000" face=Arial size=3"><br> O Aluno</font> <font face=Arial size=4" color=#FF0000"><%=nome%></font> <font color=#800000" face=Arial size=3"> , <br>com a mdia de </font> <font face=Arial size=4" color=#FF0000"><%=media%></font> <font color=#800000" face=Arial size=3">valores<br>nascido em </font> <font face=Arial size=4" color=#FF0000"><%=data%></font> <font color=#800000" face=Arial size=3"><br></font> <font face=Arial size=4" color=#FF0000"> <% if ((rendimento<=80000)AND(media>11)) then mensagem = tem else if ((rendimento>80000 AND
CAPTULO 4: OBJECTOS 83 if session(erro)<> then formulario else resposta end if %> <%End Sub%> <%Sub formulario()%> <p align=center><i><b><font size=4" color=#800000">Simulador de Bolsas de Estudo</font></b></i> <br> <div align=center> <center> <FORM name=bolsa method=POST> <table border=0" width=400" bgcolor=#CED299"><tr> <td width=100% align=left> <strong><font size=2" face=ARIAL color=RED><%=session(erro)%> </font></strong> <font face=Arial><b>Nome: </b></font> <input type=text name=nome size=44" value=<%=Request.Form(nome)%> maxlength=50"> <font face=Arial><b><br>Data de Nascimento:</b></font> <input type=text name=dia size=2" value=<%=Request.Form(dia)%> maxlength=2"><input type=text name=mes maxlength=2" value=<%=Request.Form(mes)%> size=2">- 19 <input type=text name=ano size=2" maxlength=2" value=<%=Request.Form(ano)%>><b> <font face=Arial><br>Mdia do ltimo ano:</font></b> <input type=text name=media value=<%=Request.Form(media)%> size=2" maxlength=2">valores<b> <font face=Arial><br>Rendimento mensal dos pais:</font></b> <input type=text name=rendimento value=<%=Request.Form(rendimento)%> maxlength=7" size=7">$00 <p align=center><input type=submit value=Simular name=submeter><br></p> </td> </tr></table> </FORM> </center> </div> <%End Sub%>
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 > <i>1 / 5<br> <br> </i></font></b> <FORM name=pergunta1" action=cpt4-3-4.asp method=POST> <p> <font face=Arial>Qual o cdigo para escrever no browser?</font></p> <div align=center> <center> <table border=0" width=300"> <tr> <td width=7% align=right><input type=radio value=resposta1" name=pergunta1"></td> <td width=93%><font face=Arial>Request.Write ()</font></td> </tr> <tr> <td width=7% align=right><input type=radio value=resposta2" name=pergunta1"></td> <td width=93%><font face=Arial>Session(escrever)</font></td> </tr> <tr> <td width=7% align=right><input type=radio value=resposta3" name=pergunta1"></td> <td width=93%><font face=Arial>Response.Write ()</font></td> </tr> <tr> <td width=7% align=right><input type=radio value=resposta4" checked name=pergunta1"></td> <td width=93%><font face=Arial>No sei</font></td> </tr>
Como se pode ver este um teste de ASP. O leitor pode fazer testes de tudo o que quiser, e com o uso de bases de dados (a ver em prximo captulo), pode criar vrios tipos de testes usando apenas um procedimento para todos eles. Ser ento num outro procedimento, depois de todas as perguntas terem sido respondidas, que todas as variveis sero limpas, de maneira a que se possa responder a um novo teste, ou tentar nova sorte. Nesta fase, ser feita uma validao de todas as respostas e incrementada uma varivel com o total de valores do teste - alterada consoante a qualidade das respostas dadas.
CAPTULO 4: OBJECTOS 87 <%Sub total_respostas ( )%> <%session(pergunta5) = Request.Form(pergunta5) total = 0 if session(pergunta1) = resposta3 then total = total + 4 if session(pergunta2) = resposta2 then total = total + 6 if session(pergunta3) = resposta3 then total = total + 3 if session(pergunta4) = resposta1 then total = total + 2 if session(pergunta5) = resposta3 then total = total + 5 Response.Write <center><strong>Teve & total & valores neste teste...<strong><br><br> if total < 10 then Response.Write <strong><font size=4' color=RED>REPROVADO </font></strong> Else if (total > 10 AND total <= 11) then Response.Write <strong><font size=4' color=BLUE>APROVADO tangente...</font></strong> Else if (total >= 12 AND total < 17) then Response.Write <strong><font size=4' color=BLUE>APROVADO </font></strong> Else if (total >= 18 AND total<=20) then Response.Write<strong><font size=4' color=BLUE>APROVADO com distino!</font></strong> end if end if end if end if %> Como se pode observar, todas as variveis de sesso devolvem as respostas, que conforme estejam certas ou 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
<%Sub Pergunta1()%> <%session(npergunta)=1%> <div align=center> <center> <table border=0" width=500" bgcolor=#B8CFCF> <tr> <td width=100%><b><font face=Arial>Pergunta > <i>1 / 5<br> <br> </i></font></b> <FORM name=pergunta1" action=cpt4-3-4.asp method=POST> <p> <font face=Arial>Qual o cdigo para escrever no browser?</font></p> <div align=center> <center> <table border=0" width=300"> <tr> <td width=7% align=right><input type=radio value=resposta1" name=pergunta1"></td> <td width=93%><font face=Arial>Request.Write ()</font></td> </tr> <tr> <td width=7% align=right><input type=radio value=resposta2" name=pergunta1"></td> <td width=93%><font face=Arial>Session(escrever)</font></td> </tr> <tr> <td width=7% align=right><input type=radio value=resposta3" name=pergunta1"></td> <td width=93%><font face=Arial>Response.Write ()</font></td> </tr> <tr> <td width=7% align=right><input type=radio value=resposta4" checked name=pergunta1"></td> <td width=93%><font face=Arial>No sei</font></td> </tr> </table> </center> </div> <p align=center><input type=submit value=Responder name=submeter></p> </FORM> </td> </tr> </table> </center> </div> <%End Sub%>
CAPTULO 4: OBJECTOS 89 <%Sub Pergunta2()%> <%session(pergunta1) = Request.Form(pergunta1) session(npergunta)=2%> <div align=center> <center> <table border=0" width=500" bgcolor=#B8CFCF> <tr> <td width=100%><b><font face=Arial>Pergunta > <i>2 / 5<br> <br> </i></font></b> <FORM name=pergunta2" action=cpt4-3-4.asp method=POST> <p> <font face=Arial>Como se cria uma varivel global, acessvel por<br>todos os utilizadores?</font></p> <div align=center> <center> <table border=0" width=300"> <tr> <td width=7% align=right><input type=radio value=resposta1" name=pergunta2"></td> <td width=93%><font face=Arial>Session ()</font></td> </tr> <tr> <td width=7% align=right><input type=radio value=resposta2" name=pergunta2"></td> <td width=93%><font face=Arial>Application ()</font></td> </tr> <tr> <td width=7% align=right><input type=radio value=resposta3" name=pergunta2"></td> <td width=93%><font face=Arial>x = 1</font></td> </tr> <tr> <td width=7% align=right><input type=radio value=resposta4" checked name=pergunta2"></td> <td width=93%><font face=Arial>No sei</font></td> </tr> </table> </center> </div> <p align=center><input type=submit value=Responder name=submeter></p> </FORM> </td> </tr> </table> </center> </div> <%End Sub%>
CAPTULO 4: OBJECTOS 91 <%Sub Pergunta4()%> <%session(pergunta3) = Request.Form(pergunta3) session(npergunta)=4%> <div align=center> <center> <table border=0" width=500" bgcolor=#B8CFCF> <tr> <td width=100%><b><font face=Arial>Pergunta > <i>4 / 5<br> <br> </i></font></b> <FORM name=pergunta4" action=cpt4-3-4.asp method=POST> <p> <font face=Arial>Qual a funo que devolve uma diferena entre duas datas?</font></p> <div align=center> <center> <table border=0" width=300"> <tr> <td width=7% align=right><input type=radio value=resposta1" name=pergunta4"></td> <td width=93%><font face=Arial>DateDiff ()</font></td> </tr> <tr> <td width=7% align=right><input type=radio value=resposta2" name=pergunta4"></td> <td width=93%><font face=Arial>IsDate ()</font></td> </tr> <tr> <td width=7% align=right><input type=radio value=resposta3" name=pergunta4"></td> <td width=93%><font face=Arial>Date ()</font></td> </tr> <tr> <td width=7% align=right><input type=radio value=resposta4" checked name=pergunta4"></td> <td width=93%><font face=Arial>No sei</font></td> </tr> </table> </center> </div> <p align=center><input type=submit value=Responder name=submeter></p> </FORM> </td> </tr> </table> </center> </div> <%End Sub%>
CAPTULO 4: OBJECTOS 93 <%Sub total_respostas()%> <%session(pergunta5) = Request.Form(pergunta5) total = 0 if session(pergunta1) = resposta3 then total = total + 4 if session(pergunta2) = resposta2 then total = total + 6 if session(pergunta3) = resposta3 then total = total + 3 if session(pergunta4) = resposta1 then total = total + 2 if session(pergunta5) = resposta3 then total = total + 5 Response.Write <center><strong>Teve & total & valores neste teste...<strong><br><br> if total < 10 then Response.Write <strong><font size=4' color=RED>REPROVADO</ font></strong> Else if (total > 10 AND total <= 11) then Response.Write <strong><font size=4' color=BLUE>APROVADO tangente...</font></strong> Else if (total >= 12 AND total < 17) then Response.Write <strong><font size=4' color=BLUE>APROVADO </font></strong> Else if (total >= 18 AND total<=20) then Response.Write<strong><font size=4' color=BLUE>APROVADO com distino!</font></strong> end if end if end if end if %> <br><br><center><a href=cpt4-3-4.asp>recomear</a></center> <%session(pergunta1) = session(pergunta2) = session(pergunta3) = session(pergunta4) = session(pergunta5) = session(npergunta) = 0%> <%End Sub%> <% Select case session(npergunta) case 1 Pergunta2 case 2 Pergunta3 case 3 Pergunta4 case 4 Pergunta5 case 5 total_respostas case else Pergunta1 end select %>
<%Sub formulario%> <FORM action=cpt4-3-5.asp?todo=in method=POST> <div align=center> <center> <table border=1" width=250" bgcolor=#FFCCFF> <tr> <td width=100%> <center><font size=4">Controlo de Acessos</font></center> </center> <div align=center>
CAPTULO 4: OBJECTOS 95 <table border=0" width=96%> <tr> <td width=50%> <p align=right><font face=Arial>Login:</font></td> <center><center> <td width=50%><input type=text name=login size=8"></td> </tr> </center></center> <tr> <td width=50%> <p align=right><font face=Arial>Password:</font></td> <center><center> <td width=50%><input type=password name=password size=8"></td> </tr> </table><br><input type=submit name=submete value=Submeter><br> </center> </div> </td> </tr> </table> </center> </div> </FORM> <%End Sub%> <%Sub erro%> <center><br><br><br> <font face=ARIAL color=RED size=6">ERRO, login e password errados...</font> <br><br><a href=cpt4-3-5.asp>tente de novo</a></center> <%End Sub%> <% session.Timeout = 4 o tempo que as sesses vo estar activas session(login) = Request.Form(login) vamos buscar os ltimos dados de login session(password) = Request.Form(password) e de password if Request.Querystring(todo) = then se o argumento estiver todo limpo vamos ao formulrio formulario else seno vamos ver o que tm as sesses no momento if ((session(login)<>xpto and session(password)<>123") AND Request.Querystring(todo)=in) then erro neste caso o login e password no so validados else Response.Redirect(cpt4-3-5test.asp) aqui o utilizador validado positivamente end if end if %>
<%if ( session ( login ) <> xpto and session( password )<> 123 ) then Response.Redirect(cpt4-3-5erro.asp) end if%> <center><br><br><br> <font face=ARIAL color=BLUE size=6">Bem vindo a esta pgina...</font> </center> Como ficou demonstrado, simples a maneira de se poder proteger pginas de um site. Alm deste caso, o utilizador pode fazer uma conexo a uma base de dados, e usar apenas uma varivel de sesso que diz sim ou no, conforme seja validada ou no depois de inquirida a base de dados.
CAPTULO 4: OBJECTOS 97 1. o primeiro utilizador entra e o servidor fica alerta; 2. o utilizador comea uma nova sesso, e essas sesses que ele cria so as que utilizamos para variveis globais, e para definir o tempo de aco das mesmas. 3. o utilizador sai do site e a sua sesso acaba; 4. o ltimo utilizador do site sai e o servidor Internet deixa de estar alerta. Depois de vistas estas 4 fases, posso agora demonstrar esta explicao do ponto de vista prtico. O ficheiro Global.Asa, algo como que o controlador dos acessos ao site que o programador criou, ou estiver a desenvolver. Este ficheiro tem apenas 4 funes distintas: a primeira aquela que activada quando o site fica activo; a segunda activada por cada vez que entra um utilizador; a terceira activada por cada vez que sai um utilizador do site, e a quarta activada quando o site deixa de ter utilizadores. Desta maneira, podemos criar cdigo dentro de cada uma destas zonas para nosso benefcio. Por exemplo, o leitor quer que seja introduzido num ficheiro de texto o endereo IP de cada utilizador que entra no site. Basta escrever dentro da segunda funo do ficheiro Global.Asa o cdigo que cria essa linha no ficheiro de controlo, para ter a certeza que cada acesso registado. Ou se quisermos saber quanto tempo cada utilizador passa em mdia no site, basta criarmos um registo de tempo de entrada na segunda funo, e um na terceira funo, e mais tarde fazermos DateDiff() para sabermos a mdia que cada utilizador gasta no nosso site. O esquema de um ficheiro Global.Asa o seguinte: <SCRIPT LANGUAGE=VBScript RUNAT=Server> Sub Application_OnStart End Sub Sub Session_OnStart End Sub Sub Session_OnEnd End Sub Sub Application_OnEnd End Sub </SCRIPT>
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;
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.
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>
<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.
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.
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 ()
(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.
<%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> </p> <p> </p> <p> </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> </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;
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.
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.
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.??????
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
148 152
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
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, )
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)
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
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
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).
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).
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.
Depois fica ento acessvel na consola do MSAccess a tabela que foi ento criada. Ficamos assim com uma base de dados j algo estruturada.
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.
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
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.
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
Depois destes passos, se aparecer livrodsn como na imagem anterior, a conexo est feita, e o leitor pode preparar-se para programar em ASP com acesso BD. A maneira mais usual de se conectar BD por via do DSN, onde se indica neste caso o nome da conexo que foi criado livrodsn. O primeiro passo ser criar um objecto de conexo BD, Set Conn = Server.CreateObject(ADODB.Connection) Depois deste passo vamos usar o mtodo open, prprio do objecto que foi criado, Conn.open DSN=livrodsn; Desta maneira acabmos de fazer uma conexo BD. Tudo o que agora preciso de uma maneira de podermos trabalhar os dados referentes BD que est nessa conexo. Vamos ento usar o RecordSet, mais um tipo de objectos, mas desta maneira, para o controlo de dados.
Depois das fases anteriores, tudo o que tem de fazer para controlar a BD criar uma declarao de SQL e accionar a mesma, isto da seguinte maneira, SQLStmt = SELECT FROM rs.Open SQLstmt,Conn,1,2
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.
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).
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
Depois de tudo validado o utilizador poder repetir novamente, devido incluso de um link que d essa hiptese.
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>
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 %>
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.
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%>
<%Sub formulario() Set Conn = Server.CreateObject(ADODB.Connection) Conn.open DSN=livrodsn; Set rs = Server.CreateObject(ADODB.Recordset) SQLStmt = SELECT * FROM contactos rs.Open SQLstmt,Conn,1,2 %> <FORM ACTION=cpt5-4-3.asp?fazer=apagar METHOD=POST> <font face=ARIAL size=2">contactos na base de dados</font><br> <SELECT NAME=contacto> <OPTION selected> escolha </OPTION> <%While Not rs.EOF %> <OPTION VALUE=<%= rs.Fields(ID) %>><%= rs.Fields(nome)%> </OPTION> <%rs.MoveNext Wend rs.close%> </SELECT> <INPUT type=submit value=Apagar> </FORM> <%End Sub%> <%Sub apagar_contacto%> <% Set Conn = Server.CreateObject(ADODB.Connection) Conn.open DSN=livrodsn; Set rs = Server.CreateObject(ADODB.Recordset) SQLStmt = DELETE FROM contactos WHERE ID = & Request.Form(contacto) rs.Open SQLstmt,Conn,1,2 %> <strong><font face=ARIAL size=3">O contacto escolhido foi apagado... </font></strong><br> <br><br><a href=cpt5-4-3.asp>continuar a apagar</a> <%End Sub%> <% if Request.querystring(fazer)=apagar then apagar_contacto else formulario end if %>
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%>
<%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> <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
CAPTULO 5: BASES DE DADOS 141 select case request.querystring(fazer) case alterar alterar case executar validar_dados case else formulario_principal end select%>
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.
<% 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.
O cdigo, if cor=99CCFF then cor=9999FF else cor=99CCFF end if ento o pequeno truque para que possamos alternar as cores das linhas. Iniciamos a varivel cor com um valor, e, dentro do loop, vamos validar a mesma, de maneira que ela troque pela cor oposta.
<% Set Conn = Server.CreateObject(ADODB.Connection) Conn.open DSN=livrodsn; Set rs = Server.CreateObject(ADODB.Recordset) SQLStmt = SELECT * FROM contactos rs.Open SQLstmt,Conn,1,2 %> <table border=0" width=580" cellpadding=4" cellspacing=0"> <tr> <td width=32" align=right><font size=1"><b>e-mail</b></font></td> <td width=170"><b>Nome</b></td> <td width=50" align=right><b>Idade</b></td> <td width= align=right><b>Telefone</b></td> </tr> <% cor=99CCFF while not rs.EOF%> <tr> <td align=right><% if len(Rs.Fields(email))>1 then Response.write <a href=mailto:&Rs.Fields(email)&> Response.Write <img border=0' src=carta.jpg></a> end if %></td> <td bgcolor=#<%=cor%>><%=Rs.Fields(nome)%></td> <td bgcolor=#<%=cor%> align=right><%=Rs.Fields(idade)%></td> <td bgcolor=#<%=cor%> align=right><%=Rs.Fields(telefone)%></td> </tr> <%rs.MoveNext if cor=99CCFF then cor=9999FF else cor=99CCFF end if wend %></table>
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 ()
Algo que muito usado nas pginas Internet a pesquisa nas bases de dados da existncia de um dado utilizador, e esse exemplo que vamos apresentar de seguida.
<%Sub Listagem() Set Conn = Server.CreateObject(ADODB.Connection) Conn.open DSN=livrodsn; Set rs = Server.CreateObject(ADODB.Recordset) SQLStmt = SELECT * FROM contactos WHERE nome like % & Request.Form(nome) & % rs.Open SQLstmt,Conn,1,2 %> <table border=0" width=580" cellpadding=4" cellspacing=0"> <tr> <td width=32" align=right><font size=1"><b>e-mail</b></font></td> <td width=170"><b>Nome</b></td> <td width=50" align=right><b>Idade</b></td> <td width= align=right><b>Telefone</b></td> </tr> <% cor=99CCFF while not rs.EOF%> <tr> <td align=right><% if len(Rs.Fields(email))>1 then Response.write <a href=mailto:&Rs.Fields(email)&> Response.Write <img border=0' src=carta.jpg></a> End if %></td> <td bgcolor=#<%=cor%>><%=Rs.Fields(nome)%></td> <td bgcolor=#<%=cor%> align=right><%=Rs.Fields(idade)%></td> <td bgcolor=#<%=cor%> align=right><%=Rs.Fields(telefone)%></td> </tr> <%rs.MoveNext if cor=99CCFF then cor=9999FF else cor=99CCFF end if wend %></table> <br><a href=cpt5-5-3.asp>fazer nova procura</a> <%End Sub%> <%Sub formulario_procura%> <form action=cpt5-5-3.asp?fazer=procura method=POST> String para Procura : <input type=text name=nome size=22"> <input type=submit value=Procurar> </form> <%End Sub%> <%select case request.querystring(fazer) case procura listagem case else formulario_procura end select%>
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.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.
<% 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> </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>
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 ()
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.
<% 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).
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
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
Skip SkipLine
Input Input
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.
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.
(ficheiro cpt6-2-2.asp)
<% Sub procura_ficheiro() Set ProcuraFicheiro = Server.CreateObject(Scripting.fileSystemObject) If Not ProcuraFicheiro.FileExists(Server.MapPath(historia.txt)) then Set ObjectoFicheiro = CreateObject(Scripting.fileSystemObject) Set EscreveTexto = ObjectoFicheiro.CreateTextFile (Server.MapPath(historia.txt),True) EscreveTexto.WriteLine(ERA UMA VEZ............) EscreveTexto.Close end if End Sub Sub escrita_de_linha() Set ObjectoFicheiro = CreateObject(Scripting.fileSystemObject) Set EscreveTexto = ObjectoFicheiro.OpenTextFile (Server.MapPath(historia.txt),8,True) If len(Request.Form(linha))>1 then EscreveTexto.WriteLine(Request.Form(linha)) end if EscreveTexto.Close End Sub Sub leitura_de_ficheiro() Set ObjectoFicheiro = CreateObject(Scripting.fileSystemObject) Set LerTexto = ObjectoFicheiro.OpenTextFile (Server.MapPath(historia.txt)) While NOT LerTexto.AtEndOfStream Response.Write | & LerTexto.ReadLine & <br> Wend Set LerTexto = nothing End Sub Sub formulario() %> <br><br><p><FORM action=cpt6-2-2.asp method=POST> Novo Pargrafo: <input type=text name=linha size=60" MaxLength=140"><br> <input type=submit name=submeter Value=Acrescentar> </FORM> </p> <% End Sub
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.
<% 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 %>
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.
Fig.6.4
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).
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.
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,
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;
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
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
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)
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)
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
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
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
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:
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.
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:
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> <a href=default.asp?fazer=registar>registar site </a> </font></center> <% fazer = Request.QueryString(fazer) vamos buscar o argumento fazer Select Case fazer vamos ento chamar o ficheiro consoante o argumento Case procura se o argumento for procura foi submetida uma busca e se foi submetida uma busca vamos mostrar o formulrio de busca e incluir a listagem de sites identificados com essa procura %> <!#INCLUDE FILE=includes/procura.inc> <!#INCLUDE FILE=includes/listagem.inc>
<% esta funo serve exclusivamente para acrescentar uma plica por cada uma que existir nas strings a usar em declaraes de SQL Function tira_plicas(texto) Texto = trim(texto) desta maneira tiramos os espaos em branco ao incio e fim da string texto_temp = esta uma string temporria onde vamos construir uma string que no tem uma plica sozinha For i=1 to len(texto) loop para percorrer a string if Mid(texto,i,1)= then se achar plica acrescenta mais uma texto_temp=texto_temp & else texto_temp=texto_temp & Mid(texto,i,1) end if Next Tira_plicas = texto_temp ao fazermos esta igualdade estamos a devolver o resultado desta funo ( funo corrente = valor ) End Function %> O ficheiro funcoes.asp como que uma biblioteca que recorremos que tem funes generalistas. Nestes exemplos s o usei para uma funo, mas o leitor poder usar para vrios tipos de funes. Depois de fazermos #INCLUDE de um destes ficheiros, todas as funes e procedimentos a existentes so usados como se ao cdigo do ficheiro inicial pertencessem.
(ficheiro topo.inc)
<HMTL> <HEADER> <TITLE>A R - o novo motor de busca com ASP</TITLE> </HEADER> <BODY> <div align=center><table width=600"> <tr><td> <img src=imagens/topo.jpg> </td></tr> </table></div>
<div align=center><table width=600"> <tr bgcolor=#8AC491"><td> </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> <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>
<!#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> </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> </p><p> </p><p> </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()%>
CAPTULO 7: EXEMPLOS REAIS 195 if Len(titulo)<4 or len(titulo)>80 then OK = 0 response.write <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 <font color=red> response.write - a descrio do site no vlido</font> end if if (procura_repetido(urlsite)) = 1 then OK = 0 Response.write <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 %>
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.
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
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'
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:
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'
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;
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>
<!#INCLUDE FILE=includes/topo.inc> <div align=center> <table width=600"><tr> <td align=top width=600"> <% o sistema de busca dos argumentos idntico ao do motor de busca fazer = Request.QueryString(fazer) Select Case fazer Case carrinho se for escolhido o carrinho vamos mostrar o carrinho %> <!#INCLUDE FILE=includes/carrinho.inc> <% Case pagar neste caso o utilizador vai pagar o escolhido %> <!#INCLUDE FILE=includes/pagar.inc> <% Case procura se houver procura vai-se mostrar a listagem de resultados %> <!#INCLUDE FILE=includes/listagem.inc> <% Case Else se o argumento no existir mostramos a pgina inicial %> <!#INCLUDE FILE=includes/inicial.inc> <% End Select %> </td> </tr></table></div> <p> </p> <!#INCLUDE FILE=includes/fundo.inc>
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> </td> <td valign=top><font size=2" face=Verdana> <a href=default.asp?fazer=carrinho> <img border=0" alt=Ver carrinho de compras src=imagens/carrinho.jpg></a> </td> <td valign=top><font size=2" face=Verdana> <a href=default.asp?fazer=pagar>
Verso digital, individual, licenciada em Jan/Fev do ano 2000, pelo Centro Atlntico, da verso 1.0 do livro 'Programao Web com ASP'
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> </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>
(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> </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> </p><p> </p><p> </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> (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>( edio de response.write rs.fields(mes_edicao)&/&rs.fields(ano_edicao) response.write )</b></font> response.write <small>livro com response.write rs.fields(n_paginas) & pginas.</small><p> response.write [ <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> ]</p> conta = 1 a partir daqui a prxima disposio ser diferente else response.write <td valign=top><font face=arial size=2'>
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'
<% este procedimento faz com que vejamos os dados que esto em carrinho Sub ver_carrinho() Produtos_info = session(matriz_produtos) vamos buscar os dados dos produtos Quantidade_info = session(matriz_quantidade) e respectivas quantidades produtos_num = ubound(produtos_info) tirar o nmero de produtos em carrinho if produtos_num <1 then se forem menos de 1 ento est vazio response.write <p> </p><p> </p><p><center> response.write <font size=4' color=red>o carrinho ainda est vazio..</font> response.write </center></p><p> </p><p> </p> exit sub saimos forosamente do procedimento end if num_produtos = 0 vamos construir a tabela response.write <div align=center> response.write <table width=600' border=1' response.write bordercolor=#409AC9' cellspacing=0'><tr> response.write <td width=20'> response.write Qt. response.write </td> response.write <td> response.write ISBN response.write </td> response.write <td> response.write Titulo da Obra response.write </td> response.write <td> response.write Preo response.write </td> response.write <td> response.write Total response.write </td></tr> response.write <form action=default.asp?fazer=carrinho& response.write como=calcula method=POST> total_preco = 0 varivel que vai calcular o preo total da encomenda total_produtos = 0 vai calcular o nmero total de produtos no podemos usar o produtos_num pois este diz quantos produtos diferentes e no quantos produtos (quantidade) for i=1 to produtos_num SQLStmt = SELECT id_produto, isbn, titulo, preco FROM produtos
Verso digital, individual, licenciada em Jan/Fev do ano 2000, pelo Centro Atlntico, da verso 1.0 do livro 'Programao Web com ASP'
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)
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.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> </p><p> </p><p><center> response.write <font size=4' color=red>o carrinho ainda est vazio..</font> response.write </center></p><p> </p><p> </p> exit sub end if %> <div align=center> <form action=default.asp?fazer=pagar&como=efectuar method=POST> <input type=hidden name=total_valor value=<%=session(valor_t)%>> <font face=ARIAL size=3'>Total a Pagar: <b> <%=formatCurrency( session(valor_t))%> </b></font></p> <table width=500' border=1' bordercolor=#409AC9' cellspacing=0'><tr><td><table> <tr><td bgcolor=#409AC9'><font face=arial color=white size=2'><b>Dados Pessoais </b></font></td>
Verso digital, individual, licenciada em Jan/Fev do ano 2000, pelo Centro Atlntico, da verso 1.0 do livro 'Programao Web com ASP'
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'> (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> response.write o nome est invlido</font><br> OK = 0
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> </p><p><br><br><font face=Verdana color=blue> response.write A sua encomenda foi processada...</font></p> response.write <p> </p><p> </p><p> </p> session.Abandon vamos abandonar a sesso depois de ser feita a compra
No caso do nmero do carto de crdito no estar vlido mostrado um erro (o mesmo acontece com a maioria dos dados a introduzir)
Agradecimentos: Queria agradecer a todos aqueles que ajudaram na minha formao e percurso profissional, onde esto includos: Manuel Pacheco Vieira, Jos Fernando Silva, Pedro Tiago Pereira e Carlos Dias. No estrangeiro tive o apoio de duas pessoas que me apoiaram nos meus artigos e acreditaram nas minhas capacidades, so eles Scott Mitchell (www.4guysfromrolla.com) e Stephen Wynkoop (www.swynk.com). Agradeo tambm s centenas de pessoas que me enviam mensagens para o e-mail todos os meses, a pedir esclarecimentos tcnicos ou a agradecer pelo cdigo que tenho disponvel no meu site (www.joaovieira.com). A nvel pessoal agradeo ento s peas fundamentais na minha vida, os meus pais, avs, Tnia Penedo e dupla Jujinha & Ritinha.
Coleco Tecnologias
Todas as tecnologias de destaque da Internet tratadas pela equipe de tcnicos do Centro Atlntico
Coleco Desafios
O que nos reservam os tempos que se aproximam em que as novas tecnologias invertem muitas das certezas adquiridas
Coleco Solues
Solues prticas para resolver novas questes levantadas pelas tecnologias da sociedade da informao
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
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
= = = = =
_____ * 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.
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