Notes ou suppression d'un cours: Erreur Plus d'un enregistrement trouvé dans fetch()

Notes ou suppression d'un cours: Erreur Plus d'un enregistrement trouvé dans fetch()

par Thierry SEBBAR,
Nombre de réponses : 5

Bonjour;

Pour un cours, quand je clique sur le menu Notes ou que j'essaye de le supprimer, j'ai cette erreur :

[error] 700#700: *49429738 FastCGI sent in stderr: "PHP message: Default exception handler: Plus d'un enregistrement trouvé dans fetch() ! Debug:
Error code: morethanonerecordinfetch
* line 482 of /lib/setuplib.php: moodle_exception thrown
* line 163 of /lib/grade/grade_object.php: call to print_error()
* line 354 of /lib/grade/grade_item.php: call to grade_object::fetch_helper()
* line 1125 of /lib/grade/grade_item.php: call to grade_item::fetch()
* line 335 of /lib/gradelib.php: call to grade_item::fetch_course_item()
* line 376 of /lib/gradelib.php: call to grade_needs_regrade_final_grades()
* line 90 of /grade/report/user/index.php: call to grade_regrade_final_grades_if_required()" while reading response header from upstream, server: *.parisdescartes.fr, request: "GET /grade/report/user/index.php?id=5177 HTTP/1.1", upstream: "fastcgi://127.0.0.1:9000", host: "moodle.parisdescartes.fr", referrer: "https://moodle.parisdescartes.fr/grade/report/user/index.php?id=5177"

En lisant ce post :

https://moodle.org/mod/forum/discuss.php?d=360882

J'ai bien 2 enregistrements avec chacun de ces 2 selects (2 espaces/conteneurs de notes):

select * from mdl_grade_items where courseid=5177 and categoryid is null

select * from mdl_grade_categories where courseid=5177

D'après le même post, si on supprime les 2 enregistrements dans chacune des 2 tables mdl_grade_items et mdl_grade_categories, ça corrige le problème.

Est-ce qu'il y aurait des effets de bord en supprimant ces enregistrements ?

Et si on supprime (dont l'id est le plus petit) qu'un seul dans chaque table ?

Merci.


Moyenne des évaluations  -
En réponse à Thierry SEBBAR

Re: Notes ou suppression d'un cours: Erreur Plus d'un enregistrement trouvé dans fetch()

par Patrick Lemaire,
Avatar Développeurs de plugins Avatar Documentation writers Avatar Moodleurs particulièrement utiles Avatar Testeurs Avatar Traducteurs

Bonjour Thierry,

Franchement, jamais encore rencontré surprise

Mais à lire le tout dernier message du fil de discussions évoqué (celui de Terus E-learning du vendredi 18 janvier 2019, 07:36), il faudrait en effet supprimer l'ID le plus bas.

Je ne suis pas très fan de modifier la base de données en direct mais là, visiblement, il ne devrait déjà pas y avoir de doublon. Donc il y a un bug en amont. Pas d'autre solution pour le moment apparemment. Je te recommande la prudence et donc un sauvegarde complète de la base de données avant d'opérer.

Bon courage et bonne continuation ! Tiens nous au courant !! clin d’œil
Patrick

En réponse à Patrick Lemaire

Re: Notes ou suppression d'un cours: Erreur Plus d'un enregistrement trouvé dans fetch()

par Nicolas Martignoni,
Avatar Développeurs Avatar Développeurs de plugins Avatar Documentation writers Avatar Moodleurs particulièrement utiles Avatar Testeurs Avatar Traducteurs

> Donc il y a un bug en amont

Ou bien y a-t-il eu déjà une modification manuelle de la BDD ? Moi aussi, pas du tout fan de telles modifications, qui la plupart du temps débouchent sur des incohérences impossibles à rattraper.

Je déconseille fortement.

En réponse à Nicolas Martignoni

Re: Notes ou suppression d'un cours: Erreur Plus d'un enregistrement trouvé dans fetch()

par Thierry SEBBAR,

Bonjour;

Modifier la base n'est pas anodin: j'ai supprimé les enregistrements mais j'ai toujours un problème (d'allocation mémoire ...).

D'après ce Post https://moodle.org/mod/forum/discuss.php?d=360882 :

The problem was caused by two users creating assignments in the same course at exactly the same time.

Je l'ai vu sur les enregistrement qui ont les mêmes dates de création ...


Merci.

En réponse à Thierry SEBBAR

Re: Notes ou suppression d'un cours: Erreur Plus d'un enregistrement trouvé dans fetch()

par Thierry SEBBAR,


Bonjour;

J'ai pu résoudr le problème en faisant du nettoyage pour enlever les doublons créés dans les tables  mdl_grade_items et mdl_grade_categories.

J'avais ceci (remarquez les dates de création identiques):

select * from mdl_grade_categories where courseid=5177

(`id`, `courseid`, `parent`, `depth`, `path`, `fullname`,  .... `timecreated`, `timemodified`, `hidden`)
(31351, 5177, NULL, 1, '/31351/', '?', 13, 0, 0, 1, 0, 1531762611, 1531762611, 0);
(31350, 5177, NULL, 1, '/31350/', '?', 13, 0, 0, 1, 0, 1531762611, 1531762611, 0)

select * from mdl_grade_items where courseid=5177

(`id`, `courseid`, `categoryid`, `itemname`, `itemtype`, `itemmodule`, `iteminstance`, `itemnumber`, ... `timecreated`, `timemodified`)
(58685, 5177, 31351, 'Partie 1 à rendre ici', 'mod', 'assign', 3864, 0, .... 1531762611, 1531762611),
(58683, 5177, NULL, NULL, 'course', NULL, 31351, NULL, ... 1531762611, 1531762611);
(58684, 5177, 31350, 'Partie 1 à rendre ici', 'mod', 'assign', 3864, ...1531762611, 1531762611),
(58682, 5177, NULL, NULL, 'course', NULL, 31350, NULL,..., 1531762611, 1531762611);

Il faut supprimer l'un des records (dont l'id est la plus petite ?) de la table mdl_grade_categories puis les records correspondants de la table mdl_grade_categories:

- table mdl_grade_categories : supprimer le record id 31350 (il faut qu'il n'y ai q'une seule racine pour le cours)
- table mdl_grade_items : supprimer les records  58682 et 58684 liés au record 31350 de la table mdl_grade_categories, le lien se fait par :
mdl_grade_items.categoryid = 31350 
sinon (si mdl_grade_items.categoryid est null) par  mdl_grade_items.iteminstance = 31350


Thierry.

En réponse à Thierry SEBBAR

Re: Notes ou suppression d'un cours: Erreur Plus d'un enregistrement trouvé dans fetch()

par Patrick Lemaire,
Avatar Développeurs de plugins Avatar Documentation writers Avatar Moodleurs particulièrement utiles Avatar Testeurs Avatar Traducteurs

Tiens nous au courant d'éventuels suites à ces modifications en base de données ! On croise les doigts pour toi 🤞

Patrick