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