Re: Requête permettant de connaitre le(s) fichier(s) attaché aux consignes d'une activité Devoir
Re: Requête permettant de connaitre le(s) fichier(s) attaché aux consignes d'une activité Devoir
SELECT *
FROM mdl_files as f JOIN mdl_context as c ON c.id = f.contextid WHERE c.instanceid = 61499 AND c.contextlevel = 70
61499 = id du contexte du devoir (provenant de l'url du devoir https://mon.moodle/mod/assigne/view.php?id=61499)
Cela liste les entrées de la table mdl_files associées à ce devoir
Donc cela comprend également les devoirs déposés par les étudiants
Il faut ensuite trier selon le champ "filearea" de la table mdl_files
Bruno
Re: Requête permettant de connaitre le(s) fichier(s) attaché aux consignes d'une activité Devoir
Bonsoir,
Requête à tester pour obtenir la liste des devoirs qui ont au moins un fichier attaché à l'introduction :
SELECT a.id,a.name AS Devoir,cm.id AS cmid,c.id AS contextid, f.filename AS Fichier
FROM mdl_context AS c
JOIN mdl_course_modules AS cm ON c.instanceid = cm.id
JOIN mdl_files AS f ON f.contextid = c.id
JOIN mdl_assign AS a ON a.id = cm.instance
WHERE f.component = 'mod_assign' AND f.filearea = 'introattachment' AND f.source IS NOT NULL
Re: Requête permettant de connaitre le(s) fichier(s) attaché aux consignes d'une activité Devoir
Merci Bruno et Christian pour vos pistes. C'est exactement sur ce genre d'éléments que j'étais effectivement tombé hier, après quelques recherches et requêtes.
Il faut que j'approfondisse et affine tout ça, et je reviendrai poster les résultats.
Séverin
Re: Requête permettant de connaitre le(s) fichier(s) attaché aux consignes d'une activité Devoir
Re-bonjour,
Voila la requête que j'ai écrite, à utiliser avec le plugin Requêtes personnalisées, qui est une extension de celle qui listait les devoirs des cours.
SELECT DISTINCT
c.id AS 'ID Cours'
, c.visible AS 'Ouvert'
, c.idnumber
, CONCAT('<a target="_new" href="%%WWWROOT%%/course/view.php?id=',c.id,'">',c.fullname,'</a>') AS 'Nom du cours'
, CONCAT('<a target="_new" href="%%WWWROOT%%/mod/assign/view.php?id=',cm.id,'">',a.name,'</a>') AS 'Nom du devoir'
, cm.visible AS 'Visible' , IF (a.allowsubmissionsfromdate= 0, 'Pas de date', DATE_FORMAT(FROM_UNIXTIME(a.allowsubmissionsfromdate), '%Y-%m-%d %H:%i' )) AS 'Date ouverture'
, IF (a.duedate = 0, 'Pas de date', DATE_FORMAT(FROM_UNIXTIME(a.duedate) , '%Y-%m-%d %H:%i' )) AS 'Date de rendu'
, IF (a.cutoffdate = 0, 'Pas de date', DATE_FORMAT(FROM_UNIXTIME(a.cutoffdate), '%Y-%m-%d %H:%i' )) AS 'Date limite'
, a.id AS 'ID Devoir'
, f.filename AS 'Fichier consigne'
, FORMAT ( (f.filesize / 1024), 2) AS 'Taille Ko'
, FROM_UNIXTIME(f.timecreated) AS 'Créé'
, FROM_UNIXTIME(f.timemodified) AS 'Modifié'
, f.itemid
, f.filepath
FROM prefix_course_modules AS cm
JOIN prefix_modules AS m ON m.id = cm.module
JOIN prefix_course AS c ON c.id = cm.course
JOIN prefix_assign AS a ON a.id = cm.instance
JOIN prefix_context AS ctx ON ctx.instanceid = cm.id
LEFT JOIN prefix_files AS f ON f.contextid = ctx.id AND f.component = 'mod_assign' AND f.filearea = 'introattachment' AND filename != '.'
WHERE m.name = 'assign'
Par contre, j'ai un souci :
Pour la table des fichiers (files), si je laisse un JOIN simple, je n'affiche que les devoirs ayant un fichier attaché dans sa description.
Et si je met LEFT JOIN, j'ai du coup plusieurs lignes pour les devoirs ayant un fichier attaché.
Je ne sais pas trop comment faire pour lister tous les devoirs, mais éviter les lignes en doublon.
Séverin
Re: Requête permettant de connaitre le(s) fichier(s) attaché aux consignes d'une activité Devoir
Bonsoir,
En utilisant SQL GROUP_CONCAT() ..... GROUP BY
SELECT DISTINCT
c.id AS 'ID Cours',
c.fullname AS 'Nom du cours',
a.name AS 'Nom du devoir',
a.id AS 'ID Devoir',
GROUP_CONCAT( f.filename ) AS 'Fichiers',
GROUP_CONCAT( f.filesize ) AS 'Taille'
FROM mdl_course_modules AS cm
JOIN mdl_modules AS m ON m.id = cm.module
JOIN mdl_course AS c ON c.id = cm.course
JOIN mdl_assign AS a ON a.id = cm.instance
JOIN mdl_context AS ctx ON ctx.instanceid = cm.id
LEFT JOIN mdl_files AS f ON f.contextid = ctx.id AND
f.component = 'mod_assign' AND f.filearea = 'introattachment' AND
filename != '.'
WHERE m.name = 'assign'
GROUP BY a.id
Christian
Re: Requête permettant de connaitre le(s) fichier(s) attaché aux consignes d'une activité Devoir
Merci encore pour cette fonction. C'est une très bonne idée. Le pire est que je l'avais utilisée une fois, il y a longtemps, mais n'y ait plus pensé...
Par contre, autant ta requête fonctionne correctement lorsque je la lance telle qu'elle en direct dans MySql, autant lorsque j'essaie d'intégrer cela dans l'outil de requêtes personnalisables, j'obtiens un message d'erreur :
"FUNCTION MaBase.GROUP_CONCAT does not exist. Check the 'Function Name Parsing and Resolution' section in the Reference Manual"Je ne comprends pas pourquoi il refuse d'utiliser cette fonction...
Séverin
Re: Requête permettant de connaitre le(s) fichier(s) attaché aux consignes d'une activité Devoir
En utilisant "Rapports personnalisés" (customsql) et la requête :
SELECT DISTINCT
c.id AS 'ID Cours',
c.fullname AS 'Nom du cours',
a.name AS 'Nom du devoir',
a.id AS 'ID Devoir',
GROUP_CONCAT( f.filename ) AS 'Fichiers',
GROUP_CONCAT( f.filesize ) AS 'Taille'
FROM {course_modules} AS cm
JOIN {modules} AS m ON m.id = cm.module
JOIN {course} AS c ON c.id = cm.course
JOIN {assign} AS a ON a.id = cm.instance
JOIN {context} AS ctx ON ctx.instanceid = cm.id
LEFT JOIN {files} AS f ON f.contextid = ctx.id AND
f.component = 'mod_assign' AND f.filearea = 'introattachment' AND filename != '.'
WHERE m.name = 'assign'
GROUP BY a.id
la fonction GROUP_CONCAT() n'a pas été bloquée et j'ai obtenu le rapport.
Christian
Re: Requête permettant de connaitre le(s) fichier(s) attaché aux consignes d'une activité Devoir
Idem de mon coté, je peux lancer la requête directement dans l'interface phpMyAdmin ou rapports personnalisés
Mais sur mon ancienne plateforme (moodle 3.8), pas la nouvelle car nous sommes passés sur Postgres
et là, la fonction n'est pas disponible
Ci-dessous, 2 liens qui traitent de cette fonction, visiblement pas implémentée partout
Sur le 2ème lien, ils est question de remplacer par STRING_AGG ..
https://sql.sh/fonctions/group_concat
https://stackoverflow.com/questions/41298741/function-not-found-group-concat
Peut-être un problème de librairies, de configuration MySQL entre les modes "Standard" et "Legacy" .. (cf 2ème lien)
Bruno
Re: Requête permettant de connaitre le(s) fichier(s) attaché aux consignes d'une activité Devoir
Merci encore pour votre aide.
Bruno : les indications du second lien sont liées à des éléments spécifiques à Google.
Christian : en fait, si je copie directement ta requête, elle fonctionne correctement, que ce soit en direct, ou bien avec les plugins customsql ou configurable_reports.
Par contre, ça bloque quand j'essaie d'avoir des éléments plus évolués, avec des fonctions, ou la "construction" de chaînes plus élaborées permettant de créer des liens vers les éléments... mais je n'ai pas encore cerné exactement ce qui pose problème.
C'est un peu pénible de perdre du temps bêtement sur ces aspects là... mais il est vrai que les liens directs sont très utiles lors de l'exploitation !
Séverin
Re: Requête permettant de connaitre le(s) fichier(s) attaché aux consignes d'une activité Devoir
SELECT DISTINCT
c.id AS "ID Cours",
c.fullname AS "Nom du cours",
a.name AS "Nom du devoir",
a.id AS "ID Devoir",
STRING_AGG( f.filename , ',') AS "Fichiers",
STRING_AGG( f.filesize::character , ',') AS "Taille"
FROM mdl_course_modules AS cm
JOIN mdl_modules AS m ON m.id = cm.module
JOIN mdl_course AS c ON c.id = cm.course
JOIN mdl_assign AS a ON a.id = cm.instance
JOIN mdl_context AS ctx ON ctx.instanceid = cm.id
LEFT JOIN mdl_files AS f ON f.contextid = ctx.id AND
f.component = 'mod_assign' AND f.filearea = 'introattachment' AND
filename != '.'
WHERE m.name = 'assign'
GROUP BY a.id , c.id
- Utiliser STRING_AGG au lieu de GROUP_CONCAT
- STRING_AGG fonctionne avec des chaînes de caractères, donc nécessiter de convertir dans la 2ème fonction ( ::character )
- Nécessiter de groupe les résultats sur c.id également
Re: Requête permettant de connaitre le(s) fichier(s) attaché aux consignes d'une activité Devoir
Séverin
Re: Requête permettant de connaitre le(s) fichier(s) attaché aux consignes d'une activité Devoir
Bonsoir Séverin,
J'ai fait un copier-coller de tes premières lignes 2 à 13 :
c.id AS 'ID Cours'
.........
, a.id AS 'ID Devoir'
et cela fonctionne en obtenant les liens vers les cours ou les devoirs. Cette fois j'ai mis la requête dans le bloc configurable_reports.
Re: Requête permettant de connaitre le(s) fichier(s) attaché aux consignes d'une activité Devoir
Merci encore à vous deux. J'ai enfin réalisé ce que je voulais, avec un peu d'acharnement...
Du coup, ma requête complète (pour MySQL / MariaDB) est celle-ci (utilisée avec configurable_reports) :
SELECT DISTINCT
c.id AS 'ID Cours'
, c.visible AS 'Ouvert'
, c.idnumber
, CONCAT('<a target="_new" href="%%WWWROOT%%/course/view.php?id=',c.id,'">',c.fullname,'</a>') AS 'Nom du cours'
, CONCAT('<a target="_new" href="%%WWWROOT%%/mod/assign/view.php?id=',cm.id,'">',a.name,'</a>') AS 'Nom du devoir'
, CONCAT('<a target="_new" href="%%WWWROOT%%/course/modedit.php?up','date=',cm.id,'">Modifier</a>') AS 'Modifier'
, cm.visible AS 'Visible'
, IF (a.allowsubmissionsfromdate= 0, 'Pas de date', DATE_FORMAT(FROM_UNIXTIME(a.allowsubmissionsfromdate), '%Y-%m-%d %H:%i' )) AS 'Date ouverture'
, IF (a.duedate = 0, 'Pas de date', DATE_FORMAT(FROM_UNIXTIME(a.duedate) , '%Y-%m-%d %H:%i' )) AS 'Date de rendu'
, IF (a.cutoffdate = 0, 'Pas de date', DATE_FORMAT(FROM_UNIXTIME(a.cutoffdate), '%Y-%m-%d %H:%i' )) AS 'Date limite'
, a.id AS 'ID Devoir'
, GROUP_CONCAT( f.filename ) AS 'Fichiers'
, GROUP_CONCAT( f.filesize ) AS 'Taille'
, FROM_UNIXTIME(GROUP_CONCAT(f.timecreated)) AS 'Créé'
, FROM_UNIXTIME(GROUP_CONCAT(f.timemodified)) AS 'Modifié'
, GROUP_CONCAT(f.itemid) AS 'ItemId'
, GROUP_CONCAT(f.filepath) AS 'Filepath'
, GROUP_CONCAT(u.firstname) AS 'Prénom'
, GROUP_CONCAT(u.lastname) AS 'Nom'
FROM {course_modules} AS cm
JOIN {modules} AS m ON m.id = cm.module
JOIN {course} AS c ON c.id = cm.course
JOIN {assign} AS a ON a.id = cm.instance
JOIN {context} AS ctx ON ctx.instanceid = cm.id
LEFT JOIN {files} AS f ON f.contextid = ctx.id AND
f.component = 'mod_assign' AND f.filearea = 'introattachment' AND filename != '.'
LEFT JOIN {user} AS u ON u.id = f.userid
WHERE m.name = 'assign'
GROUP BY a.id, c.id
J'ai également intégré le nom de la personne ayant déposé le fichier de consigne de devoir.
Re: Requête permettant de connaitre le(s) fichier(s) attaché aux consignes d'une activité Devoir
-- On peut spécifier la catégorie (et sous-catégories) souhaitée, voir en bas !J'aurais bien aimé pouvoir spécifier la catégorie dans une variable unique en haut de page avec un SET @VARIABLE, mais il me le refuse pour raison de mot-clé interdit...
SELECT DISTINCT
CONCAT_WS (' / ', cc6.name, cc5.name, cc4.name, cc3.name, cc2.name, cc1.name, cc.name) AS 'Chemin'
, c.id AS 'ID Cours'
, c.visible AS 'Ouvert'
, c.idnumber AS 'IdNumber'
, CONCAT('<a target="_new" href="%%WWWROOT%%/course/view.php?id=',c.id,'">',c.fullname,'</a>') AS 'Nom du cours'
, CONCAT('<a target="_new" href="%%WWWROOT%%/mod/assign/view.php?id=',cm.id,'">',a.name,'</a>') AS 'Nom du devoir'
, CONCAT('<a target="_new" href="%%WWWROOT%%/course/modedit.php?up','date=',cm.id,'">Modifier</a>') AS 'Modifier'
, cm.visible AS 'Visible'
, IF (a.allowsubmissionsfromdate= 0, 'Pas de date', DATE_FORMAT(FROM_UNIXTIME(a.allowsubmissionsfromdate), '%Y-%m-%d %H:%i' )) AS 'Date ouverture'
, IF (a.duedate = 0, 'Pas de date', DATE_FORMAT(FROM_UNIXTIME(a.duedate) , '%Y-%m-%d %H:%i' )) AS 'Date de rendu'
, IF (a.cutoffdate = 0, 'Pas de date', DATE_FORMAT(FROM_UNIXTIME(a.cutoffdate), '%Y-%m-%d %H:%i' )) AS 'Date limite'
, a.id AS 'ID Devoir'
, GROUP_CONCAT( f.filename ) AS 'Fichiers'
, GROUP_CONCAT( f.filesize ) AS 'Taille'
, FROM_UNIXTIME(GROUP_CONCAT(f.timecreated)) AS 'Créé'
, FROM_UNIXTIME(GROUP_CONCAT(f.timemodified)) AS 'Modifié'
, GROUP_CONCAT(DISTINCT f.itemid) AS 'ItemId'
, GROUP_CONCAT(DISTINCT f.filepath) AS 'Filepath'
, GROUP_CONCAT(DISTINCT u.firstname) AS 'Prénom'
, GROUP_CONCAT(DISTINCT u.lastname) AS 'Nom'
FROM {course_modules} AS cm
JOIN {modules} AS m ON m.id = cm.module
JOIN {course} AS c ON c.id = cm.course
JOIN {assign} AS a ON a.id = cm.instance
JOIN {context} AS ctx ON ctx.instanceid = cm.id
LEFT JOIN {files} AS f ON f.contextid = ctx.id AND
f.component = 'mod_assign' AND f.filearea = 'introattachment' AND filename != '.'
LEFT JOIN {user} AS u ON u.id = f.userid
JOIN {course_categories} AS cc ON cc.id = c.category
LEFT JOIN {course_categories} AS cc1 ON cc1.id = cc.parent
LEFT JOIN {course_categories} AS cc2 ON cc2.id = cc1.parent
LEFT JOIN {course_categories} AS cc3 ON cc3.id = cc2.parent
LEFT JOIN {course_categories} AS cc4 ON cc4.id = cc3.parent
LEFT JOIN {course_categories} AS cc5 ON cc5.id = cc4.parent
LEFT JOIN {course_categories} AS cc6 ON cc6.id = cc5.parent
WHERE m.name = 'assign'
-- AND -- Pour sélectionner une catégorie (et sous-catégories)
-- ( cc.id = 53 -- spécifier l'id de la catégorie souhaitée
-- OR cc.path LIKE '%/53/%' -- sur ces deux lignes !
-- ) -- et activer ces 4 lignes (en enlevant les "-- " en début de ligne)
-- Penser à ré-activer les commentaires ensuite (pour tout traiter)
GROUP BY a.id, c.id
Re: Requête permettant de connaitre le(s) fichier(s) attaché aux consignes d'une activité Devoir
Bonsoir Séverin,
Pour ajouter un filtre sur les catégories, en essayant de comprendre la documentation sur les filtres du plugin Configurable reports, j'ai ajouté dans la requête SQL la ligne :
%%FILTER_CATEGORIES:c.category%%
et j'ai ajouté le filtre "Catégories" en cliquant sur l'onglet "Filtres".
Et cela a fonctionné.
Mais ce n'est peut-être pas cela que tu veux faire ...
Christian