segunda-feira, 9 de agosto de 2010

Desmistificando Questionário do Moodle com Comando SQL



    A Plataforma Moodle tem um excelente sistema de questionário . É um dos recursos mais rico do Moodle. Caso for necessário montar um relatório customizado, aí começa a dor de cabeça. Sobra pergunta e falta resposta. 
  •  Em qual tabela da base de dados fica armazenada os dados do questionário?
  •  Como consultar  esses dados com o  comando SQL?
    A resposta para essas perguntas é muito simples. Vamos lá. Primeiro vamos mapear a as principais tabelas. Em seguida, vamos demonstrar o comando SQL para consultar os dados.
As consultas fazem SELECT apenas em alguns campos que se julga mais importantes para compreensão da tabela. 

    Principais Tabelas do Questionário
  • mdl_question – Armazena as questões
  • mdl_question_answers - Armazena opções de resposta das questões e gabaritos
  • mdl_quiz – Armazena os questionários
  • mdl_quiz_grades - Armazena nota final do questionário de cada aluno
  • mdl_quiz_attempts – Armazena  a nota final de cada tentativas de resposta
  • mdl_question_states – Armazena as respostas dos alunos

    As tabelas não são apenas essas. Há muito mais. Entendendo essas, as demais será moleza. Bem, agora que você sabe onde fica o armazém de dados, deve estar mais tranqüilo. Vamos ao próximo passo que é a consulta com o comando SQL. Todos os  comando SQL foram testados na versão 1.9 e 1.9.7 do Moodle.

1- SQL para consultar questões
SELECT id,name,questiontext,qtype FROM mdl_question

Essa consulta retorna todas as questões cadastradas. Retorna uma lista com:
  • id - Id  da questão
  • name - Nome da questão
  • questiontext – Enunciado da questão
  •  qtype – Tipo da questão

2- SQL para consultar alternativas de respostas e gabarito de uma determinada  questão

SELECT id,answer,fraction FROM mdl_question_answers  WHERE question=?
 
Passe o parâmetro id da questão  em question=?

Essa consulta retorna todas as opções de respostas de uma determinada questão. Retorna uma lista com:
  • id - Id  da resposta
  • answer – Texto da resposta
  • fraction – Fica o gabarito  das respostas. Indica se a resposta é verdadeira ou falsa. 

3 - SQL para consultar questionário um determinado curso
SELECT id,name,questions,grade FROM mdl_quiz WHERE course=?

Passe o parâmetro id do curso em course=?

Essa consulta retorna uma lista de questionário vinculado a um determinado  curso.
 Retorna uma lista com:
  • id - Id  do questionário
  • name – Nome do questionário
  • questions –  Lista de Id das questões (que ficam na tabela mdl_question ) instanciadas no questionário.  A lista de Id é separada por virgula . Algo assim: 1,2,4,8…
  • grade  - Escala de nota maxima do questionário. Indica se questionário vale nota 10 por exemplo.
Observação:
    Se você estava procurando uma tabela com relação de muitos para  muitos que relacione a tabela do questionário com a tabela da questões, dançou. Perdeu tempo vasculhando. O campo  questions da  tabela mdl_quiz resolve esse vínculo apenas listando os id das questões. Está claro que, neste caso, não há integridade  de dados via chave primária e estrangeira. A integridade de dados fica na cama de aplicação do Moodle e não no motor da base de dados. Sendo assim, numa missão crítica, a eficiencia e performance do Moodle  pode ser questionada. Se houver falha na camda de aplicação, a gravação no banco pode ficar incompleta, assim pode gerar dados orfãos na base de dados. 


4 - SQL para consultar lista de nota dos alunos em um determinado  questionário


SELECT u.id,u.firstname,u.lastname,g.grade FROM mdl_user u INNER JOIN mdl_quiz_grades  g ON u.id=g.userid WHERE  quiz=?
Passe o parâmetro id do questionário em quiz=?
   
Essa consulta lista a nota final dos alunos numa atividade implementada com o questionário. Faz junção da tabela   mdl_user e mdl_quiz_grades. Há caso em que  o questionário pode ser configurada para o aluno fazer mais de uma tentativa,  valendo  como  nota final a da maior nota.  Essa consulta traz sempre a final da nota configurada no questionário.
A lista retorna:
  • id - Id  usuário
  • u.firstname – Nome do usuário
  • u.lastname – Sobrenome do usuário
  • g.grade – Nota final

5 - SQL para consultar as tentativas de  resposta do  questionário feitas por um determinado aluno

SELECT id,attempt, sumgrades FROM mdl_quiz_attempts WHERE quiz=? AND userid=?

Passe o parâmetro id do questionário em quiz=? e id do usuário em userid=?
    Essa consulta lista todas as tentativas feita em um questionário por um aluno. Caso o questionário for configurado para ter mais de uma tentativa de resposta, o aluno pode responder várias vezes. Todas as tentativas ficam armazenadas na tabela  mdl_quiz_attempts.

A lista retorna:
  • id - Id  da tentativa
  • attempt – Numéro seqüencial das tentativas feitas
  • sumgrades – Nota final da tentativa

6 - SQL para consultar resposta do questionário de um determinado aluno
SELECT q.name,s.seq_number,s.answer,s.grade FROM mdl_quiz_attempts t INNER JOIN mdl_question_states s ON   t.id=s.attempt INNER JOIN mdl_question q ON s.question=q.id WHERE  t.quiz=? AND t.userid=? AND t.attempt=?

Passe o parâmetro id do questionário em quiz=?,  id do usuário em userid=?  e id da tentativa em t.attempt=?
 
    Essa consulta extrai uma lista de todas as questões do questionário com as respostas do  aluno.  Caso uma questão sofrer  alteração durante o momento do preenchimento do questionário, será listado mais de uma vez, ou seja, a lista traz o histórico das alterações.  

A lista retorna:
  • q.name – Nome da questão
  • s.seq_number – Controle  do histórico da alteração
  • s.answer – Resposta atribuída
  • s.grade – Nota obtida

O campo s.seq_number indica quantas vezes a questão sofreu alteração. A última alteração que é válida para computar a nota final da tentativa.

7 - SQL para consultar histórico de resposta  de uma determinada questão de um aluno

SELECT  s.seq_number,s.answer,s.grade FROM mdl_quiz_attempts t INNER JOIN mdl_question_states s ON   t.id=s.attempt  WHERE t.quiz=? AND t.userid=? AND t.attempt=? AND s.question=?

Passe o parâmetro id do questionário em quiz=?,  id do usuário em userid=?,   id da tentativa em t.attempt=? e id da questão em s.question=?


    Essa consulta retorna o histórico de resposta de uma questão dado por um aluno. É uma consulta detalhada exclusivamente de uma questão. Cada alteração na questão é registrada no banco de dados.

A lista retorna:
  • s.seq_number – Controle  do histórico da alteração
  • s.answer – Resposta atribuída
  • s.grade – Nota obtida

    Bem, com essas informações  já é possível decifrar o restante das tabelas sobre o questionário que  não foram abordados aqui.  Entendendo a lógica de funcionamento e ligação entre  as tabelas aqui apresentado,  já possibilita montar um relatório customizado sobre o Moodle.    
    Agora que já desvendou o mistério, faça um intervalo, vá tomar uma cerveja. Ao voltar da manguaça, boa programação.

31 comentários:

  1. Muito bom Lino!

    Esclareceu muitas dúvidas minhas.

    Abraço,
    JC

    ResponderExcluir
  2. Muito bom. Gostaria de saber para que serve a tabela mdl_question_sessions ?

    ResponderExcluir
    Respostas
    1. Gil,
      A tabela mdl_question_sessions serve para armazenar dados de alteração de um questionário como om comentário que o tutor faz para cada resposta do aluno.

      Além disso, é uma tabela que efetua controle sobre a alteração das questões do questionários após o preenchimento feito pelo aluno.

      Para uma compreensão mais afinada, segue a descrição de cada campo:

      attempted – Chave estrangeira da tabela mdl_quiz_attempts. Essa tabela registra a tentativa de cada aluno de um determinado questionário.

      questioned - Chave estrangeira da tabela mdl_question. Essa tabela registra as questões do questionário.

      newest - Chave estrangeira da tabela mdl_question_states. Essa tabela registra a resposta dos alunos de cada questionário.

      newgraded - Chave estrangeira da tabela mdl_question_states. Essa tabela registra a resposta dos alunos de cada questionário. Há uma diferença do campo newest. Possivelmente se refere as alterações de nota da questão.

      sumpenalty - Esta coluna registra o peso de cada questão no questionário para composição da nota final.

      manualcomment – Esta coluna registra o comentário, ou seja, o feedback efetuado pelo tutor de cada resposta do aluno.

      Excluir
  3. Como faço para fazer um backup geral do moodle, tipo gostaria de ter um servidor de arquivos fazendo backup do moodle de 30 a 30 minutos, existe algum plugin ou algum comando sql pra isso?

    ResponderExcluir
    Respostas
    1. Eilton Santos,

      Para fazer backup automático no Moodle, siga os seguintes passos:

      1)Ative/configure a opção do backup automático no bloco de amdministração do Moodle navegando em:
      Administração do site ► Cursos ► Backups

      2)Configure o cron do Moodle para ser invocado periodicamente

      Excluir
  4. Fala brother bu sta fixi?

    Como que eu faço para desativar a data de restrição de todas a provas no banco sem ir em cada disciplina e desabilitar?

    Abraço.

    ResponderExcluir
    Respostas
    1. Ya sta fixi brow.Bu bai terra ?
      O link acima ajudou, porém quando voltar na página da turma mantem a restrição até entrar na configuração da prova e clicar em salvar.Só alterando no banco não retira a restrição de vez.

      Excluir
    2. É mode go sócio, tudo fixola pa?
      Ya um gaju staba na terra kau Berdi na final de novembru. N da um txas ti lá pan n ba odja nha mama.

      Abo quanto a questionário, txeka si ka tem otu restrison komu de progressu ou de condicionalidadade. Link li ta splika restrison de condicionalidade: http://moodleeduc.blogspot.com.br/2011/05/atividade-condicionada-no-moodle.html
      Txeka e bu dan fala.

      Excluir
    3. Misti bai pa tchon utro ano. Abo mé bu mata dja saudade.
      Sta na terra bu ta sinti dirito rs...
      Djubi kusa de condicionamento i ka el, n'acha i dibidi tenê um tabela N pa N ku ta gurda status de ora ku tira restrição.
      Mas link ku bu passan li riba i bom, i djudan pa utrus kusas.

      Excluir
  5. Prezado Badiu, preciso criar um relatório com os nomes dos participantes, as questões e as respostas de cada um. Notei que a tabela mdl_question_states está vazia, apesar das questões estarem respondidas na plataforma. Como posso fazer para gerar o relatório por meio de SQL?

    Desde já agradeço pela atenção. E, mais uma vez, parabéns pelo bom trabalho.

    ResponderExcluir
    Respostas
    1. Cara, estou com o mesmo problema... caso eu encontre a resposta, te aviso por aqui. Abraço

      Excluir
    2. Consegui achar... As respostas das questões se encontram nas tabelas "mdl_question_attempt_steps" onde vc encontrará o id do usuário, e na tabela "mdl_question_attempts" onde vc encontrará os dados da questão utilizada.

      Estou colando um script de exemplo de como vc poderá fazer a consulta...

      -- QUERY PARA RECUPERAR QUESTÕES DA PROVA DE UM DETERMINADO ALUNO
      SELECT
      u.id,
      u.firstname,
      u.lastname,
      qas.fraction,
      qa.questionid,
      qa.slot,
      qa.questionsummary
      FROM
      public.mdl_user u
      INNER JOIN
      public.mdl_question_attempt_steps qas ON u.id = qas.userid
      INNER JOIN
      public.mdl_question_attempts qa ON qas.questionattemptid = qa.id
      INNER JOIN
      public.mdl_question_usages qu ON qa.questionusageid = qu.id
      INNER JOIN
      public.mdl_context c ON qu.contextid = c.id
      WHERE
      qas.sequencenumber = 2
      AND
      u.id = '[id do aluno]'
      AND
      c.instanceid = '[id do questionário que aparece na url]';

      Espero ter ajudado. Abraço a todos

      Excluir
    3. Bacana Victor, mas como recuperar a letra da resposta (a,b,c,d) ao invés do texto em sí?

      Excluir
  6. Ah! Só para constar estou usando o moodle 2.4

    grande abraço.

    ResponderExcluir
  7. Boa tarde senhores e ao ilustre Badiu rs,

    Tenho um sistema que busca dados do aluno no moodle, com o crescimento do uso dos questionários tive que incorpora os dados do mesmo no sistema.
    Minhas duvidas são as seguintes :

    1°Qual é tabela que informa quando o questionário esta ativo ou encerrado?
    existe algo tipo : 1= ativo e 0= encerrado ?
    sei que existe os campos data de abertura e data de encerramento, só queria separa os ativos e os encerrados.

    2°Gostaria de saber quais os campos que contem o tempo em que o aluno fez o questionário .


    ResponderExcluir
    Respostas
    1. Marcos Paulo,

      Cada vez que o aluno responder o questionário, o registro da tentativa é feita na tabela mdl_quiz_attempts. Nessa tabela há seguintes campos:

      state - registra se a tentativa está em progresso ou finalizado
      timestart - registra data / hora que o aluno iniciou a tentativa
      timefinish - registra data / hora que o aluno encerrou a tentativa

      Excluir
    2. Só não encontre o campo "state", mas da pra me arrumar aqui, muito obrigado!

      Excluir
    3. Caro Badiu ,
      Mais uma vez quero a te agradecer pela sua presteza.
      A comunidade Moodle deve muito ao seu trabalho.
      Deus continue te abençoando!
      Abraços!

      Excluir
  8. Este comentário foi removido pelo autor.

    ResponderExcluir
  9. Gostaria de saber onde ficar registrado a data em que o usuário realizou o questionário.

    ResponderExcluir
    Respostas
    1. Boa tarde Gilberto, essa informação fica na tabela mdl_quiz_attemps nos campos timestart e timefinish

      Excluir
  10. Bom dia Badiu! Quanto tempo, espero que esteja bém!
    Meu nobre, estou utilizando o Moodle 3.0,e nele irei fazer uma pesquisa de satisfação, e para tanto estou utilizando o plugin Questionnaire: https://moodle.org/plugins/mod_questionnaire
    A pergunta que quero lhe fazer é: estou tentando fazer um relatório por curso da pesquisa, o plugin Questionnaire já tem um relatório,mas preciso de em em sql, Você poderia me ajudar me dando uma luz de como posso criar um relatório por curso?
    Abraços!!

    ResponderExcluir
    Respostas
    1. Marcos,

      Estou precisando dos mesmos dados, porem só consegui chegar na consulta que retorna as perguntas e as respostas... Estou trabalhando para adicionar o curso e o usuário ...

      SELECT qq.content PERGUNTA, qc.content RESPOSTA
      FROM mdl_questionnaire_resp_single q
      JOIN mdl_questionnaire_question qq on q.question_id = qq.id
      JOIN mdl_questionnaire_quest_choice qc on q.choice_id = qc.id

      Excluir
  11. Grande Lino!
    Os anos passam mas o conteúdo maravilhoso de apoio continua salvando horas de análise!
    Obrigado mais uma vez!

    ResponderExcluir
  12. Boa tarde, meu nome e Felipe e gostaria de saber se posso recuperar as notas dos alunos num quiz, onde ha questoes abertas? Gostaria de recuperar as notas que o proprio moodle atribuiu ao aluno e o campo vazio caso a nota de uma atividade dissertativa ainda nao tenha sido lancada. Igual a tela de relatorio das tentativas realizadas para o quiz

    ResponderExcluir
  13. Bom dia! Onde ficam armazenadas as questões de um quiz na versão 3.0 do moodle?

    ResponderExcluir
  14. Boa tarde!
    Como gerar a media de acerto por questão?

    ResponderExcluir
  15. Miguel,
    Explore os comandos SQL nesse post da comunidade Badiu.
    http://comunidade.badiu.com.br/mod/forum/discuss.php?d=248

    O último comando nesse post traz a resposta dos alunos. A partir dessa lógica, monte o comando para o que precisa.

    ResponderExcluir
  16. Bom dia,
    Eu queria saber se tem como imprimir a prova do aluno?

    ResponderExcluir