segunda-feira, 26 de agosto de 2013

Corrigir data de inscrição no Moodle com comando SQL

Neste post vamos mostrar como atualizar o cadastro de matrícula do aluno para inserir a data de inscrição caso estiver faltando.

    A data de inscrição do aluno no curso do Moodle é de extrema importância para gerar relatórios gerenciais. Ainda mais nos cursos em que a inscrição é aberta, ou seja, pode ocorrer a qualquer momento.

     Para computar evasão, a data de inscrição é o ponto de  referência. Pois, a falta desse registro dificulta emissão de relatórios. Por exemplo, há administradores do Moodle que usam sistema Badiu GMoodle para automatizar o cálculo da evasão tendo como regra os alunos que deixaram de acessar o curso durante 15 dias após a data de inscrição. Essa regra não será viável caso não houver registro de quanto o aluno ingressou no curso.

    A data de inscrição pode não ser lançada ou cadastrada de forma errada quando a carga de dados no Moodle vem de um sistema externo. Para corrigir isso, é necessário usar o comando UPDATE na tabela mdl_user_enrolments na versão 2.x e mdl_role_assignments na versão  1.9.

Versão 2.x do Moodle
Para corrigir data inscrição na versão 2.x do Moodle, execute os seguintes comandos SQL:

1° Passo – Recupere método de inscrição do curso
SELECT id FROM mdl_enrol WHERE courseid=? AND enrol=?




Parâmetro
Descrição
courseid=?
Passe o valor do id do curso. Esse valor fica registrado na tabela mdl_course. Trata-se do curso em que se pretende corrigir a data de inscrição
enrol=?
Trata-se do método de inscrição do curso. Na versão 2.x um curso pode ter mais de um método de inscrição. O método padrão é manual. Se for manual o parâmetro deve ficar assim: enrol='manual'


O id retornado pelo SELECT é o método de inscrição. Esse valor deve ser usado para dar entrada de dados na tabela  mdl_user_enrolments no campo enrolid.

2° Passo – Atualizar data de inscrição
 
UPDATE mdl_user_enrolments SET timestart=?,timeend=?,timemodified=? WHERE enrolid=? AND userid=?


Parâmetro
Descrição
timestart=?
Data do início da inscrição em formato timestamp
timeend=?
Data da validade de inscrição em formato timestamp. Use esse campo apenas se houver data de validade da matrícula.
timemodified=?
Data em que a atualização do registro da matrícula foi feita. Também e em formato timestamp.
enrolid=?
Método de inscrição recuperado pelo comando SQL do 1° passo
userid=?
Id do usuário que se pretende alterar a data de inscrição. O valor do id deve ser recuperado na tabela mdl_user


Para ficar mais prático, vamos juntar os dois comandos em um só.  Código abaixo mostra o resultado dessa junção. 

UPDATE mdl_user_enrolments SET timestart=?,timeend=?,timemodified=? WHERE enrolid IN (SELECT id FROM mdl_enrol WHERE courseid=? AND enrol=?)  AND userid=?

A execução desse comando dá o mesmo resultado que os dois comandos anteriores. É mais prático quando se estiver processando SQL na base de forma manual.


Versão 1.9.x do Moodle

Para corrigir data inscrição na versão 1.9.x e também nas versões inferiores 1.8 e 1.7 do Moodle, execute os seguintes comandos SQL:

1° Passo – Recupere o contexto da inscrição

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




Parâmetro
Descrição
contextlevel=50
Especifica que se trata do contexto do curso. Na tabela de domínio, 50 se refere ao contexto do curso. Dê uma olhada nesse link:http://docs.moodle.org/dev/Roles_and_modules#Context
instanceid=?
Aqui passa o id do curso, o qual se pretende corrigir a data de inscrição. O valor desse parâmetro deve ser extraído na tabela mdl_course quando o nível do contexto for 50.



2° Passo – Atualizar data de inscrição

UPDATE mdl_role_assignments SET timestart=?,timeend=?,timemodified=? WHERE contextid=? AND userid=?

Para ficar mais prático, vamos juntar os dois comandos em um só.  Código abaixo mostra o resultado dessa junção. 

UPDATE mdl_role_assignments SET timestart=?,timeend=?,timemodified=? WHERE contextid IN (SELECT id FROM mdl_context WHERE contextlevel=50 AND instanceid=?) AND userid=?

A execução desse comando dá o mesmo resultado que os dois comandos anteriores. É mais prático quando se estiver processando SQL na base de forma manual.

    Agora você já sabe como corrigir a sua base de dados. Há um detalhe importante a ser levado em conta  caso a carga no Moodle for feita por um sistema externo. Se a base externa tiver registro da data de ingresso de cada aluno no curso, para automatizar essa informação no Moodle,  é necessário que as duas bases estejam sincronizadas. Ou seja, a base externa deve possuir uma chave de identificação, de forma precisa, de cada registro de usuário e curso no Moodle. Tendo isso,  basta fazer um loop numa rotina de programação, extraindo a data de matrícula de cada aluno no curso e atualizar o Moodle. Não tendo a sincronização, a alternativa  é fazer manualmente.

    Na eventualidade de não ter a base externa, a data de inscrição pode ser atualizada com a data do primeiro acesso do aluno no ambiente do curso. Há uma margem de erro  que deve ser levada em conta uma vez que não necessariamente o aluno  acessou o curso no dia em que foi inscrito.

Comando SQL que extrai o primeiro acesso no curso
SELECT MIN(time) FROM mdl_log WHERE course=?  AND  userid=?

    Essa alternativa atualiza a data de inscrição apenas dos alunos que acessaram o curso. Os que ainda não acessaram vão continuar sem registro da data de ingresso.
   
    Agora tudo que você precisa é solicitar ao seu desenvolvedor que faça uma rotina de programação para corrigir as informações no Moodle. Geralmente você dá conta desse problema quando precisa gerar relatórios que usam a data de inscrição.  



segunda-feira, 12 de agosto de 2013

Excluir alunos do curso do Moodle com comando SQL

Neste post, vamos mostrar como  excluir aluno do ambiente de curso no Moodle  usando comando SQL.  Vamos usar o comando DELETE. Isso é perigoso, uma vez exclui os dados. 
   
    Vamos mostrar como excluir os dados em em lote, ou seja, todos os alunos de um determinado curso. Também vamos mostrar como excluir apenas alguns alunos.

    O registro da  matrícula fica na tabela  mdl_role_assignments. O contexto da matrícula fica na tabela   mdl_context. Sendo assim, o comando da exclusão deve ser:

SQL  para excluir todos os alunos de um curso
DELETE FROM mdl_role_assignments WHERE roleid=5 AND contextid IN (SELECT id FROM mdl_context WHERE contextlevel=50 AND instanceid=?)

SQL  para excluir alguns alunos de um curso
DELETE FROM mdl_role_assignments WHERE roleid=5 AND contextid IN (SELECT id FROM mdl_context WHERE contextlevel=50 AND instanceid=?)  AND userid IN(?,?,?)

A única diferença do comando anterior é userid IN(?,?,?) que delimita quais alunos devem ser excluídos




Parâmetros
Descrição
roleid=5
Define filtro de exclusão apenas para alunos. Veja na tabela mdl_role valor de parâmetro para outros perfis. Por padrão, 5 é o aluno. Confirme se de fato você está usando 5 para alunos e não alterou o padrão. Já que está excluindo, todo o cuidado é pouco.
contextlevel=50
Especifica que se trata do contexto do curso. Na tabela de domínio, 50 se refere ao contexto do curso. Dê uma olhada nesse link:http://docs.moodle.org/dev/Roles_and_modules#Context
instanceid=?
Aqui passa o id do curso, o qual pretende excluir os alunos. Esse valor fica na tabela mdl_course.
userid IN(?,?,?)
Especifique quais alunos devem ser excluídos. O id dos alunos deve ser extraído da tabela mdl_user


Caso estiver usando a versão 2.x do Moodle, é necessário também apagar os dados da tabela mdl_user_enrolments. Esta tabela foi criada na versão 2 do Moodle. Contêm informações método de inscrição e data de inscrição. O campo enrolid faz ligação com a tabela mdl_enrol. É a chave estrangeira do campo id da tabela  mdl_enrol que faz registros dos plugins de inscrição habilitados no curso.

Sql para excluir informações de dados da inscrição de todos os alunos de um curso (apenas para versão 2.x)
 DELETE FROM mdl_user_enrolments WHERE enrolid IN (SELECT id FROM mdl_enrol WHERE  courseid=?)

Sql para excluir informações de dados da inscrição de alguns os alunos de um curso (apenas para versão 2.x)
DELETE FROM mdl_user_enrolments WHERE enrolid IN (SELECT id FROM mdl_enrol WHERE  courseid=?) AND userid IN(?,?,?)

A única diferença do comando anterior é userid IN(?,?,?) que delimita quais alunos devem ser excluídos

Nestes dois últimos comando, ficou claro que deve passar o id do curso no parâmetro  courseid=?. O valor desse parâmetro deve ser extraído da tabela mdl_course. Para o parâmetro userid IN(?,?,?) vale a mesma explicação apontada na tabela acima. 
   
    Os comandos listados aqui apenas retira o aluno do curso. Cancela a inscrição. Não excluir o histórico  do aluno. Caso o aluno venha a ser reinscrito, ele continuará o curso do ponto onde havia parado, ou seja, reaproveita todo o histórico.

    Bem, isso é tudo que você precisa saber para excluir alunos de um curso. Agora tome cuidado para não fazer nada errado. Teste primeiro no seu Moodle de desenvolvimento antes de levar para produção. Sempre recomendo ter um clone de produção no ambiente de desenvolvimento. Isso evita prejuízo e falha humanas. Lembre, estamos usando comando DELETE. Você não quer que a equipe pedagógica fique no seu cangote reclamando que o aluno simplesmente sumiu!