Criação de Questionário

Boa tarde,

Estou há vários dias pensando em como criar um questionário de respostas, mas ainda não encontrei uma lógica utilizando o ScriptCase, gostaria da ajuda de vocês.

Criei 3 tabelas:

Tabela 1 - questionario_questao
Estrutura: COD_QUESTAO, DESCRICAO, COD_PROCESSO_SELETIVO

Tabela 2 - questionario_resposta
Estrutura: COD_RESPOSTA, COD_QUESTAO, DESCRICAO, COD_PROCESSO_SELETIVO

Tabela 3 - questionario_resultado
Estrutura: COD_RESULTADO, COD_RESPOSTA, COD_QUESTAO, COD_CANDIDATO, DATAEHORA, COD_PROCESSO_SELETIVO

Para que o usuário do sistema crie o questionário, criei um mestre/detalhe entre a tabela 1 e tabela 2. Até aqui, tudo bem.

Estou tentando agora na parte do visitante, visualizar todas as questões criadas, com suas respostas, e o visitante deve selecionar a resposta que ele desejar de um radiobox. Não é enquete, é um formulário com várias questões, definidas pelo usuário do sistema.

Vocês teriam alguma sugestão? Tentei pelo Blank, mas me parece que o Blank não aceita tudo, ainda não descobri a melhor forma de fazer isso.

Desde já, obrigado.

1 Curtida

Olá Ramos,

Esses tempos tinha uma pergunta parecida aqui no fórum, mas na época não consegui pensar num jeito de fazer isso…

acho que tem que ser tudo manual mesmo, criar uma apl blank, fazer um lookup nas perguntas e um loop (foreach por exemplo)… e dentro deste loop, mostrar a pergunta e criar outro loop com um radiobox das respostas… por exemplo:

sc_lookup(dsquest, "SELECT COD_QUESTAO, DESCRICAO FROM questionario_questao WHERE COD_PROCESSO_SELETIVO = '[COD_PROCESSO_SELETIVO]'");
if  (FALSE === {dsquest} || empty({dsquest}))
{
	// erro
}
else
{
	foreach ({dsquest} as $pergunta)
	{
			$codquest = $pergunta[0];
			$questao = $pergunta[1];
			echo "<form name='formulario' action='processa_form.php' method='POST'>";
			echo "Pergunta - $questao";	// ex: Pergunta - Quanto é 2 + 2?
			echo "<br /> Resposta:";
			sc_lookup(dsresp, "SELECT COD_RESULTADO, COD_RESPOSTA FROM questionario_resposta WHERE COD_PROCESSO_SELETIVO = ''[COD_PROCESSO_SELETIVO]");
			if  (FALSE === {dsresp} || empty({dsresp}))
			{
				// erro
			}
			else
			{
				foreach ({dsresp} as $resposta)
				{
					$codresp = {dsresp}[0][0];
					$resposta = {dsresp}[][];
					echo "<option id='$codquest' name='$codquest' value='$codresp'> $resposta </option><br />
				}
			}
	}
	echo "<br /><br /><input type='submit' value='Enviar'></form>";
}

todos os radios de uma mesma pergunta precisam ter como nome/id o COD da questão, e como valor o código da resposta… após o submit vc escolhe se vai querer inserir as respostas no banco ou se vai calcular a nota direto…

acho que é mais ou menos por aí… se alguém tiver outra idéia mais prática, tbm tenho interesse.

Espero ter ajudado.

Att.
Robson

Está dando um erro, segue:


// Chama o banco de dados.
sc_lookup(perguntas, "SELECT COD_QUESTAO, DESCRICAO FROM questionario_questao WHERE COD_PROCESSO_SELETIVO = '[COD_PROCESSO]'");

// Se não existe ou vazio...
if  (FALSE === {perguntas} || empty({perguntas}))
{
	// erro
	echo "Banco de dados não existe ou tabela está vazia.";
}
else
{
	// Faça enquanto achar, colocando em um array
	foreach ({perguntas} as $pergunta)
	{
			$codquest = $pergunta[0];
			$questao = $pergunta[1];
			echo "<form name='formulario' action='processa_form.php' method='POST'>";
			echo "<b>Pergunta - $questao <b />";	// ex: Pergunta - Quanto é 2 + 2?
			echo "<br /> Resposta: </br>";

			// Abre nova tabela para listar as respostas conforme questão.
			sc_lookup(respostas, "SELECT COD_RESPOSTA, COD_QUESTAO, DESCRICAO FROM questionario_resposta WHERE COD_PROCESSO_SELETIVO = '[COD_PROCESSO]'");
			
			// Se não existe ou vazio...
			if ({respostas} === false)
			{
				echo "Erro de acesso. Mensagem = " .{respostas};
			}	
			elseif (empty({respostas}))
			{
				echo "Comando select não retornou dados "; // >> ESTÁ DANDO ERRO AQUI.
			}
			else
			{
				foreach ({respostas} as $resposta)
				{
					$codresp = {respostas}[0];
					$resposta = {respostas}[1];
					echo "<option id='$codquest' name='$codquest' value='$codresp'> $resposta </option><br />";
				}
	}
	echo "<br /><br /><input type='submit' value='Próximo'></form>";
}
}

Está dando erro neste trecho em negrito:

sc_lookup(respostas, “SELECT COD_RESPOSTA, COD_QUESTAO, DESCRICAO FROM questionario_resposta WHERE COD_PROCESSO_SELETIVO = ‘[COD_PROCESSO]’”);

		// Se não existe ou vazio...
		if ({respostas} === false)
		{
			echo "Erro de acesso. Mensagem = " .{respostas};
		}	

elseif (empty({respostas}))
{
echo "Comando select não retornou dados "; // >> ESTÁ DANDO ERRO AQUI.
}

else
{

Mas me parece correto. O que pode ser?

Testa a SELECT do sc_lookup no banco para ver se ela retorna dados.

Testei, retornou.

O nome da tabela é inscridb, não “perguntas” isso influi em algo?

Neste caso, o respostas do sc_lookup é uma variavel que armazena o array de retorno.

sc_lookup(respostas, “SELECT COD_RESPOSTA, COD_QUESTAO, DESCRICAO FROM questionario_resposta WHERE COD_PROCESSO_SELETIVO = ‘[COD_PROCESSO]’”);

Testa se na variável global [COD_PROCESSO] tá passando o valor para a cláusula WHERE.

Ramos,

O código parece estar certinho… acho que é o que o Cleyton falou, o lookup não está recebendo o valor da global… ali onde deu o erro, coloque o seguinte:

elseif (empty({respostas}))
{
echo "Comando select não retornou dados - cod_processo = ".[COD_PROCESSO];
}

assim já dá pra saber se a variavel está com algum valor…

Tirando o WHERE dá certo. Mas tenho uma nova dúvida:

Como selecionar somente as respostas que forem referentes a questão? Tipo, posso até retirar o COD_PROCESSO_SELETIVO, uma vez que o primeiro select já está fazendo isso, mas o COD_QUESTAO do segundo SELECT deve ser igual o COD_QUESTAO do primeiro.

Isso atesta nossa suspeita de que o valor da global não está sendo passado. Faça o teste que o Robson orientou para ver que valor está indo na global.

Outro teste que vc pode fazer é: ao invés de colocar a global na WHERE coloque um número que corresponda a um código existente.

Ex.:
sc_lookup(respostas, “SELECT COD_RESPOSTA, COD_QUESTAO, DESCRICAO FROM questionario_resposta WHERE COD_PROCESSO_SELETIVO = ‘1’”);

Robison,

Fazendo o que falou, mostra que está retornando o valor do COD_PROCESSO sim. Tudo ok. Mas mesmo assim, não passa desta mensagem de erro. E já testei no QueryBrowser o SELECT e funciona também.

E Cleyton, se colocar da forma que você disse dá certo. Mas tem algo errado, não posso definir, tem que pegar da variável global COD_PROCESSO, mas ele, conforme o Robison disse, está pegando. Estranho.

Testa tirando as aspas da global:

sc_lookup(respostas, “SELECT COD_RESPOSTA, COD_QUESTAO, DESCRICAO FROM questionario_resposta WHERE COD_PROCESSO_SELETIVO = [COD_PROCESSO]”);

Se coloco sem aspas dá a primeira mensagem do IF

if ({respostas} === false)

Rapaz que coisa, parece tudo certinho.

Experimente jogar o valor da global numa local:

$processo = [COD_PROCESSO];

na WHERE coloca a variável $processo

Não sei pq, mas algumas vezes eu já tive que fazer isso em código de comparação. Mesmo com o valor correto na global.

Verificar tbem os valores em sessão. Em menu EXIBIR em DADOS EM SESSÃO. Vc poder ir testando nas fases da aplicação os valores nas variáveis. Tipo ao carregar checa o valor, depois de executar alguma coisa pode ver se nada alterou o valor da variável. É legal para ir depurando.

Pelo que vc tá nos retornando, ainda acho que o problema está na global passada na WHERE, visto que se vc colocar um valor fixo funciona.

O que acha Robson?

Concordo com vc Cleyton, acho que o problema deve estar nesta global…
Ramos, como ela está sendo enviada pra esta aplicação? Dá uma conferida na aplicação de origem, ou tenta fazer o que o Cleyton falou dando um trim nela pra remover espaços: $processo = trim([COD_PROCESSO]), sei lá… deve ser alguma coisa aí, pois o código está certo e o lookup roda tranquilamente quando vc insere o valor manualmente…

Olha deu certo, só declarar local. Obrigado.

Agora… eu vi um exemplo aqui no forum do que estou querendo fazer, sem usar aplicações Blank: http://www.scriptcase.com.br/sistemas4/sc_quest_pt_br/login/login.php onde posso baixar este exemplo?

Boa Noite. ramosinfo,

Você conseguiu montar o questionário ?