Criando uma enquete simples.

Novo aqui no site? Talvez gostaria de assinar o
RSS feed do site?

Publicado em: 06/02/2008
Área: ASP
Visualizações: 3.430
Comentário(s): 0

imprimir envie por e-mail compartilhe
Ola pessoal  vamos lá. 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:


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" >  <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">   opção        
    </font></strong></td>
    <td width="27%" bgcolor="#E8E8E8" align="left">
    <p align="left"><font face="Verdana" size="1" color="#0033FF"><strong> Votos  
    </strong></font></td>
    <td width="75%" bgcolor="#E8E8E8" align="left">
<strong style="font-weight: 400"><font face="Verdana" size="1">   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">  <img src="images/red.jpg" height="10" width=
"<%= (total1/contador)*100 %>"> <%= formatnumber((total1/contador)*100,1)  %>%    </strong></font></td>
  </tr>
  <tr>
    <td width="34%"> <font face="Verdana, Arial, Helvetica, sans-serif"> <strong>
    <font color="#0033FF">VB .NET   </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">  <img src="images/yellow.jpg" height="10" width=
"<%= (total2/contador)*100 %>"> <%= formatnumber((total2/contador)*100,1)  %>%    </strong></font></td>
  </tr>
  <tr>
    <td width="34%"> <font face="Verdana, Arial, Helvetica, sans-serif"> <strong>
    <font color="#0033FF">ASP         </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"> <img src="images/green.jpg" height="10" width=
"<%= (total3/contador)*100 %>"> <%= formatnumber((total3/contador)*100,1)  %>%  
</strong></font></td>
  </tr>
  <tr>
    <td width="34%"> <font face="Verdana, Arial, Helvetica, sans-serif"> <strong>
    <font color="#0033FF">ASP.NET  </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">  <img src="images/blue.jpg" height="10" width=
"<%= (total4/contador)*100 %>"> <%= formatnumber((total4/contador)*100,1)  %>%  
</strong></font></td>
  </tr>
  <tr>
    <td width="34%"> <font face="Verdana, Arial, Helvetica, sans-serif"> <strong>
    <font color="#0033FF">C#          </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">  <img src="images/pink.jpg" height="10" width=
"<%= (total4/contador)*100 %>"> <%= formatnumber((total4/contador)*100,1)  %>%  
</strong></font></td>
  </tr>
  <tr>
    <td width="34%"> <font face="Verdana, Arial, Helvetica, sans-serif"> <strong>
    <font color="#0033FF">VBA      </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">  <img src="images/grey.jpg" height="10" width=
"<%= (total4/contador)*100 %>"> <%= formatnumber((total4/contador)*100,1)  %>%  
</strong></font></td>
  </tr>
  <tr>
    <td width="34%"> <font face="Verdana, Arial, Helvetica, sans-serif"> <strong>
   <font color="#0033FF">SQL     </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">  <img src="images/black.jpg" height="10" width=
"<%= (total4/contador)*100 %>">
</strong>
<%= formatnumber((total4/contador)*100,1)  %>%    </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:

    
*  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 história: "Nem tudo que funciona é uma boa solução"

Abaixo o resultado da pesquisa em teste realizados na minha máquina local:


e é isso ae, espero que isso ae ajudem muito, valeu pessoal  até o próximo artigo.

Nota da Redação: Artigo original em: http://www.macoratti.net/asp_enq1.htm

veja mais
Preencha o formulário para comentar:
Nome:*

E-mail:* (não será exibido)

Site: (http://)

Comentário:*

Deseja receber os comentários no e-mail?

Anti-spam: (nova imagem)





Seja o primeiro a comentar!

Autor da matéria
Diego Darlan
Olá! muito prazer, meu nome é Diego Darlan S. Lopes , Sou um White hat há 2 anos, atualmente faço alguns serviços, como desenvolvedor eXtreme freelancer, na ár.

Todas as matérias de Diego Darlan

Publicidade
Seguir o Oficina da Net
RSS

RSS

RSS
Top matérias do mês
Matérias relacionadas
Tags
» asp

© 2005 - 2009 - Oficina da Net - v 4.0 - É proibida a reprodução parcial ou completa do conteúdo deste site sem autorização por escrito. Resolução adequada: 1024x768px.