Programação Web com ASP - Active Server Pages
Transcrição
Programação Web com ASP - Active Server Pages
João Vieira Centro Atlântico Programação Web com ASP - Active Server Pages Edições Centro Atlântico Portugal/2000 Reservados todos os direitos por Centro Atlântico, Lda. Qualquer reprodução, incluindo fotocópia, só pode ser feita com autorização expressa dos editores da obra. Programação Web com Active Server Pages Colecção: Tecnologias Autor: João Vieira Direcção gráfica: Centro Atlântico Capa: Paulo Buchinho © Centro Atlântico, Lda., 2000 Av. D. Afonso Henriques, 1462 - 4450 Matosinhos Tel. 22 - 938 56 28/9 Fax. 22 - 938 56 30 Rua da Misericórdia, 76 - 1200 Lisboa Tel. 21 - 321 01 95 Fax 21 - 321 01 85 Portugal [email protected] www.centroatlantico.pt Fotolitos: Centro Atlântico Impressão e acabamento: Rolo & Filhos 1ª edição: Janeiro de 2000 ISBN: 972-8426-21-6 Depósito legal: 146.485/00 Marcas registadas: todos os termos mencionados neste livro conhecidos como sendo marcas registadas de produtos e serviços, foram apropriadamente capitalizados. A utilização de um termo neste livro não deve ser encarada como afectando a validade de alguma marca registada de produto ou serviço. O Editor e os Autores não se responsabilizam por possíveis danos morais ou físicos causados pelas instruções contidas no livro nem por endereços Internet que não correspondam às HomePages pretendidas. Dedico este livro aos meus pais, Maria de Jesus S. R. Sousa Vieira, António Tiago Vieira Índice 1. Introdução à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. Expressões e Operadores 2.1 2.2 2.3 Os primeiros passos 2.1.1 Exemplo: ‘Olá Portugal’ 2.1.2 Exemplo: ‘Olá Portugal’ com variável 2.1.3 Exemplo: Cálculo de variáveis 2.1.4 Exemplo: Código ASP embebido em HMTL IF, THEN, ELSE, END IF… 2.2.1 Exemplo: Comparação entre variáveis 28 28 29 29 30 FOR, WHILE, CASE… 2.3.1 Exemplo: Comparação de variáveis com ciclos 2.3.2 Exemplo: Select Case 2.3.3 Exemplo: Contadores ASP embebidos em HMTL 2.3.4 Exemplo: HMTL embebido em contadores ASP 32 33 33 34 2.4 Variáveis 35 2.5 Tabela de Operadores 2.5.1 Exemplo: Comparação de variável entre valores 37 2.5.2 Exemplo: Utilização de todos os operadores 38 3. Funções 3.1 Tabela de funções base das ASP 40 3.2 As nossas funções 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 gráfico em HTML a partir de um array 48 50 52 53 Uso de SSI (Server Side Includes) com as nossas funções 3.3.1 Exemplo: Uso de um ficheiro externo com SSI 3.3.2 Exemplo: Ficheiro com todas as funções 3.3.3 Exemplo: ASP que usa o ficheiro com todas as funções 56 57 58 3.3 4. Objectos 4.1 Tabela de Objectos 62 4.2 Variáveis globais e de sessão 65 4.3 Interagir com o utilizador 4.3.1 Exemplo: Responder ao utilizador com os dados recolhidos 4.3.2 Exemplo: Validar formulário 4.3.3 Exemplo: Curso online 4.3.4 Exemplo: Protecção de páginas com password 72 73 81 88 Ficheiro global.asa 4.4.1 Exemplo: Quantos utilizadores estão a visitar a página 4.4.2 Exemplo: Chat em Browser 100 102 Cookies, dados do utilizador e do servidor 4.5.1 Exemplo: Recolher dados do utilizador 4.5.2 Exemplo: Páginas personalizadas 105 107 Formatação de strings 108 4.4 4.5 4.6 5. Bases de dados 5.1 Bases de Dados / SQL 114 5.2 Construir uma base de dados em Microsoft Access 117 5.3 Conexão à base de dados 122 5.4 Inserir, apagar e actualizar dados em bases de dados 5.4.1 Exemplo: Inserir dados 5.4.2 Exemplo: Eliminar dados 5.4.3 Exemplo: Actualizar dados 127 135 137 Apresentação de dados 5.5.1 Exemplo: Listar dados em tabela 5.5.2 Exemplo: Listar dados com imagens 5.5.3 Exemplo: Listar dados a pedido 142 144 146 Exemplos com bases de dados 5.6.1 Exemplo: Livro de Visitas 5.6.2 Exemplo: Sondagens de opinião 148 152 5.5 5.6 6. Componentes 6.1 Introdução aos Componentes 156 6.2 Tratamento de ficheiros de texto com o TextStream 6.2.1 Exemplo: História sem fim 6.2.2 Exemplo: Contador de acessos 159 163 Componentes de e-mail 6.3.1 Exemplo: Envio de e-mail com attachment 164 Criar componentes em Visual Basic 6 6.4.1 Exemplo: Componente Livro de Visitas 173 6.3 6.4 7. Exemplos reais 7.1 7.2 7.3 Introdução A Rã: Motor de Busca A Loja: Loja E-Commerce 182 183 197 g t t m t o seu e-book b Peça gratuitamente Receba gratuitamente, por e-mail, a versão digital (e-book) deste livro, para poder utilizar todos os programas sem ter que os re-escrever. Para tal, envie a cópia da factura deste livro para o Centro Atlântico, para o e-mail [email protected] ou por correio para, Centro Atlântico Ap. 413 4760 V. N. Famalicão 12 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES 1.1 Do Autor Escrevi este livro, acima de tudo, para dar algum apoio a todos aqueles que querem iniciar-se neste tema de programação Internet do lado do servidor. Quando comecei a pesquisar estes assuntos, há alguns anos, a realidade era muito diferente para conseguir programar neste tipo de sistemas. Seria necessário um servidor (com certos requisitos), e conhecimentos bastante mais avançados de programação. A definição de páginas dinâmicas na altura, consistia na existência de ficheiros executáveis do lado do servidor que criavam páginas HTML consoante o que o utilizador procurava, e que limitava bastante os tipos de pesquisa. Quando o Perl (para programação de páginas dinâmicas) apareceu, o panorama mudou, e as facilidades deste tipo de programação começavam. Mesmo assim, a Microsoft apareceu com os IDC (Internet Database Connector), que apesar de serem de mais fácil compreensão não eram tão potentes a nível de desenvolvimento. Mais tarde, apareceram as ASP, que deram uma grande (e boa) viragem na programação do lado do servidor. O programador começava a ter uma linguagem potente e flexível onde podia desenvolver o mais variado tipo de serviços e de soluções. Quando comecei a trabalhar nesta linguagem estava-se a fazer a transição do sistema IDC para as ASP. As facilidades das mesmas deram-me hipótese de as poder experimentar onde quer que fosse. Mesmo assim, os recursos a nível de manuais e páginas Internet eram poucos, e tive bastantes dificuldades em me desenvolver 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, código e ideias. Com este suporte on-line e alguma ajuda de programadores de todo o mundo, comecei a desenvolver páginas, e tudo foi correndo normalmente. Quando me senti preparado comecei a escrever artigos para estes mesmos sites, para apoiar aqueles que iriam ter as mesmas 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 domínio das ASP seja o menos dificultado possível. Este livro está separado por capítulos; cada capítulo está estruturado por uma parte do sistema das ASP, e foi dada uma ordem a estes, para que os temas estivessem ordenados por níveis de dificuldade. No final deixo alguns exemplos, que sei irão ser muito úteis a todos aqueles que querem algo Versão digital, individual, licenciada em Fev/2000, pelo Centro Atlântico, da versão 1.0 do livro 'Programação Web com ASP' CAPÍTULO 1: INTRODUÇÃO ÀS ACTIVE SERVER PAGES 13 mais que tópicos e artigos. Estes exemplos para os iniciados necessitam de uma compreensão de todos os temas abordados neste livro, mas os programadores mais avançados podem ir directamente para os exemplos, e recorrer ao manual para entenderem ou reverem alguns aspectos da programação com ASP. Espero que este livro sirva para aquilo que o leitor está à procura, pois quando eu comecei se tivesse tido este manual, metade dos meus problemas tinham sido resolvidos muito mais depressa. Para me ajudar nos temas tenho os problemas que normalmente recebo todas as semanas de vários pontos do planeta, que me dão uma ideia daquilo que os programadores mais precisam quando começam a trabalhar com esta tecnologia. 1.2 Requisitos para as ASP ‘ASP’ é a abreviatura de Active Server Pages. ASP são páginas dinâmicas para a Internet, que usam uma linguagem de programação ao estilo do VB (Visual Basic). Para quem está familiarizado com o VB não lhe será difícil entender este código, pois as rotinas de scripting de ambos os sistemas são quase idênticas e seguem as mesmas regras. Se além do VB, tiver sólidos conhecimentos de HTML (Hyper Text Marked Language), rapidamente estará preparado para programar sobre este sistema a um bom nível depois de dominar os tópicos deste manual. Mesmo que não domine o HTML, poderá ler o capítulo 1.6 onde estão indicados alguns dos principais comandos (chamados Tags) do mesmo. Este sistema foi o segundo adoptado pela Microsoft para a criação de poderosos sites dinâmicos com acesso a bases de dados. O primeiro sistema foi o de IDC que usava um sistema de dois ficheiros, um com o código HTML (HTX) que continha rotinas de chamada de ficheiros IDC, que por sua vez tinham as declarações de SQL para acesso às bases de dados. Não era tão flexível, era mais lento de se programar, e tinha certos requisitos de programação algo diferentes das ASP. CAPÍTULO 1: INTRODUÇÃO ÀS ACTIVE SERVER PAGES 15 1.3 ASP vs JavaScript/VBScript Muitas pessoas perguntam “…Qual a diferença entre as ASP e o JavaScript? Ou o VBScript? Ou mesmo o tão potente Java?…”. Bem, as diferenças são bastantes, não só falando das ASP, mas também de outras linguagens parecidas, como o Perl, PHP ou mesmo o Cold Fusion. Enquanto o JavaScript e o VBScript e o Java, funcionam do lado do cliente (apesar de haver hipótese do Java funcionar também a nível do servidor com servlets) as ASP funcionam no servidor. Uma boa maneira de notar esta diferença entre as ASP e o JavaScript/VBScript, é olhando para as instruções de programação de ambos. Quando estamos no nosso browser e vamos ver o source de um ficheiro com JavaScript ou VBScript, vemos todo o código, e daí vem o problema desse código poder ser usado ilegalmente por outro programador - situação muito usual. Com as ASP, ao tentar aceder ao código, só se vê puro HTML, pois as ASP são tratadas e processadas no servidor de Internet que por sua vez envia a formatação online toda em HTML. O código de JavaScript é facilmente identificado no meio do código HTML, sendo a sua estrutura a seguinte: <SCRIPT LANGUAGE=”JAVASCRIPT”> { history.go(-1); } </SCRIPT> Este exemplo está a simular o botão de recuo do browser, fazendo com que seja recuada uma página. Normalmente este código é usado na seguinte situação (pelo menos aquela em que o uso mais): <a href=”javascript : history-go(-1)”>Voltar Atrás</a> O VBScript é no final de contas o código base das ASP, mas que corre no lado do cliente: <SCRIPT LANGUAGE=”VBSCRIPT”> formatcurrency(“10000”) </SCRIPT> Este código formata o valor 10000, para que fique 10.000$00. 16 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES Com o Java o problema é diferente, é muito pesado, nem todos os browsers o suportam, e a sua programação é dispendiosa, e toma muitos recursos, que a fazem ideal para outros campos. Este foi então posto de parte por todos aqueles que querem sites com rápido acesso a bases de dados, e flexíveis, não só na programação mas também na utilização (interface com o utilizador), onde as ASP e linguagens semelhantes têm vindo a dominar todo o mercado. E se formos a ter em conta o que é aceder a bases de dados online, poderemos ver que todos os serviços online têm de aceder a essas mesmas estruturas, para poderem praticar o chamado e-commerce, que veremos também neste manual. 1.4 Instalar o servidor de Internet O servidor de Internet é bastante fácil de instalar e a documentação da Microsoft que vem com o pacote do software é bastante explícita. Mesmo assim vou só indicar alguns pontos para a instalação do software. Se está a pensar em instalar um servidor de Internet para ter páginas online, a opção certa é o WindowsNT com o Option Pack 4 (de onde vem o IIS 4) e se possível com o Service Pack 4 ou 5 do WindowsNT. Se quiser usar sistemas mais recentes pode também usar o Windows 2000, que vem mais seguro no aspecto dos sites que fiquem sob sua alçada e trás já o IIS 5. As grandes diferenças no IIS 5 serão no aspecto do uso de código e alguns objectos novos, que não são bem novos, mas sim melhoramentos de alguns já usados anteriormente. A nível de performance essa será melhor pois os cabeçalhos de HTTP (a informação que é recolhida pelo browser, enviada pelo servidor) quando possível são enviados comprimidos, permitindo uma redução de tamanho de informação. Terá alguns wizards para instalação de sites, e um grande avanço é que o programador não terá de se preocupar com as extensões dos ficheiros, podendo colocar código ASP em qualquer lado, pois o novo servidor vai detectar as diferenças. Existirá uma maneira mais prática de redireccionamento de páginas, poderá ser executado código dinamicamente (do tipo o utilizador ter uma página online para testar scripts no momento), melhor controlo de componentes, e o mais importante de todos, a hipótese de se criarem e usarem classes, sistema usado por programadores em ambientes de programação orientada por objectos. Versão digital, individual, licenciada em Fev/2000, pelo Centro Atlântico, da versão 1.0 do livro 'Programação Web com ASP' CAPÍTULO 1: INTRODUÇÃO ÀS ACTIVE SERVER PAGES 17 Caso contrário, o PWS para o Windows 98 é uma boa escolha pois pesa menos no computador e será o suficiente para criar as ASP que irá usar futuramente no Windows NT. Eu indicaria então que instalasse tudo o que vem no pacote (PWS ou IIS), as consolas de gestão, o transaction server, os exemplos, o ADO (Access Data Obects), todos os componentes que vierem – em resumo, tudo o que for possível instalar. Perceberá durante a leitura deste manual o porquê desta indicação, e com a sua especialização nesta matéria ao longo da sua vida profissional também o entenderá. O directório onde as páginas vão ficar instaladas pode ser aquele que o programador quiser, mas aconselho vivamente a utilizar o que está por defeito c:\inetpub\wwwroot\, e a partir do interior deste gerir todas as páginas que quiser criar. Não apague os ficheiros que ele criar, principalmente um chamado global.asa, que iremos tratar mais adiante. Depois de todo o sistema instalado tem de activar o serviço de Internet. No PWS basta ir ao Personal Web Server e carregar em Start (normalmente ele já está por defeito). No IIS 4 terá de ir à Management Console e escolher Default Web Site da lista do lado esquerdo, carregando depois no botão de run. Fig. 1.2 - Aspecto da consola do PWS Como se pode verificar na figura 1.2, o servidor virtual criado por defeito é o nome que se deu ao computador, variando por isso de máquina para máquina. No meu caso será jvpc. Assim, quando for preciso aceder ao servidor virtual, poder-se-á fazer no browser através de http://jvpc/ ; aparecer-lhe-ão informações do PWS, da mesma maneira que se escrevesse no address link do seu browser localhost . CAPÍTULO 1: INTRODUÇÃO ÀS ACTIVE SERVER PAGES 19 1.5 Programar com ficheiros ASP e HTML As extensões dos ficheiros ASP é *.asp, e dos ficheiros HMTL é *.html ou *.htm Conforme a versão do servidor Internet, o programador poderá definir quais as extensões a usar e para que tipo de ficheiro. Poderá até personalizar os ficheiros ASP, fazendo com que passem a ser *.xyz Como estes tipos de ficheiros não são compilados e sim interpretados (os *.asp no servidor e os *.html no browser), o programador estará a programar sobre ficheiros de texto, mas com as extensões referidas. Normalmente são usados editores Freeware, que se podem encontrar na Internet, ou outros mais profissionais como o InterDev da Microsoft. Acho que cada um deve tentar todos os que puder, para fazer a escolha que esteja mais apropriada à sua maneira de programar. 1.6 Conhecer o HTML (Hyper Text Markup Language) em 12 passos Para se programar as ASP, serão necessários certos requisitos, não só a nível de hardware como de conhecimento a nível de programação. Falo do HTML, que é necessário como base para um bom entendimento de tudo aquilo que é descrito neste manual. Para isso descreverei alguns comandos do HTML, que de linguagem de programação tem muito pouco, visto que se poderia comparar a alguns processadores de texto bastante antigos (quem se lembrar do WordStar sabe ao que me refiro!). Vou então indicar 12 pontos essenciais em relação ao HTML, para que o leitor fique melhor preparado para o que vai ler nos próximos capítulos, onde se misturará HTML com o código ASP. 20 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES 1. O código HTML que aparece no browser fica sempre entre duas Tags - Tags são os comandos que estão entre os símbolos <> <HTML> <BODY> ……………. </BODY> </HTML> 2. Como deve ter reparado, todas as Tags que começam com <NOMEDATAG> têm de acabar com uma barra </NOMEDATAG>. Nem todas o requerem, mas podemos dizer que cerca de 90% sim. 3. Para enviar conteúdo para o browser de maneira a ser visível pelo utilizador, basta escrever: <HTML> <BODY> ISTO É UM TESTE </BODY> </HTML> 4. Para mudar-se os parâmetros dos textos escritos é usada a Tag <FONT>, onde poderá mudar o tamanho das letras, a cor e até mesmo o tipo de letra: <HTML> <BODY> <FONT FACE=”ARIAL” COLOR=”GREEN” SIZE=”5”>ISTO É UM TESTE</FONT> </BODY> </HTML> 5. Para simular um parágrafo existe a Tag <P> <HTML> <BODY> <P><FONT FACE=”ARIAL” COLOR=”GREEN” SIZE=”5”>ISTO É UM TESTE</FONT></P> E ISTO JÁ É OUTRO TESTE </BODY> </HTML> Versão digital, individual, licenciada em Fev/2000, pelo Centro Atlântico, da versão 1.0 do livro 'Programação Web com ASP' CAPÍTULO 1: INTRODUÇÃO ÀS ACTIVE SERVER PAGES 21 6. A mudança de linha é feita com <BR> que funciona como que um Enter no mesmo parágrafo: <HTML> <BODY> <P><FONT FACE=”ARIAL” COLOR=”GREEN” SIZE=”5”>ISTO É UM TESTE</FONT></P> E ISTO<BR> JÁ É<BR> OUTRO TESTE<BR> </BODY> </HTML> 7. Para se criar tabelas usamos <TABLE></TABLE>, onde <TR></TR> simbolizam as linhas, e <TD></TD> as colunas dessa mesma 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 comentários ao código usamos <!— —>. Dá muito jeito quando o código HTML é muito extenso, comentando assim o que está criado em vários pontos do script: <HTML> <BODY> <!—ISTO QUE AQUI ESTÁ ESCRITO NÃO APARECE NO BROWSER—> ISTO SIM, JÁ APARECE NO BROWSER </BODY> </HTML> 22 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES 9. Quando é necessário um script, para funcionar do lado do cliente tipo JavaScript ou VBScript usa-se a Tag <Script Language=”….”> </Script> <HTML> <BODY> <!—ISTO QUE AQUI ESTÁ ESCRITO NÃO APARECE NO BROWSER—> ISTO SIM, JÁ APARECE NO BROWSER <SCRIPT LANGUAGE=”JAVASCRIPT”> …………. </SCRIPT> </BODY> </HTML> 10.Uma das maneiras de recebermos dados do utilizador é através de formulários. Podemos usar o método POST ou GET, que serão definidos para o tipo de programação com dados dos utilizadores via ASPs. Estes são estruturados da seguinte maneira: <HTML> <BODY> <FORM NAME=”nomedoformulario” METHOD=”POST”> O seu nome:<INPUT NAME=”nome”><BR> O seu telefone:<INPUT NAME=”email”><BR> <INPUT TYPE=”SUBMIT”> </FORM> </BODY> </HTML> 11.Para ter um texto que vai ter a outra página, tem de fazer o link com a Tag <A> </A> <HTML> <BODY> <FORM NAME=”nomedoformulario” METHOD=”POST”> O seu nome:<INPUT NAME=”nome”><BR> O seu telefone:<INPUT NAME=”email”><BR> <INPUT TYPE=”SUBMIT”> </FORM> <A HREF=”outrapagina.html”>Pode seguir por aqui</A> </BODY> </HTML> Versão digital, individual, licenciada em Fev/2000, pelo Centro Atlântico, da versão 1.0 do livro 'Programação Web com ASP' CAPÍTULO 1: INTRODUÇÃO ÀS 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 básicos essenciais do HTML, para compreender parte daquilo que vai ser demonstrado neste manual. A linguagem HMTL é bastante simples e limitada. Uma boa observação a outros sites pode fazer maravilhas aos seus conhecimentos de HMTL ;-) Quando estiver no capítulo dos exemplos deste manual, e se não estiver a perceber o código de HTML volte a consultar este capítulo onde se introduziram as Tags que poderiam causar mais dúvidas. A maioria das outras Tags e opções são quase óbvias aquando da sua tradução para português. 1.7 Sites com recursos de ASP Poderia enumerar muitas dezenas de sites com recursos a nível das ASP, alguns dos quais eu ainda recorro. Mas vou indicar aqueles que julgo valerem mesmo a pena, não apenas pelo conteúdo que têm, mas também pela maneira como apresentam o conteúdo e o organizam: www.activeserverpages.com Este é o site ‘Pai’ das ASP. Terá sido em princípio o primeiro relacionado com este assunto. Tem muitos exemplos explicados, e vários truques para aquelas dificuldades que vão aparecendo enquanto programamos. É actualizado periodicamente há muito tempo. 28 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES 2.1 Os primeiros passos Para começar irei demonstrar-lhe, em apenas uma linha, como poderá escrever uma frase; depois veremos o mesmo no HTML, com variáveis e acções entre variáveis. Isto ainda antes de definir os objectos, métodos, expressões, funções e regras das ASP. Terei como princípio que o leitor tem conhecimentos de HTML, visto ser a base de toda esta programação (programação Internet). (ficheiro cpt2-1-1.asp) <%response.write”Olá Portugal”%> Vemos aqui algo que nos salta à vista e que são os <% %>. Como se pode facilmente verificar, estes são os identificadores de onde começa e acaba a ASP que foi construída, pois quando introduzirmos código entre o HTML, teremos de definir onde estão as ASP, e estes indicadores serão determinantes para esse propósito. Response é um objecto das ASP que conta com bastantes métodos. Este e o objecto Request vão ser sem sombra de dúvidas aqueles com que irá trabalhar mais. Encontra uma tabela no capítulo seguinte com os objectos principais e seus métodos de maneira que sempre que necessitar os possa encontrar mais rapidamente consultando a tabela. (ficheiro cpt2-1-2.asp) <% pais = “Portugal” response.write”Olá “ & pais %> Este segundo exemplo demonstra uma abordagem diferente mas com o mesmo resultado no browser. Aqui pretendo demonstrar a maneira como se fazem ligações com o símbolo & 30 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES Neste exemplo foi feito aquilo que de mais normal vai ser feito no resto deste manual - usar as variáveis geradas ou não nas ASP e introduzi-las no meio do código HTML. Repare no truque para que a variável fique entre o HTML. Não foi necessária a rotina response.write, sendo então introduzido apenas o caracter de igualdade seguido da variável. A plica ‘ é usada para comentar, sempre que quisermos introduzir algum comentário ao código. Neste livro vamos usá-la com frequência para dar explicações adicionais de algumas situações a nível de programação. Julgo que com estes exemplos o leitor ficou a perceber como se estrutura de um modo geral a programação em ASP. 2.2 IF, THEN, ELSE, END IF… Vamos então iniciar alguma programação básica e essencial, aquilo que une toda a programação, e que são os operadores e as expressões. Vou começar pelas expressões, e deixar uma tabela de operadores para o final deste capítulo (visto que são bastante poucos). Entretanto estes vão sendo usados nos próximos exemplos. (ficheiro cpt2-2-1.asp) <% a= 10 b=100 if a < b then response.write “a é menor que b” else if a > b then response.write “a é maior que b” end if end if %> CAPÍTULO 2: EXPRESSÕES E OPERADORES 31 A expressão IF, foi aqui usada para que em conjunto com o operador < , fizessem uma comparação. A mensagem que vai ser enviada para o browser, depende dos valores a e b. O IF tem uma estrutura simples: IF (ALGO) THEN (FAZ MAIS ALGO) END IF Ou quando as opções são várias: IF (ALGO) THEN (FAZ ALGO) END IF IF (ALGO2) THEN (FAZ ALGO2) END IF IF (ALGO3) THEN (FAZ ALGO3) END IF Mas se as opções estão em cadeia, e se uma acontecer, as outras têm de ficar anuladas. Teremos de usar a expressão ELSE: IF (ALGO) THEN (FAZ ALGO) ELSE IF (ALGO2) THEN (FAZ ALGO2) ELSE IF (ALGO3) THEN (FAZ ALGO3) END IF END IF END IF Este tipo de expressões dá muito jeito aos programadores, mas quando existem várias opções em cadeia, eu sugiro que se use a expressão CASE; fica melhor organizado, e as confusões dentro do código são bastante menores. Estas pequenas ‘regras’ que vou escrevendo neste manual, não são propriamente para serem seguidas religiosamente. Se calhar o leitor nem vai ter muitos problemas, mas quando o código começa a ficar muito extenso, o programa tende a ficar confuso. Notará isso se lá voltar ao fim de uns meses para fazer manutenção (muito comum em sites na Internet). 32 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES 2.3 FOR, WHILE, CASE… As expressões de repetição, usadas pelas ASP, são conhecidas de qualquer programador, não sendo por isso algo que precise de uma especial atenção para as tentar perceber. (ficheiro cpt2-3-1.asp) <% a= 4 b=12 if a < b then ‘ comparação entre dois valores for I=0 to a ‘ ciclo FOR response.write “ a(“ & a & ”) é maior que “ & I & “<br>” ‘ o símbolo <br> em HTML simboliza mudança de linha ‘ no mesmo parágrafo next I ‘ final de ciclo FOR else if a>b then I=a While b<I ‘ciclo WHILE Response.write “b(“ & b & ”) é menor que” & I & “<br>” I=I–1 wend ‘ final de ciclo WHILE end if end if %> Neste caso aproveitei código de um exemplo inteiro, para lhe dar mais umas linhas com este ciclo WHILE. Inicialmente faz-se a primeira comparação, que se repetirá enquanto a mesma for válida. Neste caso enquanto b for menor que I, o ciclo (loop) vai sendo concretizado. A minha expressão de repetição favorita, é a CASE, muito flexível e rápida. Por mais tarde que eu volte a mexer no código, fico a sempre perceber o que lá se passa em minutos. CAPÍTULO 2: EXPRESSÕES E OPERADORES 33 (ficheiro cpt2-3-2.asp) <% resposta = 4 Select case resposta case “1” response.write “ Não é ” & resposta case “2” response.write “ Não é ” & resposta case “3” response.write “Acertou é ” & resposta case “4” response.write “ Não é ” & resposta case else response.write”Desconhecido….” end select %> Neste case a comparação é feita por hipóteses em função de uma resposta (variável resposta), tendo-se atenção à mesma, iremos fazer uma comparação com as hipóteses possíveis (1, 2, 3 e 4 são as únicas possíveis) e executar a declaração correspondente (se acertou ou se não acertou). (ficheiro cpt2-3-3.asp) <CENTER><TABLE BORDER=”1”> <% contador = 1 while contador<6%> <TR> <TD BGCOLOR=”RED””> <FONT COLOR=”WHITE”><%=contador%></FONT></TD> <TD><%=(contador-1)%></TD> <TD><%=(contador+1)%></TD> <TD><%=(contador*100)%></TD> </TR> <% contador = contador + 1 wend %> </TABLE></CENTER> Neste caso, fui usar novamente o WHILE, mas com o intuito do 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 programação com bases de dados. Introduzindo o valor que se quer dentro de cada célula da tabela, é o truque que origina, as grandes tabelas dos sites de comércioelectrónico. Além de texto, pode introduzir um novo esquema de tabelas e/ou imagens. CAPÍTULO 2: EXPRESSÕES E OPERADORES 35 2.4 Variáveis Nas ASP, as variáveis são também, como no Visual Basic, dinâmicas, não sendo por isso necessária a sua inicialização. Seja como for, é ‘má’ programação usar variáveis globais sem controlo sobre as mesmas. Deve-se usar, mas não em excesso, assim como se devem sempre inicializar as mesmas, não só para melhor controlo, mas também para melhor performance. Para que não se ‘desleixe’ com as variáveis, use o código <% Option Explicit %> no início de cada página para que tenha de inicializar sempre as variáveis. Assim, as alocações de memória, para as variáveis dinâmicas, serão feitas com uma melhor estrutura, ficando por esse motivo beneficiado o desempenho das suas páginas. Para inicializar uma variável em ASP basta usar Dim . Para criarmos a variável ‘xpto’ usamos então <%Dim xpto%> Temos nas ASP, alguns tipos de variáveis a considerar: - variáveis usuais (usadas no momento, e que, como são dinâmicas, podem ser criadas a qualquer altura sem inicialização das mesmas; podemos incluir os arrays neste grupo, que podem ser passados para as variáveis de sessão). Normalmente quando as inicializamos usamos a expressão Dim variável - variáveis Application (usadas como globais no site pois todos os utilizadores têm acesso à mesma); - variáveis de sessão/Session (usadas para acompanharem toda uma sessão de acesso por parte de um utilizador, mas só acessíveis por este, e não por todos como as de Application). 36 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES 2.5 Operadores Apesar de já terem sido praticamente todos usados neste capítulo, vou então deixar uma pequena tabela dos operadores, para referência. Os operadores de comparação e igualdade são os seguintes: TIPO DE OPERADOR DESCRIÇÃO = Igualar a… · if a = b · c=d < Menor do que… · if a < b · while c < x > Maior do que… · if a > b · while c > x <= Menor ou igual do que… · if a <= b · while c <= x >= Maior ou igual do que… · if a >= b · while c >= x <> Diferente de… · if a <> b · while c <> x Estes são os operadores principais das ASP, e será com estes que iremos trabalhar ao longo deste manual. Estes operadores não serão usados única e exclusivamente no código de ASP, mas também aquando do uso de declarações de SQL. CAPÍTULO 2: EXPRESSÕES E OPERADORES 37 Quando queremos fazer comparações múltiplas podemos então usar AND ou OR, como nos seguintes casos: (ficheiro cpt2-5-1.asp) <% a = 10 b = 20 c = “Teste” If a > 9 AND a <=20 then Response.write “ (a) está entre 9 e 20 <br>“ End if %> Nos operadores aritméticos temos então uma outra tabela: TIPO DE OPERADOR DESCRIÇÃO ^ Usado para expoente, (Para o caso de 26, temos nas ASP , (2^6)) * Multiplicador, (2*5) / Divisão para retornar valor singular… (a / b) \ Divisão inteira… (a \ b) + Soma… (a+b) Este valor também funciona para concatenação tal como o símbolo & - Diferença… (a–b) MOD Resto da divisão… ( a MOD b ) Podemos então demonstrar todos os operadores aritméticos da tabela anterior, num ficheiro de ASP. 38 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES (ficheiro cpt2-5-2.asp) <% a=2 b=8 c = 10 st1 =”Desta maneira” st2 = “ também podemos concatenar strings.” Response.Write “a = 2<br>” Response.Write “b = 8<br>” Response.Write “c = 10<br>” Response.write “st1 = ‘Desta maneira’<br>” Response.write “st2 = ‘ também podemos concatenar strings.’<br>” Response.Write “<br><br>” Response.Write “- b^a -> “ & b^a & “<br>” Response.Write “- a*b -> “ & a*b & “<br>” Response.Write “- c/a -> “ & c/a & “<br>” Response.Write “- a\b -> “ & a\b & “<br>” Response.Write “- a-b -> “ & a-b & “<br>” Response.Write “- a+b -> “ & a+b & “<br>” Response.Write “- c MOD a -> “ & c MOD a & “<br>” Response.Write “- st1 + st2 -> “ & st1+st2 & “<br>” %> E para se perceber um pouco melhor o que está a acontecer neste código, pode recorrer à seguinte imagem, que julgo responder a qualquer dúvida com que possa ter ficado. Fig. 2.4 - Resultado do ficheiro cpt2-5-2.asp Estes operadores são muito importantes na medida em que todo o tipo de estatísticas, contas, comparações e cálculos extra os irão requerer. No dia a dia, as empresas precisam de certas situações resolvidas que por vezes não têm solução nas funções pré-definidas das ASP, e nessa altura terá de ser o leitor a desenvolver as suas próprias funções, por meio destes operadores de base. 40 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES 3.1 Tabela de Funções base das ASP Um dos aspectos que mais se destaca nas ASP são as suas funções, e a facilidade de manuseamento das mesmas. Existem funções que facilitam muito a vida a quem faz a programação de vários sites . A recursividade é um dos pontos fortes quando programamos, e as funções ajudam nesse aspecto. A tabela seguinte, tal como a tabela de objectos que existe no próximo capítulo, vão de encontro a tudo aquilo que este manual se refere - a programação de potentes sites interactivos e dinâmicos. Será a partir deste capítulo que o leitor se irá confrontar com exemplos realmente essenciais para a programação do dia a dia de sites profissionais. Espero que estas tabelas vão de encontro às necessidades do leitor, que quer procurar rapidamente aquela função ou objecto que necessita no momento em que está a programar. A tabela está por ordem alfabética para facilitar a procura de qualquer uma das funções que possa ser necessária. As funções são da versão 2.00 das ASP, pertencente ao VBScript V4. TABELA DE FUNÇÕES DAS ASP Função Descrição Abs() Esta função serve para devolver números absolutos, sejam eles de que tipo forem. Ex. variavel = Abs(23.34) ‘ devolve 23.34 variavel = Abs(-23.34) ‘ devolve 23.34 Array() Os arrays servem para definirmos listas de valores dentro de uma mesma variável. São muito usados para simplificar actos muito comuns em programação, a todos os níveis. Um array é constituído por vários valores que estão separados por uma posição. O array variavel(“João”, 3, 1200, “Sol”), tem 4 posições. As posições de um array começam sempre do 0. Para acedermos aos dados que esta tem, basta indicarmos a posição que nos interessa. Ex. variavel(“João”, 3, 1200, “Sol”) Response.write variavel(0) ‘ devolve João Response.write variavel(1) ‘ devolve 3 Response.write variavel(3) ‘ devolve Sol CAPÍTULO 3: FUNÇÕES 41 Asc() Devolve o número ASCII de um caracter Ex. variavel1 = Asc(“C”) ‘devolve 67 variavel2 = Asc(“1”) ‘devolve 49 Atn() Serve para calcular o arco-tangente de um valor Ex. Atn(1) ‘ devolve 0,785398163397448 CBool() Retorna True ou False: False se a expressão for falsa, caso contrário True Ex. Cbool(32=32) ‘ devolve True Cbool(10=32) ‘ devolve False CByte() Transforma qualquer valor (do tipo não Byte) para o tipo Byte Ex. CByte(225.1278) ‘ devolve 225 CCur() Idêntico a CByte(), mas neste caso para o tipo de moeda usado. CDate() Converte uma expressão que tende para uma Data, numa Data validada, não sendo necessário usar IsDate() Ex. variavel1 = Cdate(“Dezembro 1, 1990”) ‘ a variável1 fica com uma data válida CDbl() Converte um valor (do tipo não Double) para o tipo Double Chr() Ao contrário da função Asc(), esta converte os valores ASCII para o caracter correspondente Ex. Chr(67) ‘devolve C Chr(49) ‘ devolve 1 CInt() Converte um valor (do tipo não Intenger) para o tipo Integer CLng() Converte um valor (do tipo não Long) para o tipo Long Cos() Devolve o coseno de um ângulo 42 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES CreateObject() Cria uma referência a um objecto externo Ex. Set Objecto=Server.CreateObject(“Projecto.Objecto”) Csng() Converte um valor (do tipo não Single) para o tipo Single CStr() Converte um valor (do tipo não String) para o tipo String Ex. CStr(123) ‘ devolve uma string “123” Date() Devolve a Data corrente no servidor Internet Ex. response.write Date() DateAdd() Esta função serve para o programador obter uma data posterior ou anterior àquela que pretende usar para cálculo. Podemos querer saber qual o dia referente a 20 dias depois da data pretendida, ou 1 mês, ou 2 anos. A expressão usa 3 campos, o primeiro para introduzirmos o campo de data por onde queremos calcular a diferença, o segundo campo para o valor numérico dessa diferença, e no final a data de início. O campo do caracter que define o tipo de diferença aceita as seguintes opções: h – horas n – minutos s – segundos yyyy – anos q – quarto anual m – meses do ano y – dias do ano d – dias w – dias da semana ww – semanas do ano Ex. DateAdd(“m”, 1, “31-Jan-2000”) ‘ devolve 29-Fev-2000 DateAdd(“d”, 1, “31-Jan-2000”) ‘ devolve 1-Fev-2000 DateDiff() Devolve a diferença entre duas datas escolhendo um dos campos de comparação explicados em DateAdd() Ex. DateDiff(“d”, Now, “31-Jan-1999”) ‘ devolve a diferença entre a data de hoje e o dia 31 de Janeiro de 1999 CAPÍTULO 3: FUNÇÕES 43 DatePart() É dada uma certa data e obtemos em que altura do ano acontece usando os valores de campo de DateAdd() Ex. DatePart(“q”, “31-Set-2000”) ‘ devolve o quarto do ano em que a data se aplica DateSerial() Devolve uma data para especificados ano, mês e dia DateValue() Devolve uma data válida daquela que é pedida Day() Devolve o dia do mês de uma data Ex. Day(“31-Set-2000”) ‘ devolve 31 Exp() Devolve a exponencial de um valor Filter() Pesquisa um array, para procura de um valor ou expressão Ex. variavel1(“Internet”,”Sites”,”Hosting”,”Portugal”) Filter(variavel1,”Si”) ‘ devolve Sites Fix() Devolve o inteiro de um qualquer valor FormatCurrency()Transforma um valor normal numérico para valor monetário. Ex. FormatCurrency(32420) ‘ devolve 32.420$00 FormatDateTime() Funciona como FormatCurrency() mas para datas FormatNumber() Formata um número da maneira que nos convém FormatPercent() Devolve uma percentagem do universo que o programador pretende Ex. FormatPercent(23/230) ‘ devolve 10,00% GetObject() Devolve a referência a um objecto Hex() Transforma um valor para resultado hexadecimal Hour() Devolve a hora de uma expressão Ex. Hour(Now()) ‘ devolve a hora do momento InStr() Devolve a posição de uma string dentro de outra a contar do início Ex. InStr(1,”Hoje é um bom dia para se programar”, “ra”) ‘ devolve 21 44 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES InStrRev() Devolve a posição de uma string dentro de outra a contar do fim Ex. InStr(1,”Hoje é um bom dia para se programar”, “ma”,35,0) ‘ devolve 33 IsArray() Devolve True ou False em relação a uma variável, validando-a no caso de ser ou não um array IsDate() Devolve True ou False em relação a uma string, validando-a no caso de esta ser do tipo Date ou não IsEmpty() Valida uma variável, para ver se a mesma está ou não vazia IsNull() Valida uma variável para ver se a mesma é Null ou não IsNumeric() Valida uma string/valor para ver se o mesmo é numérico ou não IsObject() Valida um Objecto, certificando-se se o mesmo o é ou não Join() Junta todas as variáveis dentro de um array, criando uma só. Ex. variavel(0) = “Hoje ” variavel(0) = “está ” variavel(0) = “bom ” variavel(0) = “tempo.” variavel2 = Join(variavel) ‘a variavel2 ficará igual a “Hoje está bom tempo.” LBound() Devolve o menor valor da dimensão de um array LCase() Devolve uma string em ‘lower case’ Ex. LCase(“Estamos em Setembro.”) ‘ devolve “estamos em setembro.” Devolve um certo número de caracteres a contar do lado esquerdo da string Ex. Left(“Vamos programar ASP.”,3) ‘devolve “Vam” Left() Len() Devolve o tamanho de uma string Ex. Len(“Vamos programar ASP.”) ‘ devolve 20 CAPÍTULO 3: FUNÇÕES 45 Log() Devolve o logaritmo de um dado número LTrim() Devolve uma string sem espaços do lado esquerdo Ex. LTrim(“ Isto é um teste.”) ‘ devolve “Isto é um teste.” Mid() Serve para termos um número dado de caracteres de uma string, a partir de uma dada posição Ex. Mid(“Vamos programar ASP.”, 7, 9 ) ‘ devolve “programar” Minute() Devolve o minuto de uma data/hora Month() Devolve o valor correspondente ao mês de uma dada data Ex. Month(date()) ‘ devolve o valor do mês em que estiver a testar o código MonthDate() Devolve o nome do mês (por extensão) Ex. MonthDate(10) ‘ devolve “Outubro” Now() Devolve a data e hora corrente Oct() Devolve o valor octal de um dado número Replace() Altera certo caracter/string por outro dado Ex. replace(“yyXiiXppX22fXjX” , ”X” , ”P” ) ‘ devolve “yyPiiPppP22fPjP” RGB() Devolve um valor representativo de uma cor. A expressão é estruturada por RGB(vermelho, verde, azul) Os valores usados vão de 0 a 255 Ex. RGB(22,233,143) ‘ devolve 9431318 Right() Funciona como a função Left() mas a contar da direita Rnd() Retorna um valor aleatório Round() Faz arredondamento a valores numéricos Ex. Round(23,77) ‘ devolve 24 46 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES Second() Devolve os segundos de uma dada hora Sgn() Devolve o sinal de um valor Ex. Sgn(2) ‘ devolve 1 Sgn(-12) ‘ devolve –1 Sgn(0) ‘ devolve 0 Sin() Devolve o seno de um ângulo indicado Space() Introduz um dado número de espaços numa string Ex. response.write “Teste“ & Space(12) & “Feito…” ‘devolve “Teste Feito…” Split() Divide uma string num array, escolhendo o critério de separação Ex. resultado = Split(“IstoKéKmaisKumKteste.”, “K”, -1, 1) ‘ devolve ; ‘ resultado(0) = “Isto” ‘ resultado(1) = “é” ‘ resultado(2) = “mais” ‘ resultado(3) = “um” ‘ resultado(4) = “teste.” Sqr() Devolve a raiz quadrada de um valor StrComp() Compara duas strings, devolvendo um valor, no que respeita se são iguais ou não. A estrutura desta função é StrComp(var1,var2,tipo) Var1 e var2 são duas strings à escolha, o tipo pode ser definido por 0 (comparação entre binários) ou 1 (comparação entre textos) Ex. var1 = “Teste” var2 = “ TesTE” StrComp( var1, var2) ‘ devolve 1 StrComp( var1, var2, 0) ‘ devolve –1 StrComp( var1, var2, 1) ‘ devolve 0 StrReverse() Devolve uma string dada, invertendo-a Ex. StrReverse(“123456”) ‘ devolve “654321” String() Devolve repetidamente um caracter escolhido um número de vezes definido Ex. String(“C”,10) ‘ devolve “CCCCCCCCCC” Tan() Devolve a tangente de um determinado número CAPÍTULO 3: FUNÇÕES 47 Time() Devolve a hora do sistema TimeSerial() Devolve uma hora para hora, minuto e segundos especificados TimeValue() Devolve uma hora válida daquela que é pedida TypeName() Devolve o tipo de variável que estamos a usar Ex. TypeName(“ASP”) ‘ devolve “String” TypeName(12.40) ‘ devolve “Double”. TypeName(NullVar) ‘ devolve “Null” TypeName(ArrayVar) ‘ devolve “Variant()”. TypeName(6) ‘ devolve “Integer” UBound() Devolve o maior valor da dimensão de um array Ucase() Devolve uma string em ‘upper case’ Ex. LCase(“Estamos em Setembro.”) ‘ devolve “ESTAMOS EM SETEMBRO.” VarType() Parecido com TypeName(), mas devolve um valor correspondente aos dados da variável a validar. Os números possíveis de resposta são: 0 – Vazio 1 – Null 2 – Integer 3 – Long 4 – Single 5 – Double 6 – Currency 7 – Date 8 – String 9 – Object 10 – Error 11 – Boolean 12 – Variant 13 – Data Access Object (DAO) 17 – Byte 8192 – Array WeekDay() Devolve o dia da semana de uma dada data Ex. WeekDay (“Outubro 10, 1999”) ‘ devolve 1 que representa Domingo WeekDayName() Devolve por extenso o dia da semana de uma dada data Ex. WeekDayName (1) ou WeekDayName(WeekDay (“Outubro 10, 1999”)) ‘ devolvem ambas as expressões domingo Year() Devolve o ano de uma dada data 48 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES Apesar da existência de um número considerável de funções nas ASP estas vingam não pela quantidade das mesmas, mas sim, nos objectos que existem. Com os objectos que as ASP disponibilizam, o leitor poderá criar potentes funções próprias, ou componentes para estas em Visual Basic. Este assuntos serão abordados noutros capítulos, mas que não terão nexo se o leitor não conhecer o funcionamento de procedimentos e funções em ASP, ou até mesmo o uso de ficheiros externos. Neste capítulo ainda não irá aprender como interagir com o utilizador, mas sim tratar de todo o tipo de dados e/ou variáveis que lhe poderão aparecer. 3.2 As nossas Funções O leitor tem acesso a todas as funções disponíveis pelas ASP 2.00, e a partir de agora pode definir as suas próprias funções. Não esquecer que as ASP 3.00 vêm com o Windows 2000 e o seu IIS5, como indicado no primeiro capítulo. Nos próximos casos as funções que vão ser criadas serão para situações que por vezes aparecem na programação de sites Internet. Neste primeiro exemplo criou-se uma função que devolve o número de dias que faltam até ao ano 2001 a partir de uma dada data. (ficheiro cpt3-2-1.asp) <% Function a2001(data) ‘ início da função If IsDate(data) then ‘ se for uma data for válida ‘ então envia-se a diferença entre datas a2001 = DateDiff(“d”,data,”Janeiro 1, 2001") else ‘ caso contrário ‘ enviamos a data como inválida, em forma de informação a2001 = “Data inválida...” end if ‘ final do if End Function ‘ final da função Response.Write “Hoje é “ & now() & “<br><br>” ‘ escreve a data corrente ‘ escreve-se então o resultado Response.write “Faltam “ & a2001(now()) & “ dias até ao ano 2001.” %> CAPÍTULO 3: FUNÇÕES 49 Foram usadas as seguintes funções: IsDate() DateDiff() Now() para nos certificarmos se a dada data tinha realmente um formato válido de data; que retorna o número de dias até ao ano 2001 (o número de dias pois é isso que foi estabelecido, aquando do campo “d”); dá-nos a data corrente, que inclui as horas. Como se viu, as funções têm uma estrutura própria: Function nome_da_funcao(variavel1, variavel2, variaveln) ……. Nome_da_funcao = resposta End Function Fig. 3.1 - Resultado do ficheiro cpt3-2-1.asp A maneira de chamar uma função é simples, basta o uso do nome da função em qualquer ponto do código. No próximo exemplo pretende-se saber se um e-mail é válido. Desta maneira o programa valida algo que perturba muitos programadores, para tentarem que o input dos utilizadores seja o mais correcto possível, e os e-mails introduzidos sejam o mais correctos. 50 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES (ficheiro cpt3-2-2.asp) <% Function valmail(email) ‘ início da função ‘ se o tamanho do e-mail for menor que 5 dificilmente será válido([email protected]) If Len(email) <= 5 Then Valmail=False else ‘se não existir um @ também não é válido If InStr(1, email, “@”, 1) < 2 Then valmail=False Else ‘ o ponto final é também importante If InStr(1,email, “.”, 1) < 4 Then Valmail=False Else Valmail=True End If End If End If End Function ‘ final da função if valmail(“o_meu_email@algum_email.com”) then Response.Write”O e-mail o_meu_email@algum_email.com é válido.<br>” Else Response.Write”O e-mail o_meu_email@algum_email.com não é válido.<br>” End if if valmail(“tentar@iludir”) then Response.Write “O e-mail tentar@iludir é válido.<br>” Else Response.Write “O e-mail tentar@iludir não é válido.<br>” End if %> Foram usadas as seguintes funções: Len() retorna o tamanho de uma string, para sabermos se tem o tamanho mínimo pretendido para um e-mail normal InStr() muito usado para nos certificarmos da existência do símbolo @ ou de um ponto final, sempre usado antes da extensão do domínio. O leitor tem assim, uma função que lhe valida todos os e-mails que receber como input. 52 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES (ficheiro cpt3-2-3.asp) <%@ Language=”VBScript” %> <% Function criacaixa() %><select size=”1" name=”nome”><% For I=0 to UBound(ardados) %> <option><%=ardados(I)%></option> <% Next %></select><% End Function Dim ardados(3) ‘ inicialização de array Ardados(0) Ardados(1) Ardados(2) Ardados(3) = “Alentejo” = “Minho” = “Algarve” = “Beira-Litoral” %> <form> Viajar Para ? <%=criacaixa()%> </form> Foram usadas as seguintes funções: UBound() retorna o tamanho de um array, necessário neste caso para sabermos até que ponto podemos ir com o ciclo FOR. Fig. 3.3 - Resultado do ficheiro cpt3-2-3.asp CAPÍTULO 3: FUNÇÕES 53 Como se pode ver, foi usada a linha <%@ Language=”VBScript” %> que serve para o programador ter acesso mais facilitado ao código ASP, que é conhecido como o VBScript do lado do servidor. O IIS interpreta código, e acaba por percorrer todas as linhas, quer tenham ASP ou não, se indicarmos no ínicio do ficheiro de que se trata de um ficheiro com VBScript, a sua performance será melhorada, mas não é essencial o uso desta linha no ínicio do código. Algo também muito comum são os gráficos correspondentes a opiniões, ou outros, para transmitir informação a partir dos dados em bases de dados. No exemplo seguinte pode-se perceber o truque de criar gráficos em HTML, que servem para esse mesmo propósito. O código seguinte é bastante explícito nesse ponto. O truque é o de controlar o tamanho das células das tabelas de HTML com os 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() %> CAPÍTULO 3: FUNÇÕES 55 que mantém, ou que repete bastante nas várias páginas de um mesmo site. Com os SSI, o programador introduz todas as funções que quer num ficheiro, que por sua vez é chamado no início do código ASP. A partir daí todas as funções desse ficheiro estão acessíveis na programação dessa página ASP. Devemos usar os SSI para aquele tipo de código que sabemos vai ser alterado em várias páginas. Dessa maneira, bastará alterar uma vez, para que todas as páginas fiquem actualizadas com o novo código. A maneira de se chamar um ficheiro dentro de um ASP (uso de SSI), tenha ele parte de código HTML, ou de ASP, é <!—#INCLUDE FILE=”ficheiro.inc”—> . Este código é introduzido no código HTML, e não no de ASP. Mas tem de estar num ficheiro de ASP e não no de um de HTML - um pouco confuso! Vejamos então os seguintes ficheiros, criados a partir de tudo aquilo que temos vindo a criar neste capítulo, e recorrendo ao uso de SSI (chamada de ficheiros exteriores para complementar a programação). Vamos então criar um ficheiro que tem o nosso topo de página HTML por defeito. Esse ficheiro ficará com uma extensão diferente (*.inc) para se poder diferenciar dos outros. Pode-se criar HMTL e ASP nesse mesmo ficheiro. (ficheiro cpt3-3-1.inc) <div align=”center”> <center> <table border=”0" width=”80%” bgcolor=”#0000FF”> <tr> <td width=”100%”><b><font face=”Arial” color=”#FFFFFF”>A Listagem das minhas Funções:</font></b></td> </tr> </table> </center> </div> <div align=”right”><%=FormatDateTime(Now(),2)%></div><br> Foram usadas as seguintes funções: FormatDateTime() Now() formata a data escolhida, neste caso com um Formato de tipo 2; é usada para que seja formatada a data corrente. CAPÍTULO 3: FUNÇÕES 57 (ficheiro cpt3-3-2.asp) <%@ Language=”VBScript” %> <% Function a2001(data) if IsDate(data) then a2001 = DateDiff(“d”,data,”Janeiro 1, 2001") else a2001 = “Data inválida...” end if End Function Function valmail(email) If Len(email) <= 5 Then valmail=False else If InStr(1, email, “@”, 1) < 2 Then valmail=False Else If InStr(1,email, “.”, 1) < 4 Then valmail=False else valmail=True End If End If End If End Function Function criacaixa() %><select size=”1" name=”nome”><% For I=0 to UBound(ardados) %> <option><%=ardados(I)%></option> <% Next %></select><% End Function Function criagrafico() For I=0 to UBound(ardados2) %> <table border=”0" width=”100"> <tr><td><font face=”ARIAL” size=”2"><%= ardados2(I,0)%></font></td></tr> <tr><td><table bgcolor=”blue” border=”1" width=”<%=ardados2(I,1)%>”><tr><td></td></tr></table></td></tr></table> <% Next End Function %> 58 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES Como foi visto o ficheiro cpt3-3-2.asp tem todas as funções criadas neste capítulo. Iremos incluí-lo com a potencialidade dos SSI numa outra página que usaremos para demonstrar as funções. Foi alterado o nome de um dos arrays, para que não existissem conflitos entre ambas as funções. De futuro, as funções recebem os parâmetros, para não nos preocuparmos com este tipo de situações. Vemos então no exemplo a seguir, introduzido através de SSI, o ficheiro cpt-3-3-2.asp . Para as ASP é como se todo aquele código estivesse presente no ficheiro, tomando todas as funções como locais. A partir deste momento podemos utilizar o ficheiro e todas as suas funções. (ficheiro cpt3-3-3.asp) <!—#INCLUDE FILE=”cpt3-3-2.asp”—> <!—#INCLUDE FILE=”cpt3-3-1.inc”—> <p> Iremos agora ver todos as funções do capítulo a funcionar,<br> e não precisamos de as ter neste ficheiro.<br> Desta maneira temo-las em todos os ASP que quisermos sem termos de<br> escrever o código todo de novo, ou de passar o tempo<br> no Copy & Paste...</p><br> <%Response.Write “Hoje é “ & now() & “<br>” Response.write “Faltam “ & a2001(now()) & “ dias até ao ano 2001.<br><br>” if valmail(“o_meu_email@algum_email.com”) then Response.Write “O e-mail o_meu_email@algum_email.com é válido.<br>” Else Response.Write “O e-mail o_meu_email@algum_email.com não é válido.<br>” End if if valmail(“tentar@iludir”) then Response.Write “O e-mail tentar@iludir é válido.<br>” Else Response.Write “O e-mail tentar@iludir não é válido.<br>” End if Dim ardados(3) ‘ inicialização de array Ardados(0) = “Alentejo” ardados(1) = “Minho” ardados(2) = “Algarve” ardados(3) = “Beira-Litoral” %> CAPÍTULO 3: FUNÇÕES 59 <br><br><form id=form1 name=form1> Viajar Para? <%=criacaixa()%> </form><br> <% Dim ardados2(3,3) Ardados2(0,0) = “Primeiro” ardados2(0,1) = 100 ardados2(1,0) = “Segundo” ardados2(1,1) = 40 ardados2(2,0) = “Terceiro” ardados2(2,1) = 60 ardados2(3,0) = “Quarto” ardados2(3,1) = 18 criagrafico() %> O resultado na imagem seguinte é bastante explícito daquilo que se pretendia. Temos todas as funções a funcionar, e podendo funcionar em todos os ficheiros ASP que o programador tiver para o seu site, com apenas a inserção de uma linha de código no topo de cada página ASP. Fig. 3.6 - Resultado do ficheiro cpt3-3-3.asp Agora o leitor poderá estender toda a sua programação num só ficheiro, pelo menos as funções que acha virem a ser aquelas que mais vai utilizar. 62 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES 4.1 Tabela de Objectos Os objectos que as ASP têm por defeito parecem ser poucos, mas os seus métodos são os suficientes para que o leitor consiga alcançar os objectivos pretendidos para o seu site. A maneira de usar os objectos é bastante simples, e intuitiva, funcionando como os objectos das outras linguagens. TABELA DE OBJECTOS DAS ASP Objectos Métodos e suas funções Response · Redirect usado para redireccionarmos o utilizador para outra página. Usado normalmente para controlo de utilizadores e acessos. · Cookies mecanismo para deixar informações do lado do cliente com variada informação (dentro das cookies existem outros métodos para o seu controlo, como veremos depois em pormenor). · Write é esta a maneira para enviar informação para o browser. · CacheControl desta maneira controlamos se a página pode deixar que se faça cache da mesma nos browsers (por defeito não deixa fazer cache). · Charset uma maneira de definirmos o tipo de caracteres a usar. · ContentType para definir o tipo de informação que vai ser passada, usado normalmente para UpLoad onde definimos que queremos passar não só informação usual, mas também binária, originária de ficheiros. CAPÍTULO 4: OBJECTOS 63 · Expires uma maneira de definir o tempo que uma página ficará activa e deixará de estar disponível. Neste caso definimos ao fim de quanto tempo expirará. · ExpireAbsolute idêntico ao Expires, com a diferença que se pode controlar, não com o valor que define ao fim de quanto tempo, mas sim com uma data que define a altura em que deixa de estar disponível. · IsClientConnected – desta maneira controlamos se o cliente ainda está ligado. · Status define o código que está no HTTP header. · AddHeader Ajusta dinamicamente a informação que está no HTTP header. Request · Cookies neste caso será usado para ir buscar os cookies criados com o objecto response. · Querystring desta maneira poderemos obter os valores que vêm da página anterior, depois de submetermos um formulário com o método GET. · Form este método permite-nos obter os dados enviados por um formulário que esteja com o método POST. · ServerVariables usa-se muito este método para identificar os tipos de browsers que o cliente está a usar, os IPs do mesmo, a página de onde o cliente veio, assim como variadas informações sobre o servidor que está a ser usado. 64 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES Server · HTMLEncode o método que formata a informação que o utilizador insere. Esta formatação é muito importante devido a alguns símbolos serem reconhecidos pelo HTML, e por esse motivo o layout pode não ter o aspecto planeado · URLEncode parecido com o HTMLEncode, mas formata a string de maneira a ser válida para usar na linha de address dos browsers. · CreateObject é esta a maneira como iremos aceder a objectos exteriores, assim como componentes criados por nós ou outros. Os componentes de ASP são ficheiros de extensão DLL, especiais para os ASPs, possíveis com o VB ou o VC++ (Visual C++). · MapPath é com este método que trabalharemos os nossos ficheiros localmente (no servidor). Session · Timeout as sessões do servidor têm um limite, ao fim do qual toda a informação contida nas sessions desaparecem. Desta maneira poderemos controlar o tempo que as sessões estão activas. · SessionID este é o método que nos dá o nuúmero da sessão do cliente corrente. São uma espécie de impressão digital das sessões. · Abandon força a finalização das sessões. Application A variável global, mas idêntica para todos os utilizadores, ao contrário das sessions que são variáveis do tipo global, mas só para o cliente que está nessa sessão. TextStream · CreateTextFile método de criação de ficheiros de texto. · OpentextFile método de leitura dos ficheiros de texto. CAPÍTULO 4: OBJECTOS 65 A estrutura de um objecto e seu método é do tipo objecto.método, logo, para criar-mos, por exemplo, um cookie , usamos response.cookies, e para obter o valor introduzido na cookie, usaremos então request.cookies. Depois de se ver esta tabela, muitas questões ficam no ar, em relação a vários métodos que aqui descrevemos. A sua grande maioria vai ser aprofundada nos próximos capítulos, mas iremos tratar alguns deles ainda neste capítulo, assim como desenvolver exemplos reais de como usufruir ao máximo destes objectos. 4.2 Variáveis globais e de sessão As variáveis globais/sessão, serão uma das hipóteses que o programador terá para poder passar dados de base de uma página para a outra. Normalmente quando se passa de uma página para outra, as variáveis da primeira página deixam de funcionar numa segunda. A maneira de ultrapassar este obstáculo é usando os objectos Application e Session. Apesar de ambos os objectos serem usados para variáveis globais, cada um tem um objectivo diferente, e um comportamento diferente dentro do contexto da programação de páginas ASP. Para o leitor perceber como ambas funcionam explica-se então como funciona o servidor de Internet que suporta as ASP: O servidor Internet faz um controlo de acessos às páginas que contém sob sua alçada, e por isso cria um ID para cada acesso HTTP que é feito na máquina onde está instalado e a correr. Desta forma o servidor consegue fazer uma estatística mais pormenorizada, que a grande maioria dos outros não conseguem. A partir do momento que o programador tem acesso a este ID, poderá seguir o rasto (pormenorizado) daquilo que esse utilizador faz, dentro do site. O ID de sessão, que pode aceder-se por session.sessionID, termina e passa a ser outro a partir do momento que o browser é desligado, ou que passa o tempo limite de uma sessão, que se pode aceder por session.TimeOut . Cada pessoa que está a aceder ao site tem um ID diferente, assim como que cada sessão é diferente, podendo o programador usar as sessões, para passar de variáveis de uma página para outra, visto que a ligação apenas se quebra no desligar do browser, ou no atingir do limite de tempo das sessões. Pode-se ver pelo código seguinte o ID de uma sessão e o tempo limite que está por defeito no servidor. 66 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES (ficheiro cpt4-2-1.asp) <% Response.Write “O numero desta sessão é “ & session.SessionID Response.Write “<br>O tempo de validade de uma sessão é de “ Response.write session.Timeout & “ minutos.” %> Foram usadas os seguintes objectos: Response.Write Session.SessionID Session.Timeout objecto usado para escrita, tanto em cookies, browser, headers, etc. a maneira de saber qual o código da sessão no momento. devolve o tempo de expiração das sessões, definido no momento. Fig. 4.1 - Resultado do ficheiro cpt4-2-1.asp Podemos então usar o objecto Session para passarmos todo o tipo de variáveis de uma páginas ASP para outra. Aqui então está um exemplo em que passamos uma string entre duas páginas. Ter em atenção de que estas variáveis ficam acessíveis não só na página que se corre em seguida, mas em todas aquelas que pertencerem a esse site. Por isso se para chegar-mos a um ficheiro C começando em A, tenhamos de passar por B, a sessão criada em A continua activa. CAPÍTULO 4: OBJECTOS 67 (ficheiro cpt4-2-2.asp) <% Response.Write “<br>O tempo de validade de uma sessão é de “ & session.Timeout & “ minutos.” session.Timeout = 10 Response.Write “<br> Depois de alterado passou a “ & session.Timeout session(“Teste”) = “Isto é um teste” Response.Write “<br>Entretanto foi criada uma variável de sessão Session(“”Teste””),” Response.Write “que contém a string ‘“ & session(“Teste”) & “‘ .” %> <br><br><a href=”cpt4-2-3.asp”>carregue aqui para passar à próxima página</a> Foram usadas os seguintes objectos: Session(“Teste”) Session.TimeOut a maneira de saber qual o código da sessão no momento; neste ficheiro usámos este objecto com este método, de maneira a alterarmos o tempo limite de uma sessão. A possibilidade de podermos alterar o tempo limite de uma sessão é muito importante, tanto para sites de protecção por password, como para sites mais pesados, onde necessitamos de mais tempo, pois uma página que demore muito tempo a abrir, ou a processar algo bastante pesado, possa demorar mais de 1 minuto, e nessa altura a sessão deveria ter um mínimo de 2 minutos. Aqui também pudemos ver como é possível usar “ “ dentro de uma string, ou então lá criar algo com os mesmos. Visto que as “ “ são usadas para conter strings, e outro tipo de dados, o programador para as usar terá de criar uma a mais por cada uma que lá introduzir. Tal como está no ficheiro, que vimos anteriormente. No ficheiro cpt4-2-2.asp temos então a possibilidade de ver como se altera o objecto que controla o tempo das sessões, e como criar uma sessão nossa, e lá introduzir dados que queiramos estarem acessíveis em uma ou várias páginas. Este ficheiro vai chamar um outro (cpt4-2-3.asp) para que o leitor se aperceba da maneira como foi possível criar uma sessão própria e aceder à mesma, a partir de outras páginas. CAPÍTULO 4: OBJECTOS 69 As imagens são bem elucidativas em relação ao uso de uma sessão criada pelo programador. Da mesma maneira que criada uma sessão para suportar uma string, o leitor poderá usar para criar um array ou número. As hipóteses são imensas, e a programação a este nível é bastante facilitada com este objecto. Outro objecto que é usado para tratar de variáveis globais é Application, que é criado e acessível tal como se faz com as sessões, com a particularidade que para o alterarmos tem-se de seguir certas regras. A grande diferença entre Application e Session é que enquanto as variáveis criadas pelo segundo são acedidas apenas pelo utilizador do momento, ou por aquele a quem pertence um SessionID, as variáveis Application são acedidas por todos os utilizadores, todos os SessionID. Fica assim um esquema para o leitor perceber melhor como isto funciona. Fig. 4.4 - Funcionamento das variáveis globais Pelo esquema pode-se reparar que para cada utilizador existe uma sessão independente, enquanto a variável de Application é igual para todos. Vemos então um exemplo de como criar e aceder a uma variável de Application. Repare que existem dois métodos Lock e UnLock para que a mesma possa ser alterada. Para aceder à mesma não é necessário usar as regras ditas anteriormente, e visíveis no exemplo seguinte: 70 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES (ficheiro cpt4-2-4.asp) <% Application.Lock Application(“Teste2”) = “Uma variável acessível por todos os utilizadores...” Application.UnLock Response.Write “ Avariável Application(“”Teste2"”) é > “ Response.Write Application(“Teste2”) & “ <“ %> Foram usados os seguintes objectos: Application.Lock serve para trancar a variável aos utilizadores, de maneira a poder ser alterada a variável; Application(“Teste2”) da mesma maneira que se usa as Sessions, pode-se criar uma variável e aceder à mesma; Application.UnLock usado para depois que é alterada a variável, tirando o Lock. Fig. 4.5 - Resultado do ficheiro cpt4-2-4.asp CAPÍTULO 4: OBJECTOS 71 4.3 Interagir com o utilizador Aquilo que realmente faz a diferença entre as páginas estáticas e as páginas dinâmicas é a possibilidade de resposta aos utilizadores em tempo real. Podem-se programar páginas que recebendo um input de um utilizador, estas respondem de acordo com os dados recolhidos, e isso não se pode fazer apenas com HMTL, e outros recursos básicos. Para se recolher dados do utilizador é necessário criar uma estrutura que permite o utilizador inseri-los, de maneira que o programador possa trabalhar com os mesmos. Em primeiro lugar é criado um formulário HTML, que tanto pode estar numa simples página HTML, como numa página ASP. O utilizador pode ter uma página HTML com o formulário que depois de submetido vai buscar um ficheiro ASP, onde o programador pode recolher os dados e trabalhar sobre eles. Ou então o programador numa mesma página ASP controla o input que é feito, e conforme o estado em que o contexto se encontra, conforme a acção que é accionada. Mas com os ficheiros de exemplo seguintes, o leitor vai perceber as diferenças. (ficheiro cpt4-3-1.html) <form action=”cpt4-3-1.asp” method=”POST”> Nome: <input type=”text” name=”nome” size=”20"><br> Idade: <input type=”text” name=”idade” size=”2" Maxlength=”2"><br> Telefone: <input type=”text” name=”telefone” size=”12" Maxlength=”14"><br> <input type=”submit” value=”Enviar”> </form> Foram usadas as seguintes Tags: Application.Lock serve para trancar a variável aos utilizadores, de maneira a poder ser alterada a variável; Application(“Teste2”) da mesma maneira que se usa as Sessions, pode-se criar uma variável e aceder à mesma; Application.UnLock usado para depois que é alterada a variável, tirando o Lock. CAPÍTULO 4: OBJECTOS 73 (ficheiro cpt4-3-2.asp) <%Sub usar_dados()%> O utilizador <strong><%=Request.Form(“nome”)%></strong>, tem <strong><%=Request.Form(“idade”)%></strong> anos<br> e está acessível pelo número de telefone <strong><%=Request.Form(“telefone”)%></strong> ! <%End Sub%> <%Sub formulario()%> <form action=”cpt4-3-2.asp” method=”POST” id=form1 name=form1> Nome: <input type=”text” name=”nome” size=”20"><br> Idade: <input type=”text” name=”idade” size=”2" Maxlength=”2"><br> Telefone: <input type=”text” name=”telefone” size=”12" Maxlength=”14"><br> <input type=”submit” value=”Enviar” name=”submeter”> </form> <%End Sub%> <% if Request.Form(“submeter”)=”” then formulario else usar_dados end if %> Usando um só ficheiro ASP simulamos os dois ficheiros anteriores, num só, poupando ‘burocracia’ algorítmica. Fig. 4.8 - Resultado inicial do ficheiro cpt4-3-2.asp CAPÍTULO 4: OBJECTOS 75 - rendimento mensal entre 80.000$00 e 100.000$00 e média maior que 13 valores; - rendimento mensal entre 100.000$00 e 160.000$00 e média maior que 16; - média maior que 18; - o aluno não pode ter menos de 10 anos e mais de 28. Não vamos aprofundar muito com questões das quantidades envolvidas, mas vamos então pedir os dados necessários para que possamos dizer se tem hipótese ou não no caso de se candidatar. Além de dizermos isso, vamos calcular a idade do aluno pela data de nascimento. Desta forma o leitor perceberá mais alguns pontos de desenvolvimento ASP a este nível e poderemos então criar um pequeno curso online que demonstra muito genericamente uma das grandes potencialidades da Internet, a formação online. Continuando então, vamos criar o formulário com as perguntas, e não esquecendo os nomes de cada Tag de input, nomes esses que serão os identificadores no uso do objecto request. Vamos por partes, neste caso vamos estudar a estrutura a desenvolver. Separemos por partes o que vai ser feito: - Formulário de pedido de dados do aluno; - Validação dos dados do aluno; - Apresentação do resultado. Estas 3 fases distintas podem ser feitas em 3 procedimentos diferentes. Criaremos um procedimento formulario(), dados_validar() e resposta(). Ficamos assim com os 3 pontos definidos. Basta agora criar o código que os vai colocar em produção. Comecemos pelo formulário que vai pedir os dados ao utilizador: 76 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES <%Sub formulario()%> <p align=”center”><I><b> <font size=”4" color=”#800000">Simulador de Bolsas de Estudo</font></b></I> <br> <div align=”center”> <center> <FORM name=”bolsa” method=”POST”> <table border=”0" width=”400" bgcolor=”#CED299"><tr> <td width=”100%” align=”left”> <strong> <font size=”2" face=”ARIAL” color=”RED”> <%=session(“erro”)%></font></strong> <font face=”Arial”><b>Nome: </b></font> <input type=”text” name=”nome” size=”44" value=”<%=Request.Form(“nome”)%>” maxlength=”50"> <font face=”Arial”><b><br>Data de Nascimento:</b></font> <input type=”text” name=”dia” size=”2" value=”<%=Request.Form(“dia”)%>” maxlength=”2"><input type=”text” name=”mes” maxlength=”2" value=”<%=Request.Form(“mes”)%>” size=”2">- 19 <input type=”text” name=”ano” size=”2" maxlength=”2" value=”<%=Request.Form(“ano”)%>”><b> <font face=”Arial”><br>Média do último ano:</font></b> <input type=”text” name=”media” value=”<%=Request.Form(“media”)%>” size=”2" maxlength=”2">valores<b> <font face=”Arial”><br>Rendimento mensal dos pais:</font></b> <input type=”text” name=”rendimento” value=”<%=Request.Form(“rendimento”)%>” maxlength=”7" size=”7">$00 <p align=”center”><input type=”submit” value=”Simular” name=”submeter”><br></p> </td> </tr></table> </FORM> </center> </div> <%End Sub%> 78 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES Este código é introduzido antes de se usarem os procedimentos pois queremos que as variáveis sejam dadas como variáveis públicas dentro deste ficheiro ASP. Desta forma, é mais fácil tratar os dados e escusamos de estar sempre a usar o código Request.Form (“…..”), bastando assim apenas o nome que atribuímos a cada um dos argumentos que são passados. A variável Data fica com uma formatação diferente, pois queremos construir uma data real, para que no uso da função IsDate() disponhamos à partida de algo semelhante para validação. <%Sub dados_validar()%> <% session(“erro”) = “” ‘ se não for data a variável de sessão fica com o erro correspondente if not(IsDate(data)) then session(“erro”) = “* A data está inválida...<br>” else if (not(IsNumeric(media))OR ((media<0)OR(media>20))) then session(“erro”) = “* A média é inválida...<br>” else if not(IsNumeric(rendimento)) then session(“erro”) = “* O rendimento está inválido...<br>” end if end if end if if session(“erro”)<>”” then formulario else resposta end if %> <%End Sub%> Como se viu foram validadas todas as variáveis que o formulário apanhou do utilizador, e validadas conforme aquilo que se pretendia: a data validada como data e o rendimento e média do aluno como números, para que não sejam aceites letras ou outros caracteres idênticos. E no final é chamado o formulario() ou o procedimento resposta(), conforme o que se pretende. No caso de existir algum erro nas variáveis que foram pedidas, o utilizador é enviado novamente para o formulário, que mantém os dados anteriores, visto que os está sempre a apanhar com Request.Form(). Caso contrário, e visto que está tudo certo, o utilizador recebe a resposta em relação à sua simulação. Esta resposta é dada a partir do código que vemos a seguir. CAPÍTULO 4: OBJECTOS 79 <%Sub resposta()%> <%session(“erro”) = “”%> <div align=”center”> <center> <table border=”0" width=”400" bgcolor=”#CED299"> <tr><td width=”100%” align=”left”> <%idade = DateDiff(“yyyy”, data, Now) if (idade>10 and idade<28) then%> <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 média de </font> <font face=”Arial” size=”4" color=”#FF0000"><%=media%></font> <font color=”#800000" face=”Arial” size=”3">valores<br>nascido em </font> <font face=”Arial” size=”4" color=”#FF0000"><%=data%></font> <font color=”#800000" face=”Arial” size=”3"><br></font> <font face=”Arial” size=”4" color=”#FF0000"> <% if ((rendimento<=80000)AND(media>11)) then mensagem = “ tem “ else if ((rendimento>80000 AND rendimento<100000) AND (media>13)) then mensagem = “ tem “ else if ((rendimento>=100000 AND rendimento<160000) AND (media>16)) then mensagem = “ tem “ else if (media>18) then mensagem = “ tem “ else mensagem = “ não tem “ end if end if end if end if Response.Write mensagem%> </font> <font color=”#800000" face=”Arial” size=”3">direito<br>à bolsa de estudo.<br></font></b></p><br> <% else%> <br><center><strong><font face=’ARIAL’ color=’red’ size=’3'> Não é possivel concorrer à bolsa de estudo<br> com <%=idade%> anos.</font></strong></center><br> <%end if%> </td></tr></table> <br><br><a href=”cpt4-3-3.asp”>repetir a simulação</a> </center> </div> <%End Sub%> CAPÍTULO 4: OBJECTOS 81 Como podemos ver na imagem anterior, a resposta que se obteve foi negativa, depois de se terem efectuadas as comparações com os requisitos definidos para a atribuição de bolsa ao estudante. Teve-se o cuidado de se criar uma tabela com um texto de resposta por defeito, que só altera as zonas que são correspondentes aos dados que o utilizador introduziu. Neste caso é usado o DateDiff (), para que os alunos com uma idade não válida para as bolsas sejam avisados disso. No caso contrário é enviada a resposta em relação ao apoio por Bolsa de Estudo. Introduziu-se um link para o caso do utilizador querer recomeçar a simulação. Será aqui que tudo recomeçará, tendo em conta que a variável de sessão tem de estar vazia, ou o último erro continuaria a aparecer apesar de ser uma nova simulação. Por isso esta função começa com a sessão de erro a ser limpa, pois para se ter chegado a este ponto era porque as variáveis estavam correctas. Depois desta explicação, podemos ver o código por completo, para percebermos melhor o seu funcionamento. (ficheiro cpt4-3-3.asp) <%Sub resposta()%> <%session(“erro”) = “”%> <div align=”center”> <center> <table border=”0" width=”400" bgcolor=”#CED299"> <tr><td width=”100%” align=”left”> <%idade = DateDiff(“yyyy”, data, Now) if (idade>10 and idade<28) then%> <p align=”center”><b><font color=”#800000" face=”Arial” size=”3"><br> O Aluno</font> <font face=”Arial” size=”4" color=”#FF0000"><%=nome%></font> <font color=”#800000" face=”Arial” size=”3"> , <br>com a média de </font> <font face=”Arial” size=”4" color=”#FF0000"><%=media%></font> <font color=”#800000" face=”Arial” size=”3">valores<br>nascido em </font> <font face=”Arial” size=”4" color=”#FF0000"><%=data%></font> <font color=”#800000" face=”Arial” size=”3"><br></font> <font face=”Arial” size=”4" color=”#FF0000"> <% if ((rendimento<=80000)AND(media>11)) then mensagem = “ tem “ else if ((rendimento>80000 AND 82 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES rendimento<100000)AND(media>13)) then mensagem = “ tem “ else if ((rendimento>=100000 AND rendimento<160000)AND(media>16)) then mensagem = “ tem “ else if (media>18) then mensagem = “ tem “ else mensagem = “ não tem “ end if end if end if end if Response.Write mensagem%> </font> <font color=”#800000" face=”Arial” size=”3">direito<br>à bolsa de estudo.<br></font></b></p><br> <% else%> <br><center><strong><font face=’ARIAL’ color=’red’ size=’3'> Não é possível concorrer à bolsa de estudo<br> com <%=idade%> anos.</font></strong></center><br> <%end if%> </td></tr></table> <br><br><a href=”cpt4-3-3.asp”>repetir a simulação</a> </center> </div> <%End Sub%> <%Sub dados_validar()%> <% session(“erro”) = “” if not(IsDate(data)) then session(“erro”) = “* A data está inválida...<br>” else if (not(IsNumeric(media))OR ((media<0)OR(media>20))) then session(“erro”) = “* A média é inválida...<br>” else if not(IsNumeric(rendimento)) then session(“erro”) = “* O rendimento está inválido...<br>” end if end if end if CAPÍTULO 4: OBJECTOS 83 if session(“erro”)<>”” then formulario else resposta end if %> <%End Sub%> <%Sub formulario()%> <p align=”center”><i><b><font size=”4" color=”#800000">Simulador de Bolsas de Estudo</font></b></i> <br> <div align=”center”> <center> <FORM name=”bolsa” method=”POST”> <table border=”0" width=”400" bgcolor=”#CED299"><tr> <td width=”100%” align=”left”> <strong><font size=”2" face=”ARIAL” color=”RED”><%=session(“erro”)%> </font></strong> <font face=”Arial”><b>Nome: </b></font> <input type=”text” name=”nome” size=”44" value=”<%=Request.Form(“nome”)%>” maxlength=”50"> <font face=”Arial”><b><br>Data de Nascimento:</b></font> <input type=”text” name=”dia” size=”2" value=”<%=Request.Form(“dia”)%>” maxlength=”2"><input type=”text” name=”mes” maxlength=”2" value=”<%=Request.Form(“mes”)%>” size=”2">- 19 <input type=”text” name=”ano” size=”2" maxlength=”2" value=”<%=Request.Form(“ano”)%>”><b> <font face=”Arial”><br>Média do último ano:</font></b> <input type=”text” name=”media” value=”<%=Request.Form(“media”)%>” size=”2" maxlength=”2">valores<b> <font face=”Arial”><br>Rendimento mensal dos pais:</font></b> <input type=”text” name=”rendimento” value=”<%=Request.Form(“rendimento”)%>” maxlength=”7" size=”7">$00 <p align=”center”><input type=”submit” value=”Simular” name=”submeter”><br></p> </td> </tr></table> </FORM> </center> </div> <%End Sub%> 84 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES <% nome = Request.Form(“nome”) data = Request.Form(“dia”) & “-” & Request.Form(“mes”) & “-19” & Request.Form(“ano”) media = Request.Form(“media”) rendimento = Request.Form(“rendimento”) if (Request.Form(“submeter”)=””) then formulario else dados_validar end if %> Foram usados os seguintes objectos e funções: Session () usado neste caso para que tenhamos uma variável que guarde o tipo de erro que foi achado nos dados introduzidos pelo utilizador; DateDiff () DateDiff (), assim como está explicado na tabela de funções, serve para devolver uma diferença entre duas datas, tanto em dias, anos, minutos, …. Neste caso usamos para devolver os anos entre o dia de hoje, e a data de nascimento introduzida pelo utilizador. Esta variável é depois usada para sabermos se o mesmo reúne condições para poder receber resposta da aplicação; IsDate () O IsDate, devolve True ou False, conforme a data indicada seja ou não uma data válida; IsNumeric () Como o IsDate, este também é booleano, e indica se a variável é numérica ou não; Request.Form () Esta é a maneira de o programa aceder aos dados submetidos pelo último formulário. No seguinte exemplo é criado um curso online, bastante simples, de resposta múltipla. Este exemplo é importante, pois, caso o leitor o compreenda terá uma boa noção das potencialidades das variáveis de sessão, e passagem de parâmetros entre vários procedimentos. Necessitamos claro, de perguntas, respectivas respostas, validação das respostas, e uma apresentação do resultado depois do teste. CAPÍTULO 4: OBJECTOS 85 Definimos então alguns procedimentos: - Procedimentos de perguntas (onde teremos um formulário de pergunta e respostas, que neste exemplo são 5, devido a serem 5 perguntas); - Um procedimento, para enviar o total do teste, e respectiva mensagem de aprovação ou reprovação. Todos os procedimentos de perguntas terão então o aspecto do código da seguinte tabela, mas com a diferença de que cada um tem as suas perguntas e respostas, parte essa que terá de ser alterada. <%Sub Pergunta1()%> <%session(“npergunta”)=1%> <div align=”center”> <center> <table border=”0" width=”500" bgcolor=”#B8CFCF”> <tr> <td width=”100%”><b><font face=”Arial”>Pergunta > <i>1 / 5<br> <br> </i></font></b> <FORM name=”pergunta1" action=”cpt4-3-4.asp” method=”POST”> <p> <font face=”Arial”>Qual o código para escrever no browser?</font></p> <div align=”center”> <center> <table border=”0" width=”300"> <tr> <td width=”7%” align=”right”><input type=”radio” value=”resposta1" name=”pergunta1"></td> <td width=”93%”><font face=”Arial”>Request.Write ()</font></td> </tr> <tr> <td width=”7%” align=”right”><input type=”radio” value=”resposta2" name=”pergunta1"></td> <td width=”93%”><font face=”Arial”>Session(“escrever”)</font></td> </tr> <tr> <td width=”7%” align=”right”><input type=”radio” value=”resposta3" name=”pergunta1"></td> <td width=”93%”><font face=”Arial”>Response.Write ()</font></td> </tr> <tr> <td width=”7%” align=”right”><input type=”radio” value=”resposta4" checked name=”pergunta1"></td> <td width=”93%”><font face=”Arial”>Não sei</font></td> </tr> 86 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES </table> </center> </div> <p align=”center”><input type=”submit” value=”Responder” name=”submeter”></p> </FORM> </td> </tr> </table> </center> </div> <%End Sub%> Podemos ver por este exemplo que o código usado é praticamente HTML puro, com a excepção do uso de uma variável de sessão que serve para podermos controlar em que pergunta vai o teste, de maneira que o utilizador seja enviado para a pergunta seguinte, e no final para o resultado do teste. Fig. 4.13 - Pergunta do ficheiro cpt4-3-4.asp Como se pode ver este é um teste de ASP. O leitor pode fazer testes de tudo o que quiser, e com o uso de bases de dados (a ver em próximo capítulo), pode criar vários tipos de testes usando apenas um procedimento para todos eles. Será então num outro procedimento, depois de todas as perguntas terem sido respondidas, que todas as variáveis serão limpas, de maneira a que se possa responder a um novo teste, ou tentar nova sorte. Nesta fase, será feita uma validação de todas as respostas e incrementada uma variável com o total de valores do teste - alterada consoante a qualidade das respostas dadas. CAPÍTULO 4: OBJECTOS 87 <%Sub total_respostas ( )%> <%session(“pergunta5”) = Request.Form(“pergunta5”) total = 0 if session(“pergunta1”) = “resposta3” then total = total + 4 if session(“pergunta2”) = “resposta2” then total = total + 6 if session(“pergunta3”) = “resposta3” then total = total + 3 if session(“pergunta4”) = “resposta1” then total = total + 2 if session(“pergunta5”) = “resposta3” then total = total + 5 Response.Write “<center><strong>Teve “ & total & “ valores neste teste...<strong><br><br>” if total < 10 then Response.Write “<strong><font size=’4' color=’RED’>REPROVADO </font></strong>” Else if (total > 10 AND total <= 11) then Response.Write “<strong><font size=’4' color=’BLUE’>APROVADO à tangente...</font></strong>” Else if (total >= 12 AND total < 17) then Response.Write “<strong><font size=’4' color=’BLUE’>APROVADO </font></strong>” Else if (total >= 18 AND total<=20) then Response.Write”<strong><font size=’4' color=’BLUE’>APROVADO com distinção!</font></strong>” end if end if end if end if %> Como se pode observar, todas as variáveis de sessão devolvem as respostas, que conforme estejam certas ou não irão ser determinantes no desenvolvimento da variável local total, para a nota final do teste online. Observando todo o código, teremos então uma noção mais real daquilo que se pretende, pois com as primeiras linhas de código se pode perceber como todos os procedimentos são geridos. Fig. 4.14 88 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES (ficheiro cpt4-3-4.asp) <%Sub Pergunta1()%> <%session(“npergunta”)=1%> <div align=”center”> <center> <table border=”0" width=”500" bgcolor=”#B8CFCF”> <tr> <td width=”100%”><b><font face=”Arial”>Pergunta > <i>1 / 5<br> <br> </i></font></b> <FORM name=”pergunta1" action=”cpt4-3-4.asp” method=”POST”> <p> <font face=”Arial”>Qual o código para escrever no browser?</font></p> <div align=”center”> <center> <table border=”0" width=”300"> <tr> <td width=”7%” align=”right”><input type=”radio” value=”resposta1" name=”pergunta1"></td> <td width=”93%”><font face=”Arial”>Request.Write ()</font></td> </tr> <tr> <td width=”7%” align=”right”><input type=”radio” value=”resposta2" name=”pergunta1"></td> <td width=”93%”><font face=”Arial”>Session(“escrever”)</font></td> </tr> <tr> <td width=”7%” align=”right”><input type=”radio” value=”resposta3" name=”pergunta1"></td> <td width=”93%”><font face=”Arial”>Response.Write ()</font></td> </tr> <tr> <td width=”7%” align=”right”><input type=”radio” value=”resposta4" checked name=”pergunta1"></td> <td width=”93%”><font face=”Arial”>Não sei</font></td> </tr> </table> </center> </div> <p align=”center”><input type=”submit” value=”Responder” name=”submeter”></p> </FORM> </td> </tr> </table> </center> </div> <%End Sub%> CAPÍTULO 4: OBJECTOS 89 <%Sub Pergunta2()%> <%session(“pergunta1”) = Request.Form(“pergunta1”) session(“npergunta”)=2%> <div align=”center”> <center> <table border=”0" width=”500" bgcolor=”#B8CFCF”> <tr> <td width=”100%”><b><font face=”Arial”>Pergunta > <i>2 / 5<br> <br> </i></font></b> <FORM name=”pergunta2" action=”cpt4-3-4.asp” method=”POST”> <p> <font face=”Arial”>Como se cria uma variável global, acessível por<br>todos os utilizadores?</font></p> <div align=”center”> <center> <table border=”0" width=”300"> <tr> <td width=”7%” align=”right”><input type=”radio” value=”resposta1" name=”pergunta2"></td> <td width=”93%”><font face=”Arial”>Session ()</font></td> </tr> <tr> <td width=”7%” align=”right”><input type=”radio” value=”resposta2" name=”pergunta2"></td> <td width=”93%”><font face=”Arial”>Application ()</font></td> </tr> <tr> <td width=”7%” align=”right”><input type=”radio” value=”resposta3" name=”pergunta2"></td> <td width=”93%”><font face=”Arial”>x = 1</font></td> </tr> <tr> <td width=”7%” align=”right”><input type=”radio” value=”resposta4" checked name=”pergunta2"></td> <td width=”93%”><font face=”Arial”>Não sei</font></td> </tr> </table> </center> </div> <p align=”center”><input type=”submit” value=”Responder” name=”submeter”></p> </FORM> </td> </tr> </table> </center> </div> <%End Sub%> 90 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES <%Sub Pergunta3()%> <%session(“pergunta2”) = Request.Form(“pergunta2”) session(“npergunta”)=3%> <div align=”center”> <center> <table border=”0" width=”500" bgcolor=”#B8CFCF”> <tr> <td width=”100%”><b><font face=”Arial”>Pergunta > <i>3 / 5<br> <br> </i></font></b> <FORM name=”pergunta3" action=”cpt4-3-4.asp” method=”POST”> <p> <font face=”Arial”>Qual o servidor Internet para as ASP que é <br>usado no Windows NT?</font></p> <div align=”center”> <center> <table border=”0" width=”300"> <tr> <td width=”7%” align=”right”><input type=”radio” value=”resposta1" name=”pergunta3"></td> <td width=”93%”><font face=”Arial”>Personal Wide Server</font></td> </tr> <tr> <td width=”7%” align=”right”><input type=”radio” value=”resposta2" name=”pergunta3"></td> <td width=”93%”><font face=”Arial”>Apache</font></td> </tr> <tr> <td width=”7%” align=”right”><input type=”radio” value=”resposta3" name=”pergunta3"></td> <td width=”93%”><font face=”Arial”>Internet Information Server</font></td> </tr> <tr> <td width=”7%” align=”right”><input type=”radio” value=”resposta4" checked name=”pergunta3"></td> <td width=”93%”><font face=”Arial”>Não 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%> CAPÍTULO 4: OBJECTOS 91 <%Sub Pergunta4()%> <%session(“pergunta3”) = Request.Form(“pergunta3”) session(“npergunta”)=4%> <div align=”center”> <center> <table border=”0" width=”500" bgcolor=”#B8CFCF”> <tr> <td width=”100%”><b><font face=”Arial”>Pergunta > <i>4 / 5<br> <br> </i></font></b> <FORM name=”pergunta4" action=”cpt4-3-4.asp” method=”POST”> <p> <font face=”Arial”>Qual a função que devolve uma diferença entre duas datas?</font></p> <div align=”center”> <center> <table border=”0" width=”300"> <tr> <td width=”7%” align=”right”><input type=”radio” value=”resposta1" name=”pergunta4"></td> <td width=”93%”><font face=”Arial”>DateDiff ()</font></td> </tr> <tr> <td width=”7%” align=”right”><input type=”radio” value=”resposta2" name=”pergunta4"></td> <td width=”93%”><font face=”Arial”>IsDate ()</font></td> </tr> <tr> <td width=”7%” align=”right”><input type=”radio” value=”resposta3" name=”pergunta4"></td> <td width=”93%”><font face=”Arial”>Date ()</font></td> </tr> <tr> <td width=”7%” align=”right”><input type=”radio” value=”resposta4" checked name=”pergunta4"></td> <td width=”93%”><font face=”Arial”>Não sei</font></td> </tr> </table> </center> </div> <p align=”center”><input type=”submit” value=”Responder” name=”submeter”></p> </FORM> </td> </tr> </table> </center> </div> <%End Sub%> 92 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES <%Sub Pergunta5()%> <%session(“pergunta4”) = Request.Form(“pergunta4”) session(“npergunta”)=5%> <div align=”center”> <center> <table border=”0" width=”500" bgcolor=”#B8CFCF”> <tr> <td width=”100%”><b><font face=”Arial”>Pergunta > <i>5 / 5<br> <br> </i></font></b> <FORM name=”pergunta5" action=”cpt4-3-4.asp” method=”POST”> <p> <font face=”Arial”>Como chama em ASP um procedimento chamado ‘ procedimento1’?</font></p> <div align=”center”> <center> <table border=”0" width=”300"> <tr> <td width=”7%” align=”right”><input type=”radio” value=”resposta1" name=”pergunta5"></td> <td width=”93%”><font face=”Arial”>get procedimento1</font></td> </tr> <tr> <td width=”7%” align=”right”><input type=”radio” value=”resposta2" name=”pergunta5"></td> <td width=”93%”><font face=”Arial”>run procedimento1</font></td> </tr> <tr> <td width=”7%” align=”right”><input type=”radio” value=”resposta3" name=”pergunta5"></td> <td width=”93%”><font face=”Arial”>procedimento1</font></td> </tr> <tr> <td width=”7%” align=”right”><input type=”radio” value=”resposta4" checked name=”pergunta5"></td> <td width=”93%”><font face=”Arial”>Não sei</font></td> </tr> </table> </center> </div> <p align=”center”><input type=”submit” value=”Responder” name=”submeter”></p> </FORM> </td> </tr> </table> </center> </div> <%End Sub%> CAPÍTULO 4: OBJECTOS 93 <%Sub total_respostas()%> <%session(“pergunta5”) = Request.Form(“pergunta5”) total = 0 if session(“pergunta1”) = “resposta3” then total = total + 4 if session(“pergunta2”) = “resposta2” then total = total + 6 if session(“pergunta3”) = “resposta3” then total = total + 3 if session(“pergunta4”) = “resposta1” then total = total + 2 if session(“pergunta5”) = “resposta3” then total = total + 5 Response.Write “<center><strong>Teve “ & total & “ valores neste teste...<strong><br><br>” if total < 10 then Response.Write “<strong><font size=’4' color=’RED’>REPROVADO</ font></strong>” Else if (total > 10 AND total <= 11) then Response.Write “<strong><font size=’4' color=’BLUE’>APROVADO à tangente...</font></strong>” Else if (total >= 12 AND total < 17) then Response.Write “<strong><font size=’4' color=’BLUE’>APROVADO </font></strong>” Else if (total >= 18 AND total<=20) then Response.Write”<strong><font size=’4' color=’BLUE’>APROVADO com distinção!</font></strong>” end if end if end if end if %> <br><br><center><a href=”cpt4-3-4.asp”>recomeçar</a></center> <%session(“pergunta1”) = “” session(“pergunta2”) = “” session(“pergunta3”) = “” session(“pergunta4”) = “” session(“pergunta5”) = “” session(“npergunta”) = 0%> <%End Sub%> <% Select case session(“npergunta”) case 1 Pergunta2 case 2 Pergunta3 case 3 Pergunta4 case 4 Pergunta5 case 5 total_respostas case else Pergunta1 end select %> 94 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES Foram usados os seguintes objectos e funções: Session () muito usado neste exemplo, este objecto tem tanto o número da última pergunta, para que possamos direccionar o utilizador para a pergunta seguinte, como as respostas das respectivas perguntas; Request.Form () Tal como noutros exemplos, recebe os valores que foram enviados por formulário. Para acabar esta parte do capítulo, vamos ver como podemos proteger as nossas páginas ASP, de maneira a só serem acedidas depois de introdução de login e password, e controlando o tempo que estes têm de activação. Parece algo que requer alguma programação mais avançada, mas será o exemplo onde terá de ser escrito um mínimo de código de programação. Tudo o que o leitor tem de criar é um ficheiro, formulário onde o utilizador irá introduzir o login e a password, a mensagem de erro, e o envio para a página principal do site protegido, que por sua vez, só pode ser acedido depois do login e password serem validados. Vamos então dividir o ficheiro de entrada e validação de dados em 3 partes: a primeira parte será aquela em que serão pedidos os dados por intermédio de um formulário, a segunda parte será a zona onde aparecerá uma mensagem de erro, no caso de os dados estarem errados, e a terceira a zona onde se controla qual dos procedimentos é executado. Vamos então ter de receber dados, que vamos introduzir em variáveis de sessão, de maneira a que possamos ter os dados activos durante o tempo que definirmos em Session.TimeOut Quando reiniciamos a página e esses dados estiverem incorrectos, enviamos o utilizador para uma mensagem de erro, caso contrário, será encaminhado para a primeira página protegida. As páginas protegidas deverão então ter apenas 3 linhas de código, de maneira a compararmos o login e password que estão em variáveis de sessão. (ficheiro cpt4-3-5.asp) <%Sub formulario%> <FORM action=”cpt4-3-5.asp?todo=in” method=”POST”> <div align=”center”> <center> <table border=”1" width=”250" bgcolor=”#FFCCFF”> <tr> <td width=”100%”> <center><font size=”4">Controlo de Acessos</font></center> </center> <div align=”center”> CAPÍTULO 4: OBJECTOS 95 <table border=”0" width=”96%”> <tr> <td width=”50%”> <p align=”right”><font face=”Arial”>Login:</font></td> <center><center> <td width=”50%”><input type=”text” name=”login” size=”8"></td> </tr> </center></center> <tr> <td width=”50%”> <p align=”right”><font face=”Arial”>Password:</font></td> <center><center> <td width=”50%”><input type=”password” name=”password” size=”8"></td> </tr> </table><br><input type=”submit” name=”submete” value=”Submeter”><br> </center> </div> </td> </tr> </table> </center> </div> </FORM> <%End Sub%> <%Sub erro%> <center><br><br><br> <font face=”ARIAL” color=”RED” size=”6">ERRO, login 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 sessões vão estar activas session(“login”) = Request.Form(“login”) ‘ vamos buscar os últimos dados de login session(“password”) = Request.Form(“password”) ‘ e de password if Request.Querystring(“todo”) = “” then ‘ se o argumento estiver todo limpo vamos ao formulário formulario else ‘ senão vamos ver o que têm as sessões no momento if ((session(“login”)<>”xpto” and session(“password”)<>”123") AND Request.Querystring(“todo”)=”in”) then erro ‘ neste caso o login e password não são validados else Response.Redirect(“cpt4-3-5test.asp”) ‘aqui o utilizador é validado positivamente end if end if %> 96 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES Foram usados os seguintes objectos e funções: Session () terá as variáveis que simbolizam o login e password. Estas serão comparadas no início de cada página protegida, de maneira a assegurar se o utilizador está validado ou não; Session.Timeout () neste exemplo este método é usado para definirmos o tempo em que as sessões estão activas, ou seja, os minutos em que as sessões estão activas, depois da inactividade ocorrente no site. Agora que vimos o código que recebe e valida a entrada de um utilizador vamos ver uma normal página ASP, que está protegida, a qual só é possível ao utilizador aceder, se validada a sua entrada no formulário. No início de todas as páginas ASP que queremos protegidas, fazemos uma comparação das variáveis de sessão de maneira a sabermos se estas são válidas ou não. (ficheiro cpt4-3-5test.asp) <%if ( session ( “login” ) <> “xpto” and session( “password” )<> “123” ) then Response.Redirect(“cpt4-3-5erro.asp”) end if%> <center><br><br><br> <font face=”ARIAL” color=”BLUE” size=”6">Bem vindo a esta página...</font> </center> Como ficou demonstrado, é simples a maneira de se poder proteger páginas de um site. Além deste caso, o utilizador pode fazer uma conexão a uma base de dados, e usar apenas uma variável de sessão que diz sim ou não, conforme seja validada ou não depois de inquirida a base de dados. 4.4 Ficheiro Global.asa Muitos programadores de ASP têm um certo receio de mexer neste ficheiro, ou até mesmo de programar usando o mesmo. Não há que ter receio em mexer neste ficheiro, que acima de tudo é uma tecnologia importante para certas soluções online, e que é uma das armas das ASP em relação a outras linguagens semelhantes. Quando entramos num site em servidor IIS existem 4 fases distintas que vou identificar de maneira a poder continuar com o meu raciocínio: CAPÍTULO 4: OBJECTOS 97 1. o primeiro utilizador entra e o servidor fica alerta; 2. o utilizador começa uma nova sessão, e essas sessões que ele cria são as que utilizamos para variáveis globais, e para definir o tempo de acção das mesmas. 3. o utilizador sai do site e a sua sessão acaba; 4. o último utilizador do site sai e o servidor Internet deixa de estar alerta. Depois de vistas estas 4 fases, posso agora demonstrar esta explicação do ponto de vista prático. O ficheiro Global.Asa, é algo como que o controlador dos acessos ao site que o programador criou, ou estiver a desenvolver. Este ficheiro tem apenas 4 funções distintas: a primeira é aquela que é activada quando o site fica activo; a segunda é activada por cada vez que entra um utilizador; a terceira é activada por cada vez que sai um utilizador do site, e a quarta é activada quando o site deixa de ter utilizadores. Desta maneira, podemos criar código dentro de cada uma destas zonas para nosso benefício. Por exemplo, o leitor quer que seja introduzido num ficheiro de texto o endereço IP de cada utilizador que entra no site. Basta escrever dentro da segunda função do ficheiro Global.Asa o código que cria essa linha no ficheiro de controlo, para ter a certeza que cada acesso é registado. Ou se quisermos saber quanto tempo cada utilizador passa em média no site, basta criarmos um registo de tempo de entrada na segunda função, e um na terceira função, e mais tarde fazermos DateDiff() para sabermos a média que cada utilizador gasta no nosso site. O esquema de um ficheiro Global.Asa é o seguinte: <SCRIPT LANGUAGE=”VBScript” RUNAT=”Server”> Sub Application_OnStart End Sub Sub Session_OnStart End Sub Sub Session_OnEnd End Sub Sub Application_OnEnd End Sub </SCRIPT> CAPÍTULO 4: OBJECTOS 99 Agora para testarmos a potencialidade deste ficheiro vamos saber quantos utilizadores estão neste momento no nosso site. Para isso basta criarmos uma variável que se incrementa no procedimento Session_OnStart(), e que se decrementa no Session_OnEnd(). Desta maneira se estiverem 4 utilizadores ao mesmo tempo no site a variável será 4. Se um deles sair passará a ser 3 pois houve uma sessão que acabou. Da mesma maneira, por cada utilizador que entre no site essa mesma variável irá ser incrementada. Passando da teoria à prática vamos então editar o nosso ficheiro Global.Asa, que suportará o controlo dos acessos ao site. (ficheiro global.asa) <SCRIPT LANGUAGE=”VBScript” RUNAT=”Server”> Sub Application_OnStart Session.Timeout = 3 Application.Lock Application(“utilizadores”) = 0 Application.UnLock End Sub Sub Session_OnStart Application.Lock Application(“utilizadores”) = Application(“utilizadores”) + 1 Application.UnLock End Sub Sub Session_OnEnd Application.Lock Application(“utilizadores”) = Application(“utilizadores”) - 1 Application.UnLock End Sub Sub Application_OnEnd End Sub </SCRIPT> Foram usados os seguintes objectos e funções: Session.Timeout () onde se define o tempo que vai durar cada sessão. Se o utilizador ficar inactivo durante um certo período de tempo (em minutos), a função Session.OnEnd() activa-se e processa uma saída do site. Aqui va– mos definir esse tempo em minutos; 100 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES Application.Lock () é o método usado para trancar a variável, de maneira que possa ser alterada sem intervenções externas. Um meio de protecção dos dados que estão lá incluídos; Application (“utilizadores”) desta maneira obtemos uma variável global, onde todos os utilizadores têm acesso, de maneira que todos podem aceder aos dados relativos ao número de utilizadores do site em questão; Application.UnLock () neste método destranca-se a variável depois da mesma ter sido alterada. Depois de termos este ficheiro no local certo e com o código acima descrito, está na hora de acedermos à variável de maneira a sabermos quantos utilizadores estão online. Para isso basta apenas uma linha de código ASP, dentro do HTML que o leitor achar apropriado para a apresentação deste valor. (ficheiro cpt4-3-6.asp) <font face=”ARIAL” size=”3">Existem neste momento</font> <font face=”ARIAL” color=”red” size=”5"><%=Application(“utilizadores”)%></font> <font face=”ARIAL” size=”3"> utilizadores...</font><br> Foram usados os seguintes objectos e funções: Application () aqui usado para podermos escrever no browser o número de utilizadores que estão a navegar no nosso site. Fig. 4.17 - Imagem do ficheiro cpt4-3-6.asp CAPÍTULO 4: OBJECTOS 101 Como podemos ver nesta imagem, existem 4 utilizadores no site. O leitor pode obter este valor abrindo várias janelas no browser e entrar neste mesmo site virtual. Esta é uma das formas de usar o global.asa para nosso benefício. Outra maneira é tentar criar um chat para os utilizadores do site. O truque está em criarmos várias variáveis do tipo Application() e ir actualizando cada uma delas conforme a introdução de informação por parte dos utilizadores. Ao entrar uma nova linha de texto actualizam-se as variáveis, igualando a mais recente à imediatamente anterior e assim consecutivamente. O ficheiro global.asa vai entrar aqui novamente - será onde as variáveis vão ser inicializadas. Neste exemplo teremos três ficheiros: um para controlar os frames, pois para este exemplo teremos de usar dois ficheiros em simultâneo, outro onde se mostram as frases, com um auto-refresh de 8 segundos, e outro ainda para o formulário de introdução de 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 são uma técnica para se conseguir no mesmo ecrã visualizar várias páginas em simultâneo. Usam-se muito em sites muito complexos, e quando se pretende dar uma sensação de televisão com vários botões para mudar de canal (neste caso para mudar de local no site). Nos frames, primeiro criamos a linha que define a espessura das margens que separam as páginas, assim como os espaços, e tamanho de apresentação de cada uma das páginas. <frameset FRAMEBORDER=”0" BORDER=”false” framespacing=”0" rows=”90,60"> Vamos então configurar cada uma das páginas que vão ser criadas para colocar o chat em funcionamento dentro do esquema de frames. <FRAME SRC=”cpt4-3-7top.asp” SCROLLING=”no”> <FRAME SRC=”cpt4-3-7.asp” SCROLLING=”no”> 102 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES E acabamos por finalizar o código HTML para a criação das frames. A partir daqui vamos criar os ficheiros ASP que vão trabalhar com as variáveis que guardam os textos do chat. O primeiro será aquele que introduz a informação introduzida pelo utilizador para as variáveis globais, que vão aparecer em todas as diferentes sessões, permitindo que todos os utilizadores vejam o que todos introduzem no chat. (ficheiro cpt4-3-7.asp) <body bgcolor=”BLACK”> <% If not Request.Form(“mensagem”)=”” THEN APPLICATION.LOCK Application(“linha18”) = Application(“linha17”) Application(“linha17”) = Application(“linha16”) Application(“linha16”) = Application(“linha15”) Application(“linha15”) = Application(“linha14”) Application(“linha14”) = Application(“linha13”) Application(“linha13”) = Application(“linha12”) Application(“linha12”) = Application(“linha11”) Application(“linha11”) = Application(“linha10”) Application(“linha10”) = Application(“linha9”) Application(“linha9”) = Application(“linha8”) Application(“linha8”) = Application(“linha7”) Application(“linha7”) = Application(“linha6”) Application(“linha6”) = Application(“linha5”) Application(“linha5”) = Application(“linha4”) Application(“linha4”) = Application(“linha3”) Application(“linha3”) = Application(“linha2”) Application(“linha2”) = Application(“linha1”) Application(“linha1”) = “<B>” & Request.Form(“nick”) & “:</B> “ & Request.Form(“mensagem”) APPLICATION.UNLOCK END IF %> <FORM NAME=”chat” ACTION=”cpt4-3-7.asp” METHOD=”post” > <font size=”3" color=”white”>Nick: </font> <INPUT NAME=”nick” SIZE=10 maxlength=”14" value=”<%=Request.Form(“Nick”)%>”><br> <font size=”3" color=”white”>Mensagem: </font> <INPUT NAME=”mensagem” SIZE=30 maxlength=”72"><br> <INPUT TYPE=”submit” value=”Introduzir”> </FORM> </body> CAPÍTULO 4: OBJECTOS 103 Foram usados os seguintes objectos e funções: Application (“ linha…n…”) variáveis que guardam todas as mensagens que vão sendo deixadas. Cada vez que uma nova é introduzida, todas se vão igualando de maneira a andar uma casa para cima. Precisamos agora de um ficheiro que mostra os dados no ecrã (browser). Será então o próximo ficheiro que vai tratar dessa função, de reparar na Meta Tag usada (pelo HTML), para refrescar a página por cada número de segundos escolhido pelo programador (neste caso, 8 segundos). (ficheiro cpt4-3-7top.asp) <HTML> <HEAD> <META HTTP-EQUIV=”REFRESH” CONTENT=”8;cpt4-3-7top.asp”> </HEAD> <%=Application(“linha18”)%><BR> <%=Application(“linha17”)%><BR> <%=Application(“linha16”)%><BR> <%=Application(“linha15”)%><BR> <%=Application(“linha14”)%><BR> <%=Application(“linha13”)%><BR> <%=Application(“linha12”)%><BR> <%=Application(“linha11”)%><BR> <%=Application(“linha10”)%><BR> <%=Application(“linha9”)%><BR> <%=Application(“linha8”)%><BR> <%=Application(“linha7”)%><BR> <%=Application(“linha6”)%><BR> <%=Application(“linha5”)%><BR> <%=Application(“linha4”)%><BR> <%=Application(“linha3”)%><BR> <%=Application(“linha2”)%><BR> <%=Application(“linha1”)%><BR> </HTML> O resultado é aquele que podemos ver na seguinte imagem. A introdução no formulário do anterior Nick usado serve para facilitar a utilização pois o utilizador, em princípio, estará sempre a usar o mesmo Nick. CAPÍTULO 4: OBJECTOS 105 tador que está a suportar a página, podendo o webmaster de um site criar uma página protegida para conhecer os dados da sua máquina. Estas informações são dadas como variáveis especiais do servidor, e para acedermos a elas usamos o objecto ServerVariables(). Necessitamos então de saber que tipo de variáveis de servidor existem para podermos tirar partido das mesmas. Para obtermos todas as que podemos obter basta corrermos o seguinte código ASP. (ficheiro cpt4-3-8.asp) <TABLE border=”1" bordercolor=”black” cellspacing=”0"> <TR><TD><B>Variáveis</B></TD> <TD><B>Conteudo</B></TD></TR> <%For Each nome In Request.ServerVariables%> <TR><TD><%=nome%></TD> <TD><%=Request.ServerVariables(nome)%> </TD></TR> <%Next %> </TABLE> Foram usados os seguintes objectos e funções: For Each / Next () Request.ServerVariables () Usamos esta expressão para percorrermos todos os eventos possíveis com o objecto ServerVariables; devolve o conteúdo da informação que pretendemos tanto do servidor como do cliente. Podemos pedir uma informação por Request.ServerVariables(“HTTP_COOKIE”) ou Request.ServerVariables(13). Fig.4.19 - Resultado parcial do ficheiro cpt4-3-8.asp 106 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES Este tipo de variáveis vão permitir ultrapassar muitas lacunas a nível de programação de páginas dinâmicas. Da mesma maneira que nos servimos destas variáveis para usarmos as potencialidades do JavaScript, usamos também o método Cookies para podermos usar os mesmos em ASP. As variáveis de sessão resolvem muitos problemas na programação, mas o uso de cookies nunca deixa de ser uma realidade. Eles são muito usados para adaptação de sites conforme o tipo de utilizador. Os cookies são ficheiros criados no lado do utilizador para guardarem variáveis que o programa necessite de ter de cada máquina que visite o site. Vamos ver como as cookies funcionam, de uma maneira que o leitor poderá ficar com muitas ideias em relação a soluções válidas para os sites que vai criar. Temos o exemplo de alguns sites portugueses que dão a hipótese ao utilizador de configurar os dados que aparecem na página inicial. Isto não seria possível sem o recurso a cookies, e o exemplo que vou demonstrar vai ser usado para algo parecido. Pretende-se uma página onde o utilizador configura alguns aspectos da mesma, e por cada vez que a for visitar essa configuração pessoal está activa. Isto tudo porque um ficheiro foi criado no computador do utilizador, com variáveis lá incorporadas criadas pela ASP, aquando das configurações do próprio utilizador. (ficheiro cpt4-3-9.asp) olá, não é indiscrição mas será que está a usar<br> uma máquina com as seguintes configurações:<br> <%=Request.ServerVariables(“HTTP_USER_AGENT”)%><br> Já agora, o seu IP não será <%=Request.ServerVariables(“REMOTE_ADDR”)%> ? <br><br>Obrigado pelas informações... Pelo código anterior julgo que fica clara a maneira como se usam e acedem às variáveis do servidor… Os cookies têm alguns métodos que vão ser explorados neste exemplo. Os cookies aqui criados foram feitos como se de objectos se tratassem criando-se uma estrutura OCOOKIE que detém várias variáveis. A este ‘array’ de cookies vai-se acrescentar uma validade, que é definida em dias, usando-se (DATE + número de dias) para a activar. CAPÍTULO 4: OBJECTOS 107 (ficheiro cpt4-3-10.asp) <%if Request.Form(“alterar”)<>”” then Response.Cookies (“OCOOKIE”)(“Titulo”) = Request.Form(“nome”) ‘criar um cookie Response.Cookies (“OCOOKIE”)(“CorFundo”) = Request.form(“cor”) Response.Cookies (“OCOOKIE”).Expires = DATE + 10 ‘definir o tempo de activação em dias end if%> <body bgcolor=”<%= Request.Cookies (“OCOOKIE”)(“CorFundo”)%>”> Olá <font FACE=”ARIAL” color=”BROWN” size=”5"><%= Request.Cookies (“OCOOKIE”)(“Titulo”)%></font> ... <p> </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 funções: Response.Cookies (“OCOOKIE”) terá as variáveis que simbolizam o login e password. Estas serão comparadas no início de cada página protegida, de maneira a assegurar se o utilizador está validado ou não; CAPÍTULO 4: OBJECTOS 109 maneira a ficar no formato que mais nos convém. Existem vários tipos de formato. Vamos identificar alguns e depois experimentar com uma página onde todos estão a funcionar. Podemos então formatar strings, números e datas: formatDateTime(“12-01-1995 12:12:00”,1) Obtém-se assim uma data por extenso, onde até se inclui o dia da semana. É uma formatação útil para quando queremos uma maior descrição de uma data, para apresentar cálculos, ou apenas para páginas que suportam calendários feitos em ASP. Response.Write formatCurrency(“12312321”) Podemos formatar um qualquer número para a nossa moeda. O resultado do número em questão será então em escudos. Response.Write FormatNumber(“4231,22345553”,5) Quando precisamos de obter um número e temos de definir as casas decimais, podemos usar esta função para essa mesma tarefa. FormatPercent(15/67) Esta função é muito útil quando fazemos estatísticas num site, ou quando temos um gráfico, como por exemplo, de uma dada votação. Somam-se todos os votos, separam-se os que são referentes a um assunto, e usamos esta função para sabermos a que 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 fóruns, devido às Tags de HTML, pois se os dados do utilizador não forem controlados este pode alterar o funcionamento do site, com dados abusivos, e não aceites. Para que não seja possível ao utilizador escrever Tags de HMTL a funcionar no site, usamos este método. Server.URLEncode(http://www.joaovieira.com/) Esta função não é muito usada, mas sempre que for preciso formatar uma string, de maneira a ela servir como referência para outro site, que tem espaços no link ou outra formatação estranha, usa-se este método para se obter a string certa para esse efeito Depois de revistos alguns tipos de formatação, vamos então escrever o nosso ficheiro exemplo, para vermos tudo a funcionar. É sempre a melhor maneira de perceber - experimentar, alterar valores ou alterar algum código. 110 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES (ficheiro cpt4-3-11.asp) str1 = “12-01-1995 12:12:00” Response.Write str1 & “ <strong>(não formatada)</strong><br>” Response.Write formatDateTime(str1,1) & “ (formatada com opção 1 de FormatDateTime)<br><br>” str2 = “12-01-1995 12:12:00” Response.Write str2 & “ <strong>(não formatada)</strong><br>” Response.Write formatDateTime(str2,3) & “ (formatada com opção 3 de FormatDateTime)<br><br>” str3 = “12312321” Response.Write str3 & “ <strong>(não formatada)</strong><br>” Response.Write formatCurrency(str3) & “ (formatada)<br><br>” str4 = “4231,22345553” Response.Write str4 & “ <strong>(não formatada)</strong><br>” Response.Write FormatNumber(str4,5) & “ (formatada com formatNumber para 5 casas decimais)<br><br>” str5 = “15/67” Response.Write str5 & “ <strong>(não formatada)</strong><br>” Response.Write FormatPercent(15/67) & “ (formatada com Format Percent)<br><br>” str6 = “Hoje é dia de praia, <font color=’RED’ size=’4'> tu vais</font> ?” Response.Write str6 & “ <strong>(não formatada)</strong><br>” Response.Write Server.HTMLEncode(str6) & “ (formatada com Server.HTMLEncode)<br><br>” str7 = “http://www.joaovieira.com/” Response.Write str7 & “ <strong>(não formatada)</strong><br>” Response.Write Server.URLEncode(str7) & “ (formatada com Server.URLEncode)<br><br>” Foram usados os seguintes objectos e funções: FormatDateTime () Servimo-nos desta função para formatar uma string que continha uma data/hora; FormatNumber () formatou-se um número com certas casas decimais definidas na própria função; FormatPercent () obteve-se um valor que fez a percentagem de um número solitário em relação à soma de um grupo de números; 114 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES 5.1 Bases de dados As bases de dados (BD) foram como que o grande impulsionador da procura das ASP e outras linguagens relacionadas para a programação Internet. A grande vantagem destas linguagens é a hipótese de se aceder a bases de dados, e, por conseguinte, disponibilizar informação dinâmica online. Desta maneira pode-se vender online, ter revistas com informação online, abrir Bancos, Seguradoras, e outros tipos de empreendimentos online. Não vamos propriamente ver como se abre o maior negócio do século (deixo isso para o leitor), mas poderemos ver como se processam algumas partes desses sistemas, e como solucionar certos problemas. O livro de visitas, muito procurado, pois todos gostamos de ter um no nosso site, é um exemplo de como podemos disponibilizar um serviço interactivo online sem precisar de muita manutenção. Um e-zine, jornal online, é mais um exemplo de como se podem criar pequenas comunidades dedicadas a um certo assunto. Os sistemas de gestão de bases de dados (SGBD ou DBMS) a utilizar com as ASP podem ser diversos. Tudo o que precisa é de ter os drivers (ficheiros para configuração do Windows, com software externo) necessários para se ligar via ODBC (sistema que faz uma ponte entre bases de dados independentemente dos sistemas operativos das mesmas). Os exemplos que vão ser demonstrados neste livro são feitos em MSAccess, visto ser indiscutivelmente a base de dados mais acessível para Windows (para Linux teríamos outras soluções também muito utilizadas). De referir que via ODBC é indiferente a base de dados em relação ao código de programação, visto que será usado puro código SQL para qualquer tipo de intervenção nos dados. O ODBC é o sistema (que encontramos no control panel) para criarmos uma ligação com qualquer tipo de BD suportado pelo servidor (ou pelo menos referente aos drivers que estiverem instalados). Uma base de dados é constituída por tabelas, algumas delas ligadas entre si. Podemos, por exemplo, ter uma tabela de contactos pessoais para guardar um código identificador, nome, telefone e email. Ficaria qualquer coisa do tipo: TABELA: CONTACTOS ID Nome Telefone EMail CAPÍTULO 5: BASES DE DADOS 115 Mas só isto não chega. Precisamos de saber que tipo de campos é que vamos usar, e para isso teremos uma tabela onde definimos além do tipo, o tamanho disponível para os dados: TABELA: CONTACTOS ID as number Nome as varchar(50) Telefone as varchar(14) EMail as varchar(22) Ficou assim criada uma tabela possível de ser usada numa base de dados. Vamos então demonstrar esta mesma tabela mas com dados já introduzidos depois de ter sido criada. TABELA: CONTACTOS ID as number Nome as varchar(50) Telefone as varchar(14) EMail as varchar(22) 1 2 3 4 João Carlos Rui Pedro 219886675 324444332 234343444 332442433 [email protected] [email protected] [email protected] [email protected] Pode-se ver então mais facilmente como se processa (teoricamente) a criação de uma tabela em base de dados, e como ela comporta os dados que lhe são fornecidos. Agora, a maneira como estes dados são introduzidos, e como podemos aceder aos mesmos, já requer uma linguagem própria de bases de dados. O SQL (Structured Query Language), criada no início dos anos 70 pela IBM, é desde então usada como standard em todas as bases de dados relacionais até hoje criadas. O SQL é a linguagem padrão para a definição, actualização e pesquisa de bases de dados. Qualquer linguagem de terceira ou quarta geração que trabalhe com bases de dados decerto que embebe expressões de SQL, quer estejemos a falar de ambientes de bases de dados MSAccess, Informix, SQLServer ou Oracle. O SQL contém poucos comandos, o que faz que com alguma experiência se possam fazer maravilhas. O sistema é simples: as ASP usam uma conexão ODBC, que por sua vez está ligada a uma qualquer base de dados. As ASP usam o ADO (ActiveX Data Objects) para que com uma conexão à base de dados possamos usufruir de várias hipóteses de como programar 116 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES com as mesmas. A estrutura base do SQL é a seguinte: SELECT [ DISTINCT | ALL] coluna1, coluna2, … FROM tabela WHERE (situação) GROUP BY HAVING UNION | INTERSECT (usar para mais de um SELECT) ORDER BY (ordenar por coluna) Neste caso apenas obtemos dados, e não alteramos os dados já existentes. Para isso é necessário outro tipo de expressões. Por exemplo, para inserir, INSERT INTO tabela (coluna1, coluna2, …) VALUES (‘dados1’, ‘dados2’, …) Para apagar os dados de uma tabela basta, DELETE FROM tabela Ou então se apenas pretendermos eliminar um único registo (linha), DELETE FROM tabela WHERE coluna1 = ‘dados1’ Podemos também actualizar dados, e nesse caso escreveríamos, UPDATE FROM tabela SET coluna1 = ‘novo_dado1’ WHERE coluna2 = ‘dado2’ No caso da tabela anteriormente descrita, se o programador quiser saber os dados de todas as pessoas que começam com a letra J, basta escrever a seguinte expressão SQL: SELECT * FROM CONTACTOS WHERE nome like ‘J%’ As plicas ‘ são usadas sempre que se compara uma string. Para valores numéricos tal já não é preciso. As datas por vezes necessitam de #data# , como nas bases de dados da Microsoft. CAPÍTULO 5: BASES DE DADOS 117 No caso de se querer introduzir um novo registo já será necessário um manuseamento diferente dos dados; usaremos então o comando INSERT - outro comando standard do SQL. INSERT INTO CONTACTOS (ID, nome, Telefone, E-Mail) VALUES (5, ‘Ricardo’, ‘288889999’, ‘[email protected]’) A nossa tabela passará então a ter a seguinte estrutura: TABELA: CONTACTOS ID as number Nome as varchar(50) Telefone as varchar(14) EMail as varchar(22) 1 2 3 4 5 João Carlos Rui Pedro Ricardo 219886675 324444332 234343444 332442433 288889999 [email protected] [email protected] [email protected] [email protected] [email protected] Podemos, para nos ajudar, contar com os seguintes operadores válidos no SQL: OPERADOR = > < <= >= <> DESCRIÇÃO Para igualar Maior que… Menor que… Menor ou igual Maior ou igual Diferente 5.2 Construir uma base de dados em MSAccess Depois daquilo que foi visto inicialmente neste capítulo, e olhando para o que vai ser feito, o leitor pode pensar que quase não vale a pena conhecer mais das expressões de SQL. É um engano, pois mais cedo ou mais tarde se o leitor não conhecer o essencial destas expressões, o trabalho com as novas linguagens Internet decorrerá muito mais lento e menos vantajoso. 118 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES Foi adoptado para este livro a base de dados Microsoft Access, pois é a mais acessível de todas, mas é indiferente aquando de uma conexão via ODBC. A ideia é criar uma base de dados para contactos. O propósito não é propriamente a vantagem comercial, ou técnica, mas sim um exemplo perceptível, para se usar nos exemplos de introdução ao uso de bases de dados com ASP. A estrutura da primeira tabela da base de dados é a seguinte : TABELA: CONTACTOS ID Auto-number Nome Text (50) Idade Number (Integer) Telefone Text (22) Email Text (32) / null Data Date / Time A partir daqui temos a primeira análise feita. Basta agora traduzir isto para a base de dados MSAccess. Em Email temos null, pois queremos que este campo possa aceitar valores nulos. Em primeiro lugar iniciamos o programa de base de dados. O ecrã terá as opções para criarmos um novo ficheiro, ou usarmos um já existente. Vamos escolher a opção para iniciarmos um novo ficheiro. Fig. 5.1 - Escolha da criação de um novo ficheiro para base de dados em MSAccess 122 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES Fica assim criada a primeira tabela da base de dados que nos vai acompanhar no resto deste livro. 5.3 Conexão à base de dados Normalmente a conexão às bases de dados pelas ASP é feito pelo ADO, que por sua vez usa uma conexão ODBC. Esta conexão é feita sem se saber se a base de dados é MSAccess ou não. O que interessa é que a mesma seja feita com sucesso. Vai-se criar a conexão via ODBC, mas vai ser exemplificado também uma maneira de se conectar à BD MSAccess sem ser necessário o uso do ODBC, ligação essa mais conhecida internacionalmente por DSNLess Connection (visto que para o uso de ODBC a conexão processa-se com DSN=…). Para ser feita esta conexão temos de saber onde temos o ficheiro da BD, e o nome que achamos ser o mais fácil, ou acessível para uso dentro da programação ASP. Neste manual vai ser livrodsn Primeiro o leitor vai ao Control Panel (Painel de Controlo) que pode ser acedido a partir do Start (Iniciar), como demonstra a figura seguinte. Fig. 5.8 - Atalho para a zona onde se encontra o controlo de ODBC Depois de aí entrar, escolha o ícone ODBC, entrando na sua consola… 126 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES Podemos então criar um objecto RecordSet com o seguinte código, Set rs = Server.CreateObject(“ADODB.Recordset”) Depois das fases anteriores, tudo o que tem de fazer para controlar a BD é criar uma declaração de SQL e accionar a mesma, isto da seguinte maneira, SQLStmt = “SELECT … FROM …” rs.Open SQLstmt,Conn,1,2 Desta maneira o leitor já fez uma procura na BD, apesar de não fazer uma saída para o browser, mas isso será visto nas próximas linhas. A estrutura completa para uma conexão à BD, e fazer uma alteração ou uma procura na mesma ficará da seguinte forma, Set Conn = Server.CreateObject(“ADODB.Connection”) Conn.open “DSN=livrodsn;” Set rs = Server.CreateObject(“ADODB.Recordset”) SQLStmt = “SELECT … FROM ….. ORDER BY ….. DESC” rs.Open SQLstmt,Conn,1,2 A declaração de SQL é apenas um exemplo e não funciona como está. Vamos ver exemplos válidos já a seguir. Ou se possuir 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 extensão da conexão e o local onde está a mesma, conn = “DRIVER={Microsoft Access Driver (*.mdb)};” conn = conn & “DBQ=” & Server.Mappath(“./livro.mdb”) & “;” Set rs = Server.CreateObject(“ADODB.Recordset”) SQLStmt = “Select * FROM contactos” rs.Open SQLStmt, conn, 2, 1 Neste caso a BD está no mesmo directório e por isso na variável DBQ não foi preciso indicar a morada onde a mesma está. Ficam assim vistas duas maneiras de nos conectarmos à BD. Nor- CAPÍTULO 5: BASES DE DADOS 127 malmente os sites de aluguer de espaço fazem-se pagar por cada conexão que é feita por DSN, fazendo com que a maioria dos programadores opte por fazer uma conexão directa como no segundo caso agora visto. O leitor irá optar por aquela que mais lhe convém, desde que não se esqueça que se mais tarde for mudada a BD pode ter de alterar o código em todos os ficheiros, o que com a ligação via DSN já não seria preciso. 5.4 Inserir, apagar e actualizar dados em base de dados Vamos então começar por ver como podemos inserir dados na BD, e aproveitaremos para fazer inserções de duas maneiras diferentes. Na primeira forçamos no código a inserção dos dados, como podemos ver no exemplo seguinte: (ficheiro cpt5-4-1.asp) Set Conn = Server.CreateObject(“ADODB.Connection”) Conn.open “DSN=livrodsn;” Set rs = Server.CreateObject(“ADODB.Recordset”) SQLStmt = “INSERT INTO contactos (nome, idade, telefone, email, data) “ SQLStmt = SQLStmt & “VALUES(‘Bernardo Miguel’, 12, ‘33242443’, ‘[email protected]’, now())” rs.Open SQLstmt,Conn,1,2 Response.Write “Introduzido com sucesso...” Foram usados os seguintes objectos/métodos: Server.CreateObject(“ADODB.Connection”) a maneira com que criamos o objecto de conexão à BD; Server.CreateObject(“ADODB.Recordset”) criação do recordset que nos permitirá trabalhar com a BD; conn.Open ”DSN=…” serviu para abrir a BD com a conexão via DSN, referente à BD em questão; Rs.Open,…,1,2 o 1 representa o tipo de cursor (pode ser 0 – Forward Only, 1 – KeySet, 2 – Dynamic, 3 – Static) , o 2 representa o tipo de Lock da BD (1 – Read-Only, 2 – Pessimistic, 3 – Optimistic, 4 – Batch Optimistic). 128 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES Podemos também criar um ficheiro ASP onde temos um formulário para introdução de dados por parte do utilizador, que depois é validado e introduzido na BD. Iremos então criar alguns procedimentos para a execução deste ficheiro de introdução de dados via formulário. Sub formulario_introducao%> <div align=”center”> <table bordercolor=”black” border=”1" cellpadding=”5" cellspacing=”0"> <tr><td> <form action=”cpt5-4-2.asp?fazer=introduzir” method=”POST”> Nome: <input type=”text” name=”nome” value=”<%=Request.Form(“nome”)%>” size=”30"><br> Idade: <input type=”text” name=”idade” value=”<%=Request.Form(“idade”)%>” size=”3"><br> Telefone: <input type=”text” name=”telefone” value=”<%=Request.Form(“telefone”)%>” size=”12"><br> E-Mail: <input type=”text” name=”email” value=”<%=Request.Form(“email”)%>” size=”22"><br> <center><input type=”submit” value=”Introduzir”></center> </form> </td></tr></table></div> <%End Sub%> Assim fica criado o procedimento formulario_introducao, que é o interface de introdução de dados para o utilizador. De reparar que foi introduzido o Request.Form(“…”), para que cada vez que se tenha de repetir a introdução de dados devido a um campo ser inválido, o utilizador não tenha de introduzir tudo de novo. O argumento para sabermos o que se vai seguir é fazer (o argumento que vem da linha de comando do link quando se chama a página pagina.asp?fazer=...), como podemos ver neste caso ficará fazer=introduzir, que ao iniciarmos a página validaremos para saber o que vai ser executado, para mostrar o formulário ou receber e enviar os dados introduzidos. Depois da introdução dos dados, verificamos que os recebemos e que queremos introduzir na BD, mas para isso temos de os validar primeiro, pois certos campos têm de ter um certo número de caracteres, assim como o campo idade tem de ser numérico. CAPÍTULO 5: BASES DE DADOS 129 Sub validar_dados() if len(Request.Form(“nome”))>50 or len(Request.Form(“nome”))<3 then Response.Write “<center><font color=’RED’>O nome não pode exceder os 50 caracteres, ou ter menos de 3.</font></center>” formulario_introducao exit sub else if (len(Request.Form(“idade”))>3 or (not isnumeric(Request.Form(“idade”)))) then Response.Write “<center><font color=’RED’>A idade não é válida...</font></center>” formulario_introducao exit sub else if len(Request.Form(“telefone”))>22 or len(Request.Form(“telefone”))<6 then Response.Write “<center><font color=’RED’>O telefone excedeu o número de caracteres, ou tem menos de 6.</font></center>” formulario_introducao exit sub else if len(Request.Form(“email”))>32 then Response.Write “<center><font color=’RED’>O email excedeu o número de caracteres.</font></center>” formulario_introducao exit sub end if end if end if end if introducao_dados End Sub Ao introduzirmos dados incorrectos este procedimento vai devolver uma mensagem de erro Fig. 5.14 - Aspecto do formulário do ficheiro cpt5-4-2.asp, com um campo em que se tentam introduzir dados inválidos CAPÍTULO 5: BASES DE DADOS 131 Depois da validação, corremos o procedimento introducao_dados que é onde estará o código de conexão e declaração SQL, necessários para actuar na BD. Sub introducao_dados() Set Conn = Server.CreateObject(“ADODB.Connection”) Conn.open “DSN=livrodsn;” Set rs = Server.CreateObject(“ADODB.Recordset”) SQLStmt = “INSERT INTO contactos (nome, idade, telefone, email, data) “ SQLStmt = SQLStmt & “VALUES(‘“&Request.Form(“nome”)&”’,” SQLStmt = SQLStmt & “ “&Request.Form(“idade”)&”,” SQLStmt = SQLStmt & “ ‘“&Request.Form(“telefone”)&”’, “ SQLStmt = SQLStmt & “‘“&Request.Form(“email”)&”’, “ SQLStmt = SQLStmt & “now())” rs.Open SQLstmt,Conn,1,2 Response.Write “<br><br><center>Acabou de ser introduzido um novo contacto.<br><br>” Response.Write “<a href=’cpt5-4-2.asp’>introduzir novo contacto</a> </center>” End Sub Depois da introdução dos dados, fica a nossa página completa. Note-se que toda a introdução de dados é feita via SQL, para que no futuro não tenha problemas de portar o código para algum sistema diferente. Usamos o Exit Sub, para que não corra logo a seguir à introdução dos dados, sendo nosso objectivo mostrar o texto de erro e pedir novos dados puxando o formulário novamente. O resultado final da nossa página é então o seguinte: (ficheiro cpt5-4-2.asp) <% Sub introducao_dados() Set Conn = Server.CreateObject(“ADODB.Connection”) Conn.open “DSN=livrodsn;” Set rs = Server.CreateObject(“ADODB.Recordset”) SQLStmt = “INSERT INTO contactos (nome, idade, telefone, email, data) “ SQLStmt = SQLStmt & “VALUES(‘“&Request.Form(“nome”)&”’,” SQLStmt = SQLStmt & “ “&Request.Form(“idade”)&”,” SQLStmt = SQLStmt & “ ‘“&Request.Form(“telefone”)&”’, “ SQLStmt = SQLStmt & “‘“&Request.Form(“email”)&”’, “ SQLStmt = SQLStmt & “now())” rs.Open SQLstmt,Conn,1,2 Response.Write “<br><br><center>Acabou de ser introduzido um novo contacto.<br><br>” 132 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES Response.Write “<a href=’cpt5-4-2.asp’>introduzir novo contacto</a> </center>” End Sub Sub validar_dados() if len(Request.Form(“nome”))>50 or len(Request.Form(“nome”))<3 then Response.Write “<center><font color=’RED’>O nome não pode exceder os 50 caracteres, ou ter menos de 3.</font></center>” formulario_introducao exit sub else if (len(Request.Form(“idade”))>3 or (not isnumeric(Request.Form(“idade”)))) then Response.Write “<center><font color=’RED’>A idade não é válida...</font></center>” formulario_introducao exit sub else if len(Request.Form(“telefone”))>22 or len(Request.Form(“telefone”))<6 then Response.Write “<center><font color=’RED’>O telefone excedeu o número de caracteres, ou tem menos de 6.</font></center>” formulario_introducao exit sub else if len(Request.Form(“email”))>32 then Response.Write “<center><font color=’RED’>O email excedeu o número de caracteres.</font></center>” formulario_introducao exit sub end if end if end if end if introducao_dados End Sub Sub formulario_introducao%> <div align=”center”> <table bordercolor=”black” border=”1" cellpadding=”5" cellspacing=”0"> <tr><td> <form action=”cpt5-4-2.asp?fazer=introduzir” method=”POST”> Nome: <input type=”text” name=”nome” value=”<%=Request.Form(“nome”)%>” size=”30"><br> Idade: <input type=”text” name=”idade” CAPÍTULO 5: BASES DE DADOS 133 value=”<%=Request.Form(“idade”)%>” size=”3"><br> Telefone: <input type=”text” name=”telefone” value=”<%=Request.Form(“telefone”)%>” size=”12"><br> E-Mail: <input type=”text” name=”email” value=”<%=Request.Form(“email”)%>” size=”22"><br> <center><input type=”submit” value=”Introduzir”></center> </form> </td></tr></table></div> <%End Sub%> <% if request.querystring(“fazer”) = “introduzir” then validar_dados else formulario_introducao end if %> O código, if request.querystring(“fazer”) = “introduzir” then validar_dados else formulario_introducao end if serve para sabermos qual a acção a prosseguir, pois no nosso formulário criamos o argumento fazer, para podermos controlar se mostramos o formulário ou se vamos actuar na BD, com dados já introduzidos. Agora, podemos deparar com uma situação em que o utilizador quer apagar um contacto. Nesta altura é necessário disponibilizar uma lista de contactos existentes, de maneira ao utilizador escolher aquele que quer apagar. Uma das maneiras possíveis (e a que vamos usar), é a de criar uma ComboBox com todos os nomes, e um botão de apagar junto da mesma. Primeiro precisamos de um procedimento onde temos o formulário que inclui a tal ComboBox e o botão para apagar. 134 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES <%Sub formulario() Set Conn = Server.CreateObject(“ADODB.Connection”) Conn.open “DSN=livrodsn;” Set rs = Server.CreateObject(“ADODB.Recordset”) SQLStmt = “SELECT * FROM contactos” rs.Open SQLstmt,Conn,1,2 %> <FORM ACTION=”cpt5-4-3.asp?fazer=apagar” METHOD=”POST”> <font face=”ARIAL” size=”2">contactos na base de dados</font><br> <SELECT NAME=”contacto”> <OPTION selected> — escolha — </OPTION> <%While Not rs.EOF %> <OPTION VALUE=”<%= rs.Fields(“ID”) %>”><%= rs.Fields(“nome”)%> </OPTION> <%rs.MoveNext Wend rs.close%> </SELECT> <INPUT type=”submit” value=”Apagar”> </FORM> <%End Sub%> Verificar que na ComboBox a tag ‘VALUE’ recebe o número do ID do contacto, número esse que será a referência futura na declaração de SQL, de forma a sabermos qual o contacto a eliminar. Fig. 5.17 - Aspecto do formulário do ficheiro cpt5-4-3.asp CAPÍTULO 5: BASES DE DADOS 135 No procedimento para apagar, tudo o que se tem a fazer é receber o número (identificador) do contacto que pretende apagar, introduzir esse valor na declaração de SQL, e executar a mesma. O contacto fica então apagado, é devolvida uma mensagem ao utilizador que diz que o processo foi executado com sucesso. Introduziu-se também um link para o caso de haver necessidade de se apagar mais algum contacto. <%Sub apagar_contacto%> <% Set Conn = Server.CreateObject(“ADODB.Connection”) Conn.open “DSN=livrodsn;” Set rs = Server.CreateObject(“ADODB.Recordset”) SQLStmt = “DELETE FROM contactos WHERE ID = “ & Request.Form(“contacto”) rs.Open SQLstmt,Conn,1,2 %> <strong><font face=”ARIAL” size=”3">O contacto escolhido foi apagado... </font></strong><br> <br><br><a href=”cpt5-4-3.asp”>continuar a apagar</a> <%End Sub%> Fig. 5.18 - Aspecto da resposta do ficheiro cpt5-4-3.asp, depois do comando apagar 136 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES O ficheiro com todo o código fica então com a seguinte estrutura: (ficheiro cpt5-4-3.asp) <%Sub formulario() Set Conn = Server.CreateObject(“ADODB.Connection”) Conn.open “DSN=livrodsn;” Set rs = Server.CreateObject(“ADODB.Recordset”) SQLStmt = “SELECT * FROM contactos” rs.Open SQLstmt,Conn,1,2 %> <FORM ACTION=”cpt5-4-3.asp?fazer=apagar” METHOD=”POST”> <font face=”ARIAL” size=”2">contactos na base de dados</font><br> <SELECT NAME=”contacto”> <OPTION selected> — escolha — </OPTION> <%While Not rs.EOF %> <OPTION VALUE=”<%= rs.Fields(“ID”) %>”><%= rs.Fields(“nome”)%> </OPTION> <%rs.MoveNext Wend rs.close%> </SELECT> <INPUT type=”submit” value=”Apagar”> </FORM> <%End Sub%> <%Sub apagar_contacto%> <% Set Conn = Server.CreateObject(“ADODB.Connection”) Conn.open “DSN=livrodsn;” Set rs = Server.CreateObject(“ADODB.Recordset”) SQLStmt = “DELETE FROM contactos WHERE ID = “ & Request.Form(“contacto”) rs.Open SQLstmt,Conn,1,2 %> <strong><font face=”ARIAL” size=”3">O contacto escolhido foi apagado... </font></strong><br> <br><br><a href=”cpt5-4-3.asp”>continuar a apagar</a> <%End Sub%> <% if Request.querystring(“fazer”)=”apagar” then apagar_contacto else formulario end if %> CAPÍTULO 5: BASES DE DADOS 137 Ao criar e apagar dados em bases de dados, o utilizador começa ao longo do tempo a necessitar de fazer actualizações nos contactos, como o e-mail e o número de telefone. É por isso que aparece agora o próximo ficheiro para actualizar dados já existentes. A fórmula vai ser um pouco a mesma que foi vista. Vamos então ter a ComboBox, só que nesta escolhemos o contacto, depois serão devolvidos os dados desse, preparados para actualização. Foi usado um procedimento que já tinha sido criado aquando da inserção de novos contactos – referimo-nos à validação da informação. Vamos também usar o formulário de apresentação e recepção dos dados, criado anteriormente, ficando por fazer apenas o código de inicialização, e os procedimentos de alteração dos dados. O esquema aqui vai mudar, na medida em que é necessário guardar a variável que representa a identificação da linha da tabela a alterar (o identificador é a chave da tabela). Isto porque será feita uma escolha num formulário. De seguida passamos para a zona onde o utilizador poderá alterar os dados do identificador escolhido anteriormente, e no final faz-se uma execução da alteração feita na fase anterior, com uma declaração de UPDATE de SQL. <%Sub alterar() Set Conn = Server.CreateObject(“ADODB.Connection”) Conn.open “DSN=livrodsn;” Set rs = Server.CreateObject(“ADODB.Recordset”) SQLStmt = “SELECT * FROM contactos WHERE ID=” & session(“contacto”) rs.Open SQLstmt,Conn,1,2%> <div align=”center”> <table bordercolor=”black” border=”1" cellpadding=”5" cellspacing=”0"> <tr><td> <form action=”cpt5-4-4.asp?fazer=executar” method=”POST”> Nome : <input type=”text” name=”nome” value=”<%=rs.Fields(“nome”)%>” size=”30"><br> Idade : <input type=”text” name=”idade” value=”<%=rs.Fields(“idade”)%>” size=”3"><br> Telefone: <input type=”text” name=”telefone” value=”<%=rs.Fields(“telefone”)%>” size=”12"><br> E-Mail: <input type=”text” name=”email” value=”<%=rs.Fields(“email”)%>” size=”22"><br> <center><input type=”submit” value=”Submeter Alteração”></center> </form> </td></tr></table></div> <%End Sub%> 138 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES Repare-se que a maneira de obtermos o valor que vem na resposta da execução do SQL é com rs.Fields(“..”) , ou seja, recordset.Fields(“nome_do_campo”). Mais tarde o leitor terá de lidar com estes dados um a um, pois a resposta de uma declaração pode ser múltipla. Desta maneira, os dados foram introduzidos nos campos certos no formulário, e o utilizador terá a hipótese de os alterar. A seguir, depois da submissão desses novos dados, é preciso validar os mesmos, e se tudo estiver correcto, introduzi-los na BD, como no procedimento seguinte: <%Sub executar_alterar%> <% Set Conn = Server.CreateObject(“ADODB.Connection”) Conn.open “DSN=livrodsn;” Set rs = Server.CreateObject(“ADODB.Recordset”) SQLStmt = “UPDATE contactos SET “ SQLStmt = SQLStmt & “ nome = ‘“&Request.Form(“nome”)&”’, “ SQLStmt = SQLStmt & “idade = “&Request.Form(“idade”)&”,” SQLStmt = SQLStmt & “ telefone = ‘“&Request.Form(“telefone”)&”’, “ SQLStmt = SQLStmt & “email = ‘“&Request.Form(“email”)&”’” SQLStmt = SQLStmt & “ WHERE ID = “ & session(“contacto”) rs.Open SQLstmt,Conn,1,2 %> <strong><font face=”ARIAL” size=”3">O contacto escolhido foi alterado... </font></strong><br> <br><br><a href=”cpt5-4-4.asp”>continuar a alterar</a> <%End Sub%> Toda a estrutura fica então completa, da seguinte maneira: (ficheiro cpt5-4-4.asp) <%Sub formulario_principal() Set Conn = Server.CreateObject(“ADODB.Connection”) Conn.open “DSN=livrodsn;” Set rs = Server.CreateObject(“ADODB.Recordset”) SQLStmt = “SELECT * FROM contactos” rs.Open SQLstmt,Conn,1,2%> <FORM ACTION=”cpt5-4-4.asp?fazer=alterar” METHOD=”POST”> <font face=”ARIAL” size=”2">contactos na base de dados</font><br> <SELECT NAME=”contacto”> <OPTION selected> — escolha — </OPTION> <%While Not rs.EOF%> CAPÍTULO 5: BASES DE DADOS 139 <OPTION VALUE=”<%= rs.Fields(“ID”) %>”><%= rs.Fields(“nome”)%> </OPTION> <%rs.MoveNext Wend rs.close%> </SELECT> <INPUT type=”submit” value=”Alterar”> </FORM> <%End Sub%> <%Sub executar_alterar%> <% Set Conn = Server.CreateObject(“ADODB.Connection”) Conn.open “DSN=livrodsn;” Set rs = Server.CreateObject(“ADODB.Recordset”) SQLStmt = “UPDATE contactos SET “ SQLStmt = SQLStmt & “ nome = ‘“&Request.Form(“nome”)&”’, “ SQLStmt = SQLStmt & “idade = “&Request.Form(“idade”)&”,” SQLStmt = SQLStmt & “ telefone = ‘“&Request.Form(“telefone”)&”’, “ SQLStmt = SQLStmt & “email = ‘“&Request.Form(“email”)&”’” SQLStmt = SQLStmt & “ WHERE ID = “ & session(“contacto”) rs.Open SQLstmt,Conn,1,2 %> <strong><font face=”ARIAL” size=”3">O contacto escolhido foi alterado... </font></strong><br> <br><br><a href=”cpt5-4-4.asp”>continuar a alterar</a> <%End Sub%> <%Sub validar_dados() if len(Request.Form(“nome”))>50 or len(Request.Form(“nome”))<3 then Response.Write “<center><font color=’RED’>O nome não pode exceder os 50 caracteres, ou ter menos de 3.</font></center>” Alterar exit sub else if (len(Request.Form(“idade”))>3 or (not isnumeric(Request.Form(“idade”)))) then Response.Write “<center><font color=’RED’>A idade não é válida.</font></center>” Alterar exit sub else if len(Request.Form(“telefone”))>22 or len(Request.Form(“telefone”))<6 then Response.Write “<center><font color=’RED’>O telefone excedeu 140 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES o número de caracteres, ou tem menos de 6.</font></center>” Alterar exit sub else if len(Request.Form(“email”))>32 then %>center><font color=’RED’>O email excedeu o número de caracteres.</font></center><% alterar exit sub end if end if end if end if executar_alterar End Sub%> <%Sub alterar() Set Conn = Server.CreateObject(“ADODB.Connection”) Conn.open “DSN=livrodsn;” Set rs = Server.CreateObject(“ADODB.Recordset”) SQLStmt = “SELECT * FROM contactos WHERE ID=” & session(“contacto”) rs.Open SQLstmt,Conn,1,2%> <div align=”center”> <table bordercolor=”black” border=”1" cellpadding=”5" cellspacing=”0"> <tr><td> <form action=”cpt5-4-4.asp?fazer=executar” method=”POST”> Nome : <input type=”text” name=”nome” value=”<%=rs.Fields(“nome”)%>” size=”30"><br> Idade : <input type=”text” name=”idade” value=”<%=rs.Fields(“idade”)%>” size=”3"><br> Telefone : <input type=”text” name=”telefone” value=”<%=rs.Fields(“telefone”)%>” size=”12"><br> E-Mail : <input type=”text” name=”email” value=”<%=rs.Fields(“email”)%>” size=”22"><br> <center><input type=”submit” value=”Submeter Alteração”></center> </form> </td></tr></table></div> <%End Sub%> <% if len(session(“contacto”)) = 0 and len(Request.Form(“contacto”))<>0 then session(“contacto”) = Request.Form(“contacto”) end if CAPÍTULO 5: BASES DE DADOS 141 select case request.querystring(“fazer”) case “alterar” alterar case “executar” validar_dados case else formulario_principal end select%> O código, if len(session(“contacto”)) = 0 and len(Request.Form(“contacto”))<>0 then session(“contacto”) = Request.Form(“contacto”) end if é usado para que o identificador do contacto seja guardado e esteja disponível durante as páginas, pois é com ele que podemos localizar, nas declarações de SQL, se o tamanho do mesmo é vazio, e o retorno do formulário estiver preenchido. Vamos então preencher a variável de sessão contacto, com o identificador que vem do formulário. Para controlarmos qual dos procedimentos a executar, além de determinarmos a variável argumento fazer, temos que depois buscar o valor que esta detém, e correr o procedimento que se identifica com esse comando, com o seguinte código: select case request.querystring(“fazer”) case “alterar” alterar case “executar” validar_dados case else formulario_principal end select Ficam então assim descritas as três situações que o leitor vai encontrar quando começar a trabalhar com as ASP: Introduzir, apagar e actualizar dados em BD parece ser por vezes difícil mas isso só se pode dizer depois de conhecidos os objectivos. Por vezes para se actualizar uma tabela é preciso percorrer outras, e o programa terá de abrir vários recordsets e por vezes várias conexões, o que será mais trabalhoso, e pedirá um esforço intelectual maior. 142 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES 5.5 Apresentação de dados Podemos apresentar os dados de várias maneiras mas normalmente são usadas as tabelas de HMTL (tratadas no primeiro capítulo deste manual) para chegarmos a esse objectivo. Além da conexão à BD, necessitaremos então de executar declarações de SQL, como já foi feito. A diferença aqui é que vamos ter de percorrer uma a uma e colocar os dados nos locais que nos convém. O método movenext, que funciona com o objecto recordset, é o passo a seguir por cada vez que queremos percorrer a resposta da nossas declaração de SQL. (ficheiro cpt5-5-1.asp) <% Set Conn = Server.CreateObject(“ADODB.Connection”) Conn.open “DSN=livrodsn;” Set rs = Server.CreateObject(“ADODB.Recordset”) SQLStmt = “SELECT * FROM contactos” rs.Open SQLstmt,Conn,1,2 %> <table border=”0" width=”580" cellpadding=”4" cellspacing=”0"> <tr> <td width=”170"><b>Nome</b></td> <td width=”50" align=”right”><b>Idade</b></td> <td width=”” align=”right”><b>Telefone</b></td> <td width=””><b>E-Mail</b></td> </tr> <% cor=”99CCFF” while not rs.EOF%> <tr> <td bgcolor=”#<%=cor%>”><%=Rs.Fields(“nome”)%></td> <td bgcolor=”#<%=cor%>” align=”right”><%=Rs.Fields(“idade”)%></td> <td bgcolor=”#<%=cor%>” align=”right”><%=Rs.Fields(“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> 144 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES Agora digamos que queremos criar uma tabela dinâmica, que vai fazer uso de imagens. Neste caso para aqueles que têm e para os que não têm e-mail. Digamos que para cada pessoa que tem e-mail aparece uma imagem que, carregando na mesma, permite o envio de e-mail para essa pessoa. Para isso temos de validar o campo que devolve o e-mail, ver se esse não está vazio, e nesse caso mostrar ou não a imagem referente a um envelope. (ficheiro cpt5-5-2.asp) <% Set Conn = Server.CreateObject(“ADODB.Connection”) Conn.open “DSN=livrodsn;” Set rs = Server.CreateObject(“ADODB.Recordset”) SQLStmt = “SELECT * FROM contactos” rs.Open SQLstmt,Conn,1,2 %> <table border=”0" width=”580" cellpadding=”4" cellspacing=”0"> <tr> <td width=”32" align=”right”><font size=”1"><b>e-mail</b></font></td> <td width=”170"><b>Nome</b></td> <td width=”50" align=”right”><b>Idade</b></td> <td width=”” align=”right”><b>Telefone</b></td> </tr> <% cor=”99CCFF” while not rs.EOF%> <tr> <td align=”right”><% if len(Rs.Fields(“email”))>1 then Response.write “<a href=’mailto:”&Rs.Fields(“email”)&”’>” Response.Write “<img border=’0' src=’carta.jpg’></a>” end if %></td> <td bgcolor=”#<%=cor%>”><%=Rs.Fields(“nome”)%></td> <td bgcolor=”#<%=cor%>” align=”right”><%=Rs.Fields(“idade”)%></td> <td bgcolor=”#<%=cor%>” align=”right”><%=Rs.Fields(“telefone”)%></td> </tr> <%rs.MoveNext if cor=”99CCFF” then cor=”9999FF” else cor=”99CCFF” end if wend %></table> CAPÍTULO 5: BASES DE DADOS 145 Foram usados os seguintes objectos e funções: Len () aqui usado para testar o tamanho do e-mail. Se for menor que um é porque é inexistente, e nesse caso não se mostra a imagem que representa um envelope e respectivo link para envio de e-mail; <a href=”mailto:<%=Rs.Fields(“email”) %>”> desta maneira introduzimos o e-mail que é devolvido pela BD, e usando o comando mailto: ele passa a usar esse link, como envio de e-mail para o endereço definido. Como se pode verificar foi aproveitado o código do ficheiro cpt5-51.asp. Para este caso bastou-nos alterar a ordem de apresentação dos dados, e validar o campo de e-mail. Fig. 5.20 - Aspecto da resposta do ficheiro cpt5-5-2.asp Algo que é muito usado nas páginas Internet é a pesquisa nas bases de dados da existência de um dado utilizador, e é esse exemplo que vamos apresentar de seguida. 146 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES (ficheiro cpt5-5-3.asp) <%Sub Listagem() Set Conn = Server.CreateObject(“ADODB.Connection”) Conn.open “DSN=livrodsn;” Set rs = Server.CreateObject(“ADODB.Recordset”) SQLStmt = “SELECT * FROM contactos WHERE nome like ‘%” & Request.Form(“nome”) & “%’” rs.Open SQLstmt,Conn,1,2 %> <table border=”0" width=”580" cellpadding=”4" cellspacing=”0"> <tr> <td width=”32" align=”right”><font size=”1"><b>e-mail</b></font></td> <td width=”170"><b>Nome</b></td> <td width=”50" align=”right”><b>Idade</b></td> <td width=”” align=”right”><b>Telefone</b></td> </tr> <% cor=”99CCFF” while not rs.EOF%> <tr> <td align=”right”><% if len(Rs.Fields(“email”))>1 then Response.write “<a href=’mailto:”&Rs.Fields(“email”)&”’>” Response.Write “<img border=’0' src=’carta.jpg’></a>” End if %></td> <td bgcolor=”#<%=cor%>”><%=Rs.Fields(“nome”)%></td> <td bgcolor=”#<%=cor%>” align=”right”><%=Rs.Fields(“idade”)%></td> <td bgcolor=”#<%=cor%>” align=”right”><%=Rs.Fields(“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%> 148 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES 5.6 Exemplos com bases de dados Um dos exemplos mais utilizados que recorrem às bases de dados são os famosos livro de visitas, que além de serem simples de desenvolver, servem depois para serem aproveitados noutras aplicações para a Internet com as ASP. Para começar vamos criar uma tabela na nossa BD; a mesma que usámos para os contactos, com os campos básicos para um livro de visitas. TABELA LIVRO_VISITAS ID_livro as autonumber Data_assinatura as Date/Time Nome as Text (30) Email as Text (30) Texto as Memo Agora que já temos a BD actualizada com a tabela livro_visitas podemos iniciar a construção do esquema para o livro de visitas. O livro de visitas não é mais que uma tabela, como as que já vimos, com dados, mas com uma apresentação diferente. Além dessa apresentação dos dados temos também um formulário de introdução de dados. Um truque, se assim se pode chamar, introduzido neste exemplo, é o de refrescar a página depois de ser submetido o formulário, para que o argumento não fique no link de caminho do browser. O problema de o argumento ficar no link é que ao fazer refresh na página, os dados são introduzidos novamente, mas se chamar a página novamente sem argumento esse problema fica resolvido. Mas para nos apercebermos disto vamos ver o código fonte desta página ASP que é um livro de visitas. (ficheiro cpt5-6-1.asp) <% Sub Introduzir() passa = 1 nome = left(Request.Form(“nome”),30) nome = Replace(nome, “‘“, “”) email = left(Request.Form(“email”),30) email = Replace(email, “‘“, “”) texto = Request.Form(“texto”) texto = Replace(texto, “‘“, “”) if (len(nome)<2) then passa = 0 end if CAPÍTULO 5: BASES DE DADOS 149 if (len(texto)<15) then passa = 0 end if If Len(email) > 0 and Len(email) < 5 Then Passa = 0 Else If InStr(1, email, “@”, 1) < 2 Then Passa = 0 Else If InStr(1,email, “.”, 1) < 4 Then Passa = 0 End If End If End If if passa=1 then rs.Close SQLStmt = “INSERT INTO livro_visitas (data_assinatura, nome, email, texto) VALUES(“ SQLStmt = SQLStmt & “‘“ & now() & “‘, ‘“ SQLStmt = SQLStmt & nome & “‘, ‘“ & email & “‘, ‘“ & texto & “‘)” rs.Open SQLstmt,Conn,1,2 Response.Redirect(“cpt5-6-1.asp”) Else Response.Write “<font color=’red’>os dados que tentou introduzir não foram válidos.</font>” end if End Sub Set Conn = Server.CreateObject(“ADODB.Connection”) Conn.open “DSN=livrodsn;” Set rs = Server.CreateObject(“ADODB.Recordset”) SQLStmt = “SELECT * FROM livro_visitas ORDER BY data_assinatura DESC” rs.Open SQLstmt,Conn,1,2 if Request.QueryString(“fazer”)=”introduzir” then introduzir end if %><p> </p><div align=”center”> <table border=”0" width=”580" cellpadding=”4" cellspacing=”2"><% while not rs.EOF%> <tr><td bgcolor=”#C6C6C6"> <p align=”left”>Assinatura de <a href=”mailto: <%=rs.Fields(“email”)%>”> <%=rs.Fields(“nome”)%></a></p> <center> <p align=”center”><%=rs.Fields(“texto”)%></p> 150 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES <p align=”center”> </td> </center> </td></tr> <%rs.MoveNext wend %> <tr><td> <form action=”cpt5-6-1.asp?fazer=introduzir” method=”POST”> Indique o seu nome : <INPUT TYPE=”TEXT” NAME=”nome” size=”22" maxlength=”30"><br> o seu e-mail : <INPUT TYPE=”TEXT” NAME=”email” size=”22" maxlength=”30"><br> a mensagem que quer deixar :<br> <TEXTAREA name=”texto” cols=”33" rows=”7"></TEXTAREA><br> <input type=”submit” value=”Assinar o Livro”> </form> </td></tr></table></div> Foram usados os seguintes objectos e funções: Len () esta função serve aqui para podermos medir o tamanho das strings que são enviadas do formulário. Assim poderemos ver se estão vazias, ou se estão dentro dos requisitos mínimos, impostos pelo programa; Left () devolve os n caracteres da esquerda de uma determinada string. Digamos que temos um campo que não pode ter mais de 30 caracteres na BD e assim nós forçamos esse limite; Replace () foi aqui usado por causa das plicas ‘ , que ao serem usadas nas declarações de SQL dão erro, pois o próprio SQL usa as mesmas para limitação de código; Response.Redirect () o truque que aqui foi feito com este objecto e método, era de maneira a que o argumento ?fazer=introduzir não ficasse na linha do URL no browser, pois no caso do utilizador fazer refrescamento do site com este argumento, a BD passava a ter outro registo igual ao que já tinha sido feito. 152 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES TABELA SONDAGEM ID_sondagem as autonumber Resposta as Text (5) Valor as number Vamos então fazer um formulário que recebe o input do utilizador, e depois vamos processar o mesmo actualizando a base de dados consoante a resposta. (ficheiro cpt5-6-2.asp) <% Sub Introduzir() SQLStmt = “UPDATE sondagem SET valor = valor+1 WHERE resposta =’” & Request.Form(“sondagem”) &”’” Rs.Open SQLstmt,Conn,1,2 Response.Redirect(“cpt5-6-2.asp”) End Sub Set Conn = Server.CreateObject(“ADODB.Connection”) Conn.open “DSN=livrodsn;” Set rs = Server.CreateObject(“ADODB.Recordset”) if Request.QueryString(“fazer”)=”introduzir” then introduzir end if %> <div align=”center”> <table border=”0" width=”400"> <tr> <td width=”100%”> <p align=”center”><font size=”3" face=”Arial”><b>Acha que este livro o ajudou?</b></font> </p> <div align=”center”> <table border=”0" width=”100"> <tr> <td width=”26"> <form action=”cpt5-6-2.asp?fazer=introduzir” method=”POST”> <p align=”right”><font size=”3" face=”Arial”><input type=”radio” value=”Sim” name=”sondagem”></font></td> <center> <td width=”60"><font size=”3" face=”Arial”>Sim</font></td> </tr> </center> <tr> <td width=”26"> <p align=”right”><font size=”3" face=”Arial”><input type=”radio” value=”Não” name=”sondagem”></font></td> CAPÍTULO 5: BASES DE DADOS 153 <center> <td width=”60"><font size=”3" face=”Arial”>Não</font></td> </tr> </table> <input type=”submit” value=”Votar”></form> <font size=”3" face=”Arial”> <b>Resultados até ao momento :</b><br> <%SQLStmt = “SELECT * FROM sondagem” rs.Open SQLstmt,Conn,1,2 while not rs.EOF Response.Write rs.Fields(“valor”) & “ respostas com “ Response.Write rs.Fields(“resposta”) & “<br>” rs.MoveNext wend rs.Close %> </font> </center> </div> <center> </center> </td> </tr> <center> </table> </center> </div> Como se pode notar nestes exemplos, a inicialização da conexão à base de dados é sempre feita no início do código (sabendo que os procedimentos e funções só actuam se chamados). Fig. 5.24 - Aspecto da resposta do ficheiro cpt5-6-2.asp - a Sondagem 154 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES Como se pode ver pela imagem, a apresentação é clara e o conteúdo o essencial. O leitor pode utilizar os dados que são recolhidos da BD para criar gráficos, ou outras formas de apresentação. A tabela foi criada de maneira a que possa ter todo o tipo de sondagens, independentemente do número de respostas possíveis. Depois deste capítulo existe ainda mais uma matéria para enriquecer os seus programas com ASP que é a criação e uso de componentes, que vamos ver já nas próximas páginas. 156 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES 6.1 Introdução aos Componentes Os componentes das ASP são ficheiros ActiveX que servem para melhorar o desempenho das páginas ASP, visto que são rápidos e permitem o desenvolvimento de funções reutilizáveis (que desta maneira podem ficar acessíveis para outras páginas). Se explorarmos bem o funcionamento das ASP vemos que os componentes são uma constante nesta linguagem, pois ao usarmos o Response ou mesmo o Request estamos já a usar componentes internos da linguagem ASP. Desta maneira podemos muito facilmente invocar os métodos e objectos que precisamos para construir as nossas páginas dinâmicas. Mas por vezes podemos querer aceder a certas funções que não são possíveis com as ASP. Para isso podemos aceder a outras como o Visual Basic (por exemplo), criando um componente nesta linguagem. Neste capítulo vai-se então demonstrar como se podem programar componentes ASP em Visual Basic 6, para posterior uso nas nossas páginas ASP. Com o tempo, o leitor vai cada vez mais usar este tipo de programação, pois facilita a mesma, e para aqueles que vendem os seus serviços, podem salvaguardar o seu código desta maneira. Existem alguns componentes que vêm com as ASP, assim como o CDO (componente de e-mail) que vem com o IIS, o TextStream, que é próprio das ASP, e muitos outros que podem ser encontrados na Internet. A sua grande maioria é comercial, ou seja, terá de pagar para os poder utilizar nos seus servidores. Mas muitos outros são grátis, e um dos locais onde pode tentar encontrá-los é em http:// www.aspfree.com ou http://www.15seconds.com . Estes sites têm listagens dos componentes disponíveis, ordenados por temas, e por tipo de disponibilidade (Free, Trial, Comercial, Demo, etc.). Durante este capítulo o leitor vai aprender a instalar componentes exteriores, desde encontrá-los na Internet, fazer o seu download e a seguir instalá-los, sendo explicado também como instalar o seu próprio componente, criado em Visual Basic. Depois de ter lido este livro, e ultrapassadas todas as dúvidas, o leitor estará então preparado para programar as ASP a alto nível, bastando apenas alguma prática adicional. CAPÍTULO 6: COMPONENTES 157 6.2 Tratamento de ficheiros de texto com o TextStream Este objecto do componente FileSystemObject não necessita de instalação pois vem já com o PWS ou IIS. Tudo o que tem de fazer é chamar o objecto do mesmo, e utilizá-lo. Este componente serve para o leitor usar ficheiros de texto. Algo que pode ser útil quando o mesmo quer guardar informação de rápido acesso, ou mesmo criar páginas HMTL no momento, do tipo dar a hipótese aos utilizadores de criarem uma página sua em função de um template do site. Desta forma toda a página pode ser gerada com este componente e ficar disponível no momento, e num nível mais alto, ser enviada por attach via e-mail para o utilizador. Além destas funções o leitor pode também fazer procura de ficheiros, e movê-los no servidor. As tabelas abaixo servem para ter uma noção daquilo que se pode fazer com este objecto, e quais as propriedades e métodos para tal. TABELA DE MÉTODOS DO TEXTSTREAM Método Tipo Descrição Read Input Este método vai ler os caracteres um a um. ReadLine Input Como o nome indica, desta forma lê-se uma linha inteira. ReadAll Input Lê-se toda a informação que está no ficheiro. Write Output Escreve toda a informação que quisermos introduzir, não mudando de linha, sendo a informação seguinte escrita logo a seguir a esta. WriteLine Output Escreve a informação enviada, mudando de seguida de linha. WriteBlankLines Output Introduz uma linha vazia. Skip Input Salta um número específico de caracteres. SkipLine Input Muda de linha. 158 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES TABELA DE PROPRIEDADES DO TEXTSTREAM Propriedade Descrição AtEndOfLine Maneira de o leitor saber se chegou ao fim da linha. Line Devolve o número da linha onde vamos. Column Devolve o número de caracteres que foram percorridos desde o início da linha. AtEndOfStream Desta maneira o leitor vai saber se já chegou ao fim do ficheiro. Uma maneira fácil de perceber o seu processo é o de escrever e ler as linhas de texto do ficheiro criado. Vamos então criar uma página ASP, que faz uma emulação de um jogo que é uma história em que cada pessoa vai acrescentando um parágrafo. No final a história até pode ter nexo, ou pode mesmo ser a maior confusão. Mas isto serve apenas para o leitor ter a percepção de como são usados estes ficheiros, e como este componente funciona. Primeiro de tudo vamos fazer uns ficheiros de teste, para nos apercebermos daquilo que vamos usar. Para abrir uma conexão para escrita e leitura de um ficheiro vamos usar procedimentos diferentes. Para escrevermos num ficheiro vamos usar a estrutura, Set ObjectoFicheiro = CreateObject(“Scripting.fileSystemObject”) Set EscreveTexto = ObjectoFicheiro.CreateTextFile (Server.MapPath(“ficheiro.txt”),True) Para lermos a informação lá escrita é usada a estrutura, Set ObjectoFicheiro = CreateObject(“Scripting.fileSystemObject”) Set LerTexto = ObjectoFicheiro.OpenTextFile (Server.MapPath(“ficheiro.txt”),1) CAPÍTULO 6: COMPONENTES 159 Desta maneira podemos então criar linhas de texto e lê-las logo a seguir. (ficheiro cpt6-2-1.asp) <% Response.Write “processo : Vai ser criada uma linha de texto.<br><br>” Set ObjectoFicheiro = CreateObject(“Scripting.fileSystemObject”) Set EscreveTexto = ObjectoFicheiro.CreateTextFile (Server.MapPath(“ficheiro.txt”),True) EscreveTexto.WriteLine(“Este linha está no ficheiro de texto...”) EscreveTexto.Close Response.Write “processo: Escreveu uma linha de texto.<br><br>” Response.Write “processo: Vai ler linha de texto.<br><br>” Set LerTexto = ObjectoFicheiro.OpenTextFile (Server.MapPath(“ficheiro.txt”),1) Response.Write “processo: A linha lida é: <b>” & LerTexto.Readline & “</b>” Set LerTexto = nothing %> Foram usados os seguintes objectos/métodos: CreateObject(“Scripting.FileSystemObject”) conexão ao componente. Desta forma ficamos com um objecto criado com a imagem do mesmo; CreateTextFile () forma com que se define a criação de um ficheiro de texto; EscreveTexto.WriteLine () Escrita de uma linha de texto, com mudança de linha; EscreveTexto.Close Fechar o objecto de escrita de texto; OpenTextFile () Abrir o ficheiro de texto para leitura; LerTexto.Readline () Ler uma linha do ficheiro de texto; LerTexto = nothing Limpar o objecto de leitura de texto. Podemos então visualizar o resultado obtido pelo nosso exemplo, em que na mesma ASP criamos um ficheiro de texto, com uma linha, e logo a seguir vamos buscar essa mesma linha e escrevê-la no browser. CAPÍTULO 6: COMPONENTES 161 (ficheiro cpt6-2-2.asp) <% Sub procura_ficheiro() Set ProcuraFicheiro = Server.CreateObject(“Scripting.fileSystemObject”) If Not ProcuraFicheiro.FileExists(Server.MapPath(“historia.txt”)) then Set ObjectoFicheiro = CreateObject(“Scripting.fileSystemObject”) Set EscreveTexto = ObjectoFicheiro.CreateTextFile (Server.MapPath(“historia.txt”),True) EscreveTexto.WriteLine(“ERA UMA VEZ............”) EscreveTexto.Close end if End Sub Sub escrita_de_linha() Set ObjectoFicheiro = CreateObject(“Scripting.fileSystemObject”) Set EscreveTexto = ObjectoFicheiro.OpenTextFile (Server.MapPath(“historia.txt”),8,True) If len(Request.Form(“linha”))>1 then EscreveTexto.WriteLine(Request.Form(“linha”)) end if EscreveTexto.Close End Sub Sub leitura_de_ficheiro() Set ObjectoFicheiro = CreateObject(“Scripting.fileSystemObject”) Set LerTexto = ObjectoFicheiro.OpenTextFile (Server.MapPath(“historia.txt”)) While NOT LerTexto.AtEndOfStream Response.Write “ | “ & LerTexto.ReadLine & “<br>” Wend Set LerTexto = nothing End Sub Sub formulario() %> <br><br><p><FORM action=”cpt6-2-2.asp” method=”POST”> Novo Parágrafo: <input type=”text” name=”linha” size=”60" MaxLength=”140"><br> <input type=”submit” name=”submeter” Value=”Acrescentar”> </FORM> </p> <% End Sub 162 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES If Request.Form(“submeter”) = “Acrescentar” then escrita_de_linha end if procura_ficheiro leitura_de_ficheiro formulario %> Foram usados os seguintes objectos/métodos: ProcuraFicheiro.FileExists() este comando devolve True ou False consoante exista o ficheiro que procuramos ou não; len() Foi aqui usado para termos a certeza que a linha enviada pelo utilizador não está vazia, e nesse caso não é inserida uma linha em branco no ficheiro; LerTexto.AtEndOfStream Este código, e no contexto em que foi inserido (no loop), vai percorrer linha a linha, possibilitando-nos escrever cada linha da história, na formatação que quisermos. Se fosse lido todo o ficheiro de uma vez poderiamos ter problemas de performance no futuro. Fig. 6.2 - Resultado do ficheiro cpt6-2-2.asp - a história que nunca acaba CAPÍTULO 6: COMPONENTES 163 O resultado da história nunca é igual de site para site. Cada utilizador chega e escreve uma nova linha, e pode alterar a mesma de acordo com a sua vontade. Outra forma de usarmos este útil componente é na contagem dos acessos a um site. Para isso basta-nos criar um ficheiro ASP que pode ser incluído em qualquer lado, contando assim os acessos ao nosso site. O esquema é muito simples. Temos o ficheiro com um valor, tiramos o valor, incrementamos-lhe um valor, e voltamos a lá introduzir, mas neste caso sempre a criar o ficheiro gravando o novo por cima do antigo. Tudo aquilo que vai ser usado foi já visto no exemplo anterior; só o uso do objecto é que vai ser um pouco diferente, o resultado é então o do ficheiro cpt6-2-3.asp (ficheiro cpt6-2-3.asp) <% Set ObjectoFicheiro = CreateObject(“Scripting.fileSystemObject”) Set LerTexto = ObjectoFicheiro.OpenTextFile (Server.MapPath(“contador.txt”),1) Valor = LerTexto.ReadLine Set LerTexto = nothing Set EscreveTexto = ObjectoFicheiro.CreateTextFile (Server.MapPath(“contador.txt”),True) EscreveTexto.WriteLine(valor+1) EscreveTexto.Close Response.Write “Houveram “ & (valor+1) & “ acessos...<br>” %> Neste caso já tínhamos de ter criado um ficheiro de texto (contador.txt) com o valor em que queríamos inicializar a contagem, neste caso, zero. Por cada entrada no site o valor é incrementado, podendo o leitor testar, fazendo múltiplos refrescamentos da página. Fig. 6.3 - Resultado do ficheiro cpt6-2-3.asp 164 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES Muitas outras funcionalidades se podem dar a este componente. Por vezes o simples envio de informação via Internet entre sites distintos necessita deste tipo de tratamento - ficheiros de informação que são trocados, e normalmente sempre em formato ASCII. 6.3 Componentes de e-mail Este tipo de componentes (e-mail) são muito importantes na construção de sites dinâmicos. É uma das maneiras de fazer chegar informação ao utilizador num nível mais pessoal. Normalmente necessitamos de preencher o campo de e-mail noutros sites, pois disso depende a recepção de uma password, ou de um ficheiro que não é possível fazer download pois tem de ser pedido aos seus responsáveis. Com estes componentes o leitor pode fazer algo semelhante. Vários componentes estão disponíveis na Internet, assim como o ASPEmail (www.aspemail.com) ou o Jmail que são grátis e qualquer pessoa os pode usar. Ficam então todos os passos para termos acesso ao componente Jmail, que existe há alguns anos e funcionou sempre na perfeição. Para fazer download deste componente tem de se dirigir a http:// tech.dimac.net, e procurar o ficheiro w3Jmail. Depois do download, a instalação é simples, pois trata-se de um ficheiro executável, e não de um DLL solto. Neste site existem também exemplos de código em que se usa o Jmail. Cabe ao leitor explorar estes pontos mais a fundo. Seja como for são aqui demonstrados dois exemplos válidos do uso deste componente. (ficheiro cpt6-3-1.asp) <% Set Jmail = Server.CreateObject(“JMail.SMTPMail”) JMail.ServerAddress = “mail.servidor.pt” ‘ aqui fica o servidor de e-mail JMail.Sender = “[email protected]” ‘ aqui fica o endereço de quem envia o e-mail JMail.Subject = “Titulo do E-Mail” ‘ aqui fica o titulo do e-mail / subject JMail.AddRecipient “[email protected]” ‘ endereço 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-mínima 3-máxima JMail.Execute %> CAPÍTULO 6: COMPONENTES 165 Foram usados os seguintes objectos/métodos : Server.CreateObject(“JMail.SMTPMail”) Cria-se assim a conexão ao componente de e-mail; JMail.ServerAddress () Desta forma vamos definir o servidor de e-mail a usar; JMail.Sender () Define-se aqui qual o e-mail da pessoa que o envia; JMail.Subject () Aqui indicamos o título da mensagem; JMail.AddRecipient () Escrevemos aqui para quem vamos enviar o e-mail; JMail.Body () Aqui fica a construção do corpo da mensagem; Jmail.Priority () Aqui definimos a prioridade do e-mail: 1-mínimo, 2-médio, 3-máximo; JMail.Execute () Só depois deste comando é que o e-mail é enviado. Primeiro são as configurações e depois é que é executada a função geral. Este exemplo tratava apenas do envio de um e-mail, sem nenhum propósito especial. Agora imaginemos que o leitor quer ter no seu site um ficheiro com anedotas e, para que os outros possam ter acesso, têm de indicar o e-mail para que as mesmas lhes sejam enviadas. Entra então assim o conceito do próximo exemplo: Temos um campo de um formulário onde os utilizadores vão introduzir o seu e-mail, de maneira a poderem receber um documento que contém as anedotas que eles querem ter acesso. (ficheiro cpt6-3-2.asp) <% Sub enviar_piada() Set Jmail = Server.CreateObject(“JMail.SMTPMail”) Jmail.ServerAddress = “mail.servidor.pt” Jmail.Sender = “[email protected]” Jmail.Subject = “Aqui estão as piadas” Jmail.AddRecipient request.form(“email”) Corpo = “Aqui estão as piadas.doc em attachment. “ & Chr(13) & chr(12) & Chr(13) & chr(12) Corpo = corpo & Chr(13) & chr(12) & “Obrigado” Jmail.Body = corpo Jmail.AddAttachment “d:/piadas.doc” Jmail.Priority = 2 Jmail.Execute %> 166 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES <br><br><br> <p align=”center”><font face=”Arial”><b>Obrigado...</font><br> <small>receberá um e-mail meu dentro de momentos</small> </p> <% End Sub Sub formulario() %> <form action=”cpt6-3-2.asp” method=”POST”> Introduza o e-mail onde quer<br> receber as piadas: <input type=”text” name=”email”><br> <input type=”submit” name=”submeter” value=”Quero Receber”> </form> <% End Sub if Request.Form(“submeter”) = “Quero Receber” then enviar_piada else formulario end if %> Foram usados os seguintes objectos/métodos: JMail.AddAttachment () A maneira com que acrescentamos um ficheiro ao nosso e-mail (via attachment). Ficamos assim com mais conhecimentos sobre como se podem apurar as páginas dinâmicas. As utilizações possíveis para os componentes de e-mail são imensas. Numa delas, o leitor pode criar uma newsletter, onde todos os utilizadores estão em BD, e quando sai uma nova notícia uma página ASP pode-se encarregar de a enviar para todos os registados em BD. O envio de passwords para quem as perdeu é também uma das muitas funcionalidades dadas a este tipo de componentes. Assim como a confirmação de assinaturas e serviços que deste componente precisem para terem alguma 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 divulgação de novas, fazendo com que o tráfego do site aumente por cada novidade que apareça. CAPÍTULO 6: COMPONENTES 167 6.4 Criar componentes em Visual Basic 6 Para criarmos o componente previsto necessitamos apenas de algum conhecimento de Visual Basic (VB). O Visual Basic é uma das bases das ASP e como as duas linguagens são derivadas de VBScript não vão existir muitos problemas. Até mesmo o leitor que já se sente confortável na programação com ASP, e que nunca usou VB, não vai ter muitas dificuldades em aperceber-se daquilo que vai ser feito. O exemplo que vai ser criado não é nada de muito difícil, é algo aliás bastante simples, que serve apenas para ver como se devem criar componentes, instalá-los e usá-los. Vamos então criar um exemplo que usa o código já usado do Livro de Visitas, e que neste caso fica dentro de um componente DLL para ASP. Outra particularidade deste exemplo é que vamos dar hipótese à pessoa que o estiver a usar de poder fazer algumas alterações. Vamos então, antes de mais, inicializar o Visual Basic (este exemplo usa o Visual Basic 6). Ao aparecer a escolha do tipo de projecto optamos por ActiveX DLL. Fig.6.4 - Escolha do tipo de projecto CAPÍTULO 6: COMPONENTES 171 Private msc As ScriptingContext Private mapplication As Application Private mrequest As Request Private mresponse As Response Private mserver As Server Private msession As Session Private Conn As Connection Private RS As Recordset Podemos então reconhecer a conexão à BD e definição do Recordset que vamos usar para aceder à BD. De resto são as inicializações das variáveis que vão compensar os objectos das ASP. Para definirmos os procedimentos que são acessíveis do exterior basta definirmos se são Public ou Private. Public Sub NomeDoProcedimento() End Sub Private Sub NomeDoProcedimento() End Sub Existem dois procedimentos base nos componentes de ASP, que funcionam algo como os procedimentos do ficheiro Global.Asa, e que são os seguintes: Public Sub OnStartPage(psc As ScriptingContext) End Sub Public Sub OnEndPage() End Sub Deve ter reparado no tipo psc. Este serve para entrarmos no scripting da linguagem ASP, que no fundo é um sistema de texto corrido, para interpretação. Os procedimentos que vamos usar são os seguintes: Public Sub CorLetras(cor As String) Vai ser usado para introduzir a cor das letras numa variável de sessão, variável essa que será posteriormente usada; Public Sub ficheiro(ficheiro As String) Aqui introduzimos numa variável de sessão o nome do ficheiro que suporta o livro de visitas. Vai influenciar no redireccionamente e no Action do formulário HTML; 172 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES Public Sub CorLetrasCaixas(cor As String) Aqui o utilizador definirá a cor das letras das mensagens deixadas no livro de visitas; Public Sub CorCaixas(cor As String) Procedimento para definir a cor das caixas que suportam as mensagens; Public Sub OnStartPage(psc As ScriptingContext) Procedimento base que suporta tudo aquilo que deve ser inicializado antes de se começar a correr o código; Public Sub inicio() Procedimento que terá as primeiras linhas de código, que antes estavam fora dos procedimentos do livro de visitas; Private Sub Introduzir() Este é o procedimento que já usávamos antes no livro de visitas, aqui com algumas alterações pois temos de escrever o código todo com Response.Write e no VB com mresponse.write; Public Sub OnEndPage() Este é o procedimento base que define tudo o que é feito quando se acaba de usar o DLL. Neste caso limpamos todos os objectos que foram criados para simular os usados nas ASP Vamos então ver parte do que é feito no procedimento OnStartPage (): Set msc = psc ‘chamamos o objecto de scripting inicializado Set mapplication = msc.Application ‘ definimos como usar as variáveis 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 variável de sessão chamada Ficheiro com um texto ficheiro.asp faz, msession(“Ficheiro”) = “ficheiro.asp” CAPÍTULO 6: COMPONENTES 173 Se quisermos ter um valor inserido por um formulário com o nome email fazemos, Mrequest.form(“email”) E assim para todos as outras emulações criadas para os objectos. O leitor depois saberá qual o melhor uso a dar a cada uma. Tudo o resto poderá ser código base do VB, que será de onde se poderá tirar maior partido. Vamos então ver o ficheiro livrovisitas.cls - a classe que foi criada no VB para suportar o nosso livro de visitas. (ficheiro livrovisitas.cls) Private msc As ScriptingContext Private mapplication As Application Private mrequest As Request Private mresponse As Response Private mserver As Server Private msession As Session Private Conn As Connection Private RS As Recordset Public Sub CorLetras(cor As String) msession(“CorLetras”) = cor End Sub Public Sub ficheiro(ficheiro As String) msession(“Ficheiro”) = ficheiro End Sub Public Sub CorLetrasCaixas(cor As String) msession(“CorLetrasCaixas”) = cor End Sub Public Sub CorCaixas(cor As String) msession(“CorCaixas”) = cor End Sub Public Sub OnStartPage(psc As ScriptingContext) Set msc = psc Set mapplication = msc.Application Set mrequest = msc.Request Set mresponse = msc.Response Set mserver = msc.Server Set msession = msc.Session 174 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES Set Conn = mserver.CreateObject(“ADODB.Connection”) Conn.Open “DSN=livrodsn;” Set RS = mserver.CreateObject(“ADODB.Recordset”) End Sub Public Sub inicio() If mrequest.QueryString(“fazer”) = “introduzir” Then Introduzir End If mresponse.Write “<p> </p><div align=’center’>” mresponse.Write “<table border=’0' width=’580' cellpadding=’4' cellspacing=’2'>” SQLstmt = “SELECT * FROM livro_visitas ORDER BY data_assinatura DESC” RS.Open SQLstmt, Conn, 1, 2 While Not RS.EOF mresponse.Write “<tr><td bgcolor=’” & msession(“CorCaixas”) & “‘>” mresponse.Write “<p align=’left’><font color=’” & msession(“CorLetrasCaixas”) & “‘>” mresponse.Write “Assinatura de <a href=’mailto:” & RS.Fields(“email”) & “‘>” & RS.Fields(“nome”) mresponse.Write “</a></font></p>” mresponse.Write “<center>” mresponse.Write “<p align=’center’><font color=’” & msession(“CorLetrasCaixas”) & “‘>” mresponse.Write RS.Fields(“texto”) & “</font></p>” mresponse.Write “<p align=’center’> </td>” mresponse.Write “</center>” mresponse.Write “</td></tr>” RS.MoveNext Wend mresponse.Write “<tr><td>” mresponse.Write “<form action=’” & msession(“Ficheiro”) & “?fazer=introduzir’ method=’POST’>” mresponse.Write “<font color=’” & msession(“CorLetras”) & “‘>Indique o seu nome: </font>” mresponse.Write ”<INPUT TYPE=’TEXT’ NAME=’nome’ size=’22' maxlength=’30'><br>” mresponse.Write “<font color=’” & msession(“CorLetras”) & “‘>o seu email: </font>” mresponse.Write”<INPUT TYPE=’TEXT’ NAME=’email’ size=’22' maxlength=’30'><br>” mresponse.Write “<font color=’” & msession(“CorLetras”) & “‘>a mensagem que quer deixar:</font><br>” mresponse.Write “<TEXTAREA name=’texto’ cols=’33' rows=’7'> CAPÍTULO 6: COMPONENTES 175 </TEXTAREA><br>” mresponse.Write “<input type=’submit’ value=’Assinar o Livro’>” mresponse.Write “</form>” mresponse.Write “</td></tr></table></div>” End Sub Private Sub Introduzir() passa = 1 nome = Left(mrequest.Form(“nome”), 30) nome = Replace(nome, “‘“, “”) email = Left(mrequest.Form(“email”), 30) email = Replace(email, “‘“, “”) texto = mrequest.Form(“texto”) texto = Replace(texto, “‘“, “”) If (Len(nome) < 2) Then passa = 0 End If If (Len(texto) < 15) Then passa = 0 End If If Len(email) > 0 And Len(email) < 5 Then passa = 0 Else If InStr(1, email, “@”, 1) < 2 Then passa = 0 Else If InStr(1, email, “.”, 1) < 4 Then passa = 0 End If End If End If If passa = 1 Then RS.Close SQLstmt = “INSERT INTO livro_visitas (data_assinatura, nome, email, texto) VALUES(“ SQLstmt = SQLstmt & “‘“ & Now() & “‘, ‘“ SQLstmt = SQLstmt & nome & “‘, ‘“ & email & “‘, ‘“ & texto & “‘)” RS.Open SQLstmt, Conn, 1, 2 mresponse.Redirect (msession(“Ficheiro”)) Else mresponse.Write “<font color=’red’>os dados que tentou introduzir não foram válidos.</font>” End If End Sub 176 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES Public Sub OnEndPage() Set msc = Nothing Set mapplication = Nothing Set mrequest = Nothing Set mresponse = Nothing Set mserver = Nothing Set msession = Nothing End Sub Ficamos assim com o ficheiro que irá gerir todo o processo do componente. Tudo se passa como se fosse um ASP excepto as chamadas dos objectos base das ASP. Para testarmos este código necessitamos de fazer Run do mesmo, e logo de seguida ir a um ASP que busca este componente. No VB6 existe essa vantagem - não necessitamos de instalar o componente para o testar; basta carregar em RUN no VB, ir ao browser e abrir a página que chama o componente. Neste caso é uma página com a seguinte estrutura: (ficheiro cpt6-4-1.asp) <% Set lv = Server.CreateObject(“LivroASP.livrovisitas”) Lv.Ficheiro(“cpt6-4-1.asp”) lv.CorLetras(“Green”) lv.CorLetrasCaixas(“#F60000”) lv.CorCaixas(“#C6C6FF”) lv.inicio %> Como se pode ver define-se todos os dados possíveis do componente, busca-se o componente através de Serve.CreateObject onde a estrutura é, Server.CreateObject(“NomeProjecto.NomeClasse”) Depois o uso é básico e de fácil compreensão. 182 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES 7.1 Introdução Este capítulo foi introduzido neste manual, não para mais uma explicação 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 são familiares. O esquema de ambos é muito parecido, ao ponto de serem usados ficheiros idênticos em ambas as aplicações. Estes exemplos têm muito em comum, tais como, ficheiros, funções, métodos de busca de dados e muito mais. Mas o mais importante é que ambos usam apenas um ficheiro ASP e os outros são de apoio para a construção do primeiro, que é 80% dinâmico. Teremos 3 zonas desse ficheiro, o topo, o fundo e o centro. O centro é a zona mais dinâmica, onde vamos escolher consoante a resposta do nosso Querystring ou formulário, os dados a mostrar no browser. O esquema é então sempre o seguinte: Fig. 7.1 - Esquema dos exemplos deste capítulo Versão digital, individual, licenciada em Jan/Fev do ano 2000, pelo Centro Atlântico, da versão 1.0 do livro 'Programação Web com ASP' CAPÍTULO 7: EXEMPLOS REAIS 183 Pelo esquema vimos que existem ficheiros que estão incluídos na ASP, isso graças ao facto de usarmos o sistema SSI (já visto neste manual), de maneira a usarmos o comando <!—#INCLUDE FILE=”ficheiro.inc”—> . Desta maneira estamos livres para usar o primeiro ficheiro dinamicamente. Um exemplo de como fazer esse uso é com o argumento que vem com o link no browser. Digamos que temos duas hipóteses: se o argumento ‘fazer’ for sim, apresentamos o ficheiro com código HTML a representar ‘certo’ (pode não ser um ficheiro HTML, pode ter funções ASP), se for ‘não’, apresentamos o ficheiro ‘errado’. Vejamos então: No browser temos o link http://pc/livro/default.asp?fazer=sim Teremos no código ASP o seguinte: fazer = request.querystring(“fazer”) <%if fazer=”sim” then%> <!—#INCLUDE FILE=”certo.inc”—> <%else%> <!—#INCLUDE FILE=”errado.inc”—> <%end if%> E desta maneira manipulamos a apresentação, no browser, dos dados com um só ficheiro ASP. Claro que se estiver a programar um site com muitos acessos esta não será a maneira mais indicada, mas se não contar com mais de mil acessos diários pode estar descansado. Seja como for, estes exemplos servem para lhe dar a conhecer alguns truques usados por profissionais na programação de sites. Claro que nada disto é uma invenção de última hora, os mesmos recursos são usados por muitos mas de maneira diferente. 7.2 A Rã – Motor de Busca Este é sem sombra de dúvidas daqueles exemplos que muitos querem estudar e perceber como se podem ultrapassar alguns problemas. Não é nenhum exemplo para sites ‘Industriais’, mas por aqui o leitor ficará com as ideias arrumadas e com os conhecimentos suficientes para criar algo mais avançado do que este exemplo. O esquema de uso de ficheiros foi explicado no início deste capítulo, agora precisamos é de ver como estruturar a base de dados e definir 184 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES quais as funções que vamos precisar em função dos procedimentos que o site deverá ter. Podemos então desde logo identificar algumas etapas, mas para não ficar muito confuso vamos começar pelas bases de dados, e logo de seguida esquematizar o esquema de ficheiros que vão ser usados. Não é demais lembrar que neste capítulo não é prioridade explicar o que se faz em cada linha (apesar de muitos pontos serem explicados) mas sim, apresentar uma solução, e demonstrar como torná-la consistente na prática. Iremos ter então apenas uma tabela para guardar os dados que acharmos necessários (claro que o leitor poderá criar uma BD diferente, esta serve apenas de orientação inicial). Achou-se que para este exemplo a data, o título do site, uma descrição e a morada do próprio seriam suficientes. Ficando o nosso ficheiro em MSAccess (o usado deste o início do manual) com o seguinte aspecto na consola de Design. Fig. 7.2 - A BD do motor de busca - uma única tabela Versão digital, individual, licenciada em Jan/Fev do ano 2000, pelo Centro Atlântico, da versão 1.0 do livro 'Programação Web com ASP' CAPÍTULO 7: EXEMPLOS REAIS 185 O esquema é então o seguinte: TABELA: MOTORBUSCA id_motor Auto-number; o identificador do link url Text (250); o link da página registada titulo Text (80); o título da página descricao Memo; uma breve descrição do que trata o site data Date/Time; data em que foi inserido o link no motor de busca Podemos então começar a pensar no que vai ser preciso para por o motor de busca a funcionar, e podemos desde já fazer uma lista de pontos com a seguinte estrutura: 1 – Aspecto da página inicial; 2 – Formulário de procura de dados; 3 – Formulário de registo de site; 4 – Apresentação de dados; 5 – Resultado de procura de sites; 6 – Aspecto gráfico. Como vamos usar uma só ASP para suportar todas as tarefas do site, vamos implementar o que foi visto na lista em vários ficheiros *.inc (pode ter outra extensão) e usá-los quando achamos necessário, dentro da estratégia do site. Fica então assim o esquema seguinte para se ter uma noção do que vai acontecer, e onde aparecem os ficheiros de que falamos: Fig. 7.3 - Esquema de ficheiros do motor de busca 186 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES Ficamos assim com uma ideia dos ficheiros que vão ser usados e quais as hierarquias envolvidas nos mesmos. Vamos então descrever o que cada ficheiro tem: Imagens, C:\Inetpub\wwwroot\livro\motordebusca\imagens\Topo.jpg ficheiro que representa a imagem de topo do site, incluído no código HMTL do ficheiro topo.inc C:\Inetpub\wwwroot\livro\motordebusca\imagens\Bprocurar.gif ficheiro que representa o botão que se carrega para pesquisarmos no motor, usado no ficheiro procura.inc C:\Inetpub\wwwroot\livro\motordebusca\imagens\Bregistar.gif como o nome indica é o botão para registarmos os sites que queiram figurar na BD do motor de busca; é chamado no ficheiro registar.inc Ficheiros da página, C:\Inetpub\wwwroot\livro\motordebusca\Default.asp ficheiro que recebe os argumentos dos formulários ou da linha de comando do browser, e consoante o recebido consoante o ficheiro que é demonstrado na zona central da página; C:\Inetpub\wwwroot\livro\loja\motordebusca\Funcoes.asp aqui existe uma função que é usada em mais que um ficheiro, cuja função é validar as plicas usadas nas strings, para que quando usarmos a BD não apareçam erros, visto que as mesmas são usadas pela própria BD; C:\Inetpub\wwwroot\livro\motordebusca\includes\Fundo.inc ficheiro com o desenho do fundo do site (estático a 100%); C:\Inetpub\wwwroot\livro\motordebusca\includes\Inicial.inc esquema inicial, se não existirem argumentos no link, será este ficheiro a aparecer; C:\Inetpub\wwwroot\livro\motordebusca\includes\Listagem.inc depois de submetida a string de procura, aparecem todos os sites relacionados, e é este ficheiro que o vai fazer; Versão digital, individual, licenciada em Jan/Fev do ano 2000, pelo Centro Atlântico, da versão 1.0 do livro 'Programação Web com ASP' CAPÍTULO 7: EXEMPLOS REAIS 187 C:\Inetpub\wwwroot\livro\motordebusca\includes\Procura.inc é simplesmente o formulário onde o utilizador vai inserir a string de procura; C:\Inetpub\wwwroot\livro\motordebusca\includes\Registar.inc este vai ser o ficheiro que tem o formulário de registo de todos os sites que querem estar indexados no nosso motor de busca; C:\Inetpub\wwwroot\livro\motordebusca\includes\Topo.inc HTML com o desenho do topo do site (também como o fundo, 100% estático); C:\Inetpub\wwwroot\livro\livro.mdb ficheiro de base de dados onde figura a tabela de dados que usamos neste exemplo. A estrutura de directórios pode ser alterada pelo leitor desde que todo o ambiente o acompanhe. Pretendo por ambiente referir-me à configuração do servidor de Internet, à conexão à BD, às referências a páginas, etc. Agora podemos ir ver o código de todos os ficheiros e falar da função de cada procedimento dentro dos mesmos, se esses existirem. (ficheiro default.asp) <!—#INCLUDE FILE=”includes/topo.inc”—> <div align=”center”> <table width=”600"><tr> <td align=”top” width=”600"> <center><font size=”2" face=”Verdana”><a href=”default.asp”>página inicial</a> <a href=”default.asp?fazer=registar”>registar site </a> </font></center> <% fazer = Request.QueryString(“fazer”) ‘ vamos buscar o argumento fazer Select Case fazer ‘ vamos então chamar o ficheiro consoante o argumento Case “procura” ‘ se o argumento for procura foi submetida uma busca ‘ e se foi submetida uma busca vamos mostrar o formulário de busca ‘ e incluir a listagem de sites identificados com essa procura %> <!—#INCLUDE FILE=”includes/procura.inc”—> <!—#INCLUDE FILE=”includes/listagem.inc”—> 188 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES <% Case “registar” ‘ se o argumento for este é porque vai haver um novo registo %> <!—#INCLUDE FILE=”includes/registar.inc”—> <% Case Else ‘ se não existir argumento introduzimos a página inicial %> <!—#INCLUDE FILE=”includes/procura.inc”—> <!—#INCLUDE FILE=”includes/inicial.inc”—> <% End Select %> </td> </tr></table></div> <p> </p> <!—#INCLUDE FILE=”includes/fundo.inc”—> O resultado do exemplo anterior está representado na figura seguinte. Reparar que neste exemplo o argumento fazer não existe, e por isso os ficheiros introduzidos no meio do código são os correspondentes em Case Else. Fig. 7.4 - Aspecto geral da página principal Versão digital, individual, licenciada em Jan/Fev do ano 2000, pelo Centro Atlântico, da versão 1.0 do livro 'Programação Web com ASP' CAPÍTULO 7: EXEMPLOS REAIS 189 (ficheiro funcoes.asp) <% ‘ esta função serve exclusivamente para acrescentar uma plica ‘ por cada uma que existir nas strings a usar em declarações de SQL Function tira_plicas(texto) Texto = trim(texto) ‘ desta maneira tiramos os espaços em branco ao ‘ início e fim da string texto_temp = “” ‘ esta é uma string temporária onde vamos construir ‘ uma string que não tem uma plica sozinha For i=1 to len(texto) ‘ loop para percorrer a string if Mid(texto,i,1)=”’” then ‘se achar plica acrescenta mais uma texto_temp=texto_temp & “‘’” else texto_temp=texto_temp & Mid(texto,i,1) end if Next Tira_plicas = texto_temp ‘ ao fazermos esta igualdade estamos ‘ a devolver o resultado desta função ( função corrente = valor ) End Function %> O ficheiro funcoes.asp é como que uma biblioteca que recorremos que tem funções generalistas. Nestes exemplos só o usei para uma função, mas o leitor poderá usar para vários tipos de funções. Depois de fazermos #INCLUDE de um destes ficheiros, todas as funções e procedimentos aí existentes são usados como se ao código do ficheiro inicial pertencessem. (ficheiro topo.inc) <HMTL> <HEADER> <TITLE>A Rã - o novo motor de busca com ASP</TITLE> </HEADER> <BODY> <div align=”center”><table width=”600"> <tr><td> <img src=”imagens/topo.jpg”> </td></tr> </table></div> Figura. 7.5 - Imagem do topo do site 190 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES (ficheiro fundo.inc) <div align=”center”><table width=”600"> <tr bgcolor=”#8AC491"><td> </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 página aquando da chamada do site. Além de incluirmos o formulário de pesquisa pertencente ao ficheiro procura.inc, introduzimos também inicial.inc, que é o que demonstra os últimos links registados no nosso site. (ficheiro inicial.inc) <br><br> <p><font size=”2" face=”Verdana”>Use este motor de busca, para adicionar os seus links ou procurar a página que tanto procura. Não se esqueça de que este serviço é gratuito, por isso pode divulgá-lo por todos os seus amigos.<br> Agradeço a sua visita e espero que goste... </font></p> <br><font face=”Verdana” color=”blue”>Os últimos links adicionados foram:</font><br><br> <% Set Conn = Server.CreateObject(“ADODB.Connection”) Conn.open “DSN=livrodsn;” Set rs = Server.CreateObject(“ADODB.Recordset”) SQLStmt = “SELECT url, titulo, data, descricao “ SQLStmt = SQLStmt & “FROM motorbusca ORDER BY data DESC” rs.Open SQLstmt,Conn,1,2 voltas=0 ‘ variável para controlamros o número de registos a mostrar ‘ na primeira página, ou, página inicial ‘ enquanto não forem demonstrados os últimos 5 links o loop executa-se while NOT rs.EOF and voltas<5 response.write “<p><font size=’2' face=’ARIAL’>” response.write “> <b><font size=’3'><a href=’” response.write rs.fields(“url”) & “‘ target=’_blank’>” response.write rs.fields(“titulo”) & “</a></font></b><br>” response.write left(rs.fields(“descricao”),400) Versão digital, individual, licenciada em Jan/Fev do ano 2000, pelo Centro Atlântico, da versão 1.0 do livro 'Programação Web com ASP' CAPÍTULO 7: EXEMPLOS REAIS 191 ‘ usa-se a função left para controlarmos o número de caracteres da descrição ‘ que queremos ver no site response.write “<small>submetido em “ & rs.fields(“data”) response.write “ com o URL <a href=’” & rs.fields(“url”) & “‘ target=’_blank’>” response.write rs.fields(“url”) & “</a></small><br>” response.write “</font></p>” voltas=voltas+1 ‘ incrementamos as voltas para controlo do número de links a ver rs.movenext ‘ movemos o cursor da Base de Dados para a próxima posição wend rs.close ‘ fechamos o RecordSet %> (ficheiro procura.inc) <br><div align=”center”> <table border=”1" cellspacing=”0" cellpadding=”2" width=”400" bordercolor=”black”><tr bgcolor=”#8AC491"><td> <FORM action=”default.asp?fazer=procura” method=”POST”> <font face=”ARIAL” color=”white”> <b>insira a string de procura </b></font><br> <input type=”text” name=”textoprocura” value=”<%=request.form(“textoprocura”)%>” size=”40"> <input type=”image” border=”0" src=”imagens/bprocurar.gif”> </FORM> </td></tr></table></div> Fig. 7.6 - Tabela de procura 192 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES (ficheiro listagem.inc) <!—#INCLUDE FILE=”funcoes.asp”—><br><font face=”Verdana” color=”blue”> Resultado da procura__________________________________________ </font><br><br> <% ‘ usamos aqui então a função que está em funcoes.asp para tirar as plicas ‘ da string que vem do formulário de procura stringprocura = tira_plicas(request.form(“textoprocura”)) ‘ depois da plica retirada fazemos então a declaração de SQL para procurarmos ‘ a mesma no campo descricao SQLStmt = “SELECT url, titulo, data, descricao FROM motorbusca “ SQLStmt = SQLStmt & “ WHERE descricao LIKE ‘%”&stringprocura&”%’” Set Conn = Server.CreateObject(“ADODB.Connection”) Conn.open “DSN=livrodsn;” Set rs = Server.CreateObject(“ADODB.Recordset”) SQLStmt = SQLStmt & “ ORDER BY data DESC” rs.Open SQLstmt,Conn,1,2 if rs.eof then ‘ se chegarmos ao final da BD então nada existe response.write “<p> </p>” response.write “<br><br><font face=’Verdana’ size=’2' color=’blue’><b>” response.write “Não foram encontrados registos...</b> </font><br>” response.write “<p> </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 %> Versão digital, individual, licenciada em Jan/Fev do ano 2000, pelo Centro Atlântico, da versão 1.0 do livro 'Programação Web com ASP' 194 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES <br><br> <div align=”center”> <table border=”1" cellspacing=”0" cellpadding=”2" width=”400" bordercolor=”black”><tr bgcolor=”#8AC491"><td> <FORM action=”default.asp?fazer=registar&como=fazer” method=”POST”> <font face=”ARIAL” color=”white”> <b>Insira o URL do site que quer registar</b></font><br> <input type=”text” name=”urlsite” value=”http://” size=”52"><br> <font face=”ARIAL” color=”white”> <b>título do site</b></font> <input type=”text” name=”titulo” size=”30"><br> <font face=”ARIAL” color=”white”> <b>breve descrição </b></font> <br><textarea name=”descricao” cols=44 rows=3></textarea><br><br> <center><input type=”image” border=”0" src=”imagens/bregistar.gif”> </center> </FORM> </td></tr></table></div> <%End Sub ‘ o procedimento seguinte introduz os dados do registo Sub introduzir_registo() ‘ vamos buscar os dados introduzidos no formulário urlsite = request.form(“urlsite”) ‘ dados do formulário no campo urlsite titulo = request.form(“titulo”) ‘ dados do formulário no campo título descricao = request.form(“descricao”) ‘ dados do formulário no campo descricao OK=1 ‘ esta variável vai controlar se aparecem erros ‘ com o valor 1, sabemos que não existem erros ‘ nos dados introduzidos em formulário if InStr(1, urlsite, “http://”, 1)<>1 then ‘ verificamos se existe http:// na string do url OK = 0 ‘ se introduzirmos 0 é porque já existe um erro ‘ sempre que OK ficar a zero descrevemos o erro encontrado Response.write “ <font color=’red’> - o link para o site não é válido</font>” Else ‘ vamos também certificar-nos do tamanho das strings ‘ pois estas têm de ter os requisitos que quisermos e em conformidade com a BD if (len(urlsite)<12 or len(urlsite)>250)then OK = 0 response.write “ <font color=’red’> - o link para o site não é válido</font>” end if end if Versão digital, individual, licenciada em Jan/Fev do ano 2000, pelo Centro Atlântico, da versão 1.0 do livro 'Programação Web com ASP' CAPÍTULO 7: EXEMPLOS REAIS 195 if Len(titulo)<4 or len(titulo)>80 then OK = 0 response.write “ <font color=’red’>” response.write “ - o título dado para o site não é válido</font>” end if if Len(descricao)<12 or len(descricao)>400 then OK = 0 response.write “ <font color=’red’>” response.write “ - a descrição do site não é válido</font>” end if if (procura_repetido(urlsite)) = 1 then OK = 0 Response.write “ <font color=’red’>” Response.write “ - o site que introduziu já foi registado anteriormente</font>” end if if OK=1 then ‘ se OK=1 então não houve erros, vamos introduzir os dados em BD SQLStmt = “INSERT INTO MOTORBUSCA (url, titulo, descricao, data) VALUES” SQLStmt = SQLStmt & “(‘“&urlsite&”’, ‘“&titulo&”’,” SQLStmt = SQLStmt & “ ‘“&descricao&”’, ‘“&now()&”’)” rs.Open SQLstmt,Conn,1,2 response.write “<p><br><br><font face=’Verdana’ color=’blue’>” response.write “O site “ & request.form(“urlsite”) & “ foi registado...</font></p>” else ‘ no caso de haverem erros, voltamos a introduzir o formulário para preencher formulario_registo() end if End Sub%> <% Set Conn = Server.CreateObject(“ADODB.Connection”) Conn.open “DSN=livrodsn;” Set rs = Server.CreateObject(“ADODB.Recordset”) ‘ o nosso argumento é como, e se for fazer vamos introduzir um registo If request.querystring(“como”)=”fazer” then Introduzir_registo() Else ‘ se não for introduzir vamos pedir os dados mostrando o formulário Formulario_registo() end if %> CAPÍTULO 7: EXEMPLOS REAIS 197 7.3 A Loja: Loja E-Commerce Este exemplo terá uma estrutura mais complexa devido ao volume de dados que estarão envolvidos, mas a nível profissional é uma estrutura muito simples que em nada vai complicar a vida àqueles que vivem da programação com bases de dados. A BD terá então de ter uma tabela em que guardaremos a informação de todos os produtos, outra para a informação das encomendas recebidas, e claro a última que guarda a informação dos produtos que pertencem a cada uma das encomendas. Não vamos já falar da maneira como organizar isso tudo a nível de programação, mas é necessário o leitor saber o que vai ser usado neste exemplo. O uso de ficheiros é idêntico ao do exemplo do motor de busca. Só temos que estruturar a base de dados e definir as funções que vamos precisar em função das nossas necessidades. Podemos ver que vamos precisar de ter produtos em BD, e temos de os ter registados. O nome das imagens referentes a cada produto é lv seguido do identificador do mesmo - quando o programador fizer o interface de administração do lado do servidor terá de ter em conta este aspecto. O esquema da base de dados é então: TABELA: PRODUTOS Id_produtos Titulo Autor N_Paginas Isbn Preco Mes_edicao Ano_edicao introducao Auto-number; identificador interno da BD de cada produto Text (80); título do livro Text (60); nome do autor (es) do livro Number; número de páginas do livro Text (25); numero de fábrica do livro, algo como os códigos de barras Number; o preço de venda ao público do livro Number; o mês em que o livro foi editado Number; o ano em que saiu o livro Memo; uma introdução ao livro 198 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES TABELA: ENCOMENDAS Id_encomenda Auto-number; identificador da encomenda Data Date/Time; data em que a encomenda foi realizada Nome Text (50); nome do comprador Morada Text (180); morada do comprador CP Text (9); código postal do comprador Localidade Text (40); localidade Telefone Text (10); telefone de contacto do cliente Email Text (40); o e-mail do cliente Total_valor Number; valor total a pagar Numero_visa Text (16); número do cartão de crédito do cliente Nome_visa Text (20); nome do portador do cartão de crédito que vai pagar a encomenda Data_visa Text (5); data de validade do cartão de crédito O valor do total da compra é usado nesta tabela para que fique registado o preço a pagar e não ser precisa uma pesquisa aos produtos por cada vez que se queira saber o total final. TABELA: PROD_ENCOMENDAS Id_prod_encomendas Auto-number; identificador dos produtos encomendados referentes a cada encomenda Id_encomenda Number; identificador da encomenda na tabela encomendas Id_produto Number; identificador dos produtos referenciados na tabela produtos Quantidade Number; quantidade do produto encomendada Preco Number; preço a que foi comprado o produto Versão digital, individual, licenciada em Jan/Fev do ano 2000, pelo Centro Atlântico, da versão 1.0 do livro 'Programação Web com ASP' CAPÍTULO 7: EXEMPLOS REAIS 201 Bpagar.gif ficheiro que representa o botão que se carrega para passarmos à fase de finalização de pagamento de uma nova encomenda; usado no ficheiro carrinho.inc Carrinho.gif como se pode prever é o desenho do carrinho de compras, que depois de carregado faz-nos aceder à zona de produtos já escolhidos; é chamado no ficheiro topo.inc Casa.gif é o ficheiro que nos encaminha para a página inicial; é chamado no ficheiro topo.inc Pagar.gif faz a chamada da zona onde se vãoi introduzir os dados pessoais para finalização da compra; é chamado no ficheiro topo.inc Ficheiros da página, C:\Inetpub\wwwroot\livro\loja\Default.asp ficheiro que recebe os argumentos dos formulários ou do campo de endereço do browser, e consoante o recebido consoante o ficheiro que é demonstrado na zona central da página; C:\Inetpub\wwwroot\livro\loja\loja\Funcoes.asp aqui existe uma função que é usada em mais que um ficheiro, que tal e qual a do motor de busca é usada para validar as plicas usadas nas strings, para que quando usarmos a BD não apareçam erros, visto que as mesmas são usadas pela própria BD. Este código é idêntico ao do motor de busca; C:\Inetpub\wwwroot\livro\loja\includes\Fundo.inc ficheiro com o desenho do fundo do site (estático a 100%); C:\Inetpub\wwwroot\livro\loja\includes\Inicial.inc esquema inicial. Se não existirem argumentos no link, será este ficheiro a aparecer; C:\Inetpub\wwwroot\livro\motordebusca\includes\Listagem.inc depois de submetida a string de procura, aparecem todos os sites relacionados, e é este ficheiro que o vai fazer; 202 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES C:\Inetpub\wwwroot\livro\loja\includes\Topo.inc HTML com o desenho do topo do site (também como o fundo, 100% estático); C:\Inetpub\wwwroot\livro\loja\includes\Pagar.inc local onde são feitos os pagamentos, aquilo a que podemos chamar de ‘check-out‘; C:\Inetpub\wwwroot\livro\livro.mdb ficheiro de base de dados onde figura a tabela de dados que usamos neste exemplo. A estrutura de directórios foi a usada para o exemplo anterior, mas o leitor pode fazer alterações na sua estrutura desde que todo o ambiente o acompanhe. Entendo por ambiente a configuração do servidor de Internet, a conexão à BD, as referências a páginas, etc. Agora podemos ver o código de todos os ficheiros e falar da função de cada procedimento dentro dos mesmos, se esses existirem. O resultado do ficheiro global.asa a seguir tem também tudo aquilo que foi introduzido durante este manual, mas está em negrito aquilo que foi criado exclusivamente para a loja. O truque está em criar um array, que ficará dentro de uma sessão, e desta maneira toda a informação do carrinho de compras estará definida para cada sessão (sempre diferentes e sem possibilidade de confusão). Cada vez que for introduzido um produto será verificado o array para ver se o mesmo já existe, e se existir acrescentamos mais uma unidade. No caso de se querer introduzir a quantidade, será feita uma alteração. Terá de ser feito sempre um redimensionamento do array para o mesmo funcionar na perfeição, mas isso já vai ser visto. (ficheiro global.asa) <SCRIPT LANGUAGE=”VBScript” RUNAT=”Server”> Sub Application_OnStart Session.Timeout = 3 Application.Lock Application(“utilizadores”) = 0 Application.UnLock Application(“linha1”)=”” Application(“linha2”)=”” Versão digital, individual, licenciada em Jan/Fev do ano 2000, pelo Centro Atlântico, da versão 1.0 do livro 'Programação Web com ASP' CAPÍTULO 7: EXEMPLOS REAIS 203 Application(“linha3”)=”” Application(“linha4”)=”” Application(“linha5”)=”” Application(“linha6”)=”” Application(“linha7”)=”” Application(“linha8”)=”” Application(“linha9”)=”” Application(“linha10”)=”” Application(“linha11”)=”” Application(“linha12”)=”” Application(“linha13”)=”” Application(“linha14”)=”” Application(“linha15”)=”” Application(“linha16”)=”” Application(“linha17”)=”” Application(“linha18”)=”” End Sub Sub Session_OnStart Application.Lock Application(“utilizadores”) = Application(“utilizadores”) + 1 Application.UnLock ‘DADOS PARA A LOJA Dim 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 então introduzir esta informação para as sessões ‘ desta maneira cada sessão terá o seu carrinho e não ‘ existirão confusões entre clientes. São inicializados vazios session(“matriz_produtos”) = produtos_id session(“matriz_quantidade”) = produtos_quantidade ‘FORAM DADOS PARA A LOJA End Sub Sub Session_OnEnd Application.Lock Application(“utilizadores”) = Application(“utilizadores”) – 1 Application.UnLock End Sub Sub Application_OnEnd End Sub </SCRIPT> 204 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES (ficheiro default.asp) <!—#INCLUDE FILE=”includes/topo.inc”—> <div align=”center”> <table width=”600"><tr> <td align=”top” width=”600"> <% ‘ o sistema de busca dos argumentos é idêntico ao do motor de busca fazer = Request.QueryString(“fazer”) Select Case fazer Case “carrinho” ‘ se for escolhido o carrinho vamos mostrar o carrinho %> <!—#INCLUDE FILE=”includes/carrinho.inc”—> <% Case “pagar” ‘ neste caso o utilizador vai pagar o escolhido %> <!—#INCLUDE FILE=”includes/pagar.inc”—> <% Case “procura” ‘ se houver procura vai-se mostrar a listagem de resultados %> <!—#INCLUDE FILE=”includes/listagem.inc”—> <% Case Else ‘ se o argumento não existir mostramos a página inicial %> <!—#INCLUDE FILE=”includes/inicial.inc”—> <% End Select %> </td> </tr></table></div> <p> </p> <!—#INCLUDE FILE=”includes/fundo.inc”—> Fig. 7.13 - Aspecto da página inicial da Loja Versão digital, individual, licenciada em Jan/Fev do ano 2000, pelo Centro Atlântico, da versão 1.0 do livro 'Programação Web com ASP' CAPÍTULO 7: EXEMPLOS REAIS 205 A seguinte função é idêntica à do motor de busca. É uma função para que não obtenhamos erro nas declarações de SQL (ficheiro funcoes.asp) <% Function tira_plicas(texto) texto = trim(texto) texto_temp = “” For i=1 to len(texto) if Mid(texto,i,1)=”’” then texto_temp=texto_temp & “‘’” else texto_temp=texto_temp & Mid(texto,i,1) end if Next tira_plicas = texto_temp End Function %> (ficheiro topo.inc) <HMTL> <HEADER> <TITLE>A Loja - a nova loja on-line feita com ASP</TITLE> </HEADER> <BODY> <div align=”center”><table width=”600"> <tr><td> <img src=”imagens/topo.jpg”> </td></tr> <tr><td> <center> <FORM action=”default.asp?fazer=procura” method=”POST”> <table width=”400" cellpadding=”0" cellspacing=”0" border=”0"><tr> <td valign=”top”> <font size=”2" face=”Verdana”><a href=”default.asp”> <img border=”0" alt=”Voltar à página inicial” src=”imagens/casa.jpg”> </a> </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”> 206 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES <img border=”0" alt=”Pagar e sair da loja” src=”imagens/pagar.jpg”> </a> </td> <td valign=”top” align=”right”><input type=”text” name=”textoprocura” value=”<%=request.form(“textoprocura”)%>” size=”12"> <br> <% ‘ a declaração em ASP anterior é para garantirmos que aparece ‘ na caixa de procura a última string ‘ queremos também manter a última escolha e por isso ‘ vamos comparar os dados deixados pelo formulário anterior ‘ garantindo que os RADIO BUTTONS estejam correctos if request.form(“tipoprocura”)= “autor” then autor=”checked” ‘ assim escreveremos checked else if request.form(“tipoprocura”)= “titulo” then titulo=”checked” else autor=”checked” end if end if %> <input type=”radio” <%=autor%> value=”autor” name=”tipoprocura”>autor <input type=”radio” <%=titulo%> name=”tipoprocura” value=”titulo”>titulo </td><td valign=”top”> <input type=”image” border=”0" src=”imagens/bprocurar.jpg”> </td></tr></table> </FORM> </center> </td></tr> </table></div> Fig. 7.14 - Aspecto do ficheiro topo.inc em separado Versão digital, individual, licenciada em Jan/Fev do ano 2000, pelo Centro Atlântico, da versão 1.0 do livro 'Programação Web com ASP' CAPÍTULO 7: EXEMPLOS REAIS 207 Ao acedermos sempre aos dados anteriores (submetidos pelo formulário), garantimos que nunca perdemos os dados enviados, e assim deixamos o utilizador saber qual foi a última string de procura que fez, e de que tipo (autor ou título). Para isso basta que os campos estejam sempre iguais à informação que os mesmos enviaram na última inserção. (ficheiro fundo.inc) <div align=”center”><table width=”600"> <tr bgcolor=”#409AC9"><td> </td></tr> <tr><td> <center><font size=”2" face=”ARIAL”>(1999) Portugal, todos os direitos reservados<br>para IE4+ & NN4+</font></center> </td></tr> </table></div> </BODY> </HTML> No ficheiro seguinte iremos então mostrar o último produto disponível pois se todos os dias aparecer algo de novo será uma boa maneira de o promover. (ficheiro inicial.inc) <br><br> <p><b><font size=”2" face=”Verdana”>Use esta loja online, para procurar e comprar o livro que tanto procura. Não se esqueça de que este serviço é gratuito, por isso pode divulgar por todos os seus amigos.<br> Agradeço a sua visita e espero que goste... </font></b></p> <br><font face=”Verdana” color=”blue”>A mais recente novidade: </font><br><br> <% Set Conn = Server.CreateObject(“ADODB.Connection”) Conn.open “DSN=livrodsn;” Set rs = Server.CreateObject(“ADODB.Recordset”) SQLStmt = “SELECT id_produto, titulo, introducao, autor, preco “ SQLStmt = SQLStmt & “FROM produtos ORDER BY id_produto ASC” rs.Open SQLstmt,Conn,1,2 ‘ foi executada a procura rs.movelast ‘ vamos mover o cursor para a última posição response.write “<p><font size=’3' face=’ARIAL’><b>” 208 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES response.write rs.fields(“titulo”) & “</b></font><br>” response.write “<font size=’2' face=’Verdana’>escrito por <b>” response.write rs.fields(“autor”) &”</b></font></p>” response.write “<table><tr><td valign=’top’>” response.write “<img border=’0’src=’imagens/produtos/lv” response.write rs.fields(“id_produto”)&”.gif’>” ‘ da maneira anterior iremos imprimir a imagem no ecrã ‘ recorrendo ao identificador da mesma, visto o formato adoptado ‘ para os nomes das imagens ser ‘ sempre o mesmo lv(numero identificador).gif response.write “<br><center><small><b>” ‘ vamos formatar o nosso número para a moeda local (do servidor) response.write formatcurrency(rs.fields(“preco”)) response.write “</b></small></center>” response.write “</font></td><td valign=’top’><font face=’arial’ size=’2'>” response.write left(rs.fields(“introducao”),400) & “...</font><p>” response.write “[ <a href=’default.asp?fazer=carrinho&como=adicionar&qual=” response.write rs.fields(“id_produto”)&”’>” ‘ o argumento qual vai ficar com o identificador do produto ‘ mais tarde usado para introduzir no carrinho de compras response.write “<font size=’2' face=’Verdana’>adicionar ao carrinho </a></font> ]</p>” response.write “</td></tr></table>” rs.close %> (ficheiro listagem.inc) <!—#INCLUDE FILE=”funcoes.asp”—><br><font face=”Verdana” color=”blue”> Resultado da procura__________________________________________ </font><br><br> <% Set Conn = Server.CreateObject(“ADODB.Connection”) Conn.open “DSN=livrodsn;” Set rs = Server.CreateObject(“ADODB.Recordset”) stringprocura = tira_plicas(request.form(“textoprocura”)) SQLStmt = “SELECT id_produto, titulo, introducao, autor, isbn,” SQLStmt = SQLStmt & “ mes_edicao, ano_edicao, n_paginas, preco FROM produtos “ SQLStmt = SQLStmt & “ WHERE “ & request.form(“tipoprocura”) SQLStmt = SQLStmt & “ LIKE ‘%” & stringprocura & “%’” ‘ da maneira feita anteriormente é facultado pelo formulário de procura ‘ não só a string, mas o campo da BD que vai ser pesquisado Versão digital, individual, licenciada em Jan/Fev do ano 2000, pelo Centro Atlântico, da versão 1.0 do livro 'Programação Web com ASP' CAPÍTULO 7: EXEMPLOS REAIS 209 ‘ e isso porque o VALUE do formulário tem os valores iguais ‘ aos nomes dos campos da base de dados rs.Open SQLstmt,Conn,1,2 if rs.eof then response.write “<p> </p>” response.write “<br><br><font face=’Verdana’ size=’2' color=’blue’><b>” response.write “Não foram encontrados registos...</b></font><br>” response.write “<p> </p><p> </p><p> </p>” end if conta = 0 ‘ esta variável vai ser utilizada para que as imagens ‘ e disposição dos dados dos produtos alternem de linha em ‘ linha. Mais ou menos como o método usado para a mudança de cor ‘ por cada linha da tabela while NOT rs.EOF response.write “<p><font size=’3' face=’ARIAL’><b>” response.write rs.fields(“titulo”) & “</b></font><br>” response.write “<font size=’2' face=’Verdana’>escrito por <b>” response.write rs.fields(“autor”) response.write “</b><small><i> (ISBN:”&rs.fields(“isbn”)&”)” response.write “</i></small></font></p>” response.write “<table><tr>” if conta = 0 then response.write “<td valign=’top’><img width=’93' heigth=’103' “ response.write “border=’0’src=’imagens/produtos/lv” response.write rs.fields(“id_produto”)&”.gif’>” response.write “<br><center><small><b>” response.write formatcurrency(rs.fields(“preco”)) response.write “</b></small></center>” response.write “</td><td valign=’top’>” response.write “<font face=’arial’ size=’2'>” response.write left(rs.fields(“introducao”),400) response.write “...<br><b>( edição 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”) &” páginas.</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 próxima disposição será diferente else response.write “<td valign=’top’><font face=’arial’ size=’2'>” 210 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES response.write left(rs.fields(“introducao”),400) response.write “...<br><b>( edição de “&rs.fields(“mes_edicao”)&”/” response.write rs.fields(“ano_edicao”)&” )</b></font>” response.write “ <small>livro com “ & rs.fields(“n_paginas”) response.write “ páginas.</small><p>” response.write “[ <a href=’default.asp?fazer=carrinho&como=adicionar&qual=” response.write rs.fields(“id_produto”)&”’>” response.write “<font size=’2' face=’Verdana’>adicionar ao” response.write “carrinho</a></font> ]</p>” response.write “</td><td valign=’top’>” response.write “<img width=’93' heigth=’103' border=’0' ” response.write “src=’imagens/produtos/lv”&rs.fields(“id_produto”)&”.gif’>” response.write “<br><center><small><b>” & formatcurrency(rs.fields(“preco”)) response.write “</b></small></center>” conta = 0 end if response.write “</td></tr></table>” rs.movenext ‘ move-se para os dados seguintes wend rs.close %> Fig. 7.15 - Aspecto do site depois de uma procura por ‘Internet’ em títulos Versão digital, individual, licenciada em Jan/Fev do ano 2000, pelo Centro Atlântico, da versão 1.0 do livro 'Programação Web com ASP' CAPÍTULO 7: EXEMPLOS REAIS 211 (ficheiro carrinho.inc) <% ‘ este procedimento faz com que vejamos os dados que estão em carrinho Sub ver_carrinho() Produtos_info = session(“matriz_produtos”) ‘ vamos buscar os dados dos produtos Quantidade_info = session(“matriz_quantidade”) ‘ e respectivas quantidades produtos_num = ubound(produtos_info) ‘ tirar o número de produtos em carrinho if produtos_num <1 then ‘ se forem menos de 1 então está vazio response.write “<p> </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 forçosamente do procedimento end if num_produtos = 0 ‘ vamos construir a tabela response.write “<div align=’center’>” response.write “<table width=’600' border=’1' ” response.write “ bordercolor=’#409AC9' cellspacing=’0'><tr>” response.write “<td width=’20'>” response.write “Qt.” response.write “</td>” response.write “<td>” response.write “ISBN” response.write “</td>” response.write “<td>” response.write “Titulo da Obra” response.write “</td>” response.write “<td>” response.write “Preço” response.write “</td>” response.write “<td>” response.write “Total” response.write “</td></tr>” response.write “<form action=’default.asp?fazer=carrinho&” response.write “como=calcula’ method=’POST’>” total_preco = 0 ‘ variável que vai calcular o preço total da encomenda total_produtos = 0 ‘ vai calcular o número total de produtos ‘ não podemos usar o produtos_num pois este diz quantos ‘ produtos diferentes e não quantos produtos (quantidade) for i=1 to produtos_num SQLStmt = “SELECT id_produto, isbn, titulo, preco FROM produtos” 212 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES SQLStmt = SQLStmt & “ WHERE id_produto = “ & produtos_info(I) rs.Open SQLstmt,Conn,1,2 response.write “<tr><td width=’40'><center>” response.write “<input type=’text’ name=’quant”&i&”’ “ response.write “ value=’” & quantidade_info(i) & “‘ size=2 maxlength=2>” response.write “</center></td>” response.write “<td><font face=’arial’ size=’1'>” response.write rs.fields(“isbn”) response.write “</font></td>” response.write “<td><font face=’arial’ size=’2'><b>” response.write left(rs.fields(“titulo”), 34) response.write “</b></font></td>” response.write “<td><font face=’arial’ size=’2'>” response.write formatCurrency(rs.fields(“preco”)) response.write “</font></td>” response.write “<td>” valor = (rs.fields(“preco”) * quantidade_info(i) ) response.write formatCurrency(valor) response.write “</td></tr>” ‘ aqui vamos actualizando o valor total do preço total_preco = total_preco + (rs.fields(“preco”) * quantidade_info(i) ) total_produtos = total_produtos + quantidade_info(I) rs.close next response.write “</table>” response.write “<p><table width=’460' border=’1' “ response.write “ bordercolor=’#409AC9' cellspacing=’1'><tr>” response.write “<td bgcolor=’#409AC9'>” response.write “<font color=’white’ face=’Verdana’ size=’2'>Despesas com “ response.write “transportes</font><br>” response.write “<small>(600$00 por encomenda e mais 200$00 “ response.write “por cada livro )</small>” response.write “</td>” response.write “<td>” session(“valor_d”) = (600+ (200*total_produtos)) ‘ esta sessão vai ‘ guardar o valor total por despesas em transportes na variável de sessão valor_d response.write formatCurrency(session(“valor_d”)) response.write “</td></tr><tr>” response.write “<td bgcolor=’#409AC9'>” response.write “<font color=’white’ face=’Verdana’ size=’2'>TOTAL </font><br>” response.write “<small>(transportes + livros)</small>” Versão digital, individual, licenciada em Jan/Fev do ano 2000, pelo Centro Atlântico, da versão 1.0 do livro 'Programação Web com ASP' CAPÍTULO 7: EXEMPLOS REAIS 213 response.write “</td>” response.write “<td>” ‘ guardar na sessão valor_t, o valor total a pagar pelo cliente session(“valor_t”) = session(“valor_d”) + total_preco response.write formatCurrency( session(“valor_t”) ) response.write “</td>” response.write “</tr></table></p>” response.write “<p><input type=’image’ border=’0' src=’imagens/ brecalcular.jpg’>” response.write “<a href=’default.asp?fazer=pagar’>” response.write “<img border=’0' src=’imagens/bpagar.jpg’></a>” response.write “</p></form></div>” End Sub ‘ a seguir vamos criar o procedimento que faz os cálculos, ‘ como quando queremos 10 unidades de um produto e carregamos em recalcular Sub calcula() Produtos_info = session(“matriz_produtos”) ‘ vamos buscar os produtos em carrinho Quantidade_info = session(“matriz_quantidade”) ‘ buscar as respectivas quantidades Produtos_num = ubound(produtos_info) Passou = 0 ‘ para controlar se apareceu uma quantidade igual a 0 i = 1 ‘ vamos inicializar I a 1 para percorrermos todo o array while i <= produtos_num if passou=0 then form = request.form(“quant”&i) ‘ vamos buscar o próximo valor do formulário else ‘ se a quantidade foi igual a 0 então adiantamo-nos uma casa mais que o usual ‘ pois a posição do momento será igual à próxima form = request.form(“quant”&I+1) end if if int(request.form(“quant”&i))<>0 then ‘ se o valor do formulário for diferente de 0 nova_quantidade = int(form) ‘ vamos aceder à nova quantidade quantidade_info(i) = nova_quantidade ‘ introduzi-la no array else if (i < produtos_num) then ‘ se ainda não chegámos ao fim incrementamos a quantidade quantidade_info(i) = quantidade_info(i+1) for j=i to (produtos_num-1) quantidade_info(j) = quantidade_info(j+1) produtos_info(j) = produtos_info(j+1) 214 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES next passou = 1 end If ‘ como vai ser alterado o tamanho do array o mesmo tem de usar redim ‘ para ser redimencionado redim Preserve produtos_info(produtos_num-1) redim Preserve quantidade_info(produtos_num-1) produtos_num = ubound(produtos_info) end if i=i+1 wend ‘ no final actualizamos as sessões session(“matriz_produtos”) = produtos_info session(“matriz_quantidade”) = quantidade_info End Sub ‘ este procedimento adiciona um produto ao carrinho de compras Sub adicionar(qual) Produtos_info = session(“matriz_produtos”) Quantidade_info = session(“matriz_quantidade”) Produtos_num = ubound(produtos_info) Temporario = 0 ‘ esta variável temporária vai guardar os valores anteriores if produtos_num>0 then ‘ se existirem mais de 0 produtos for I=1 to produtos_num ‘ vamos percorrê-los if produtos_info(i) = qual then ‘ se acharmos o produto temporario = I exit for end if next end if if temporario = 0 then ‘ se não for achado nenhum produto temporario = produtos_num + 1 ‘ vamos incrementar uma posição no array ‘ esse incremento é respondido com um redimensionamento do array redim Preserve produtos_info(temporario) redim Preserve quantidade_info(temporario) ‘vamso buscar o identificador do produto a acrescentar produtos_info(temporario) = qual quantidade_info(temporario) = 1 ‘ o mesmo vai-se inicializar com o valor 1 else ‘ senão vamos acrescentar uma unidade ao produto que já existe em array quantidade_info(temporario) = quantidade_info(temporario) + 1 end if session(“matriz_produtos”) = produtos_info session(“matriz_quantidade”) = quantidade_info End Sub Versão digital, individual, licenciada em Jan/Fev do ano 2000, pelo Centro Atlântico, da versão 1.0 do livro 'Programação Web com ASP' CAPÍTULO 7: EXEMPLOS REAIS 215 ‘ o procedimento seguinte escreve um link para se voltar à página anterior Sub voltar() Response.write “<p><a href=’javascript:history.go(-1)’>” Response.write “<font face=’arial’ size=’2'><b>continuar a comprar</b> </font></a></p>” End Sub Set Conn = Server.CreateObject(“ADODB.Connection”) Conn.open “DSN=livrodsn;” Set rs = Server.CreateObject(“ADODB.Recordset”) como = Request.QueryString(“como”) Select Case como Case “adicionar” voltar() adicionar(request.querystring(“qual”)) ver_carrinho() Case “calcula” calcula() ver_carrinho() Case Else ver_carrinho() End Select %> depois de algumas escolhas CAPÍTULO 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>Código Postal: </b></font></td> <td><input type=’text’ name=’cp’ value=’<%=request.form(“cp”)%>’ size=’20'></td></tr> <tr><td><font face=’arial’ size=’2'><b>Localidade: </b></font></td> <td><input type=’text’ name=’localidade’ value=’<%=request.form(“localidade”)%>’ size=’38'></td></tr> <tr><td><font face=’arial’ size=’2'><b>Telefone: </b></font></td> <td><input type=’text’ name=’telefone’ value=’<%=request.form(“telefone”)%>’ size=’10'></td></tr> <tr><td><font face=’arial’ size=’2'><b>E-Mail: </b></font></td> <td><input type=’text’ name=’email’ value=’<%=request.form(“email”)%>’ size=’30'></td></tr> <tr><td bgcolor=’#409AC9'><font face=’arial’ color=’white’ size=’2'><b>Dados do Cartão VISA </b></font></td> <td></td></tr> <tr><td><font face=’arial’ size=’2'><b>Nome em Visa: </b></font></td> <td><input type=’text’ name=’nome_visa’ value=’<%=request.form(“nome_visa”)%>’ size=’26'></td></tr> <tr><td><font face=’arial’ size=’2'><b>Numero em Visa: </b></font></td> <td><input type=’text’ name=’numero_visa’ value=’<%=request.form(“numero_visa”)%>’ size=’18'></td></tr> <tr><td><font face=’arial’ size=’2'><b>Validade do Visa: </b></font></td> <td><input type=’text’ name=’data_visa’ value=’<%=request.form(“data_visa”)%>’ size=’5'> (MM/AA) </td></tr> </table></td></tr></table> <p><input type=’image’ border=’0' src=’imagens/bfinalizar.jpg’> </p></form></div> <%End Sub ‘ esta função vai validar os dados introduzidos pelo utilizador Function validar() OK = 1 if len(request.form(“nome”)& “<br>”)<6 or len(request.form(“nome”)& “<br>”)>50 then response.write “<font face=’arial’ color=’red’> “ response.write “o nome está inválido</font><br>” OK = 0 218 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES end if if len(request.form(“morada”))<10 or len(request.form(“morada”))>180 then response.write “<font face=’arial’ color=’red’> ” response.write “ a morada não é válida</font><br>” OK = 0 End if if len(request.form(“cp”))<4 or len(request.form(“cp”))>9 then response.write “<font face=’arial’ color=’red’> “ response.write “o Código Postal não é válido</font><br>” OK = 0 end if if len(request.form(“localidade”))<3 or len(request.form(“localidade”))>40 then response.write “<font face=’arial’ color=’red’> ” response.write “ a Localidade não é válida</font><br>” OK = 0 end if if len(request.form(“telefone”))<9 or len(request.form(“telefone”))>10 then response.write “<font face=’arial’ color=’red’> ” response.write “ o Telefone não é válido</font><br>” OK = 0 end if if len(request.form(“numero_visa”))<>16 then response.write “<font face=’arial’ color=’red’> ” response.write “ o número do Visa está incorrecto</font><br>” OK = 0 End if if len(request.form(“nome_visa”))<3 or len(request.form(“nome_visa”))>20 then response.write “<font face=’arial’ color=’red’> o nome do utilizador do Visa não foi aceite</font><br>” OK = 0 End if if len(request.form(“data_visa”))<>5 then response.write “<font face=’arial’ color=’red’> ” response.write “ A data do Visa não está correcta</font><br>” OK = 0 End if Validar=OK End Function ‘ depois de tudo validado é executado o seguinte procedimento Sub efectuar() SQLStmt = “INSERT INTO ENCOMENDAS (data, nome, morada, cp, “ SQLStmt = SQLSmt & “localidade, telefone,” Versão digital, individual, licenciada em Jan/Fev do ano 2000, pelo Centro Atlântico, da versão 1.0 do livro 'Programação Web com ASP' CAPÍTULO 7: EXEMPLOS REAIS 219 SQLStmt = SQLStmt & “ email, total_valor, numero_visa, nome_visa, data_visa)” SQLStmt = SQLStmt & “ VALUES( ‘“&now()&”’, ‘“&request.form(“nome”)&”’,” SQLStmt = SQLStmt & “‘“&request.form(“morada”)&”’,’”&request.form(“cp”)&”’,” SQLStmt = SQLStmt & “‘“&request.form(“localidade”)&”’,’”&request.form(“telefone”)&”’,” SQLStmt = SQLStmt & “‘“&request.form(“email”)&”’, “&session(“valor_t”)&” ,” SQLStmt = SQLStmt & “‘“&request.form(“numero_visa”) SQLStmt = SQLStmt & “‘,’”&request.form(“nome_visa”)&”’,” SQLStmt = SQLStmt & “‘“&request.form(“data_visa”)&”’ )” rs.Open SQLstmt,Conn,1,2 SQLStmt = “Select id_encomenda from encomendas” rs.Open SQLstmt,Conn,1,2 rs.movelast ‘ depois de 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 preço SQLStmt = “SELECT preco FROM produtos” SQLStmt = SQLStmt & “ WHERE id_produto = “ & produtos_info(i) rs.Open SQLstmt,Conn,1,2 valor = (rs.fields(“preco”) * quantidade_info(i) ) rs.close SQLStmt = “INSERT 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 sessão depois de ser feita a compra 220 CENTRO ATLÂNTICO - PROGRAMAÇÃO WEB COM ACTIVE SERVER PAGES ‘ começando assim uma sessão nova End Sub Set Conn = Server.CreateObject(“ADODB.Connection”) Conn.open “DSN=livrodsn;” Set rs = Server.CreateObject(“ADODB.Recordset”) como = Request.QueryString(“como”) ‘ vamos buscar o argumento Select Case como Case “efectuar” ‘ neste caso é efectuada a compra if (validar()=1) then ‘ se os dados ficarem validados efectua-se a compra efectuar() else formulario() ‘ senão, é mostrado novamente o formulário end if Case Else Formulario() ‘ sempre que não há argumento é mostrado o formulário End Select %> A imagem seguinte demonstra como somos abordados ao entrar na zona de pagamento. Fig. 7.18 - Introdução de dados para finalizar compra Versão digital, individual, licenciada em Jan/Fev do ano 2000, pelo Centro Atlântico, da versão 1.0 do livro 'Programação Web com ASP' Agradecimentos: Queria agradecer a todos aqueles que ajudaram na minha formação e percurso profissional, onde estão incluídos: Manuel Pacheco Vieira, José Fernando Silva, Pedro Tiago Pereira e Carlos Dias. No estrangeiro tive o apoio de duas pessoas que me apoiaram nos meus artigos e acreditaram nas minhas capacidades, são eles Scott Mitchell (www.4guysfromrolla.com) e Stephen Wynkoop (www.swynk.com). Agradeço também às centenas de pessoas que me enviam mensagens para o e-mail todos os meses, a pedir esclarecimentos técnicos ou a agradecer pelo código que tenho disponível no meu site (www.joaovieira.com). A nível pessoal agradeço então às peças fundamentais na minha vida, os meus pais, avós, Tânia Penedo e à dupla Jujinha & Ritinha. Colecção O Melhor da Internet Os melhores sites nacionais e internacionais da Internet organizados por profissão ou área de interesse Colecção Sociedade da Informação Os temas de fundo da Sociedade da Informação apresentados pelos maiores especialistas nacionais Colecção Tecnologias Todas as tecnologias de destaque da Internet tratadas pela equipe de técnicos do Centro Atlântico Colecção Direito das Novas Tecnologias A nova economia, dependente das tecnologias da informação, traz consigo novos desafios e ameaças. Quais as respostas dos nossos Juristas, tribunais, compêndios e legislação? Colecção Desafios O que nos reservam os tempos que se aproximam em que as novas tecnologias invertem muitas das certezas adquiridas Colecção Soluções Soluções práticas para resolver novas questões levantadas pelas tecnologias da sociedade da informação nc t o do Centro C ntr o Atlântico tâ a p e r esta s Para encomendar qualquerr título queira preencher me e l por or fax fa ou correio or i com m o seu u pa me folha de e encomenda e enviá-la pagamento. Título Q n Quant. Pr ç Preço Total otal O Melhor da Internet para o Direito O Melhor da Internet para Informáticos O Melhor da Internet para Engenheiros O Melhor da Internet para o Marketing O M.Internet p/ Gestores e Empresários _____ _____ _____ _____ _____ * * * * * Colecção Sociedade da Informação Crónicas da InforFobia Homo Conexus * Ano 2000 e Informática _____ * 1.800$ = ______ _____ * 1.950$ = ______ _____ * 1.950$ = ______ Colecção Tecnologias * Guia do Internet Explorer versão 4 * Guia do Internet Explorer versão 5 * Guia do Netscape Communicator v 4 Agentes Inteligentes TOP 100 Internet 1999 _____ _____ _____ _____ _____ * * * * * 950$ 950$ 950$ 950$ 950$ = = = = = 2.950$ 2.950$ 2.950$ 2.950$ 2.450$ _______ _______ _______ _______ _______ = = = = = ______ ______ ______ ______ ______ Colecção Direito das Novas Tecnologias Direito da Informática nos tribunais .pt _____ * 2.450$ = ______ Colecção Desafios Vertigem - Tendências para o Séc. XXI _____ * 4.950$ = ______ O Futuro da Internet _____ * 2.950$ = ______ Colecção Soluções O Vírus do ano 2000 O Guia do Telemóvel: 99 sugestões _____ * 1.600$ = ______ _____ * 1.250$ = ______ * Inclui CD-ROM TOTAL = ________ Sem Despesas de envio As encomendas directas ao Centro Atlântico não pagam custos de portes. SIM, desejo receber os títulos que assinalei sem qualquer despesa de envio. • Junto envio cheque/Vale nº ____________ à ordem do Centro Atlântico • Prefiro que debitem no meu cartão de crédito emitido em nome de _______________________________ Número do cartão de crédito _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ Validade _ _ / _ _ Nome ___________________________________________ Morada ___________________________________________ CP ________ Localidade ______________________ Tel ________________ Fax ____________________ Caso alguns dos títulos não estejam disponíveis enviaremos os que existirem em stock e pediremos confirmação no futuro para envio dos títulos em falta. Centro Atlântico - Av. D. Afonso Henriques, 1462 - 4450 Matosinhos Fax. 21 - 321 01 85 ou 22 - 938 56 30 www.centroatlantico.pt/titulos Colecção O Melhor da Internet