domingo, 18 de dezembro de 2011

Recuperar Alunos Excluídos do Curso do Moodle com Comando SQL

As matriculas canceladas nos  cursos do Moodle podem ser recuperadas. Para isso, é necessário fazer uma varredura nos registros de log ou de notas diretamente na base de dados por meio de comando SQL.

Os registros das matrículas podem ser cancelados manual ou automaticamente. Na maioria das vezes, o cancelamento é automático. Isso acontece ao executar o arquivo de cron. A configuração padrão do Moodle exclui todas as matrículas quando:
  • A inscrição no curso tiver a data de validade vencida;
  • O participante (aluno, tutor, autor do curso etc) não acessar o curso durante 120 dias.
A exclusão automática ocorre apenas quando o cron for executado.

Se o cron apagou os alunos matriculados nos cursos, certamente você estará em apuros com a equipe pedagógica. Enquanto não recuperar os dados, certamente alguém  ficará em seu cangote cobrando uma solução.

Se você estiver nessa situação, não caia no desespero. Há uma notícia boa. Quando uma matrícula é excluída, os dados do usuário relativos ao curso (participação no fórum, log, nota etc) não são excluídos. Isso significa que é possível recuperar quem estava matriculado através do rastreamento desses registros. Há dois meios alternativos para fazer isso. O primeiro é o rastreamento da tabela de log mdl_log. O segundo é o rastreamento da tabela de nota mdl_grades_grade ou qualquer outra tabela que registra atividades dos alunos, como tarefa, questionário, fórum etc. 

Vamos apresentar o comando SQL de rastreamento para cada alternativa e, além disso, explorar cada alternativa no que tange a vantagem e desvantagem.
Recuperação de Usuários pela Tabela de Log

Comando SQL

SELECT DISTINCT userid,course FROM mdl_log WHERE userid>0 AND course>0

Esse comando  faz uma consulta na tabela de log e extrai o código de identificação  do usuário e do curso, ou seja, a relação dos usuários que acessaram o curso. 

SELECT DISTINCT u.id,u.firstname,u.lastname, u.email,c.id,c.fullname FROM mdl_log l INNER  JOIN mdl_user u ON u.id=l.userid INNER JOIN mdl_course c ON c.id=l.course
SELECT DISTINCT g.userid i.courseid FROM mdl_grade_grades g INNER JOIN mdl_grade_items i ON g.itemid=i.id WHERE i.courseid>0 AND g.userid>0

Esse comando é o mesmo que o anterior. A única diferença é que ele extrai o nome do usuário e nome do curso que o usuário acessou.


Uma vez identificando os usuários e os cursos acessados, para saber se foram apagados do curso, basta fazer uma consulta na tabela de matrícula para verificar se estão registrados. Caso não estejam, devem ser inseridos. Esse procedimento é mais eficiente se for feito a partir de uma rotina de programação.

Vantagem
  • Os registros da tabela de log  possibilitam recuperar todas as inscrições canceladas, desde que o participante tenha acessado o curso.

Desvantagem
  • Não é possível identificar com exatidão o perfil de inscrição do usuário antes de ser cancelado. Se a inscrição do tutor for cancelada, o registro de log não informa explicitamente que se tratava de um tutor. Isso pode ser mapeado por meio de ações regristradas no log como criar/editar fórum, por exemplo, que são permissões atribuídas ao perfil do tutor.
  • A recuperação contempla todos os usuários que acessaram o curso e não apenas aqueles que estavam inscritos. Por exemplo, o usuário com perfil administrador do Moodle pode acessar todos os cursos. Por outro lado, usuários com permissão em nível de categoria de curso podem acessar qualquer curso vinculado à aquela categoria. A recuperação não diferencia o nível de inscrição do usuário. 
  • Caso o log do Moodle esteja desativado, não será possível rastrear acesso de nenhum usuário.



Recuperação de Usuários pela Tabela de Nota

Aqui vamos fazer o rastreamento a partir dos registros da tabela de nota. O mesmo procedimento pode ser feito a partir dos registros dos alunos em qualquer atividade do Moodle, como participação no fórum, envio de tarefa ou submissão de questionário.

Comando SQL


SELECT DISTINCT g.userid, i.courseid FROM mdl_grade_grades g INNER JOIN mdl_grade_items i ON g.itemid = i.id

Esse comando  faz uma consulta na tabela de nota e extrai o código de identificação  do usuário e do curso, ou seja, a relação dos alunos que foram avaliados.  Esse comando não é válido para as versões anteriores  à 1.9 do Moodle.



 SELECT DISTINCT  u.id,u.firstname,u.lastname, u.email,c.id,c.fullname FROM mdl_grade_grades g INNER JOIN mdl_grade_items i ON g.itemid = i.id INNER  JOIN mdl_user u ON u.id=g.userid  INNER JOIN mdl_course c ON c.id=i.courseid

Esse comando é o mesmo que o anterior. A única diferença é que ele extrai o nome do usuário e nome do curso que o usuário acessou. Também não é válido para as versões anteriores  à 1.9 do Moodle.


Vantagem
  •  Diferente da tabela de log, que registra todos os usuários que acessaram o curso, a tabela de nota registra apenas os alunos avaliados em alguma atividade. Os registros dessa tabela são mais fidedignos, uma vez que garantem que os usuários cadastrados são alunos do curso ou têm perfil equivalente.

Desvantagem
  • Os alunos que ainda não foram avaliados não terão registro na tabela de nota. Isso significa que só é possível recuperar os alunos que tiveram alguma nota registrada.
   
Uma vez rastreado o registro de usuário na tabela de nota, é necessário consultar a tabela de matrícula para verificar se a inscrição foi apagada. Se foi, basta inscrevê-lo novamente.
   
Rotina de Recuperação
Perante a vantagem e desvantagem de cada alternativa, você pode avaliar qual melhor lhe atende em função da configuração do seu curso. De qualquer forma, a recuperação eficiente requer uma rotina de programação que faz cruzamento de informações rastreadas tanto na tabela de log quanto na tabela de nota.

De modo geral, a rotina de programação deve seguir a seguinte lógica:

1- Fazer um rastreamento da relação dos usuários que tiveram algum vínculo com os cursos na tabela de log e de nota;

2- Excluir da relação dos usuários rastreados os que tiverem perfil de administrador em nível do contexto do sistema ou algo equivalente;

3- Verificar se existe registro de inscrição na tabela de matrícula para cada usuário rastreado em nível do contexto do curso, categoria de curso e sistema. Essa operação pode ser executada com o seguintes comandos:
SELECT COUNT(id) FROM mdl_role_assignments WHERE userid=?
Esse comando verifica se o usuário está inscrito em algum curso em qualquer nível.
SELECT COUNT(rs.id) FROM mdl_role_assignments rs INNER JOIN  mdl_context e ON rs.contextid=e.id WHERE e.contextlevel=? AND e.instanceid=? AND rs.userid=?
Esse comando verifica se o usuário está inscrito em algum nível. Segue a tabela de domínio do contexto do Moodle:
10 – Sistema  40 – Categoria de Curso  50- CursoPasse  o valor do contexto no parâmetro  e.contextlevel.
Para ambos os comandos é necessário passar id do usuário no parâmetro userid.

4- Caso não exista nenhum registro de inscrição, significa que a inscrição foi removida pelo cron. Nesse caso, será necessário recuperar o perfil da inscrição por meio de ações na tabela de log. Se o registro for rastreado na tabela de nota, o perfil será de aluno ou algo equivalente.

5- Efetuar inscrição no curso para os usuários cujas inscrições forem canceladas pelo cron. Para isso, consulte o seguinte post: http://moodlesql.blogspot.com/2010/07/matricular-usuario-no-curso-do-moodle.html
Considerações Finais

A recuperação das inscrições canceladas é um trabalho muito minucioso. Cada caso requer um estudo específico. A melhor solução é alterar a configuração padrão do Moodle para não cancelar as inscrições. 

Uma alternativa para mapear os alunos excluídos é usar o GMoodle, um sistema de gestão do Moodle.  Esse sistema faz gerenciamento do status da inscrição. Extrai relatórios não só dos alunos evadidos como também os dos cancelados pelo cron.
   

5 comentários:

  1. Boa tarde Lino, se o aluno for excluído de uma disciplina onde ele já tinha notas lançadas pelas atividades que ele fez, e depois quisermos voltar esse aluno ao curso essas notas vinculadas a ele são recuperadas automaticamente no relatório de notas da disciplina?

    ResponderExcluir
    Respostas
    1. Se um aluno for reescrito no curso após o cancelamento, os dados de nota e atividades no curso aparecerão normalmente como que se ele não tivesse sido cancelado. A reinscrição no curso não configura uma nova matricula, mas sim, a continuidade da matrícula anterior. Para entender a razão disso, dê uma lida no post: http://moodlephp.blogspot.com.br/2012/07/arquitetura-do-sistema-moodle.html

      Excluir
  2. pessoal no moodle 2.6 as notas não voltam para o relatório de notas. Sendo necessário executar a rotina de reavaliação de notas. E o pior dos casos são os fórum que não possui o recurso de reavaliar.

    ResponderExcluir
    Respostas
    1. Capataz,
      Especifique em qual situação as notas não são exibidas no relatório de nota, o que torna necessário a reavaliação. Dê pistas mais detalhadas. Isso pode orientar melhor na avaliação dessa situação.

      Excluir
  3. Boa tarde Lino,

    O que levaria a conta de um usuário ser deletada?

    Caso tenha sido um administrador como verificar quem quando fez isso?

    ResponderExcluir