ASP - Criando uma enquete simples.


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 :

 

a- 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

b- O usuário somente poderia fazer sua escolha uma vez.

c- 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:

 

 

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 %>

 

A parte em cinza do código refere-se ao código ASP principal da rotina onde esta praticamente toda a inteligência do projeto. 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:

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:

 

 

Até o próximo artigo ASP...

Referências:


José Carlos Macoratti