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.