Correction BTS SIO SLAM 2014 Aéroplan

Une correction de l’étude de cas Aéroplan BTS SIO SLAM 2014. La correction peut comporter des erreurs.

Certainement une des études de cas les plus difficiles du BTS SIO. Je suis très critique envers cette étude de cas qui est très mal réalisée.

1.1 À partir de la description des classes métier, indiquer sur votre copie les compléments au diagramme de classes nécessaires pour prendre en compte la gestion des retards.

Pas trop besoin de se casser la tête, la réponse est donnée en regardant le document 7. Il faut ajouter Retard et TypeRetard.

1.2 Rédiger la rubrique "Description de la cause" de la fiche d’incident D24.

A chaque passage dans la boucle on écrase le contenu de la variable res. Il faut ajouter à chaque fois le contenu de res avec la durée du retard.

Dans ce BTS on parle toujours de gestionnaire d'incidents et jamais de gestionnaire de bugs. Ce sont deux outils différents qui se ressemblent mais qui n'ont pas la même fonction. Ici la question mélange allégrement les deux.
1.3 Proposer le code permettant de corriger cette erreur.

il suffit de modifier la ligne res = r.getDuree(); par res = res + r.getDuree();

1.4 Rédiger le test unitaire qui aurait permis de détecter cette erreur.
        TypeRetard leType1 = new TypeRetard(1, "AV", "Occupation des pistes");
		TypeRetard leType2 = new TypeRetard(2, "EV", "Situation climatique");
		Retard unRetard = new Retard(1,"pluie au décollage", leType1, 50);
		Retard autreRetard = new Retard(2,"Vent défavorable", leType2, 20);
		
		mvt.ajouteRetard(unRetard);
		mvt.ajouteRetard(autreRetard);
		assertEquals("Erreur Calcul",70, mvt.retardTotal());

On crée deux retards de 50 et 20 minutes, on les ajoute au mouvement puis on regarde si la somme des retards est égale à 70

2.1 Rédiger la méthode "getImpliqueAeroport" de la classe "Retard".
     public Boolean getImpliqueAeroport() 
     {
	    return impliqueAeroport;
     }
2.2 Rédiger la méthode "dureeReelle" de la classe "Mouvement".
        public int dureeReelle() 
        {
	        return dureeVol + retardTotal() ;
        }
2.3 Rédiger la méthode "dureeRetardResponsable" de la classe "Mouvement"

En C#

         public int dureeRetardResponsable(String situation) 
         {
	        int res = 0;
	        foreach (Retard unRetard in lesRetards) 
            {
		        if (unRetard.getImpliqueAeroport()) {
			        if (unRetard.getType().getCodeSituation() == situation)) 
                    {
				        res += r.getDuree();
			        }
		        }
	        }
	        return res;
        }

Il faut récupérer le CodeSituation du Retard pour le comparer à la situation passée en paramètre, le codeSituation est défini dans la classe TypeRetard, il faut donc récupérer le TypeRetard en premier (unRetard.getType)

2.4 Rédiger la méthode "cumulRetard" de l'application "TripReport".

En C#

    public int cumulRetard(String oaci) 
    {
	    int res = 0;
    
	    foreach(Mouvement unMouvement in lesMouvements) 
        {
	
            String situation = null;		
            if (unMouvement.getAeroportDepart().getOaci() == oaci) 
            {
			    situation = "AV";
		    } 
        
		    if (unMouvement.getAeroportArrivee().getOaci() == oaci) 
            {
				    situation = "AP";
		    }
		
		    if (situation == "AV" || situation == "AP") 
            {
			    res += unMouvement.dureeRetardResponsable(situation);
		    }
	    }
	    return res;
}
   
3.1 Proposer une modélisation de la nouvelle base de données à mettre en place en intégrant la base existante et les nouveaux besoins en information (l’ensemble de la solution proposée devra être cohérent avec le formalisme choisi).
Pour cette question je donne directement les réponses issus d'un corrigé type de l'Education Nationale. Typiquement c'est le type d'exercice très scolaire qui n'a pratiquement aucun intérêt sauf de faire croire qu'on peut modéliser la gestion des avions d'un aéroport en une demi-heure!

Schéma entité-association Aéroplan

La plus grande difficulté est de trouver la relation Affecter. C'est une relation d'aggrégation entre Rôle et Mouvement/Personnel (ne manque-t-il un carré entourant les entités sur le schéma pour montrer l'aggrégation?). Un rôle est lié à un Mouvement et à un Personnel car il faut regarder dans le document 8 et s'apercevoir que Lefevre Martine est passée de chef de cabine à hôtesse en changeant de vol! C'est un peu surréaliste, on a envie d'attribuer une fonction au Personnel.

Schéma relationnel Aéroplan

Ici on donne le schéma relationnel basé sur le schéma entité-association. Et là on voit apparaître le problème de la modélisation, il est facile de mettre de mettre de l'héritage un peu partout après il faut quand même le transcrire dans la base de données

Ce n'est absolument pas le cas ici, l'héritage (qui est noté sur 7 points sur le schéma entité-association!) a complétement disparu. J'imagine qu'on se base sur le nombre d'heures de vol pour déterminer le type de personnel, il doit être Null dans le cas d'un commercial.

A noter la traduction de l'aggrégation en schéma relationnel. La table Equipage a 2 clés primaires et une clé étrangère.

4.1 Écrire la requête permettant d’extraire les informations nécessaires à l’obtention de la liste des retards du jour.
    SELECT numeroVol, raison, duree, nbPassagers, distance
    FROM RETARD JOIN MOUVEMENT
    ON MOUVEMENT.id=RETARD.idMvt
    WHERE GETDATE(dateHeureDepart)=YESTERDAY()
    ORDER BY numeroVol

Il faut faire attention à la phrase située en dessous du tableau: Un vol est listé si son départ a eu lieu la veille de l’édition de la liste. C'est pour çela qu'il faut utiliser la fonction Yesterday().

4.2 Expliquer la signification de la valeur 2 contenue dans la case grisée du tableau de bord "Ventilation des retards".

Deux vols de moins de 1500 km ont été retardé entre 15 et 120 minutes en mars 2014.

4.2 Expliquer la signification de la valeur 2 contenue dans la case grisée du tableau de bord "Ventilation des retards".
    SELECT COUNT(*) 
    FROM volsRetardes WHERE retardTotal >=15 AND retardTotal < 120 AND distance < 1500 AND year(dateheuredepart)=2014
                              AND month(dateheuredepart)=3
4.4 Écrire la fonction stockée "get_indemnisation_globale" qui retourne le montant global des indemnités d'un mouvement dont l'ID est passé en paramètre.
Le feu d'artifice final! Exercice excessivement compliqué pour rien. La fonction stockée la_distance ne sert qu'à aider les étudiants qui ne se souviennent pas de la syntaxe des fonctions en SQL. Aprés si on a jamais utilisé INTO avec un SELECT je ne suis pas sûr que cela soit d'un grand intérêt. On répéte deux fois que l'indemnisation est de 250 euros pour les petits trajets mais à la fin on s'aperçoit que cette valeur doit être récupérée d'une procédure. Pourquoi get_param_identité n'est-elle pas dans les annexes?
    /* récupération des informations nécessaires */
    SELECT distance, nbPassagers, estIntracom , retardTotal
    INTO var_distance,  var_nb_passagers, var_est_intracom, var_retart
    FROM volsRetardes
    WHERE idMvt=id_mouvement
    var_ indemnite:=0;
    IF( var_retard >p_ seuil_retard) THEN
        var_ indemnite:= p_montant1;
        IF (var_distance>p_distance1) THEN
            var_ indemnite:= p_montant2
            IF(var_est_intra_com = 0 AND var_distance>p_distance2) THEN
            var_ indemnite:= p_montant3
            END IF
        END IF
    END IF
    var_ indemnite:= var_ indemnite * var_nb_passagers;
    RETURN var_ indemnite;
    END
4.5 Proposer et justifier la création de nouveaux indicateurs permettant d’affiner l’analyse des retards.

Connaître le nombre de retards par type de retard

Connaître le nombre de retards par aéroport (au départ, à l'arrivée)

Connaître le nombre de retard par jour de la semaine et créneau horaire

Connaître le nombre de retard en fonction du type de vol intercommunautaire ou non

Quelle horrible étude de cas! Ne pourrait-on pas se concentrer sur la programmation et pas sur des règles métiers complétement superficielles? On a plus l'impression que le but est de perdre les étudiants en rajoutant des petites phrases un peu partout que de tester véritablement le niveau de l'étudiant en programmation.