quinta-feira, 19 de agosto de 2010

Cancelar Matrícula no Moodle com Comando SQL


Para cancelar a matrícula do aluno/tutor no curso do Moodle é necessário usar o comando DELETE na tabela mdl_role_assignments.

Há duas opções de comando. Primeiro, a mais fácil, pelo parâmetro id da matrícula. A segunda, pelos parâmetros: id do usuário e id do curso.

Cancelando matrícula pelo parâmetro  id da matrícula
Como a matricula fica na tabela mdl_role_assignments, cada registro tem um id diferente. Pois, o comando SQL abaixo cancela a matricula de um usuário vinculado em um curso. 

DELETE FROM  mdl_role_assignments WHERE id=?
Passe o parâmetro id da matrícula no  campo id
Cancelando matrícula pelos parâmetros id do  usuário e id do curso
    Uma matrícula é o vínculo da chave  id do usuário da tabela mdl_user e id do curso da tabela mdl_course.  Na tabela a matrícula mdl_role_assignments  o id do usuário fica no campo userid. O id do curso é representado pelo id do contexto do curso no campo contextid. Então é necessário primeiro recuperar o id do contexto do curso.  Esse contexto fica na tabela   mdl_context  e pode ser recuperada com o seguinte comando SQL:

SELECT id FROM mdl_context WHERE contextlevel=50 AND instanceid=?

    No filtro WHERE  o campo contextlevel deve ser sempre 50. Isso representa a instancia do contexto do curso. O valor do filtro do campo instanceid deve ser o id do curso.

    Então para cancelar uma matrícula, desconhecendo id da matrícula, você precisa passar os parâmetros id do usuário e id do contexto do  curso, como mostra o comando abaixo.

DELETE FROM  mdl_role_assignments WHERE userid=? AND contextid=?

No filtro WHERE  passe o parâmetros id do  usuário no campo userid e  id do contexto do  curso no campo contextid.

Outras opções de comando SQL
Entendendo como funciona agora você pode fazer várias outras operações com comando SQL tais como:

Cancelar todas as matriculas de um determinado curso:
DELETE FROM  mdl_role_assignments WHERE contextid=?

Cancelar todas as matriculas de um determinado usuário:
DELETE FROM  mdl_role_assignments WHERE userid=? 

 
Cancelar todas as matriculas por perfil  em  um determinado curso:
DELETE FROM  mdl_role_assignments WHERE roleid=? AND  contextid=?

O valor do campo roleid define o perfil do usuário no curso.  Veja a tabela de domínio com valores padrões dos perfis:
1 – Administrator (Administrador)
2 -Course creator (Autor do curso)
3 –Teacher (Tutor)
4 - Non-editing teacher (Tutor sem permissão para edição)
5 – Student (Aluno)
6 –Guest (Visitante)
7 - Authenticated user 

Esses valores são padrões da tabela mdl_role

Bem, agora que você já entendeu bem como apagar dados na tabela de matrícula, é necessário registrar que ao remover um registro da matrícula, os registros de log e de nota não serão apagados em cascata. Esses registros não estão vinculados a tabela de matrícula, mas sim ao usuário e ao curso.
    Caso você tenha cancelado uma matricula de um aluno e voltar atrás, ou seja, recadastrá-lo novamente todas as informações de notas e de log não serão perdidas, continuarão normalmente.

Veja também:
Matricular Usuário no Curso do Moodle com Comando SQL

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.

sábado, 7 de agosto de 2010

Listar Alunos que Ainda não Acessaram o Curso no Moodle com Comando SQL


Para listar os alunos que ainda não acessaram o curso no Moodle é necessário fazer uma consulta nas  tabelas  mdl_role_assignments e mdl_log.

A tabela mdl_role_assignments registra matricula dos alunos no curso. A tabela mdl_log registra histórico de acesso.   Temos que fazer uma consulta unindo as duas tabelas.  Vamos lá, posso por passo.

1º Passo – Listar alunos matriculados no curso.
    Primeiro vamos montar  comando SQL que extrai a lista de alunos matriculados no curso.
 
SELECT u.id, u.firstname,u.lastname FROM mdl_role_assignments rs INNER JOIN mdl_user u ON u.id=rs.userid INNER JOIN mdl_context e ON rs.contextid=e.id WHERE e.contextlevel=50 AND rs.roleid=5 AND e.instanceid=?

Nesse comando, você só precisa passar parâmetro  e.instanceid que deve ser o id do curso. Caso  queira entender um pouco mais sobre esse comando clique aqui
Executando esse comando você terá uma lista com id e  nome dos alunos vinculados ao curso.
 
2º Passo – Listar alunos matriculados no curso que já acessaram
Nesse momento vamos adicionar na consulta a tabela mdl_log.  Vamos montar comando SQL que retorna a lista de usuários matriculados acompanhado da data do último acesso ao curso.
 
SELECT u.id,u.firstname,u.lastname, MAX(l.time) FROM mdl_role_assignments rs INNER JOIN mdl_user u ON u.id=rs.userid INNER JOIN mdl_context e ON rs.contextid=e.id  INNER JOIN mdl_log l ON rs.userid=l.userid WHERE e.contextlevel=50 AND rs.roleid=5 AND e.instanceid=? AND l.course=? GROUP BY u.id,u.firstname,u.lastname

Nesse novo comando, o campo MAX(l.time) retorna o último acesso do aluno no curso. É uma consulta agregada com JOIN na tabela mdl_log. Novamente você precisa passar parâmetro, ou seja, o id do curso  para  e.instanceid e l.course.  Se o id do curso for 2, deve ficar assim e.instanceid=2 AND l.course=2.
Observação, essa consulta só retorna o os alunos que já acessaram.
 
3º Passo – Listar alunos que ainda não acessaram o curso
Bem, essa parte é o  que realmente interessa. Agora já temos duas listas de alunos montando no passo 1 e passo 2. Vamos tirar da primeira lista os alunos que estão presentes na segunda lista. O que sobrar são alunos que ainda não acessaram.   Isso porque na primeira lista consta todos os alunos. Já na segunda consta apenas os que acessaram.
 Podemos excluir a segunda lista da primeira pela programação ou também via comando SQL Pela programação manda a ver aí no PHP, JAVA, ASP e.t.c. Use o que for do seu gosto. Agora, via o SQL, use o comando abaixo:
 
SELECT u.id, u.firstname,u.lastname FROM mdl_role_assignments rs INNER JOIN mdl_user u ON u.id=rs.userid INNER JOIN mdl_context e ON rs.contextid=e.id WHERE e.contextlevel=50 AND rs.roleid=5 AND e.instanceid=? AND u.id NOT IN (?,?,?)

 Novamente você precisa passar parâmetro, ou seja, o id do curso  para  e.instanceid  e lista de id  do usuário retornado no segundo passo em u.id NOT IN (?,?,?).  Preencha NOT IN com  lista id  de usuário.
Os usuários retornos são usuários que ainda não acessaram.  Agora não deve ter ficado dúvidas sobre a junção de tabelas mdl_role_assignments e mdl_log. Então manda a ver aí na programação e bom relatório final do curso.



Até aqui tudo parece que está ok. No meio do silêncio, você volta e questiona:
- Pô moleque, não tem um jeito mais simples de fazer tudo isso sem dar tantas voltas?

Pensando exatamente nisso, vim pesquisando encontrei uma solução mais simples. Tanto que estou atualizando esse poste com novo comando SQL.

Comando SQL para extrair os alunos que não acessaram o curso em um única tacada:

SELECT u.id, u.firstname,u.lastname FROM mdl_role_assignments rs INNER JOIN mdl_user u ON u.id=rs.userid INNER JOIN mdl_context e ON rs.contextid=e.id WHERE e.contextlevel=50 AND rs.roleid=5 AND e.instanceid=? AND u.id NOT IN (SELECT DISTINCT userid FROM mdl_log WHERE course=?)

Passe o parâmetro id do curso  em e.instanceid=? da consulta principal e course=? da subconsulta.

A única diferença nessa consulta é que foi adicionada a subconsulta. Esta substitui os passos e 1 e 2. Sendo assim você pode extrair uma lista de alunos que não acessaram o curso sem a necessidade de executar o código dentro de uma linguagem de programação.

Espero agora que esteja satisfeito.


Veja Também
Listar Alunos que Ainda não Acessaram o Curso no Moodle num Determinado Período com Programação PHP

sexta-feira, 6 de agosto de 2010

Recuperar Senha do Administrador do Moodle com Comando SQL

Você esqueceu a senha do administrador do Moodle. Não faz a mínima idéia qual foi a senha que registrou no momento de instalação. Pior ainda, o e-mail cadastrado do usuário admin não está funcionando para recuperar pelo e-mail. Neste caso você bota mão na cabeça e pergunta o que vou fazer? Será que tenho que reinstalar novamente o Moodle?

Se isso for o seu problema, não esquente, mantenha na alegria. Acesse a base de dados em que instalou o Moodle e altere a senha no comando SQL.

Se o login do usuário for admin execute esse comando:
UPDATE mdl_user SET password=MD5('novasenha') WHERE username='admin'

Caso o login não for admin, tente alterar pelo id. Geralmente, usuário admin é o segundo a ser criado após o guest,  pois seu id é 2. Neste usando o comando:

UPDATE mdl_user SET password=MD5('novasenha') WHERE id=2

Esse comando SQL serve para alterar a senha de qualquer usuário. Uma vez feita a alteração, entre no Moode com a nova senha que vai funcionar.
Os comandos SQL acima foram testados nas bases MySQL PostgreSQL. 


Veja Também:  
Alterar Senha de Administrador do Moodle com Programação PHP

quinta-feira, 5 de agosto de 2010

Localizar Curso no Moodle pela Palavra Chave usando Comando SQL

Para localizar um determinado curso no Moodle usando uma palavra chave, basta fazer pesquisa SQL no banco de dados usando comando LIKE.
A consulta deve ser feita na tabela mdl_course. Por exemplo, para de filtrar todos os cursos que têm palavra chave Introdução em qualquer parte do nome, use o comando SQL abaixo:

SELECT id, fullname FROM mdl_course WHERE fullname Like '%Introdução%'

A consulta retorna id e nome do curso. Todos os cursos que tiverem termo introdução em qualquer parte do nome serão filtrados.

Organização do Curso no Moodle e Estrutura da Base de Dados. Diferença do Linguajar Acadêmico e Corporativo

A maneira como se denomina a organização de dados do curso no banco de dados do Moodle é diferente da linguagem do mundo acadêmico e do mundo corporativo.
No banco de dados do Moodle os cursos são organizados em três níveis de hierarquia:
  • Categoria de curso
  • Curso
  • Grupo
Uma categoria de curso pode ter um ou mais curso. Dentro um curso, os alunos podem ser divididos em grupo. As tabelas do Moodle que armazena esses dados são:
  • mdl_course_categories - Tabela de categoria de curso
  • mdl_course - Tabela de curso
  • mdl_groups - Tabela de grupo
  • mdl_groups_members - Tabela de membros vinculados a um determinado grupo

Na linguagem acadêmica, mais concretamente pensando em uma faculdade ou universidade, o termo curso se refere a uma área de conhecimento como Pedagogia, Direito, Medicina etc. Neste caso, um curso é composto por uma grade curricular de várias disciplinas. Por exemplo, teoria de aprendizagem é uma disciplina da grade curricular do curso de pedagogia. Uma disciplina, ao ser ofertada, pode ter várias turmas.

Pelo exposto acima, fica claro que a linguagem acadêmica diferencia da linguagem do Moodle. O que na linguagem acadêmica se denomina curso, na estrutura de dados do Moodle se denomina categoria de curso. A disciplina da grade curricular equivale ao curso no Moodle. Por último, turma equivale ao grupo no Moodle.

No linguajar corporativo, o uso do termo curso pode equivaler a uma disciplina no linguajar acadêmico. Por exemplo, curso de informática instrumental para capacitação de quadros pode ser equivalente a uma disciplina de grade curricular de um curso no mundo acadêmico. Em resumo, no ambiente de empresarial, o termo curso tem significado diferente de curso para ambiente acadêmico.

O termo curso do ambiente corporativo equivale ao termo curso do Moodle. Já o termo curso do mundo acadêmico equivale a categoria do curso do Moodle.

Independentemente da estrutura de organização da oferta de ensino seja no ambiente acadêmico ou corporativo, a estrutura de organização da base de dados do Moodle pode ser adaptada. A grande diferença está nas gírias, ou seja, no nome que se dá o aos bois em cada ambiente.

Tabela de Tradução de Termos
Moodle Ambiente Acadêmico Ambiente Corporativo
Categoria de Curso Curso
Curso Disciplina Curso
Grupo Turma Turma