terça-feira, 15 de fevereiro de 2011

Integração do Moodle com Sistema Acadêmico

    A integração do Moodle com o sistema acadêmico é um dos maiores desafios dos desenvolvedores do Moodle. A integração é um trabalho de sincronização de dados entre os dois sistemas.
    A sincronização  consiste em mapear um par corresponde de cada registro nos dois sistemas. Digamos assim, que cada registro no sistema acadêmico deve ter uma cópia no sistema do Moodle ou vice-versa.
    A maioria das desmandas de integração visam integrar os seguintes dados:
  • Usuário
  • Curso;
  • Disciplina;
  • Matrícula;
  • Nota.

    No processo de sincronização que visa integração de dois sistemas é necessário definir qual sistema é mestre e qual é escrava. A mestre funciona como base oficial de dados. A escrava é o sistema de espelhamento, ou seja, apenas recebe a  cópia dos dados do sistema mestre. A entrada de dados deve ser processada no sistema mestre e depois replicada no escravo.

    O sistema acadêmico geralmente é o mestre e o Moodle é escravo  no que tange ao gerenciamento do usuário, curso, disciplina e matrícula. Já para o processamento de notas, ocorre o inverso. Isso porque a nota é gerada no Moodle e depois é exportada para o sistema acadêmico.

    O processo de integração torna-se muito complicado, se não impossível, caso não haja uma padronização. Por exemplo, se a entrada de dados sobre o usuário e a  matrícula pode ser feita tanto no Moodle quanto no sistema acadêmico, a sincronização torna mais difícil de ser automatizada. Torna quase impossível caso não houver uma padronização das chaves de identificação dos registros.

    Bem, até agora já deve ter ficado claro como deve ser a logística da integração.  Agora partindo para implementação, no que tange ao Moodle, podemos seguir dois caminhos:
  • Usar API do Moodle
  • Usar comandos SQL

O uso do API do Moodle possibilita efetuar integração em alto nível na camada da aplicação. Isso requer a programação em PHP.  Web service do Moodle é uma boa alternativa. Possibilita implementação independente da linguagem de programação.

    O uso do SQL é uma alternativa mais eficaz uma vez que possibilita fazer as coisas em baixo nível, diretamente na camada de banco de dados. Essa alternativa requer conhecer bem  a estrutura do banco de dados do Moodle. A implementação pode ser feita em qualquer linguagem de programação. Neste caso, o sistema acadêmico, sendo mestre no processo de integração,  pode implementar módulos que acessam o Moodle diretamente no banco de dados e processa replicação, ou seja exportação de dados.
   
    Caso tenha interesse em conhecer a estrutura do banco de dados do Moodle, acesse os link indicados a baixo. Esses links não explicam diretamente todos os comandos SQL que você precisa para fazer integração, no entanto, lhe auxiliam em conhecer a estrutura e organização das tabelas do Moodle.

Cadastrar Usuário no Moodle pelo Comando SQL
http://moodlesql.blogspot.com/2010/07/cadastrar-usuario-no-moodle-pelo.html

Criar Curso no Moodle com Comando SQL
http://moodlesql.blogspot.com/2010/09/criar-curso-no-moodle-com-comando-sql.html


Organização do Curso no Moodle e Estrutura da Base de Dados. Diferença do Linguajar Acadêmico e Corporativo
http://moodlesql.blogspot.com/2010/08/organizacao-do-curso-no-moodle-e.html

Matricular Usuário no Curso do Moodle com Comando SQL
http://moodlesql.blogspot.com/2010/07/matricular-usuario-no-curso-do-moodle.html

Relatório Completo de Nota de um Curso no Moodle com Comando SQL
http://moodlesql.blogspot.com/2011/01/relatorio-completo-de-nota-de-um-curso.html

Padronização das tabelas do Banco de Dados do Moodle
http://moodlesql.blogspot.com/2010/09/padronizacao-das-tabelas-do-banco-de.html
   
    Agora faça o planejamento de trabalho, escolha o modelo de implementação e bota mão na massa, não  na sopa de letrinhas do código e faça boa integração. 

quarta-feira, 9 de fevereiro de 2011

Consultar Quantidade de Visita (Login) do Usuário no Moodle com Comando SQL

Para montar um relatório sobe a quantidade de vezes que o usuário entrou, ou seja, logou no ambiente do Moodle, é necessário fazer uma consulta diretamente no banco de dados. Isso porque a interface que o Moodle disponibiliza ainda não oferece esse tipo de informação.

A informação sobre a quantidade de visita fica na tabela de log. Aqui entendemos a quantidade de visita diferente da quantidade de acesso. A visita se refere ao número de vezes que o usuário entrou no Moodle usando login e senha. A quantidade de acesso é o número de cliques ou de páginas que acessou dentro do Moodle.
A consulta dever ser feita na tabela mdl_log com filtro no campo action. Segue os comandos SQL.

SQL para extrair quant. de visita por um determina usuário

SELECT COUNT(id) AS qvisita FROM mdl_log WHERE action='login' AND userid=?

Passe o parâmetro id do usuário em userid=?

Essa consulta retorna a quantidade de visita apenas de um determinado usuário.


SQL para extrair lista de quant. de visita de todos os usuários

SELECT u.id, u.firstname, u.lastname, COUNT(l.id) AS qvisita FROM mdl_user u INNER JOIN mdl_log l ON u.id = l.userid WHERE action='login' GROUP BY u.id, u.firstname, u.lastname ORDER BY COUNT(l.id) DESC

Essa consulta retorna uma lista de usuário ordenado pela quantidade de visita. Os usuários mais logaram no Moodle aparecem primeiro.


Agora que você já tem o comando SQL, monte o relatório do Moodle usando a linguagem de programação da sua preferência.

Campo mnethostid da Tabela mdl_user do Banco de dados do Moodle

    Muitos desenvolvedores do Moodle levantam a mesma questão: Para que serve o campo mnethostid da tabela de usuário mdl_user do Moodle?

    A resposta é simples. Mas requer algumas horas ou dias de pesquisa devido a  escassa    documentação técnica do Moodle.

    O campo  mnethostid é uma chave estrangeira do campo id da tabela mdl_mnet_host. O nome dessa tabela é resultado da abreviatura de Moodle Network Host.
    Moodle Network é uma funcionalidade  que foi adicionada na versão 1.8 para acesso remoto. Isso possibilita um usuário cadastrado em determinado Moodle acessar outras instâncias do ambiente Moodle. Por isso que na tabela de usuário foi adicionado o campo mnethostid para identificar o host do usuário.

    Por padrão, o primeiro registro lançado na tabela mdl_mnet_host é o host do Moodle local. O valor do campo  mnethostid na tabela mdl_user geralmente é 1 para usuários do Moodle local.

    Quando o usuário for logar diretamente no Moodle, será verificado a combinação de login e senha referente ao host do Moodle local. Com frequência, ocorre a mudança do id do Moodle local ao fazer atualização da versão. Neste caso, os usuários não conseguem logar,   mesmo que o login e a senha estiverem corretos. A  solução é verificar o novo id referente ao host do Moodle local e  atualizar a chave estrangeira no campo mnethostid na tabela de usuário mdl_user. Isso não é feito automaticamente uma vez que o Moodle é deficiente na questão da integridade de chaves primária e   estrangeira.
   
SQL para Extrair id do Host Local do Moodle
Para identificar o id referente ao host do Moodle local, execute  uma das seguintes alternativas de comando SQL:

Alternativa I
SELECT id FROM mdl_mnet_host WHERE wwwroot=?

Passe o parâmetro URL do Moodle em  wwwroot=?

Alternativa II
SELECT value FROM mdl_config WHERE name='mnet_localhost_id' 

    O primeiro comando extrai diretamente da tabela mdl_mnet_host  que é a fonte original de armazenamento dos hosts do Moodle. O segundo comando extrai a cópia do id do host local do Moodle registrada na tabela de configuração mdl_config.

    Quando você faz um cadastro de usuário no Moodle, o valor do campo mnethostid é recuperado da tabela mdl_config na variável mnet_localhost_id.  
    Então se você estiver cadastrando um usuário no Moodle com comando SQL,  o valor do campo   mnethostid deve ser extraído com um dos comandos SQL mencionados acima na alternativa I e II.
   
    Bem, agora você encontrou a resposta que estava procurando. Caso ainda não esteja satisfeito, explore mais a documentação do Moodle. Inicie a pesquisa estudando  a estrutura das tabelas que começam com o prefixo mdl_mnt_*. Certamente vai descobrir muita coisa. Se for fazer isso, não esqueça de me avisar o que descobriu.

terça-feira, 25 de janeiro de 2011

Extrair id da Matrícula do Aluno no Curso do Moodle com Comando SQL

    No Moodle a matrícula dos alunos, tutores, admin e.t.c  é feita na tabela mdl_role_assignments. Cada registro nessa tabela corresponde ao vínculo de um usuário no contexto do sistema, categoria do curso e curso. O id gerado nessa tabela é uma chave única de identificação da matrícula no sistema Moodle.
  
 Para extrair o id da matrícula de um determinado aluno, execute o seguinte comando     SQL:

SELECT rs.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 rs.userid=?

Passe o parâmetro id do curso em e.instanceid=? e id do usuário em rs.userid=?. rs.roleid=5 define que será feito filtro por aluno. Caso pretenda extrair pelo perfil do tutor, altere o valor para 3.

Essa consulta extrai os seguintes campos:
  • rs.id - Id da matrícula gerado na tabela mdl_role_assignments
  • u.firstname - Nome do usuário na tabela mdl_user
  • u.lastname - Sobrenome usuário na tabela mdl_user

Para extrair uma lista com  id da matrícula de todos os alunos em um determinado curso, execute o seguinte comando     SQL:

SELECT rs.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=?

Passe o parâmetro id do curso em e.instanceid=?. rs.roleid=5 define que será feito filtro por aluno. Caso pretenda extrair lista de tutor, altere o valor para 3.

A única diferença desse comando com a anterior é que o filtro  do usuário rs.userid=? foi retirado do comando WHERE. Os campos retornados são os mesmos da consulta anterior.

Até então já deve ter ficado claro que o  id gerado na tabela mdl_role_assignments é a chave única de inscrição  de cada usuário. Essa chave não é usada como chave estrangeira na tabela de log ou atividades que o aluno faz no curso. Isso porque caso a matrícula for cancelada, essa chave será excluída, as atividades e os  logs gerados não serão apagados em cascata. Os registros do aluno no curso continuam mesmo que a inscrição tenha sido cancelada. 

No sistema de log e atividades feitas pelos participantes do curso, a chave de identificação é a combinação do id do usuário gerado na tabela mdl_user e id do curso gerado na tabela mdl_course.
    Entender como é a estrutura da tabela da matrícula, ou seja, da inscrição dos usuários no curso do Moodle é fundamental para programar o Moodle ou efetuar integração do Moodle com um sistema acadêmico.

sexta-feira, 7 de janeiro de 2011

Mapear Alunos Inscritos nos Cursos do Moodle com Comando SQL

Para  mapear os usuários cadastrados no Moodle que estão inscritos em algum curso com perfil aluno, certamente a soluções é consultar diretamente o banco de dados do Moodle com comando SQL. 

Tabelas
Para fazer esse mapeamento, é necessário fazer a consulta nas seguintes tabelas:
  • mdl_user – Tabela de usuário
  • mdl_role_assignments – Tabela da matrícula, ou seja, da inscrição do usuário no curso
Comando SQL
SELECT DISTINCT  u.id, u.firstname,u.lastname,u.email FROM mdl_role_assignments rs INNER JOIN mdl_user u ON u.id=rs.userid  WHERE rs.roleid=5

Essa consulta filtra  apenas  os alunos. O filtro é feito no comando WHERE rs.roleid=5. Por padrão, 5 é o id do perfil do aluno na tabela mdl_role.  Caso um aluno estiver inscrito em mais de um curso, o comando DISTINCT elimina a duplicação.



Se um usuário tiver perfil de aluno em um curso e administrador em outro ele será incluído na lista. Caso você queira excluir esse tipo de usuário, altere o comando SQL para fazer exclusão dos usuários com perfil de aluno e  administrador compartilhado.  O novo comando ficará assim:
SELECT DISTINCT  u.id, u.firstname,u.lastname,u.email FROM mdl_role_assignments rs INNER JOIN mdl_user u ON u.id=rs.userid  WHERE rs.roleid =5 AND rs.userid NOT IN(SELECT userid FROM mdl_role_assignments WHERE roleid=1)

Foi adicionado a parte do código em destaque que exclua todos os administradores.

A primeira  consulta não  retorna nenhum usuário que não tenha perfil do aluno. A segunda exclui da lista os alunos que  tenham também perfil de administrador. 

terça-feira, 4 de janeiro de 2011

Relatório Completo de Nota de um Curso no Moodle com Comando SQL

    Caso você queira extrair um relatório completo de nota que exibe todas as avaliações e a nota final para todos os alunos inscritos no curso, será necessário fazer consultas SQL na camada de base de dados e montar relatório por meio de uma linguagem de programação. Neste post será explorado apenas a parte de consulta ao banco de dados.

Para montar um relatório completo de nota, o procedimento é bem simples. Será explicado por passo.

1º Passo  – Extrair a  lista dos alunos inscritos no curso

Segue o comando SQL que recupere da base de dados todos os alunos matriculados  em um determinado 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 o parâmetro  e.instanceid que deve ser o id do curso.
Caso  queira entender um pouco mais sobre esse comando clique aqui.

Esse comando retorna da base de dados os seguintes dados:
  • u.id – Id do usuário na tabela mdl_user
  • u.firstname – Nome do usuário
  • u.lastname – Sobrenome do usuário

2º Passo  – Extrair a  lista de todas as avaliações

Para extrair a relação de todos as avaliações de um determinado curso, basta consultar a tabela  mdl_grade_items. Segue o comando SQL:

SELECT id,itemname,itemtype,gradetype,scaleid FROM mdl_grade_items WHERE courseid=?

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

Esta consulta retorna os seguintes dados:
  • id – Id da avaliação
  • itemname – Nome da avaliação
  • itemtype – Tipo da avaliação. Há três tipos padrões: course, mod e manual.
      • course – É uma avaliação do curso, ou seja, a nota final. 
      • mod  - É uma avaliação criada a partir de uma atividade do curso. 
      • manual – É uma avaliação criado manualmente.
  • gradetype – Tipo de nota. Valor padrão: 1 e 2.
      • 1- Indica que a nota numérica.
      • 2 – Indica que a nota não é numérica. Neste caso a nota é definida por                 escala na tabela mdl_scale
  • scaleid – Indica a escala de nota definida na tabela mdl_scale

Caso a nota não for numérica, é necessário recuperar a escala de nota com esse comando.

SELECT scale FROM mdl_scale  WHERE id=?

Substitua o parâmetro id=? pelo valor retornado na coluna scaleid da consulta anterior.

Essa consultar retorna o seguinte dado:
•    scale – Relação da escala de nota separada por vírgula.

3º Passo  – Extrair a  lista de nota de todas as avaliações


    Para extrair uma lista de nota de todas as avaliações de um determinado curso, execute o seguinte comando sql:

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

Passe o parâmetro id do curso em i.courseid=?

4º Passo  –  Montar Layout do relatório
    Agora só falta organizar todos os dados extraídos nas consultas e montar uma tabela de nota com as seguintes colunas:

Nome do Aluno | Avaliação 1|  Avaliação 2 | Avaliação n|  Nota final

Em cada linha da tabela deve ser  impresso o nome do aluno e  a nota da avaliação de forma sincronizada. Essa sincronização pode ser feita através de uma matriz cujo índice é a combinação do id do usuário e id da avaliação. Por exemplo,  idusr/idavaliacao=nota. Isso pode ser facilmente implementada através da linguagem de programação da sua preferência.

Observação

A nota final é a avaliação cujo itemtype é course.
Caso o tipo de nota for escala (gradetype=2), o valor da nota equivale ao índice, ou seja, posição da escala da lista de nota separada por vírgula. Se  o valor da nota for 4, a nota é a quarta  posição da lista. Se a escala for: Péssimo, Ruim, Razoável, Bom, Muito  Bom; a quarta  posição é Bom, pois está será a nota.


Até aqui tudo já deve ter ficado claro como montar um relatório completo de nota. É importante ressaltar que o código SQL para extrair a avaliação e a nota não são compatíveis com a versão do Moodle  inferior a 1.9. O que extrai a lista dos alunos inscritos não é compatível com a versão inferior a 1.7.
   
    Conhecer como funciona a estrutura das tabelas de notas no banco de dados do Moodle, viabiliza a possibilidade de customizar os relatórios bem como a integração do Moodle com outros sistemas. Agora só falta você arregaçar as mangas e iniciar a programação na língua da sua preferência.

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