Visitantes que leram esse artigo, também visitaram:
  • Claro lança Canal Ideias com as principais notícias do dia
  • Favicon
  • WP-Syntax: destacar códigos fonte em artigos de blogs WordPress
  • O que é CSO?
  • Otimizando PHP/MySQL: Concatenando Partes de um Registro e Criando Novas Informações


  • Criando uma enquete am ASP

    Postado por Plinio Cruz em 15 de dezembro de 2004 na categoria ASP, Programação, Soluções | Seja o primeiro a comentar

    1 Estrela2 Estrela3 Estrela4 Estrela5 Estrela (1 votos, média: 5,00)
    Loading ... Loading ...

    Eu precisava criar uma pequena rotina de votação onde os usuário pudessem selecionar algumas opções pré-definidas de forma a obter uma estatística em termos percentuais e em número de votos recebidos por opção selecionada. Uma enquete ou pesquisa para saber o que os usuários do site estavam pretendendo encontrar no site.

    Existem muitos sistemas de enquetes prontos para usar mas como costumar ocorrer o meu caso era um caso particular. Eu queria algo simples que pudesse colocar no site sem ficar dependente de código de terceiros que não conhecesse bem e nem usar algo pronto mas proprietário.

    Para piorar tudo , como costuma ocorrer , eu não tinha tempo e precisa fazer esta pesquisa em algumas horas. Parti então para a solução que vou expor neste artigo.

    1- Levantando os requisitos do sistema

    Levantar os requisitos do sistema no meu caso era muito simples. Eu precisava de uma rotina que fizesse o seguinte:

    • Mostrasse em uma página web uma pergunta com algumas opções e um botão para que o usuário fizesse a sua escolha e a enviasse a para o servidor
    • O usuário somente poderia fazer sua escolha uma vez.
    • Exibisse uma estatística por opção para que o usuário pudesse acompanhar.

    Em conseqüência destes requisitos eu deveria armazenar a seleção do usuário em um banco de dados juntamente com algo que o identificasse forma única a fim de impedir que o mesmo votasse duas vezes ou mais. Para fazer isto eu tenho muitas opções mas escolhi armazenar o número ip do usuário de forma a identificá-lo de forma única.

    A tecnologia escolhida para implementar tudo isto , por questão de simplicidade , foi a ASP.
    Criei então um banco de dados chamado enquetes.mdb com uma tabela chamada enquete1 com a seguinte estrutura:

     

    O banco de dados possui um campo para gravar o número ip do usuário , sete campos representando cada opção para a pergunta da pesquisa mostra acima e um campo para armazenar a data do voto.

     

    Abaixo temos a figura mostrando como fica a tabela com os campos gravados para uma votação feita em uma máquina local: (Clique na imagem para ampliar)

     

    Quando o usuário clicar no botão – Enviar – o sistema deverá exibir o resultado atual da pesquisa conforme figura abaixo.

    2- Implementando o código do projeto

    Com o banco de dados criado , o formulário com a pergunta e as opções prontas e o formulário para exibir o resultado da votação também prontos abaixo temos o código da rotina asp – enquete.asp – que irá gerenciar o sistema de votação.

    <%
     
    'define as variáveis que serão usadas na código
     
    dim ja_votou , u_input , cn , rs , sql , u_ip , contador , total_votos
     
     
    'Duas variáveis são passadas gravadas no banco de dados
    'u_input = é o valor se o usuario entrou uma resposta para a questão
    'IP = é o endereço IP do usuario
     
     
    u_input=request.form("u_input")
     
     
    'pega o endereço IP do usuario
    u_ip=request.servervariables("remote_addr")
     
     
    ' Se o usuário não entrou um valor para a questão então vamos mostrar 
    ' a questão a relação de opções possíveis para resposta
    if u_input = "" then
     
     
    %>
    'exibe o formulário com a pergunta e as opções
    'ao clicar em enviar o método post envia o formulário 
    ' o conjunto serverVariables inclui uma variável chamada script_name que representa o nome da página atual
    ' ou seja a página atual enquete.asp será submetida ao servidor
     
    <form method="post" action="<%= request.servervariables("script_name") %>">
    <p><font color="#0033FF" size="2" face="Verdana, Arial, Helvetica, sans-serif"><strong>
    Você gostaria que o site tivesse mais artigos sobre:</strong></font></p>
    <p> <font face="Verdana, Arial, Helvetica, sans-serif"> <strong> 
    <input type="radio" value="1" name="u_input">
    <font color="#0033FF">VB 5/6<br>
    <input type="radio" value="2" name="u_input" >
    VB .NET<br>
    <input type="radio" value="3" name="u_input" checked>
    ASP<br>
    <input type="radio" value="4" name="u_input">
    ASP.NET<br>
    <input type="radio" value="5" name="u_input">
    C#<br>
    <input type="radio" value="6" name="u_input">
    VBA<br>
    <input type="radio" value="7" name="u_input">
    SQL</font></strong></font></p>
    <p> 
    <input type="submit" value="Enviar" >&nbsp; <b>
    <font face="Verdana" size="2" color="#0000FF">
    <font color="#FF0000"><A HREF=" javascript:window.close()">Fechar</a></font></a></font></b></p>
    </form>
     
     
    <%
    else
     
     
    ' Se o usuario entrou uma escolha na enquete
    ' verifica se o seu IP já foi registrado no BD
    BaseDados="enquetes.mdb" 
     
     
     
    'Usei um provedor OLE DB para efetuar a conexão com o banco de daos enquetes.mdb
    'poderia ter usado cn="driver={Microsoft Access Driver (*.mdb)};" mas não a performance do provedor OLE DB é melhor
    cn= "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:/inetpub/wwwroot/enquete/" & BaseDados
     
     
    'criei um recordset ADO e selecionei o número ip da tabela enquete1 que fosse igual ao ip do usuário atual
    set rs = server.createobject("ADODB.Recordset")
    sql = "select ip from enquete1 where ip ='" & u_ip & "'"
     
     
    'executei a consulta sql 
    rs.Open sql, cn
     
     
    'se o recordset estiver vazio o usuário ainda não votou
    if rs.eof then
    ' Se o usuario nao votou antes beleza atribuo o valor No a variável ja_votou
    ja_votou="No"
    end if
     
    'fecha o recordset
     
    rs.close
     
     
    if ja_votou = "No" then
    ' Se o usuario não votou então vamos gravar o voto no bd usando uma instrução SQL INSERT INTO
    sql = "insert into enquete1 (ip, opcao" & u_input &") "
    sql = sql & "values ('" & u_ip & "',1)"
     
     
    'efetiva a gravação no banco de dados
    rs.Open sql, cn
    end if
     
     
    'Vamos fazer um resumo e a estatistica dos votos por opção e calcular o total de votos
    sql= "select distinctrow sum(opcao1) as soma_opcao1, " 
    sql= sql & "sum(opcao2) AS soma_opcao2, sum(opcao3) AS soma_opcao3, "
    sql= sql & "sum(opcao4) AS soma_opcao4, sum(opcao5) AS soma_opcao5,"
    sql= sql & "sum(opcao6) AS soma_opcao6, sum(opcao7) AS soma_opcao7, count(*) AS total_votos "
    sql= sql & "FROM enquete1;"
    rs.Open sql, cn
     
    'totaliza os votos por opção e armazena nas variáveis definidas
     
    total1=rs ("soma_opcao1")
    total2=rs ("soma_opcao2")
    total3=rs ("soma_opcao3")
    total4=rs ("soma_opcao4")
    total5=rs ("soma_opcao5")
    total6=rs ("soma_opcao6")
    total7=rs ("soma_opcao7")
     
    'obtem o total de votos do recodset gerado
     
    contador=rs ("total_votos")
     
     
    %> 
     
    <table border="0" cellpadding="0" cellspacing="0" style="border-collapse: collapse" bordercolor="#111111" width="56%" id="AutoNumber1">
    <tr>
    <td width="136%" bgcolor="#FFFFFF" align="left" colspan="3">
    <font color="#0033FF" size="1" face="Verdana, Arial, Helvetica, sans-serif"><strong>
    Você gostaria que o site tivesse mais artigos sobre:</strong></font></td>
    </tr>
    <tr>
    <td width="34%" bgcolor="#E8E8E8" align="left"><strong>
    <font face="Verdana" size="1" color="#0033FF">&nbsp;&nbsp; opção&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    </font></strong></td>
    <td width="27%" bgcolor="#E8E8E8" align="left">
    <p align="left"><font face="Verdana" size="1" color="#0033FF"><strong>&nbsp;Votos&nbsp;&nbsp;
    </strong></font></td>
    <td width="75%" bgcolor="#E8E8E8" align="left">
    <strong style="font-weight: 400"><font face="Verdana" size="1">&nbsp;&nbsp; Percentual</font></strong></td>
    </tr>
    <tr>
    <td width="34%"> 
    <font face="Verdana, Arial, Helvetica, sans-serif" color="#0033FF"> <strong> VB 5/6</strong></font></td>
    <td width="27%"><font face="Verdana, Arial, Helvetica, sans-serif" color="#0033FF"><%=total1%></font></td>
    <td width="75%">
    <font face="Verdana" size="2"><strong style="font-weight: 400"> &nbsp;<img src="images/red.jpg" height="10" width=
    "<%= (total1/contador)*100 %>"> <%= formatnumber((total1/contador)*100,1) %>%&nbsp;&nbsp;&nbsp; </strong></font></td>
    </tr>
    <tr>
    <td width="34%"> <font face="Verdana, Arial, Helvetica, sans-serif"> <strong> 
    <font color="#0033FF">VB .NET&nbsp;&nbsp; </font></strong></font></td>
    <td width="27%"><font face="Verdana, Arial, Helvetica, sans-serif" color="#0033FF"><%=total2%></font></td>
    <td width="75%">
    <font face="Verdana" size="2"><strong style="font-weight: 400"> &nbsp;<img src="images/yellow.jpg" height="10" width=
    "<%= (total2/contador)*100 %>"> <%= formatnumber((total2/contador)*100,1) %>%&nbsp;&nbsp;&nbsp; </strong></font></td>
    </tr>
    <tr>
    <td width="34%"> <font face="Verdana, Arial, Helvetica, sans-serif"> <strong> 
    <font color="#0033FF">ASP&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></strong></font></td>
    <td width="27%"><font face="Verdana, Arial, Helvetica, sans-serif" color="#0033FF"><%=total3%></font></td>
    <td width="75%">
    <font face="Verdana" size="2"><strong style="font-weight: 400">&nbsp;<img src="images/green.jpg" height="10" width=
    "<%= (total3/contador)*100 %>"> <%= formatnumber((total3/contador)*100,1) %>%&nbsp;&nbsp; 
    </strong></font></td>
    </tr>
    <tr>
    <td width="34%"> <font face="Verdana, Arial, Helvetica, sans-serif"> <strong> 
    <font color="#0033FF">ASP.NET&nbsp; </font></strong></font></td>
    <td width="27%"><font face="Verdana, Arial, Helvetica, sans-serif" color="#0033FF"><%=total4%></font></td>
    <td width="75%">
    <font face="Verdana" size="2"><strong style="font-weight: 400"> &nbsp;<img src="images/blue.jpg" height="10" width=
    "<%= (total4/contador)*100 %>"> <%= formatnumber((total4/contador)*100,1) %>%&nbsp;&nbsp;
    </strong></font></td>
    </tr>
    <tr>
    <td width="34%"> <font face="Verdana, Arial, Helvetica, sans-serif"> <strong> 
    <font color="#0033FF">C#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></strong></font></td>
    <td width="27%"><font face="Verdana, Arial, Helvetica, sans-serif" color="#0033FF"><%=total5%></font></td>
    <td width="75%">
    <font face="Verdana" size="2"><strong style="font-weight: 400"> &nbsp;<img src="images/pink.jpg" height="10" width=
    "<%= (total4/contador)*100 %>"> <%= formatnumber((total4/contador)*100,1) %>%&nbsp;&nbsp;
    </strong></font></td>
    </tr>
    <tr>
    <td width="34%"> <font face="Verdana, Arial, Helvetica, sans-serif"> <strong> 
    <font color="#0033FF">VBA&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></strong></font></td>
    <td width="27%"><font face="Verdana, Arial, Helvetica, sans-serif" color="#0033FF"><%=total6%></font></td>
    <td width="75%">
    <font face="Verdana" size="2"><strong style="font-weight: 400"> &nbsp;<img src="images/grey.jpg" height="10" width=
    "<%= (total4/contador)*100 %>"> <%= formatnumber((total4/contador)*100,1) %>%&nbsp;&nbsp;
    </strong></font></td>
    </tr>
    <tr>
    <td width="34%"> <font face="Verdana, Arial, Helvetica, sans-serif"> <strong> 
    <font color="#0033FF">SQL&nbsp;&nbsp;&nbsp;&nbsp; </font></strong></font></td>
    <td width="27%"><font face="Verdana, Arial, Helvetica, sans-serif" color="#0033FF"><%=total7%></font></td>
    <td width="75%">
    <font face="Verdana" size="2"><strong style="font-weight: 400"> &nbsp;<img src="images/black.jpg" height="10" width=
    "<%= (total4/contador)*100 %>">
    </strong> 
    <%= formatnumber((total4/contador)*100,1) %>%&nbsp;&nbsp;&nbsp; </font> </td>
    </tr>
    </table>
    <br>
     
     
    <font size="2" face="Verdana, Arial, Helvetica, sans-serif">Total dos Votos : <%= formatnumber(contador,0,0) %>
    </font><p> <font size="2" face="Verdana, Arial, Helvetica, sans-serif">
     
    <% if ja_votou <> "No" then %>
    Você já votou !!! seu voto <b>NÃO</b> foi contado. 
    <% else %>
    </font></p>
    <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Obrigado por participar !! 
    <% end if %> </font></p>
    <% end if %>

    O código esta comentado e eu não vou repetir as explicações pertinentes a cada tarefa. A parte em amarelo refere-se a formulário que exibe a pergunta e a estatística.

    A solução foi testada e funciona , mas gostaria de chamar a atenção para um detalhe: Embora essa seja a solução adotada por mim para resolver um problema específico ela esta repleta de erros que eu não aconselharia ninguém a cometer.

    A solução apresentada , embora simples , somente serve para o meu caso. Vejamos seus maiores defeitos:

    • A base de dados não esta normalizada
    • o número ip escolhido para identificar unicamente um usuário apresenta problemas pois usuários com ip dinâmico poderão votar várias vezes
    • o código não é reutilizável e deverá ser reescrito para cada enquete que se deseje criar , etc…
    • Embora funcional a solução não é nada elegante em termos de interface e código.

    Moral da estória: “Nem tudo que funciona é uma boa solução”

    Abaixo o resultado da pesquisa em teste realizados na minha máquina local: Quer ver a rotina funcionando on-line ??? Entre no meu site e participe da pesquisa dando o seu voto !!!

    Até o próximo artigo ASP…

    José Carlos Macoratti
    http://www.macoratti.net/

    Deixe seu comentário