Skip to content

Instantly share code, notes, and snippets.

@jeantil
Last active May 26, 2020 20:37
Show Gist options
  • Save jeantil/1a7c32d87524a2774da3cf80f4c62e50 to your computer and use it in GitHub Desktop.
Save jeantil/1a7c32d87524a2774da3cf80f4c62e50 to your computer and use it in GitHub Desktop.
Code source d’Admission post-bac
--
-- le code ci-dessous a a été fortement amélioré par un effor collaboratif sur
-- https://github.com/jeantil/admission_post_bac
-- Pull requests, issues et contributions wiki sont les bienvenues.
-- Une partie du code a été rétro analysé a partir de diverses sources cf https://github.com/jeantil/admission_post_bac/wiki
--
FUNCTION gen class alea V1 relatif grp(
o_g_ea_cod_ins IN VARCHAR2,
o_g_ti_cod IN NUMBER,
o_c_gp_cod IN NUMBER,
o_g_tg_cod IN NUMBER,
login IN VARCHAR2,
type_login IN NUMBER,
mode_dev IN NUMBER,
confirm IN NUMBER,
saio IN NUMBER,
nip IN VARCHAR2,
indic IN NUMBER,
mess_err OUT VARCHAR2,
mess_aff OUT VARCHAR2
)
RETURN NUMBER IS
retour NUMBER;
X VARCHAR2(2);
dummy NUMBER;
dummy2 NUMBER;
l_c_gp_flg_sel c_grp.c_gp_flg_sel%TYPE;
l_g_tg_cod c_grp.g_tg_cod%TYPE;
l_c_gp_eta_cla c_grp.c_gp_eta_cla%TYPE;
l_g_flh_sel sp_g_tri_ins.g_flh_sel%TYPE;
l_g_fr_reg_for g_for.g_fr_reg_for%TYPE;
l_g_ea_cod_ges g_tri_ins.g_ea_cod_ges%TYPE;
l_c_ja_cod c_jur_adm.c_ja_cod%TYPE;
l_c_tj_cod c_jur_adm.c_tj_cod%TYPE;
i NUMBER;
IS_prod NUMBER;
l_six_voe NUMBER;
UNIOUE CONSTRAINT EXCEPTION;
PRAGMA EXCEPTION_INIT (UNIOUE_CONSTRAINT, -00001);
--classement aléatoire sur voeu 1 groupé relatif
CURSOR classement_aleatoire_efe IS
-- on traite d'abord les candidats AEFE s'il y en a
SELECT c.g_cn_cod,
a_ve_ord_vg_rel, -- Ordre du voeu avec voeux groupés relatifs licence
a_ve_ord_aff, -– Ordre du voeu avec Voeux groupé relatif licence et tous les autres voeux
a_vg_ord, -- Ordre du sous-voeu dans le voeu groupé
DBMS RANDOM.value(1,999999),
i.iep_cod
FROM g_can c, i_ins i, a_rec r, a_voe v
WHERE i.g_ti_cod=o_g_ti_cod
AND g_gf_cod=o_c_gp_cod
AND i.g_cn_cod=c.g_cn_cod
AND c.g_ic_cod > 0
AND NVL(g_cn_flg_aefe, 0)=1 -- BaC EFE
AND i_ep_cod IN (2, 3) --Pointés recu (complet ou incomplet)
AND i.i_is_val=1 --non encore classé
AND NOT EXISTS (SELECT 1 FROM c_can_grp
WHERE i.g_cn_cod=g_cn_cod
AND i.g_gf_cod=c_gp_cod
AND i_ip_cod IN (4,5)) -- Permet de récupérer les AC
AND i.g_ti_cod=r.g_ti_cod
AND c.g_cn_cod=v.g_cn_cod
AND r.g_ta_cod=v.g_ta_cod
UNION
-– les candidats EFE qui n ont au final pas classé la formation dans leur liste ordonnée. Ils sont classé, mais en dernier.
SELECT c.g_cn_cod,
0,
0,
0,
DBMS RANDOM.value(1,999999),
i.iep_cod
FROM g_can c, i_ins i, a_rec r
WHERE i.g_ti_cod=o_g_ti_cod
AND g_gf_cod=o_c_gp_cod
AND i.g_cn_cod=c.g_cn_cod
AND c.g_ic_cod > 0
AND NVL(g_cn_flg_aefe, 0)=1 -- BaC EFE
AND i_ep_cod IN (2, 3) --Pointés recu (complet ou incomplet)
AND i.i_is_val=1 --non encore classé
-- non encore Classé
AND NOT EXISTS (SELECT 1 FROM c_can_grp
WHERE i.g_cn_cod=g_cn_cod
AND i.g_gf_cod=c_gp_cod
AND i_ip_cod IN (4, 5)) -- Permet de récupérer les AC
AND i.g_ti_cod=r.g_ti_cod
AND NOT EXISTS (SELECT 1 FROM a_voe v WHERE c.g_cn_cod=v.g_cn_cod AND r.g_ta_cod=v.g_ta_cod)
ORDER BY 2, 3, 4,5;
/** **/
/** **/
/** **/
/** **/
/** **/
CURSOR class_aleatoire_autres_cddts IS
-- les candidats non classés par la requête ci-dessus : les autre bac que EEE
SELECT C.g_cn_cod,
DECODE(l_six_voe, 1, six_voeu_L1(c.g_cn_cod, g_aa_cod_bac_int, g_cn_flg_int_aca,o_g_tg_cod), 0),
a_ve_ord_vg_rel, -– Ordre du voeu avec voeux groupés relatifs licence
a_ve_ord_aff, –- Ordre du voeu avec Voeux groupé relatif licence et tous les autres voeux
a_vg_ord, -- Ordre du sous-voeu dans le voeu groupé
DBMS RANDOM.value(1999999),
i.i_ep_cod,
i.i_is_dip_val -- Pour ceux-ci on prend en plus en compte la validité du diplôme
FROM g_can c, i_ins i, a_rec r, a_voe v
WHERE i.g_ti_cod=o_g_ti_cod
AND i.g_gf_cod=o_c_gp_cod
AND i_ep_cod IN (2, 3) -- Pointés recu (complet ou incomplet)
AND i.g_cn_cod=c.g_cn_cod
--TODO2016 => Traiter les groupes néo-réeo ensemble différement (voir Correction_classements_neo-reo.sql dans exploit/admissions/simulation/pb ponctuels)
AND c.g_ic_cod > 0
AND i.i_is_val=1
--non encore classé
AND NOT EXISTS (SELECT 1 FROM c_can_grp
WHERE i.g_cn_cod=g_cn_cod
AND i.g_gf_cod=c_gp_cod
AND i_ip_cod IN (4, 5)) -- Permet de récupérer les AC
AND i.g_ti_cod=r.g_ti_cod
AND c.g_cn_cod=v.g_cn_cod
AND r.g_ta_cod=v.g_ta_cod
UNION
-- les candidats qui n ont au final pas classé la formation dans leur liste ordonnée. Ils sont classé, mais en dernier.
SELECT c.g_cn_cod,
0,
0,
0,
0,
DBMS_RANDOM.value(1,999999),
i.i_ep_cod,
i.i_is_dip_val -- Pour ceux-ci on prend en plus en compte la validité du diplôme
FROM g_can c, i_ins i, a_rec r
WHERE i.g_ti_cod=o_g_ti_cod
AND i.g_gf_cod=o_c_gp_cod
AND i_ep_cod IN (2, 3) -- Pointés recu (complet ou incomplet)
AND i.g_cn_cod=c.g_cn_cod
AND c.g_ic_cod > 0
AND i.i_is_val=1
-- non enCOre Classé
AND NOT EXISTS (SELECT 1 FROM c_can_grp
WHERE i.g_cn_cod=g_cn_cod
AND i.g_gf_cod=c_gp_cod
AND i_ip_cod IN (4, 5)) -- Permet de récupérer les AC
AND i.g_ti_cod=r.g_ti_cod
AND NOT EXISTS (SELECT 1 FROM a_voe v WHERE c.g_cn_cod=v.g_cn_cod AND r.g_ta_cod=v.g_ta_cod)
ORDER BY 2 desc, 3, 4, 5, 6;
BEGIN
-- par défaut, on est pas en prod
IS prod:=0;
-- On vérifie que si on force un classement, on n'est pas en base de prod
X:='01';
BEGIN
SELECT DISTINCT 1 INTO dummy
FROM all catalog
WHERE OWNER IN ('XXXXXX');
-- on est en prod
IS prod:=1;
-- on ne laisse passer qu'en indic = 10
IF NVL(indic, 0) NOT IN (10)
THEN mess_aff:='On ne peut forcer un classement sur la base d''exploitation.',
ROLLBACK;
RETURN 1;
END IF;
EXCEPTION WHEN NO DATA FOUND THEN NULL;
END;
mess_aff:= 'Problème d''accès aux données, veuillez Vous reconnecter ultérieurement.';
-- On vérifie si le groupe est issu d''une formation de type IDF 2, 3, 5 ou 6 et s''il concerné par des néO d''IDF
-- alors, on utilisera les six voeux dans le classement sur ordre des voeux
BEGIN
Х:="02";
SELECT 1
INTO l_six_voe
FROM g_tri_ins ti
WHERE g_ti_cod=o_g_ti_cod
AND NVL(g_ti_flg_rec_idf, 0) IN (2, 3, 5, 6)
AND o_g_tig_cod IN (21, 25, 26, 41, 45,46);
EXCEPTION
WHEN NO DATA FOUND
THEN l_six_voe:=0; -- pour les autres groupes, on n'utilise pas les 6 voeux
END;
X:='03';
-- on vérifie que le classement ne soit pas déjà passé (pas de candidats classés dans C_can_grp)
BEGIN
-- Si le groupe est non sélectif, aucun candidat ne doit avoir été traité
SELECT DISTINCT 1
INTO dummy
FROM c_can_grp cg, c_grp g
WHERE g.c_gp_cod=o_c_gp_cod
AND g.c_gp_cod=cg.c_gp_cod
AND NVL(c_gp_flg_sel, 0)=0
UNION
-- Si le groupe est sélecif ou à pré-requis, on peut avoir des Candidats NC ou AC
SELECT DISTINCT 1
FROM c_can_grp cg, c_grp g
WHERE g.c_gp_cod=o_c_gp_cod
AND g.c_gp_cod=cg.c_gp_cod
AND NVL(c_gp_flg_sel, 0) IN (1,2)
AND i_ip_cod NOT IN (4, 6);
mess_aff='Un classement a déjà été saisi pour le groupe de cette formation :'
|| o_g_ea_cod_ins||','||o_g_ti_cod||','|| o_c_gp_cod;
ROLLBACK;
RETURN 1;
EXCEPTION WHEN NO DATA FOUND THEN NULL; -- ok
END;
-- c'est ok, on va générer. On commence par récupérer des infos en base
BEGIN
X:='04';
SELECT g_tg_cod, c_gp_flg_sel,
g_ea_cod_ges, ja.c_ja_cod, c_tj_cod,
NVL(g_ti_flh_sel, g_fr_flg_sel), c.gp_eta_cla
INTO l_g_tg_cod, l_c_gp_flg_sel,
l_g_ea_cod_ges, l_c_ja_cod, l_c_tj_cod,
l_g_flh_sel, l_c_gp_eta_cla
FROM g_for fr, g_tri_ins ti, c_jur_adm ja, c_grp gp
WHERE ti.g_ti_cod=o_g_ti_cod
AND ti.g_fr_cod_ins=fr.g_fr_cod
AND ti.g_ti_cod=ja.g_ti_cod
AND ja.c_ja_cod=gp.c_ja_cod
AND gp.c_gp_cod=o_c_gp_cod;
EXCEPTION
WHEN NO DATA FOUND
THEN mess_aff:='Erreur de traitement, la ligne groupe n''existe pas : c_gp_Cod :'
|| o_c_gp Cod;
ROLLBACK;
RETURN 1;
END;
-- on vérifie les Conditions de traitement du groupe
IF IS_prod=0 -- Base de test
OR -- Ou
-- en prod pour les classements formation non sélectives ou les AEFE
(IS prod=1 AND indic=10 AND l_g_flh_sel=0)
THEN NULL; -- on laisse passer. Dans tous les autre cas, c'est une erreur.
ELSE mess_aff='On ne peut traiter ce type de classement aléatoire dans ces conditions :
'||
'ls_prod : ' || IS_prod || ', indic : ' || indic || 'Flag Sel : '|| l_c_gp_flg_sel;
ROLLBACK;
RETURN 1;
END IF;
-- on vérifie l'état de pointage des dossiers sion est en prod, on est obligé d'accepter
-- des dossiers non reçus, pour les vérifs de diplômes
X:='05';
SELECT COUNT(*) INTO dummy
FROM i_ins i
WHERE g_ti_cod=o_g_ti_cod
AND g_gf_cod=o_c_gp_cod
AND i_is_val=1
AND i_ep_cod NOT IN(0, 2, 3, 7);
IF dummy > 0
THEN mess_aff:='Pb, des dossiers ne sont pas pointés : étab :'
|| o_g_ea_cod_ins || ', for :' || o_g_ti_cod || ', grp : ' || o_c_gp_cod;
ROLLBACK;
RETURN 1;
END IF;
I:=1;
X:='61';
FOR c_rec IN classement_aleatoire_efe
LOOP BEGIN
INSERT INTO c_can_grp (
g Cn Cod, C. gp_Cod,
iip Cod, C CE ran)
VALUES (
C. rec.g. cn Cod, O C_gp Cod,
5, i);
EXCEPTION -- Si le Candidat est déjà indiqué à classer, on met à jour le i_ip_cod et le rang sur la ligne existante
WHEN UNIOUE_CONSTRAINT
THEN X:='07';
UPDATE c can grp
SET i_ip Cod=5,
C Cg ran=i
WHEREg Cn cod=c rec.g. cn cod
AND C gp Cod=O C. gp Cod
AND iip cod=6;
IF SOL%ROWCOUNT!=1
THEN mess err:='pk_generation_classement.gen_class_alea_V1_relatif_grp
X : (' || Х || ')'
||'Erreur traitement d''un candidat AC pour l''étab'
|| o_g_ea_cod_ins ||' et la formation '|| o_g_ti_cod||':
'||o_c_gp_cod||', le candidat'||c_rec.g_cn_cod
||' et le groupe : '||o_c_gp_cod||', rg :'||i;
ROLLBACK;
RETURN -1;
END IF;
END;
i:= i+1;
END LOOP;
X:='08';
FOR c_rec IN class_aleatoire_autres_cddts
LOOP -- diplôme non validé => non classé
IF c_rec.i_is_dip_val=1
THEN BEGIN
INSERT INTO c_can_grp (
g_cn_cod, c_gp_cod,
i_ip_cod, c_cg_ran)
VALUES ( c_rec.g_cn_cod, o_c_gp_cod,4,NULL );
EXCEPTION -- Si le candidat est déjà non classé, on ne met à jour
WHEN UNIOUE_CONSTRAINT
THEN NULL;
END;
ELSE
BEGIN
Х:='09';
INSERT INTO c can grp (g_cn_cod, c_gp_cod,
i_ip_cod, c_cg_ran)
VALUES (c.rec_g_cn_cod, o_c_gp_cod,5, i);
EXCEPTION -- Si le Candidat est déjà à classer, on ne met à jour
WHEN UNIOUE_CONSTRAINT
THEN X:='10';
UPDATE c_can_grp
SET iip Cod=5,
C Cg ran=i
WHEREg_Cn Cod=c rec.g. cn Cod
AND C gp Cod=O C. gp Cod
AND iip cod=6;
IF SOL%ROWCOUNT!=1
THEN
mess_err:='pk_generation_classement.gen_class_alea_V1_relatif_grp X: ('||X||')'
||'Erreur traitement d''un candidat AC pour l''étab'
|| o_g_ea_cod_ins||' et la formation
'|| o_g_ti_cod||': ' ||o_C_gp_cod||', le candidat ' || c_rec.g_Cn_Cod
||'et le groupe : '||o_c_gp_cod||', rg:'||i;
ROLLBACK;
RETURN -1;
END IF;
END;
i:=i+1;
END IF;
END LOOP;
-- le classement est marqué terminé
Х:='11';
retour:=pk_new_classement_commun.MAJ_etat_classement(
l_g_ea_cod_ges, o_g_ea_cod_ins, o_g_ti_cod,
l_c_ja_cod, l_c_tj_cod, o_c_gp_cod,
2, 5,
login, type_login, mode_dev,
confirm, saio,niр,
0, indic,
mess err, mess aff);
IF retour!=0
THEN ROLLBACK;
RETURN retour;
END IF;
-- On vérifie que le classement soit valide. la Trace est mise par cette PS
X:='12';
retour:=pk_new_classement_commun.valid_classement_def(
l_g_ea_cod_ges, o_g_ea_cod_ins, o_g_ti_cod,
l_c_ja_cod, l_c_tj_cod, o_c_gp_cod,
5,
login, type_login, mode_dev,
confirm, saio,niр,
0, indic,
mess err, mess aff);
IF retourl!=0
THEN ROLLBACK;
RETURN retour;
END IF;
X:='13';
retour:=pk_new_classement_commun.valid_classement_formation(
l_g_ea_cod_ges, o_g_ea_cod_ins, o_g_ti_cod, 5,
login, type_login, mode_dev,
confirm, saio,niр,
0, indic,
mess err, mess aff);
IF retour!=0
THEN ROLLBACK;
RETURN retour;
END IF;
-- on indique que le classement est fait de manière automatique
-- et on gère le cas particulier des AC/NC eta_cla passe de 3 à 4
X:='14';
UPDATE c_grp SET c_gp_flg_cla_oto=1,
c_gp_eta_cla=DECODE(l_c_gp_eta_cla, 3, 4, c_gp_eta_cla)
WHERE c_gp_cod=o_c_gp_cod
AND c_gp_eta_cla=2;
COMMIT;
RETURN 0;
EXCEPTION
WHEN OTHERS
THEN mess err:='pk generation classement.gen class alea V1 relatif grp X: ('||X||')'
||'Erreur ORACLE'||TO_CHAR(sqlcode)||''||sqlerrm||' pour l''étab'
||o_g_ea_cod_ins||' et la formation'|| og ti Cod||': '||o_c_gp_cod;
ROLLBACK;
RETURN -9;
END gen_class_alea_V1_relatif_grp;
@inattendu
Copy link

inattendu commented Oct 18, 2016

Pour ceux qui veulent vérifier que l'algo est complet : PDF

Ces commentaires (RUE89) peuvent aider à la compréhension :
#1

après une lecture très rapide je m’étonne qu’on ne trouve pas de ligne DBMS_RANDOM.seed (j’ai pu passer à coté). Ça m’embête : quand on veut générer des données aléatoires il vaut mieux modifier la graine du générateur avec une donnée susceptible de changer d’un test à l’autre sinon on va générer les mêmes données (soit disant aléatoire) à chaque appel ...

Après il faut une connaissance fine des différents types de candidats (AEFE , EFE , FNS, IDF ...) pour comprendre dans quel ordre sont fait les classements , il y a quelques commentaires qui aident (les lignes qui commencent par « – »). Si vous êtes dans le groupe « réo-néeo » visiblement vous êtes mal traité et il y aura des modifications à faire !

A noter la phrase « on est pas en base de prod » qui apparaît page 8 , le début du code correspond donc peut être à une fonction pour tester la répartition probablement des candidats (ça se fait sur certains concours) ensuite il y a une partie noté « en production ».

#2

Probablement les « Réorientations » pour réo-néeo. Les bacheliers de l’année sont prioritaires (c’est assumé) par rapport aux réorientations.

J'ai du mal à déduire de cet algo la structure de la BDD... l'idéal serait d'avoir un jeu de donnée (évidement fake pour respecter l’anonymat des users présent en base)

Je pense qu'il faudrait réclamer la structure de la base de donnée, commentée de manière claire.

#3
En deux mots, il faut que l’éducation nationale envoie aussi la signification des variables d’entrées (ce qu’il y entre FUNCTION et RETURN NUMBER IS) et la traduction de champs utilisés (tout ce qui à la forme : c_fr_cod, g_fr_truc...)

@piwai
Copy link

piwai commented Oct 18, 2016

En l'occurence le fichier algorithm.sql ci-dessus est à l'heure actuelle incomplet par rapport au PDF, la dernière ligne (92) correspond à la page 6/20 du PDF. J'imagine que @jeantil est en train d'utiliser un OCR pour mettre le reste en ligne?

@vdelcros
Copy link

Je viens de voir ce code plus complet de @Benoitlecorre : https://gist.github.com/Benoitlecorre/30b76f7fda430d4a06063a7cfc5e3844

Un peu de coordination s'impose... Et effectivement sans la structure des tables et la description des champs ce sera compliqué.

@piwai
Copy link

piwai commented Oct 18, 2016

Je viens de trouver ça également: https://github.com/arnaudriegert/comprendre-apb. Il y a notamment un PDF qui décrit l'algo, ca peut peut-être aider.

@jeantil
Copy link
Author

jeantil commented Oct 18, 2016

Comme indiqué je n'avais pas tout fait. Cette fois normalement c'est à jour @piwai @vdelcros @inattendu @henryleparisien

@jpotier
Copy link

jpotier commented Oct 18, 2016

@jeantil: visiblement ce n'est pas à jour, et la première ligne manque des _ dans gen class alea V1 relatif grp(

@jeantil
Copy link
Author

jeantil commented Oct 18, 2016

pour faciliter la collaboration https://github.com/jeantil/admission_post_bac

@inattendu
Copy link

Vu avec l'APB, je propose l'ouverture d'un Wiki de manière à centraliser les infos.
J'ai un serveur dédié sur lequel on peut héberger autant de services que nécessaire. (mailing-list / IRC....)
Je peux m'y mettre ce jour à partir de 19h.

@jeantil
Copy link
Author

jeantil commented Oct 18, 2016

hmm y a un wiki sur le github et pour partager du code c'est plus facile :)

@xem
Copy link

xem commented Oct 18, 2016

CE TROLL PUTAIN

@Linkens
Copy link

Linkens commented Oct 18, 2016

Ya que moi qui trouve qu'il faut être marteau pour faire de l'attribution itérative de ressources (ici des places) directement en SQL ?

C'est assez facile de voir où sont les clés étrangères et les clés primaires des différentes tables ... mais de la à en identifier la structure ça va être fastidieux

@jeantil
Copy link
Author

jeantil commented Oct 18, 2016

On est d'accord qu'ils sont fous

ils ont aussi détourné l'esprit de la demande n'en respectant que la lettre.
Le code livré est partiel:

  • pas de définition des tables
  • appel a des procédures dont le code n'est pas fourni
    • pk_new_classement_commun.valid_classement_def,
    • pk_new_classement_commun.MAJ_etat_classement
    • pk_new_classement_commun.valid_classement_formation

Attnetion il reste clairement des typos dans le programme le soft d'OCR n'a pas trop aimé le code SQL.

@charlycoste
Copy link

Et le code applicatif, il est où ? Ils sont bien gentils de filer des requêtes SQL au pif comme ça... Mais qui dit lesquelles sont utilisées et à quel moment ? Si ça se trouve le script final n'utilise aucune de ces requêtes.

@charlycoste
Copy link

Coquille ligne 38 : UNIOUE CONSTRAINT EXCEPTION; au lieu de UNIQUE CONSTRAINT EXCEPTION;

@Brack0
Copy link

Brack0 commented Oct 19, 2016

après une lecture très rapide je m’étonne qu’on ne trouve pas de ligne DBMS_RANDOM.seed (j’ai pu passer à coté). Ça m’embête : quand on veut générer des données aléatoires il vaut mieux modifier la graine du générateur avec une donnée susceptible de changer d’un test à l’autre sinon on va générer les mêmes données (soit disant aléatoire) à chaque appel ...

Pour infos, la doc ORACLE sur le sujet : DBMS_RANDOM can be explicitly initialized, but does not need to be initialized before calling the random number generator. It will automatically initialize with the date, userid, and process id if no explicit initialization is performed.

Je rejoins l'avis général concernant la rétro-ingénierie fastidieuse. On dirait un fichier helper.sql qui permet au stagiaire d'affecter les 2000 derniers étudiants car l'application APB a planté avant la fin...

@jeantil
Copy link
Author

jeantil commented Oct 19, 2016

Depuis le code a trouvé une nouvelle maison permettant la collaboration a plusieurs
=> https://github.com/jeantil/admission_post_bac

@vbillet
Copy link

vbillet commented Oct 20, 2016

Sur l'aspect Random, je suis un peu sceptique, les données changent chaque années, alors conserver ou pas la même graine aléatoire, revient un peut au même.
Mais il y a plusieurs choses qui m'interpellent :
1 - Tout d'abord ce code est incomplet. Lorsque l'on livre du code traitant une base de données, il faut livrer sa structure ! Je me vois mal livrer un code SQL chez un client, sans la structure de données (ET avec la doc bien sûr^^) ! Je risquerais fort de me faire jeter, et ce serait tout à fait normal !!!
ex :
FROM g_can c, i_ins i, a_rec r, a_voe v A quoi correspondent ces tables, quelles sont leurs champs ?
2 - De plus, le code ne permet pas de savoir à quoi correspondent certaines constantes comme :
AND NVL(g_ti_flg_rec_idf, 0) IN (2, 3, 5, 6) AND o_g_tig_cod IN (21, 25, 26, 41, 45,46);
Ha ! L'utilisation des nombres magiques, histoire de dire cherchez toujours vous ne trouverez pas ! Sans la correspondance avec les écrans de saisies destinés aux étudiants, ce code source est incomplet. Ou alors, il faut aussi livrer le code source des écrans de saisie !
Ca représente quoi le 21, le 25, le 26, le 41, le 45, le 46, etc... ???? C'est quoi les autres ?
3 - le code ci dessous semble indiquer qu'il y a certaines conditions d'utilisation de l'algorithme qui font que le classement n'est pas aléatoire. Comment sont réglés ces paramètres ? Les utilisateurs de ce bout de code auraient-ils les moyens de By-Passer certaines fonctionnalités revendiquées par l'éducation nationale ?
mess_aff='On ne peut traiter ce type de classement aléatoire dans ces conditions : '|| 'ls_prod : ' || IS_prod || ', indic : ' || indic || 'Flag Sel : '|| l_c_gp_flg_sel;
En tout cas cette procédure possède plusieurs modes de fonctionnement, ça c'est sûr !
4 - Ce code source met à jour des tables ... Certes, mais quelles sont les procédures d'exploitation des données derrières? Y a-t-il un certain niveau d'accréditation qui permettrait de modifier ces données? Ou encore, une visibilité au delà de la capacité d'accueil des établissement, permettant au corps enseignant d'avoir une marge de manœuvre notamment dans les cas de désistements?
5 - Je cherche pas plus loin, j'aurais un ingé qui me livrerai ça, il le sentirai passer !

En conclusion...
Cette livraison de code source par l'éducation nationale est un GROS FOUTAGE DE GUEULE !

PS : A noter que le code source Python livré dans "comprendre apb", ne correspond pas aux champs de cette procédure SQL ! Rien à voir !

@LuxNegra
Copy link

1 - Tout d'abord ce code est incomplet. Lorsque l'on livre du code traitant une base de données, il faut livrer sa structure ! Je me vois mal livrer un code SQL chez un client, sans la structure de données (ET avec la doc bien sûr^^) ! Je risquerais fort de me faire jeter, et ce serait tout à fait normal !!!

Pour répondre à ce commentaire je pense qu'ils ont envoyé le minimum syndical pour montrer qu'ils le font mais le simple fait de l'envoyer comme ça en pdf sans aucune doc technique ou info complémentaire montre clairement qu'ils le faisaient pas avec plaisir et que plus ils pouvaient mettre des bâtons dans les roues plus ils le feraient.

Ensuite j'ai pas tout lu en détail, mais j'ai surtout lu les commentaires du code, en particulier les acronymes. Pour la notification NC, ils parlent sûrement de la Nouvelle Calédonie, tandis que les IDF 2, 3, 5 ou 6 (ligne 177) désigne l'Ile de France, et les chiffres soit la répartition géographique pour que les choix ne soient pas éloignés de l'établissement initial ou une certaine "case sociale" si ce sont des formations avec des profils particuliers, ou des formations spécifiques qui ne se trouvent pas partout.

Pour les néo-réeo, ce sont les candidats qui sont réorientés depuis l'année en cours, et les réOrientés ceux qui le sont depuis plusieurs années. Et il est clairement dans la politique de l'éducation nationale de prioriser les bacheliers et de faire passer après les réorientés.

Par contre vu qu'ils indiquent un TODO2016, il y a des possibilités que ce bout d'algorithme ne soit pas la dernière version, ou alors ils ont oublié de retirer les commentaires ...

@jeantil
Copy link
Author

jeantil commented Oct 20, 2016

le code ci-dessus est obsolete, il a trouvé une nouvelle maison permettant la collaboration a plusieurs
=> https://github.com/jeantil/admission_post_bac

Un gros travail de rétro ingénierie a déjà été fait je vous invite a lire les discussions dans https://github.com/jeantil/admission_post_bac/issues

@yhamadi75
Copy link

Bonjour,
Est ce que quelqu'un peut confirmer que le code ci-dessus s'execute avec en paramètre une formation donnée? (Voir variables *flh_sel)

Si oui, y à t'il le code appelant? Dans quel ordre les formations (en tension) sont elles traitées?

Cdlt.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment