sábado, 11 de dezembro de 2010

Listar Alunos que Ainda não Acessaram o Curso no Moodle num Determinado Período com Comando SQL

    O Moodle oferece poucas opções de relatórios gerencias. Por exemplo, caso você queira saber quais são os alunos que não acessaram o ambiente do curso nos último 10 dias, você vai ter que dar vários cliques. Terá que emitir um relatório de acesso para cada alunos individualmente e checar se acessou ou não nos últimos 10 dias.  Caso seu curso tiver 50 alunos imagine a quantidade de cliques para emitir um simples relatório! Se você é tutor do curso, com muita razão reclama do excesso de clique para extrair um simples relatório. Aí sobra o pipino para o programador. Mais uma vez a equipe pedagógica fica no cangote do programador cobrando uma solução.

    Se você é um programador do Moodle  e estiver nessa fria, não esquente. Venha aqui para o Moodle SQL que temos a solução. Você só precisa fazer junção das tabelas da matricula com a do log por exclusão. Explicando em miúdos, extrai uma lista de alunos matriculados  e exclua dessa lista todos os usuários  que constam na lista de log. Os usuários que não constam na lista do log, são as que não acessaram o curso. 

Bem, vamos ver como isso fica no código SQL:

SELECT u.id, u.firstname,u.lastname,u.email 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=? AND time >=? AND time <=?)

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

Passe  o parâmetro da primeira e  segunda data em time >=? AND time <=?


Não esqueça que a data no banco de dados do Moodle é convertido em quantidade de segundos. Pois, os parâmetros da data  devem ser convertidos em número de quantidade de segundos.

Analisando o código SQL,  parte marcada em amarelo indica  a relação dos alunos que estão matriculados no curso. A parte em cinza indica o filtro dos usuários que acessaram o curso em um determinado período. A parte em vermelha exclui  da lista dos alunos matriculados os que já acessaram, sobrando assim, os que ainda não acessaram no período definido.

 Viu como é moleza. Agora é só rodar o código em uma linguagem de programação da sua preferência. Esse código só não funciona nas versões do Moodle inferior a 1.7. Agora boa programação. Faça um relatório bonito, assim ficará bem na fita com a equipe pedagógica. Caso ainda queira fazer uma média, monte uma rotina que envie e-mail a lista alunos dos alunos filtrado na consulta SQL. 


Codificação PHP

Agora vai de brinde a implementação do código PHP desse post. Acese o link:
http://moodlephp.blogspot.com/2010/12/listar-alunos-que-ainda-nao-acessaram-o.html


segunda-feira, 29 de novembro de 2010

Desmistificando Período de Inscrição do Curso no Moodle com Comando SQL

    Caso você esteja programando para Moodle e estiver roendo a unha tentando entender como funciona o período de validade de inscrição no curso do  Moodle, dê uma relaxada e leia esse post. Aqui será explicado as regras de funcionamento a nível da camada de aplicação e o armazenamento no banco de dados. 
   
    Regras de Funcionamento
    Período da validade de inscrição define o tempo da validade da matrícula do aluno ou tutor. É definido em quantidade de dias. A data da validade da inscrição, ou seja, data em que expira a matrícula é computada de seguinte forma: data da inscrição (data do dia que a inscrição foi feita) + quantidades de dias da validade. Por exemplo, caso o período da validade for definida em 20 dias e um aluno for inscrito no dia 1 de dezembro, a data final da validade da inscrição será dia 21 de dezembro. 
   
No Moodle 2.0 a data de inscrição pode ser personalizada. Até versão 1.9 essa data era definida automaticamente, ou seja, a data do dia em que a inscrição foi feita no curso.

    Quando o período da inscrição expirar o aluno não perde o acesso ao curso automaticamente. A inscrição continua ativa.  O cancelamento ocorre quando o cron for executado. Pois, uma das ações do cron é apagar todos as inscrições em que a data da validade já tenha expirada. Isso aconteceu em alguns teste que fiz. Certamente há alguma configuração que ativa isso. Se você ouvir alguém reclamando que os alunos inscritos sumiram do curso de uma hora para outro ou perderam acesso não tenha dúvida, a culpa é do cron que sai apagando tudo que está fora do prazo.

    A boa notícia é que ao excluir a inscrição do aluno, os dados de log de acesso, nota e participação nas atividades não serão apagados em efeito cascata. Continuam na base de dados. Se o aluno for reescrito, tudo volta ao normal como que se nada tivesse acontecido.
   
    Quando o período da validade de inscrição não for definido  significa que é ilimitado. Isto é, a inscrição nunca será apagada pelo cron.

Armazenamento de Dados nas Tabelas

    Agora que você já entendeu como funciona o período da validade de inscrição, vamos ver como  é estruturada no banco de dados. 
   
As informações são registradas em duas tabelas:
  • mdl_course – Tabela do curso
  • mdl_role_assignments – Tabela da matrícula, ou seja, inscrição nos cursos

Na tabela  mdl_course são registradas as configurações gerais do curso. A coluna enrolperiod dessa tabela registra o período da validade em quantidade de dias. Se o período for ilimitado, o valor dessa coluna será zero. Se a validade  for de um dia será registrado o seguinte valor: 86400 e se for de 20 dias o valar será 1728000.  Nesse momento você deve estar achando tudo muito estranho e até  questionando  por que esse número esquisito.

Bem vamos lá, é muito simples. Todo o campo da tabela do banco de dados do Moodle registra a data em quantidade de segundos.   Pois, o campo enrolperiod armazena dias em quantidade de segundo. Para decifrar a quantidade de dias basta dividir o valor da coluna por 60 segundos e por 60 minutos e,  por último, por 24 horas. Então 86400/60/60/24=1 ou 1728000/60/60/24=20.

A tabela mdl_role_assignments armazena os dados das inscrições. O período de validade da inscrição de cada usuário fica nas seguintes colunas:
•    timestart – data inicial da inscrição
•    timeend – data final da inscrição

A data inicial é a data em que a inscrição foi feita. A data final é a data da inscrição atualizada com os dias da validade da inscrição. Essa data é calculada a partir da data inicial adicionada os dias da validade de inscrição definida no formulário de inscrição que é acessado a  partir do link designar funções no ambiente do curso. Nesse formulário há um campo período de validade de inscrição para selecionar os dias. Esse campo traz como opção padrão o período da validade da inscrição definida em nível do curso.

Relatórios com SQL
Se até aqui ficou bem claro, vamos agora extrair os relatórios sobre o período da validade de inscrição com comando SQL.

Período de validade de inscrição por curso
SELECT id,fullname,startdate,enrolperiod FROM mdl_course

Essa consulta retorna uma lista de curso com as seguintes informações:
  • id – id  do curso
  • fullname- Nome do curso
  • startdate – Data de início do curso
  • enrolperiod – Período de validade do curso em quantidade de dias (convertido em segundos)

Período de validade de inscrição por participante de um determinado curso

SELECT u.firstname,u.lastname,rs.timestart,rs.timeend 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 e.instanceid=?

Passe id do  curso no  parâmetro e.instanceid=?

Essa consulta retorna uma lista de curso com as seguintes informações:
  • u.firstname – Nome do participante
  • u.lastname – Sobrenome do participante
  •  rs.timestart – Data inicial da inscrição
  • rs.timeend – Data final da inscrição (data em que a inscrição expira)

Período de validade de inscrição de um determinado  participante


SELECT c.id,c.fullname, rs.timestart,rs.timeend FROM mdl_course c INNER JOIN mdl_context e ON c.id=e.instanceid INNER JOIN  mdl_role_assignments rs ON e.id=rs.contextid WHERE e.contextlevel=50 AND rs.userid=?
Passe id do  usuário  no  parâmetro  rs.userid=?

Essa consulta retorna uma lista de curso que um determinado aluno ou tutor está matriculado acompanhado da data inicial e final da validade de inscrição.
A consulta retorna:

  • c.id - id  do curso
  • c.fullname - Nome do curso
  • rs.timestart - Data inicial da inscrição
  • rs.timeend - Data final da inscrição (data em que a inscrição expira)

Bem, finalmente desvendamos mais um segredo do Moodle. Agora só falta você fazer um relatório customizado bonito e entregar à equipe pedagógica ou ao seu chefe que via regra não entende nada da parte técnica para variar. Este quando faz uma demanda quer que a resposta seja para ontem  e ficam no seu cangote achando que tudo é muito simples como que se fosse uma padaria.

Veja Também:

Relatório da Configuração do Período da Validade da Inscrição no Curso do Moodle com Programação PHP

Relatório do Período da Validade da Inscrição dos Participantes no Curso do Moodle com Programação PHP

Data de inscrição do aluno no curso do Moodle

quarta-feira, 17 de novembro de 2010

Relatório de Acesso no Moodle por Cidades e País com Comando SQL

Esse poste tem por objetivo criar um relatório que mapeie o acesso ao Moodle por cidade ou país. Faz um rastreamento de acesso por endereço dos usuários. Pois, identifica de qual cidade ou país os usuários acessam o Moodle com maior frequência.

Esse relatório será montado em forma de comando SQL. As informações serão extraídas das seguintes tabelas:
  • mdl_user - Tabela de usuário. Dessa tabela será extraída o endereço  (cidade e  país);
  • mdl_log – Tabela de log. Dessa tabela será extraída a quantidade de acesso por endereço do usuário (cidade e  país);
Comando SQL que extrai relatório por cidade:
SELECT u.city, COUNT(DISTINCT u.id) AS quant_user, COUNT(l.id) AS quant_acesso,COUNT(l.id)/COUNT(DISTINCT u.id) AS media_acesso  FROM mdl_user u INNER JOIN mdl_log l ON u.id=l.userid GROUP BY u.city  ORDER BY COUNT(l.id)/COUNT(DISTINCT u.id) DESC
   
A consulta retorna quatro colunas:
u.city – Nome da cidade dos usuários cadastrado na tabela mdl_user
quant_user – Quantidade de usuários que moram na cidade
quant_acesso – Quantidade de acesso ao Moodle feito por todos os moradores da cidade
media_acesso  - Média de acesso por cidade. É computado pela quantidade de acesso divididos por número de moradores. É o acesso proporcional por morador, ou seja, por usuário. 

O resultado é organizado por média de acesso. Ou seja cidade que ficar no topo da lista é a cidade cujo usuários são mais ativos, ou seja, acessam o Moodle com maior frequência.
   
Para extrair o mesmo relatório por país, basta substituir a  coluna u.city para  u.country. O restante do comando fica o mesmo.

Comando SQL que extrai relatório por país:
SELECT u.country, COUNT(DISTINCT u.id) AS quant_user, COUNT(l.id) AS quant_acesso,COUNT(l.id)/COUNT(DISTINCT u.id) AS media_acesso  FROM mdl_user u INNER JOIN mdl_log l ON u.id=l.userid GROUP BY u.country ORDER BY COUNT(l.id)/COUNT(DISTINCT u.id) DESC
   
Nesse momento pode ainda não estar satisfeito e questionar:
-Por que não mapear a cidade e o país por IP de acesso?
    Essa pergunta é pertinente. Mais a ideia desse relatório é mapear quais cidades cujos usuários são mais ativos  no que tange ao acesso e não de qual local o acesso é feito. Por outro lado, rastrear local de acesso pelo IP não garante a confiabilidade dos dados uma vez que o IP pode ser forjado através de proxy anônimo. Bem esse papo é assunto para um outro poste.

    Execute o comando SQL diretamente na base de dados ou numa linguagem de programação e conheca o perfil de acesso do seu aluno por região, ou seja, cidade ou país. Se você fizer isso, certamente a equipe pedagógica vai gostar muito.


domingo, 14 de novembro de 2010

Matricular Usuário no Grupo/Turma do Moodle com Comando SQL

    Para cadastrar um usuário (aluno,tutor etc) em um grupo  grupo, ou seja, turma de um curso no Moodle sem ser pela interface gráfica é necessário executar o comando SQL diretamente na base de dados ou em uma linguagem de programação.
   
    Para matricular um aluno em um grupo de usuário, primeiro é necessário matriculá-lo no curso.  Em seguida, adicioná-lo a um grupo.  Neste post não abordamos como efetuar matrícula  no curso. Caso queira explorar isso, clique aqui e acesse o post que aborda esse assunto.

Antes de avançar é bom entender como o grupo de usuário é organizado no banco de dados do Moodle.
    Os registros do grupo  ficam em duas tabelas:
mdl_groups  - Tabela que armazena nome do grupo e curso que está vinculado
mdl_groups_members  - Tabela que armazena os membros de cada grupo

    O comando SQL que insere usuário no grupo é:
INSERT INTO mdl_groups_members (groupid,userid,timeadded) VALUES (?,?,?)

Passe os parâmetros:
     groupid – Id do grupo. Chave primária da tabela mdl_groups.
     userid- Id do usuário.  Chave primária da tabela mdl_user.
     timeadded – Data do cadastro. Data em formato numérico: timestamp em segundos. 


Para processar cadastro em lote é melhor executar o código dentro de uma linguagem de programação.

sexta-feira, 12 de novembro de 2010

Listar Usuários Online do Moodle com Comando SQL

Para listar os usuários online do Moodle extraindo os dados diretamente do banco de dados, será necessário escrever comando SQL que faz consulta nas seguintes tabelas:


  •  mdl_user – Tabela de usuário
  • mdl_log - Tabela de log

Segue o comando SQL:

SELECT DISTINCT u.id, u.firstname, u.lastname FROM mdl_user u INNER JOIN mdl_log l ON u.id = l.userid WHERE time >=?


Passe o parâmetro de data em time >= ? .


O parâmetro da datadelimita o período para listar os alunos que estão online. Se for os últimos 5 minutos, subtrair 5 minutos da data atual.


Não esqueça converter a data para formato numérico de (número longo). Todos os campos das tabelas da base de dados do Moodle usam campo Long (número longo) para gravar a dada. Por isso é necessário converter a data em segundos.


Como a data no banco do Moodle não é legível ao olho nú, é melhor rodar esse código numa linguagem de programação.


Veja Também:
Listar Usuários Online do Moodle com Programação PHP

quinta-feira, 11 de novembro de 2010

Mudar Curso de Categoria com Comando SQL

Caso você precise mudar a categoria de um curso sem ser via interface gráfica do Moodle, certamente vai ter que escrever um comando SQL para executar diretamente no banco de dados do Moodle ou dentro de uma linguagem de programação.

Mudar a categoria de curso do Moodle em nível de banco de dados é mudar  o valor do  campo category da tabela mdl_course. Esse campo é uma chave estrangeira da tabela mdl_course_categories.

Comando SQL para mudar curso de categoria:

UPDATE mdl_course SET category=? WHERE id=?

Passe o parâmetro id da nova categoria em category=? e id do curso em id=?

Você pode mudar um conjunto de curso de categoria com base em uma determinada condição. Por exemplo, todos os cursos que não tiverem nenhum aluno inscrito (matriculado) devem ser transferidos para uma determinada categoria. Nesse caso, deve ser feita uma subconsulta como segue abaixo.

Comando SQL para mudar curso de categoria se não tiver aluno matriculado:

UPDATE mdl_course SET category=? WHERE id NOT IN (SELECT DISTINCT c.instanceid FROM mdl_context c INNER JOIN mdl_role_assignments rs ON rs.contextid= c.id WHERE c.contextlevel=50 AND rs.roleid=5)

Passe o parâmetro id da nova categoria em category=?

Nessa consulta, diferente da anterior, os parâmetros id dos cursos virão da sub consulta. O comando NOT IN filtra apenas os cursos que não têm aluno matriculado.

    Agora que você já sabe o comando SQL para mover o curso de uma categoria para outra, só falta executar o comando.  Caso estiver usando uma linguagem de programação para executar SQL,boa programação.

sábado, 6 de novembro de 2010

Listar os Cursos do Moodle sem Inscrição de Aluno com Comando SQL

Caso você precise filtrar uma lista de curso cadastrados no Moodle que não tenha nenhum aluno matriculado, certamente vai precisar fazer essa consulta diretamente no banco de dados uma vez que a interface do Moodle não oferece essa opção de relatórios.


Esse relatório puxa informação de três tabelas:
  • mdl_course - Tabela de curso
  • mdl_context - Tabela com informações de contexto
  • mdl_role_assignments – Tabela da matrícula


O comando SQL que faz a consulta é:


SELECT id,fullname FROM mdl_course WHERE id NOT IN (SELECT DISTINCT e.instanceid FROM mdl_role_assignments rs INNER JOIN mdl_context e ON rs.contextid= e.id WHERE e.contextlevel=50 AND rs.roleid=5)


A consulta, lista id e nome do curso. Na cláusula WHERE há uma sub consulta que exclui todos os cursos que tiver algum aluno matriculado.


O resultado dessa consulta, lista apenas os cursos que não tiverem nenhum aluno cadastrado. Esse tipo de relatório é importante para mapear os curso criados no Moodle que ainda não receberam nenhuma matrícula de aluno.

segunda-feira, 25 de outubro de 2010

Explorar Mensagem do Moodle com Comando SQL

A Plataforma Moodle tem um sistema de envio de mensagem interna. Caso você precise explorar   esse sistema sem usar a interface do Moodle, será necessário escrever comando SQL para comunicar diretamente com a base de dados.

    Através do comando SQL você pode:
  • Consultar histórico de mensagens enviadas; 
  • Pesquisar conteúdo das mensagens;

  • Apagar mensagens que ainda não foram lidas;
  • Pesquisar usuário que mais enviaram ou receberam mensagens.

As mensagens do Moodle são organizadas em duas tabelas:
  • mdl_message – Tabela que registra as mensagens enviadas
  • mdl_message_read - Tabela que registra as mensagens lidas. Armazena o histórico das mensagens.

    Quando uma mensagem é enviada, é armazenada na tabela mdl_message. Quando o destinatário recebe, ou seja, visualiza  na tela, a mensagem é transferida para a tabela mdl_message_read. Na tabela    mdl_message  só ficam  as mensagens que ainda não foram lidas. Já a  tabela mdl_message_read  só ficam as mensagens que já foram lidas.


Agora que já entendeu como funciona as tabelas, vamos ver os comandos SQL.

1- Consultar todas as mensagens enviadas que ainda não foram lidas.
SELECT m.id,m.timecreated, r.firstname, r.lastname,d.firstname, d.lastname, m.message FROM mdl_user r INNER JOIN mdl_message m ON r.id=m.useridfrom INNER JOIN mdl_user d ON d.id=m.useridto

Essa consultar retorna os seguintes campos:
  • m.id  - Id da mensagem
  • m.timecreated – Data do envio da mensagem
  • r.firstname e r.lastname – Nome do remitente
  • d.firstname e d.lastname – Nome do destinatário
  • m.message – Texto da mensagem

2- Consultar todas as mensagens lidas – Histórico de mensagens.


SELECT m.id,m.timecreated, m.timeread,r.firstname, r.lastname,d.firstname,d.lastname, m.message,m.mailed FROM mdl_user r INNER JOIN mdl_message_read m ON r.id=m.useridfrom INNER JOIN mdl_user d ON d.id=m.useridto

Essa consultar retorna os seguintes campos:
  • m.id  - Id da mensagem
  • m.timecreated – Data do envio da mensagem
  • m.timeread – Data da leitura da mensagem
  • r.firstname e r.lastname – Nome do remitente
  • d.firstname e d.lastname – Nome do destinatário
  • m.message – Texto da mensagem
  • m.mailed – Controle de envio de mensagem por e-mail

3 - Monitorar as mensagens enviadas por um determinado usuário que ainda não foram  lidas

SELECT m.id,m.timecreated, d.firstname, d.lastname, m.message FROM mdl_message m  INNER JOIN mdl_user d ON d.id=m.useridto WHERE m.useridfrom=?

Passe o parâmetro id do usuário em  m.useridfrom=?

Essa consultar retorna os seguintes campos:
  • m.id  - Id da mensagem
  • m.timecreated – Data do envio da mensagem
  • d.firstname e d.lastname – Nome do destinatário
  • m.message – Texto da mensagem

4 - Monitorar histórico das  mensagens enviadas por um determinado usuário. Mensagens lidas pelos destinatários.

SELECT m.id,m.timecreated, m.timeread, d.firstname, d.lastname, m.message, m.mailed  FROM mdl_message_read m  INNER JOIN mdl_user d ON d.id=m.useridto WHERE m.useridfrom=?

Passe o parâmetro id do usuário em  m.useridfrom=?


Essa consultar retorna os seguintes campos:
  • m.id  - Id da mensagem
  • m.timecreated – Data do envio da mensagem
  • m.timeread – Data da leitura da mensagem
  • d.firstname e d.lastname – Nome do destinatário
  • m.message – Texto da mensagem
  • m.mailed – Controle de envio de mensagem por e-mail

5- Pesquisar o conteúdo das mensagens enviadas no histórico das mensagens pela palavra-chave


SELECT m.id,m.timecreated, m.timeread,r.firstname, r.lastname,d.firstname,d.lastname, m.message,m.mailed FROM mdl_user r INNER JOIN mdl_message_read m ON r.id=m.useridfrom INNER JOIN mdl_user d ON d.id=m.useridto WHERE m.message LIKE '%texto da pesquisa%'

Passe o texto a ser pesquisado no comando  LIKE '%texto da pesquisa%'
Essa consultar retorna os mesmos campos da pesquisa do item 2.

6- Lista de usuários que mais enviarem  as mensagens
SELECT r.firstname, r.lastname,d.firstname, COUNT(m.useridfrom)  FROM mdl_user r INNER JOIN mdl_message_read m ON r.id=m.useridfrom INNER JOIN mdl_user d ON d.id=m.useridto GROUP BY r.firstname, r.lastname,d.firstname ORDER BY COUNT(m.useridfrom) DESC

Essa consulta retorna uma lista de usuários  (remetentes) e quantidade de mensagens enviadas pela ordem decrescente.  Lista os usuários que mais enviaram as mensagens.

Essa consulta é feita no histórico de mensagens. Para efetuá-la nas mensagens recentes, ou seja,  ainda não lidas, basta substituir a tabela  mdl_message_read para  mdl_message e mantar o restante de código inalterado.


7- Lista de usuários que mais receberam mensagens

SELECT d.firstname, d.lastname,d.firstname, COUNT(m.useridto)  FROM mdl_user d INNER JOIN mdl_message_read m ON  d.id=m.useridto GROUP BY d.firstname, d.lastname,d.firstname ORDER BY COUNT(m.useridto) DESC

Essa consulta retorna uma lista de usuários  (destinatários) e quantidade de mensagem recebidas pela ordem decrescente.  Lista os usuários que mais receberam as mensagens.

Essa consulta é feita no histórico de mensagens. Para efetuá-la nas mensagens recentes, ou seja,  ainda não lida, basta substituir a tabela  mdl_message_read para  mdl_message e mantar o restante de código inalterado.

8 – Apagar as mensagens enviada que ainda não foram lidas

DELETE  FROM mdl_message

9 – Apagar  o histórico das mensagens. Mensagens lidas

DELETE  FROM mdl_message_read

    Essas dicas ajudam você a desvendar como é organizado as mensagens no Moodle na camada de base de dados. Isso é tudo que você precisa para mapear erros ou falha do Moodle e também para para planejar integração com outros sistemas.

sexta-feira, 22 de outubro de 2010

Consultar os Tópicos do Fórum mais Acessados no Moodle com Comando SQL

Se você trabalha na pate de TI já deve ter recebido alguma solicitação do tutor ou coordenador do curso para montar um gráfico ou tabela com os típicos mais acessados do fórum.

    Ao receber essa demanda, você fuça um pouco o Moodle e percebe que não existe essa opção de relatório. Mesmo assim a equipe pedagógica fica no seu cangote esperando uma solução.

    Neste caso, você não tem outra alternativa que não seja extrair esses dados diretamente da base de dados do Moodle com comando SQL. Para aliviar a sua barra,  facilitando algumas dias ou semanas  de pesquisa vai aí  o macete.
Para consultar os tópicos mais acessados é necessário fazer a junção das seguintes tabelas:

  • mdl_forum – Tabela de fórum
  • mdl_forum_discussions – Tabela de tópicos
  • mdl_modules – Tabela de atividades do curso
  • mdl_log – Tabela de log
SQL para MySql

SELECT d.id,d.name,COUNT(l.info) FROM  mdl_forum_discussions d INNER JOIN mdl_forum f on f.id=d.forum  INNER JOIN mdl_course_modules cm ON f.id=cm.instance INNER JOIN mdl_modules m  ON cm.module=m.id INNER JOIN mdl_log l ON l.cmid=cm.id WHERE f.id=? AND m.name='forum' AND l.module='forum' AND l.action LIKE '%discussion%' AND l.info=d.id GROUP BY d.id,d.name ORDER BY COUNT(l.cmid) DESC

SQL para PostgreSQL


SELECT d.id,d.name,COUNT(l.info) FROM  mdl_forum_discussions d INNER JOIN mdl_forum f on f.id=d.forum  INNER JOIN mdl_course_modules cm ON f.id=cm.instance INNER JOIN mdl_modules m  ON cm.module=m.id INNER JOIN mdl_log l ON l.cmid=cm.id WHERE f.id=? AND m.name='forum' AND l.module='forum' AND l.action LIKE '%discussion%' AND l.info=CAST(d.id as varchar) GROUP BY d.id,d.name ORDER BY COUNT(l.cmid) DESC

O que diferencie os dois comandos SQL é que na  consulta para PostgreSQL há conversão d.id para texto com comando CAST: l.info=CAST(d.id as varchar).  Isso  porque o PostgreSQL não compara campo numérico com texto. Já MySQL é mais tolerante. Tirando isso, o restante do comando é igual.

Essa consulta extrai uma lista com os seguintes campos:

  • d.id – Id do tópico
  • d.name – Nome do tópico
  • COUNT(l.info) – Quantidade de acesso (click) no tópico

Você precisa especificar o id do fórum passando parâmetro em  f.id=? logo após o comando WHERE.
Caso não souber o id do fórum, localize na base de dados pelo nome do fórum com o seguinte comando SQL:

SELECT id FROM mdl_forum WHERE name='Nome do Fórum'

Bem, agora que você tem o comando SQL, só falta implementar isso numa linguagem de programação ou então executar a consulta no banco  e copiar o dados para excel para montar um gráfico bonito. Assim você dá solução à demanda de forma rápida e ninguém fica no seu cangote.

domingo, 17 de outubro de 2010

Apagar Nota, Atividades e Log do Aluno no Curso do Moodle com Comando SQL

Ao cancelar a inscrição de um aluno no curso no ambiente Moodle, os registros de na base de dados (atividades realizadas, nota e log) vinculado à matricula   não serão excluídos automaticamente, ou seja, em efeito cascata.  Uma das alternativas para remover os registros órfãos é executar o comando SQL diretamente na base de dados.
  
Para excluir os dados órfãos de uma matricula  no curso  é necessário dois parâmetros:

  • id do curso – Chave de identificação do curso na tabela mdl_course
  • id do usuário - Chave de identificação do curso na tabela mdl_user
Há uma postagem no blogue que explique isso. Clique aqui para ler.


Tendo os parâmetros da chave do curso e do usuário, só resta   apagar os registro com comando DELETE passando os parâmetros da chave do usuário e curso.
Passe o parâmetro da chave do curso em course=?   ou courseid =? e do usuário em userid=?


Apagar Log

DELETE FROM mdl_log WHERE course=? AND userid=?
   
Apagar Notas
DELETE FROM mdl_grade_grades WHERE  userid=? and itemid IN  (SELECT id FROM mdl_grade_items WHERE courseid=?)

    A sub consulta apaga apenas as notas de um determinado curso.
A tabela mdl_grade_grades é o repositório final de notas.


Apagar Atividades

Apagar nota do fórum
DELETE FROM mdl_forum_ratings WHERE post IN (SELECT p.id FROM mdl_forum_posts p INNER JOIN mdl_forum_discussions d ON p.discussion=p.id  WHERE p.userid=? AND d.course=?)

Apagar os comentários

DELETE FROM mdl_forum_posts WHERE userid=?  AND  discussion IN (SELECT id FROM mdl_forum_discussions WHERE course=?)

Não é recomendável apagar os comentários já que os comentários aninhados ficarão órfãos, ou seja, as respostas das respostas.

Apagar tópicos
DELETE  FROM mdl_forum_discussions WHERE userid=? AND course=?

Não é recomendável apagar os tópicos já que os comentários aninhados ficarão órfãos.

Apagar Tarefas

DELETE FROM mdl_assignment_submissions WHERE userid =? AND assignment IN (SELECT id FROM mdl_assignment WHERE course =?)

Ao remover as tarefas, as notas serão removidas automaticamente.


Apagar questionário

Apagar nota final
DELETE FROM mdl_quiz_grades WHERE userid =?  AND quiz IN (SELECT id FROM mdl_quiz WHERE course =?)

Apagar Tentativas de Respostas
DELETE FROM mdl_question_states WHERE  attempt IN (SELECT t.id FROM mdl_quiz_attempts t INNER JOIN  mdl_quiz q  ON t.quiz=q.id WHERE t.userid= ? AND course =?)

Apagar cada tentativa (inclusive a nota final)
DELETE FROM mdl_quiz_attempts WHERE userid =?  AND quiz IN (SELECT id FROM mdl_quiz WHERE course =?)

Para fazer limpeza total, os dados do aluno devem ser removida de todas de todas as atividades instanciadas no curso. Os comandos SQL acima demostrados se restringiram em remover as atividades do fórum, tarefa e questionário.  Para as demais atividades, siga a mesma lógica. Identifica as tabelas e apague os dados.
Feito isso, todo o histórico do aluno será removida da base de dados. Ao ser reinscrito no curso,  não terá nenhuma nota e nem log de acesso.

Extrair id do Usuário e do Curso no Moodle com Comando SQL


Id é  o parâmetro de identificação do registro na base de dados.


Id do Usuário

Comandos SQL que  recuperam  o id do usuário

Por -Email:
SELECT id FROM mdl_user WHERE email='e-mail'
 
Por login:
SELECT id FROM mdl_user WHERE username='login'

Por login e senha:
SELECT id FROM mdl_user WHERE username='login' AND password=MD5('senha')

Parâmetro GET do URL do Moodle com Id do usuário

URL do perfil do usuário:
http://[enderco do domininio]/user/view.php?id=21&course=3
O parâmetro id=21  é  a chave de identificação do usuário


Id do Curso
Comandos SQL que  recuperam o id do curso


Por nome
SELECT id FROM mdl_course WHERE fullname='Nome do Curso'

Pela Abreviatura
SELECT id FROM mdl_course WHERE shortname='Abreviatura'

Parâmetro GET do URL do Moodle com id do curso

URL do curso
http://[endereco dominico ]/course/view.php?id=3
O parâmetro id=3 é  a chave de identificação do curso.

domingo, 19 de setembro de 2010

Criar Curso no Moodle com Comando SQL


    Se você estiver fazendo migração de dados ou integração de um sistema acadêmico com a  Plataforma  Moodle, certamente vai precisar criar curso no Moodle diretamente no banco de  dados sem usar a interface do Moodle.

      Isso implica conhecer a estrutura das tabelas da base de dados do Moodle e fazer INSERT nas tabelas certas. Bem, isso me custou muitas horas de pesquisa. No final descobri que é necessário fazer apenas 4 INSERT básicos. Bem, vamos lá. São  três passos. 

Os comandos SQL foram testados na versão 1.9.3 do Moodle. Devem funcionar para qualquer versão 1.9.x e não para versão inferior a 1.9.
1º Passo – Criar o Curso
    Essa parte é mais moleza. Basta fazer um INSERT na tabela mdl_course com o seguinte comando SQL:

INSERT INTO mdl_course (category,fullname,shortname) VALUES (1,'Curso1','C1')   

Embora a tabela  mdl_course tenha muitas colunas, nesse exemplo foram usadas os mais importantes:
  • category -  Chave estrangeira da tabela de categoria de curso - mdl_course_categories 
  • fullname – Nome complete do curso 
  • shortname – Abreviatura do curso
No comando INSERT, foi criado um curso denominado Curso1 na categoria de curso padrão do Moodle, cujo id é 1. 
Após executar o INSERT, recupera o id do curso gerado automaticamente pelo banco de dados. No MySQL use o comando LAST_INSERT_ID().

2º Passo – Criar Contexto do Curso
    Com o curso criado, agora é necessário criar contexto do curso na tabela mdl_context com o seguinte comando SQL:

INSERT INTO mdl_context (contextlevel,instanceid) VALUES (50,?)
O campo contextlevel define o nível do contexto. Para curso 50 é o valor padrão da tabela de domínio. O campo instanceid é a instância do curso. Preencha esse campo com o valor do Id do curso gerado automaticamente no 1º passo.

    Ao executar o comando SQL, recupere o id do contexto gerado automaticamente. Use esse id para atualizar duas colunas:  path e depth. Para isso, execute o seguinte comando SQL:

UPDATE  mdl_context SET path='/1/3/$ID_CONTEXT', depth=3 WHERE id=$ID_CONTEXT

    Você precisa substituir a variável $ID_CONTEXT pelo id gerado automaticamente do INSERT anterior, ao executar o comando  para criar o contexto do curso. Se o id for 10,  o comando SQL de atualização será:

UPDATE  mdl_context SET path='/1/3/10', depth=3 WHERE id=10
Nesse momento você deve estar perguntando por que o campo path recebe  '/1/3/$ID_CONTEXT' como valor padrão  e o  campo  depth o número 3. Ainda não encontrei a resposta. Assim como você, eu também estou perguntando. Só sei que demorei três semanas mudando de variável até que funcionou. Se não preencher esses campos,  nenhum usuário consegue entrar no curso.  Se você encontrar alguma explicação  não esqueça de me avisar.

3º Passo – Criar tópico/seção padrão do curso 

Ao criar o curso no 1º passo, não foi definido o formato. Por padrão, será criado curso em formato de tópico.  Assim, é necessário cria um primeiro tópico, o tópico número zero,  do curso. Para isso, execute o seguinte comando SQL:

 INSERT INTO mdl_course_sections (course,section) VALUES (?,0)
Na coluna course o valor do parâmetro é o id do curso gerado automaticamente no 1º passo. A segunda coluna, a section define a ordem do tópico. Por se tratar do primeiro tópico, deixe zero como está.
    Há outras colunas na tabela mdl_course_sections. No entanto, para efeito de simplificação, se restringiu aos mais importantes.
    Ao finalizar o 3º passo, o curso já está criado no Moodle. Há muitas configurações do curso que não foram abordado nesse poste. Você pode fazer isso preenchendo todos as outras colunas das tabelas mdl_course mdl_course_sections  e entre outros. Agora que o curso já está criado, acesse o ambiente Moodle com a senha do admin,  ative a edição e adicione o bloco de administração. Daí, faça o restante das configurações.

    Os comandos SQL foram testados apenas na versão 1.9.3. Deve funcionar em qualquer versão 1.9.x  já a estrutura das tabelas são as mesmas.  Não deve funcionar para as versões anteriores a 1.9.  Mas lógica é muito parecida. Não custa testar e fazer os ajustes necessários.  Agora boa programação, ou melhor, boa sorte na jornada de integração do Moodle com o seu sistema acadêmico.


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

segunda-feira, 13 de setembro de 2010

Verificar a Senha do Usuário do Moodle com Comando SQL


    É muito comum no Moodle a senha do usuário não funcionar. Isso pode ocorrer após a importação da base de dados de usuário, cadastro de novo usuário, recuperação de curso  etc. O fato é que, de repente,  as senhas deixam de funcionar. Ao logar, mesmo usando o login e a senha corretos não funciona.  

    Quando isso acontece, as causas podem ser diversas. Para eliminar a hipótese que você esteja passando o login e a senha erradas ou que a tabela do banco que armazena a senha não foi corrompida,  é necessário fazer uma consulta SQL diretamente na base de dados. Nessa consulta, verifique se a combinação de login e senha existem. Para isso, execute o seguinte comando SQL:

SELECT COUNT(id) FROM   mdl_user WHERE username='joao' AND password=MD5('silva')
Se o resultado da consulta retornar 0 (zero)  significa que não existe nenhum usuário cadastrado com login João e senha silva. Caso retorna 1 (um) significa que o cadastro.

    Se a combinação do login e da senha funcionarem no comando SQL deve funcionar também ao logar no Moodle.  Se não funcionar no Moodle, é sinal que problema é outro e não da senha. Neste caso, você eliminou uma hipótese. Então, passe para próxima hipótese da lista e boa sorte.

Veja Também:
Recuperar Senha do Administrador do Moodle com Comando SQL

quinta-feira, 9 de setembro de 2010

Padronização das tabelas do Banco de Dados do Moodle


    A Plataforma Moodle é um sistema modular, ou seja, é um ambiente de gerenciamento de vários módulos voltado para gerenciamento de cursos.  A estrutura da base de dados reflete muito bem isso.

Padrão de Nome das  Tabelas

    As tabelas no banco de dados são compostas pelo prefixo e nome do módulo. mdl_ é o prefixo padrão. Isso pode ser alterado no momento de instalação.  Por exemplo, a tabela do módulo fórum é mdl_forum. Sendo mdl_ é o prefixo e forum é o nome do módulo. Todos os módulos seguem esse padrão.

Módulos que não são do Núcleo do Sistema
Os módulos que não compões o núcleo do sistema  ficam registradas na tabela mdl_modules. Para visualizar esses módulos,  basta fazer uma consulta na  tabela mdl_modules, usando o seguinte comando SQL:

SELECT id,name FROM mdl_modules
Resultado da pesquisa:
Id    name
1      assignment
2      chat
3      choice
4      data
5      forum
6      glossary
7      hotpot
8      journal
9      label
10      lams
11      lesson
12      quiz
13      resource
14      scorm
15      survey
16      wiki
17      workshop  

    Essa consulta foi feita nas versões 1.9.3 e 1.9.7 do Moodle. Isso já é padrão da versão 1.9+ A consulta lista os módulos que vêm na distribuição padrão do Moodle. A consulta traz os campos id (chave de identificação) e name (nome do módulo).

Tabela Principal e Secundária do Módulo
    A tabela principal de cada modulo é  prefixo + nome do módulo. Em cada módulo há outras tabelas, ou seja, tabelas secundárias. Por exemplo, a tabela principal do fórum é mdl_forum (prefixo + nome do módulo). O fórum é  composta por tópicos de discussões de comentários. Pois, as tabelas secundárias são:
  • mdl_forum_discussions – Tabela dos tópicos de discussão do fórum
  • mdl_forum_posts    - Tabela de comentários do fórum
  • mdl_forum_ratings    - Tabela de nota do fórum
    Nas tabelas secundárias dá para notar que o padrão do nome é prefixo + nome do módulo + funcionalidade do módulo.
    Embora tomamos como exemplo a tabela do fórum, esse padrão se aplica a todos os módulos.

Colunas Padrão nas Principais  Tabelas que não são do Núcleo do Sistema
    Até agora deu para entender a estrutura das tabelas dos módulos. Em cada tabela do módulo que não seja do núcleo do sistema, por padrão, deve as seguintes colunas:
  • id – Chave de identificação de cada registro da instância do módulo.
  • name – Nome  do registro da instância do módulo.
  • course – Id do curso  em que o módulo está vinculado. É a chave estrangeira da tabela mdl_course. Isso significa que cada registro da instancia de um módulo deve estar obrigatoriamente vinculado a um determinado curso.
Com esse padrão, torna possível montar uma rotina que faz leitura automática de todos os módulos. Para tornar isso mais claro, vamos ver um exemplo.
O comando SQL  abaixo faz uma consulta dos campos padrões do módulo fórum.

SELECT id, name, course FROM mdl_forum
Resultado da pesquisa:
id    name        course
1    Fórum Teste I     2
2    Fórum Teste II    2
3    Dúvidas Gerais    3
    A consulta retorna três registros de fórum. A coluna course indica que os fóruns registrados pertencem aos cursos cujo id são 2 e 3. A  mesma pesquisa pode ser aplicada a qualquer módulo, basta substituir a parte do nome da tabela após o prefixo pelo nome do outro módulo. Para pesquisar no módulo do questionário, o comando SQL seria:

SELECT id, name, course FROM mdl_quiz
    Isso não se aplica aos módulos que compões ao núcleo  do sistema tais como usuário, curso, log etc.

Tabelas dos módulos do sistema

mdl_user – Tabela principal do módulo do usuário
mdl_course  - Tabela principal do módulo do curso
mdl_log - Tabela principal do módulo de log
etc.
 
    Bem, você já deve ter sacado como é o padrão e a estrutura das tabelas do Moodle. Caso queira  explorar mais afundo isso, clique aqui, e acesse um arquivo com dump, ou seja, um backup da estrutura de todas as tabelas do Moodle 1.9.3 e com dados reais sobre curso. Estudar banco de dados não é uma tarefa muito mole, por isso lhe desejo boa sorte e muita paciência.

sexta-feira, 3 de setembro de 2010

Extrair Lista de Usuários não Cadastrados no Curso do Moodle com Comando SQL


    Para extrair uma lista de usuários que não estão cadastrados em nenhum curso do Moodle ou em um determinado curso, é necessário fazer a junção por exclusão da tabela usuário na tabela matrícula. 

mdl_user Tabela de usuário
mdl_role_assignmentsTabela de matrícula a partir da versão 1.7
    A junção por exclusão consiste em mapear todos os registros na tabela usuário que não tenham correspondência na tabela da matrícula. No comando SQL  isso é implementado por meio da sub consulta, como segue a abaixo.

Lista de usuários que não estão cadastrados em nenhum curso
SELECT  id,firstname, lastname FROM mdl_user    WHERE id NOT IN (SELECT userid FROM mdl_role_assignments )
Contar a quantidade de  usuários que não estão cadastrados em nenhum curso
SELECT  COUNT(id) FROM mdl_user    WHERE id NOT IN (SELECT userid FROM mdl_role_assignments )
Lista de usuários que não estão cadastrados em um determinado curso
SELECT  id,firstname, lastname  FROM mdl_user    WHERE id NOT IN (SELECT userid FROM mdl_role_assignments rs INNER JOIN mdl_context c ON rs.contextid=c.id WHERE c.instanceid=?)
Passe o parâmetro id do curso em c.instanceid=?

Contar a quantidade de  usuários que não estão cadastrados em um determinado curso
SELECT COUNT(id)   FROM mdl_user    WHERE id NOT IN (SELECT userid FROM mdl_role_assignments rs INNER JOIN mdl_context c ON rs.contextid=c.id WHERE c.instanceid=?)
Passe o parâmetro id do curso em c.instanceid=?

    Todos os filtros utilizam sub-select, uma consulta dentro da outra. O primeiro SELECT extrai a lista de usuário da tabela do usuário. O segundo SELECT extrai a lista de usuários da tabela matrícula. O camando NOT IN exclui da primeira lista, os usuários que tem correspondência na segunda lista. Assim, sobra apenas os que não estão cadastrados no curso.

Veja também:
Matricular Usuário no Curso do Moodle com Comando SQL
Cancelar Matricula no Moodle com Comando SQL
Data de inscrição do aluno no curso do Moodle

quinta-feira, 2 de setembro de 2010

Vincular um Curso a mais de uma Categoria de Curso no Moodle com Comando SQL



Caso você precise que um curso do Moodle seja vinculado a mais de uma categoria do curso, é necessário fazer uma customização do Moodle. O propósito dessa postagem é explicar como fazer isso  por meio do comando SQL.

    De repente você deve estar confuso com os termos curso e categoria de curso.  Bem, devo ressaltar que estou usando a linguagem técnica do Moodle. Traduzindo isso para a linguagem acadêmica, curso equivale a disciplina e categoria de curso equivale ao curso. Há  uma postagem que explica de forma mais detalhada. Veja aqui: http://moodlesql.blogspot.com/2010/08/organizacao-do-curso-no-moodle-e.html
    Na estrutura do banco de dados do Moodle, um curso deve pertencer a uma única categoria. É um relacionamento de um para muitos, como mostra a estrutura das tabelas  mdl_course_categories e mdl_course.

Estrutura da tabela mdl_course_categories
 id bigint(10) unsigned NOT NULL AUTO_INCREMENT,
 name varchar(255) NOT NULL DEFAULT '',
 description text,
 parent bigint(10) unsigned NOT NULL DEFAULT '0',
 etc…
Estrutura da tabela mdl_course

 id bigint(10) unsigned NOT NULL AUTO_INCREMENT,
 category bigint(10) unsigned NOT NULL DEFAULT '0',
 sortorder bigint(10) unsigned NOT NULL DEFAULT '0',
 fullname varchar(254) NOT NULL DEFAULT '',
 shortname varchar(100) NOT NULL DEFAULT '',
etc…
    Apenas as colunas mais importantes foram apresentadas para ficar resumido. Então vamos lá. A coluna category  da tabela mdl_course é a chave estrangeira da coluna id da tabela mdl_course_categories. Sendo assim, cada curso deve pertencer a uma única categoria de curso. Uma categoria de curso pode ter vários cursos vinculados. Por isso, o relacionamento é de um para muitos.

    Para que um curso seja vinculado a mais de uma categoria, é necessário criar uma tabela intermediaria entre as tabelas  mdl_course_categories e mdl_course. Neste caso,  temos que criar uma terceira tabela que  pode ser nomeada mdl_courses_categories. Olhe que a terceira tabela, para manter o padrão do nome do Moodle, ficou  mdl_courses_categories. A única diferença da tabela mdl_course_categories é nome do curso que ficou no plural. Cuidado para não fazer confusão. Bem, esse nome é só uma sugestão. Você pode atribuir nome que achar mais conveniente.

Estrutura da tabela mdl_courses_categories  (tabela intermediária)
id bigint(10) unsigned NOT NULL AUTO_INCREMENT,
 course bigint(10) unsigned NOT NULL,
 category bigint(10) unsigned NOT NULL,
 
Para criar essa tabela execute o seguinte comando comando SQL:

CREATE TABLE mdl_courses_categories (
      id bigint(10) unsigned NOT NULL AUTO_INCREMENT,
      course bigint(10) unsigned NOT NULL,
      category bigint(10) unsigned NOT NULL,
     PRIMARY KEY (id)
    )
    Nessa tabela, a coluna course é a chave estrangeira da coluna id da tabela mdl_course. A coluna category é a chave estrangeira da coluna id da tabela mdl_course_categories. Neste caso, há um relacionamento de muitos para muitos. Um curso pode pertencer a  várias categorias e uma categoria pode ter vários cursos. Assim, você amplie a possibilidade do Moodle atender uma nova estrutura de organização de dados.

    Essa alteração na camada da base de dados do Moodle requer desenvolver uma aplicação a parte ou um módulo do Moodle para inserir dados e extrair relatórios. Para isso, veja o comando SQL para inserir dados e extrair relatórios na tabela intermediária.

Comando SQL  para inserir dados
INSERT INTO  mdl_courses_categories (course,category) VALUES(?,?)

Comando SQL  para listar todas as categorias e todos os cursos relacionados na tabela intermediária
SELECT t.name, c.fullname FROM mdl_course c INNER JOIN mdl_courses_categories s ON c.id=s.course INNER JOIN mdl_course_categories t ON t.id=s.category
A coluna t.name é o nome da categoria de curso. Já a  coluna c.fullname é o nome do curso.

Comando SQL  para listar todos os cursos vinculados a uma determinada categoria
SELECT c.id, c.fullname FROM mdl_course c INNER JOIN mdl_courses_categories s ON c.id=s.course WHERE s.category=?
Passe o parâmetro id da categoria do curso em s.category=?

Comando SQL  para listar todos as categorias relacionadas a um determinado curso
SELECT t.id,t.name FROM mdl_course_categories t INNER JOIN mdl_courses_categories s ON t.id=s.category WHERE s.course=?
Passe o parâmetro id do curso   em  s.course=?
Comando SQL  para contar a quantidade de categorias em que um curso está vinculado
SELECT COUNT(category) FROM mdl_courses_categories  WHERE course=?
Passe o parâmetro id do curso   em  course=?
    Os exemplos dos comandos SQL lhe auxiliam para inserir dados e montar relatórios usando qualquer linguagem de programação.

    Falando agora na linguagem acadêmica, ao implementar a tabela intermediária, torna possível que uma disciplina (curso no Moodle) seja vinculada a mais de um curso (categoria de curso no Moodle). Se isso for o caso da sua instituição de ensino, agora só falta fazer a programação. Então, boa codificação.

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.