ASP - Gerando um formulário de testes para avaliação


ASP ou Active Server Pages revolucionou o desenvolvimento para Web assim como o VB para o desktop. Você não precisa ser um mestre para criar aplicações web dinâmicas usando ASP.

Neste artigo eu vou mostrar como você pode criar um página para efetuar testes de verificação de avaliação. Os testes serão sobre Visual Basic mas você pode fazer para qualquer assunto.

Você vai precisar ter o Personal Web Server ou o IIS instalado para testar os scripts do artigo.

Eu não vou me preocupar com a aparência do formulário de testes deixo isto a seu encargo. Colocando uma imagem aqui , um cor ali , e você com certeza vai conseguir melhorar muito o meu design espartano.

A idéia é criar um banco de dados de questões e respostas e gerar um formulário de avaliação usando páginas ASP.

Creio que 70% do sucesso da empreitada esteja na modelagem de dados adequada pois , como você mesmo vai poder observar , o código ASP é muito simples. Vou criar o banco de dados avaliacao.mdb com 3 tabelas :

  1. Tabela Exames - contém os dados dos tipos de avaliações possíveis . Nesta tabela você cadastra os tipos de avaliações que deseja gerar : O nome da avaliação , O Título , e total de pontos que poderá ser atingido.
     
  2. Tabela Questoes - contém as questões de cada tipo de avaliação - Nesta tabela você cadastra as questões para a avaliação : o número do Exame pertinente , o número da questão e a questão; as questões estão relacionadas com o tipo de exame pela coluna ExameID
     
  3. Tabela Opcoes - contém as opções para cada questão - Nesta tabela você cadastra as opções para cada questão . Você deve informar o texto da opção , um texto para reposta que deve ser exibida e o valor em pontos da questão. As opções estão relacionadas com a questão pela coluna QuestaoID.

 Abaixo temos as estrutura de cada uma das tabelas:

 A seguir o relacionamento entre as tabelas:

A figura abaixo exibe o relacionamento dos dados entre as tabelas:

Após terminar a modelagem de dados e cadastrar alguns dados para testes ( eu cadastrei duas avaliações :Visual Basic Básico e Visual Basic Intermediário) vamos aos scripts ASP.

A primeira página será a página avaliação.asp que exibirá as opções de avaliações disponíveis para o usuário. O visual da página e o seu código é dado abaixo:

<html>

<head>
<meta http-equiv="Content-Type"
content="text/html; charset=iso-8859-1">
<title>Simulado Visual Basic -</title>
</head>

<body bgcolor="#FFFFFF">

<p align="left"><font color="#004080" size="5"
face="Comic Sans MS"><strong><img
src="file:///C:/FPXpress/maco10.gif" width="233" height="32"></strong></font><font
color="#004080" size="4" face="Comic Sans MS"><strong>Simulado
Visual Basic - Teste de avaliação de conhecimentos</strong></font></p>

<hr size="0" color="#800080">

<ol>
<li><p align="left"><font color="#FF8000" size="4"
face="Comic Sans MS"><strong>Avaliação de conhecimentos</strong></font><font
color="#0000FF" size="4" face="Comic Sans MS"><strong> - </strong></font><a
href="exame.asp?ques=1"><font color="#0000FF" size="4"
face="Comic Sans MS"><strong>Visual Basic Básico</strong></font></a></p>
</li>
</ol>

<ol type="1" start="2">
<li><p align="left"><font color="#FF8000" size="4"
face="Comic Sans MS"><strong>Avaliação de conhecimentos</strong></font><font
color="#0000FF" size="4" face="Comic Sans MS"><strong> - </strong></font><a
href="exame.asp?ques=2"><font color="#0000FF" size="4"
face="Comic Sans MS"><strong>Visual Basic Intermediário</strong></font></a></p>
</li>
</ol>

<ol type="1" start="3">
<li><p align="left"><font color="#FF8040" size="4"
face="Comic Sans MS"><strong>Avaliação de conhecimentos</strong></font><font
color="#0000FF" size="4" face="Comic Sans MS"><strong> - </strong></font><a
href="exame.asp?ques=3"><font color="#0000FF" size="4"
face="Comic Sans MS"><strong>Visual Basic Avançado</strong></font></a></p>
</li>
</ol>

<hr size="0" color="#800080">

<p align="center"><font color="#004080" face="Comic Sans MS">Clique
no link da avaliação que deseja fazer.</font></p>
</body>
</html>

Não se assuste com o código , é praticamente 99% HTML com exceção das linhas de código em cada link:

A página exame.asp irá exibir então a relação de questões cadastrada para o exame em questão. Abaixo a visão da página para os testes cadastrados para Visual Basic Básico:

<HEAD>
<TITLE>
Exame de Avalicação - VB
</TITLE>
</HEAD>
<BODY BGCOLOR="#FFFFFF">

<%

sConnString = "DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=" & Server.MapPath("avaliacao.mdb")
set conn = Server.CreateObject("ADODB.Connection")

conn.open sConnString

'
encontra o tipo de avalizacao
'ex: exame.asp?ques=1 - indica que voce seleciona o exame basico

set RS = Conn.Execute("SELECT * FROM [Exames] WHERE [ExameID]=" & request.querystring("ques"))
%>

<font face="Arial">
<h2><b><% =rs("ExameNome") %></b></h2><font size=2><% =rs("ExameTitulo") %>
<hr>
<p>

<form action="pontos.asp?ques=<% =request.querystring("ques") %>" method="post">
<%
rs.close
set rs=nothing

'inicia um loop para exibir as questões
set RS = Conn.Execute("SELECT * FROM [Questoes] WHERE [ExameID]=" & request.querystring("ques") & " ORDER BY [Numero]")
if not RS.EOF then
RS.movefirst
do

response.write "<b><font face='Verdana' color='blue'>" & rs("Numero") & ". " & rs("Questao") & "</b><p>" & chr(13)

'exibe as opções disponiveis
set ORS = Conn.Execute("SELECT * FROM [opcoes] WHERE [QuestaoID]=" & RS("QuestaoID"))

if not ORS.EOF then
ORS.movefirst
do
response.write
"<input type=Radio Name=""Questao" & RS("QuestaoID") & """ Value=""Resposta" & ORS("OpcaoID") & """>" & ORS("Opcao") & "<br>" & chr(13)
ORS.movenext

loop until ORS.EOF
end if
response.write "<p>"
RS.movenext
loop until RS.EOF
%>
<hr>
<input type=submit value="Verificação de Resultado"> Clique aqui para verificar suas respostas
<%
else
%>
<h3><font color="red">Não há questões cadastradas para esta avaliação.</font><h3>
<hr>
<h4><a href="avaliacao.asp">Continua Avaliação</a> <font color="red"><a href="http://www.macoratti.net">Retorna ao site</a></h4></font>
<%
end if
conn.close
set conn = nothing
%>
</form>
</BODY>
</HTML>

Creio que valha a pena destacar no código acima as linhas de cor azul :

Abre a tabela Exames e cria um recordset com os dados do exame selecionado na página avaliacao.asp

Cria um recordset com as questões cadastradas para o exame selecionado e ordenado por número do exame.

Gera um recordset com as opções cadastradas para questão selecionada.

Exibe cada opção com um radiobutton identificado pelo nome de Questao+número da questão(rs("QuestaoID") . O valor selecionado irá retornar : Resposta + (ORS("OpcaoID") - o número da opção.

Finalmente a página pontos.asp irá verificar as respostas dadas pelo usuário e efetuar uma contagem de pontos. A página exibe algumas mensagens relacionadas com os pontos obtidos mas isto não é tão importante. Abaixo a página e o código :

<HEAD>
<TITLE>
Verificação de avaliação
</TITLE>
</HEAD>
<BODY BGCOLOR="#FFFFFF">

<%
sConnString = "DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=" & Server.MapPath("avaliacao.mdb")
set conn = Server.CreateObject("ADODB.Connection")

conn.open sConnString

'encontre o exame de avaliação conforme informando na url
'ex: pontos.asp.asp?ques=1 -> indica que voce esta escolhendo o exame 1(basico)

set RS = Conn.Execute("SELECT * FROM [Exames] WHERE [ExameID]=" & request.querystring("ques"))
'pega o total de pontos que se pode fazer na avaliacao
totalPontos = RS("TotalPontos")
%>

<font face="Arial">
<b><% =rs("ExameNome") %> - Verificação de avaliação</b>
<hr>
<font size=2>
<p>

<%
'fecha o recordset
RS.close
set RS=nothing

Dim somaPontos , resposta , respostanum

somaPontos=0

'percorre as questoes para efetuar a verificacao
set RS = Conn.Execute("SELECT * FROM [Questoes] WHERE [ExameID]=" & request.querystring("ques") & " ORDER BY [Numero]")

if not RS.EOF then
RS.movefirst
do
response.write "<b> <font face='Verdana' color='blue'>" & rs("Numero") & ". " & rs("Questao") & "</b><br>" & chr(13)

'Obtem a resposa do usuario do formulário
resposta = request.form("Questao" & RS("QuestaoID"))

if len(resposta) > 0 then
'obtem o numero da resposta
respostanum = right(resposta,len(resposta)- 8)

'seleciona as opções para a resposta
set ORS = Conn.Execute("SELECT * FROM [opcoes] WHERE [OpcaoID]=" & respostanum )

'exibe a resposta com aviso
if not ORS.EOF then
  ORS.movefirst
  response.write " Sua resposta : " & ORS("Opcao") & "<br>"

  if ORS("Marca") then
'exibe um tique
      response.write "<img src=""AspOK.gif"">"
  else
'exibe uma cruz
      response.write "<img src=""AspErro.gif"">"
  end if

  response.write " " & ORS("Pontos") & " : " & ORS("Resposta") & chr(13)
  somaPontos=somaPontos + ORS("Pontos")
end if

else
response.write "Voce NÃO respondeu essa questão..."
end if

response.write "<p>"
RS.movenext
loop until RS.EOF
else
response.write "Não há questões para o Exame selecionado."
end if
%>
<h4><a href="avaliacao.asp">Continua Avaliação</a> <a href="http://www.macoratti.net">Retorna ao site</a></h4>
<%
response.write "<hr>Você obteve " & somaPontos & " pontos de um total de " & totalPontos & "."
if somaPontos = 0 then
response.write "<h2> <font face='Verdana' color='red'>" & "Você esta no site errado ou não leu direito." & "<br>"
response.write "O assunto aqui é : Visual Basic." & "</font></h2> <br>"
elseif somaPontos <= TotalPontos/2 then
response.write "<h2> <font face='Verdana' color='green'>" & "Quem sabe se você estudar um pouco mais..." & "</font></h2> <br>"
elseif somaPontos <= TotalPontos - 10 then
response.write "<h2> <font face='Verdana' color='gray'>" & "Faltou pouco para a perfeição..." & "</font></h2> <br>"
elseif somaPontos <= TotalPontos - 30 then
response.write "<h2> <font face='Verdana' color='pink'>" & "Você precisa estudar muito." & "</font></h2> <br>"
elseif somaPontos = TotalPontos then
response.write "<h2> <font face='Verdana' color='blue'>" & "Excelente , você sabe tudo de Visual Basic..." & "</font></h2> <br>"
end if
conn.close
set conn = nothing
%>

</BODY></HTML>

Creio que cabe destacar o código em negrito:

'Obtem a resposa do usuario do formulário
resposta = request.form("Questao" & RS("QuestaoID"))

if len(resposta) > 0 then
'obtem o numero da resposta
respostanum = right(resposta,len(resposta)- 8)

'seleciona as opções para a resposta
set ORS = Conn.Execute("SELECT * FROM [opcoes] WHERE [OpcaoID]=" & respostanum )

'exibe a resposta com aviso
if not ORS.EOF then
  ORS.movefirst
  response.write " Sua resposta : " & ORS("Opcao") & "<br>"

  if ORS("Marca") then
'exibe um tique
      response.write "<img src=""AspOK.gif"">"
  else
'exibe uma cruz
      response.write "<img src=""AspErro.gif"">"
  end if

  response.write " " & ORS("Pontos") & " : " & ORS("Resposta") & chr(13)
  somaPontos=somaPontos + ORS("Pontos")
end if

else
response.write "Voce NÃO respondeu essa questão..."
end if

Nele eu estou obtendo a resposta que o usuário marcou e selecionando a opção para a resposta. Estou usando dois arquivos de imagem:

Para cada exame há uma soma dos pontos obtidos na avaliação.

Creio que agora é só você fazer a avaliação e testar seus conhecimentos de Visual Basic . Clique aqui para fazer o teste: Simulado VB.

Nota : Você pode alimentar o seu banco de dados com uma quantidade x de questões e a seguir extrair de forma aleatório um número de questões que deseja exibir usando a função RND() que retorna um número entre zero e um em conjunto com a função Randomize de forma a gerar uma semente diferente a cada execução de Rnd.

Abaixo um código de exemplo clássico :

<%
Randomize
valor = Int(Rnd * numero) + 1
%>
 

O código abaixo pode ser usado para gerar números aleatório com registros de um banco de dados:(Não esta completo , é apenas uma forma de dar uma dica a quem não sabe por onde começar). Pensa um pouco baby , pensa vai...

  connStr = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & Server.MapPath("teste.mdb")

 Dim rs
 Set rs = Server.CreateObject("ADODB.Recordset")
 rs.Open query, connStr, 3, , adCmdText

 ' Gera números aleatório de um total de registros
 Dim intRnd
 Randomize Timer
 intRnd = (Int(RND * rs.RecordCount))

 ' move o cursor para o registro

 rs.Move intRnd

 ' exibe os valores do recordset
Response.Write "<b>" & rs("nome") & "</b>"

rs.Close
Set rs = Nothing

Até o próximo artigo


José Carlos Macoratti