segunda-feira, 26 de julho de 2010

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

A data de inscrição do aluno no curso do Moodle fica na tabela mdl_role_assignments no campo timestart. Nos relatórios do Moodle, esse dado não vem. No entanto, pode ser extraída escrevendo comando o SQL como segue exemplo abaixo.

Comando SQL para extrair data de matrícula do aluno no curso:
SELECT u.firstname,u.lastname,rs.timestart 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=?

O parâmetro e.instanceid=? deve ser do id do curso. Funciona para versão 1.7 ou superior do Moodle. Para versão 1.6 o comando dever ser outro.

6 comentários:

  1. Olá, como ficaria esse comando na versão 2.8?

    ResponderExcluir
    Respostas
    1. Pedro,
      A data de inscrição do aluno no curso na versão 2 mudou de lugar. Agora fica na tabela mdl_user_enrolments são os campos timestart e timeend

      Para saber qual curso ao aluno está vinculado, explore a coluna enrolid
      Esta coluna é chave estrangeira, faz referencia a chave primária da coluna mdl_enrol que gerencia método de inscrição.

      Um aluno pode ter mais de uma inscrição no curso por diferentes métodos. Neste caso terá mais de um lançamento na tabela mdl_user_enrolments. A tabela mdl_role_assignments atualmente só registra o perfil no contexto. Ficou meio duplicado isso na nova versão do Moodle e mais confuso.

      Atualmente para tirar data de inscrição, uso a combinação de programação para juntar os dados.
      Primeiro tiro a relação dos inscritos na tabela mdl_role_assignments e depois vou procurar a data de cadastro na tabela mdl_user_enrolments fazendo join com a tabela mdl_enrol para filtrar por curso.

      Excluir
  2. Eu também tenho dúvidas de como fazer este filtro de matrículas por data quando tenho 2 matriículas de um mesmo aluno.
    Se o aluno está no curso1 e cutrso2 no mesmo período, e eu filtro por data as matrículas do curso1 aparece também a matricula do curso2, pois ele busca na tabela "mdl_user_enrolments" campo "timestart" relacionando id_user e acha os 2 registros.
    Assim o relatório fica inconsistente.

    Segue minha query:

    $strSQL = mysql_query ("SELECT
    mdl_user_enrolments.userid,
    mdl_user_enrolments.timestart,
    mdl_user_info_data.fieldid,
    mdl_user_info_data.data,
    mdl_user.lastname AS SOBRENOME,
    mdl_user.firstname AS NOME,
    mdl_user.email AS EMAIL,
    mdl_course.fullname AS CURSO
    FROM mdl_role_assignments
    INNER JOIN mdl_user_enrolments on (mdl_role_assignments.userid = mdl_user_enrolments.userid)
    INNER JOIN mdl_user_info_data on (mdl_role_assignments.userid = mdl_user_info_data.userid)
    INNER JOIN mdl_user on (mdl_role_assignments.userid = mdl_user.id)
    INNER JOIN mdl_context on (mdl_role_assignments.contextid = mdl_context.id)
    INNER JOIN mdl_course on (mdl_course.id = mdl_context.instanceid)
    WHERE
    (date(from_unixtime(mdl_user_enrolments.timestart)) >= '$data_inicio') AND
    (date(from_unixtime(mdl_user_enrolments.timestart)) <= '$data_final') AND
    (mdl_context.contextlevel=50) AND (mdl_role_assignments.roleid=5) AND
    (mdl_course.id = '$id_curso') AND
    (mdl_user_info_data.fieldid = '26') AND (mdl_user_info_data.data like '%$unidade%') ORDER BY firstname");

    como podem ver uso outros filtros pelo campo de cadastro do usuários. Joguei o relatório aqui: http://senaiead.fiepb.org.br/relatorio_completo/
    caso queiram ver.

    NÃO ENTENDI COMO FAZER O RELACIONAMENTO COM A TABELA MDL_ENROL. :(

    Fico grato quem poder ajudar. :D

    ResponderExcluir
    Respostas
    1. Adeilton,
      No seu comando notei que está faltando INNER JOIN com a tabela mdl_enrol
      Trata-se da tabela que especifica qual método de inscrição o aluno está vinculado, e consequentemente o curso que o método está vinculado.
      Veja como é a relação:

      a) A tabela mdl_enrol registra o método de inscrição. Nessa tabela há a coluna courseid que especifica o curso;

      b) Na tabela mdl_user_enrolments a coluna enrolid especifica o método que o usuário foi inscrito. Ao fazer INNER JOIN com a tabela mdl_enrol, facilmente se mapeie para qual curso a inscrição foi feita.

      Observação:
      A tabela mdl_user_enrolments também registra o curso que o aluno está inscrito por meio do contextid, ou seja, pelo contexto. Ficou um pouco duplicado o registro de matrícula em duas tabelas. Mas para recuperar a data de início e término da matrícula, o cominho é explorar a relação entre as tabelas mdl_user_enrolments e mdl_enrol

      Excluir
    2. Valeu Lino pela informação!!

      Eu adicionei o INNER JOIN da seguinte forma:

      INNER JOIN mdl_enrol on (mdl_enrolments.enrolid = mdl_enrol.courseid)

      Mas assim não retorna nenhum dado.
      Estou tentando esta correção.

      Excluir
    3. Adilton,
      O comando a seguir lista a data de inscrição dos usuários num determinado curso:

      SELECT u.firstname,u.lastname,u.email,ue.timestart, ue.timeend FROM mdl_enrol e INNER JOIN mdl_user_enrolments ue ON e.id=ue.enrolid INNER JOIN mdl_user u ON u.id=ue.userid WHERE e.courseid=?

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

      Excluir