Correction de l'étude de cas 2017 du BTS SIO SLAM: AHM-23

Mission 1 - Question 1

Le terme "composants logiciels" peut porter à confusion, ici il faut comprendre quels sont les logiciels type à installer.

Pour que le site web fonctionne il faut

La réponse officielle de l’Education Nationale spécifie :

Un candidat qui cite un logiciel de type FTP sera accepté, un IDE sera pénalisé.On n’acceptera pas WampServer qui n’est pas un environnement de production.

En fait Wampserver est un environnement de production si on modifie les fichiers de configuration.

Mission 1 - Question 2

Créer le schéma entité-association puis créer la base de données sur le serveur en ajoutant les contraintes (clé primaire, clé étrangère).

Exporter les données du tableur vers un format de fichier (CSV par exemple).

Importer les données dans la base de données, il peut être nécessaire d’utiliser des logiciels supplémentaires pour adapter les données du tableur au format de la base de données.

Faire des tests en prenant des données issues du tableur et en les comparant avec les données stockées dans la base. Comparer les résultats.

Mission 1 - Question 3

Il faut associer à chaque utilisateur un rôle par exemple administrateur, visiteur… Chaque rôle ayant des droits particuliers, le chef d’atelier pourrait avoir des droits en écriture sur certaines tables tandis que le comptable n'aura que des droits en lecture.

Mission 1 - Question 4

D’après Internet :

La sauvegarde incrémentielle, ou « incrémental backup » en anglais, se présente comme une solution de sauvegarde de fichiers qui ne tient en compte que l’ensemble des éléments modifiés depuis la dernière sauvegarde. Plus performant et plus rapide qu’une sauvegarde totale, la sauvegarde incrémentielle permet de ne se focaliser que sur les fichiers ayant subi des modifications tout en faisant profiter d’un espace de stockage plus faible.

Question de cours, il faut connaitre la différence entre sauvegarde incrémentielle et sauvegarde différentielle.

Mission 1 - Question 5

Pour reconstituer les données il faut partir de la dernière sauvegarde complète et restaurer toutes les sauvegardes incrémentielles précédentes.

Mission 2 - Question 1

CREATE VIEW stockPalettes AS SELECT SUM(quantiteCommandee) as nbPalettes, SUM(quantiteCommandee*coutRevient) as coutRevientTotal
FROM Commande
JOIN ligneCommande ON Commande.id = LigneCommande.idCommande
JOIN ModelePalette ON ligneCommande.idModele = ModelePalette.id
WHERE estFabrique = 1
AND dateLivraisonReelle IS NULL

Mission 2 - Question 2

Les vues permettent de ne donner l’accès qu’en lecture et de simplifier l’accès à la base de données (on cache la complexité de la base). On peut aussi donner des droits sur la vue aux utilisateurs avec la commande Grant.

Mission 2 - Question 3

Par ailleurs, les entretiens menés avec le comptable et les chefs d'atelier concernés ont permis d'identifier de nouveaux besoins. Vous travaillez avec M. Laplace pour faire évoluer la structure de la base de données initiale :

Deux types de modèle de palette sont désormais proposés :

- des modèles de palette standard, identifiés par une référence catalogue avec des dimensions normalisées ;

- des modèles de palette personnalisés aux dimensions choisies par l’entreprise cliente, dont on doit connaître la raison sociale et le contact, personne qui a validé le modèle

Il faut créer un héritage entre ModelePalette (designation, longueur, largeur, poidsCharge, prixRevient), PaletteStandard et PalettePersonnalisee (RefCatalogue)

On ajoute une relation entre PalettePersonnalisee et Client (ajout de contact dans Client).

Une commande client peut concerner un ou plusieurs modèles de palette, qu’ils soient personnalisés ou standards. Chaque modèle de palette est illustré par un plan (stocké au format PDF) faisant apparaître les composants qui entrent dans la fabrication du modèle de palette, avec pour chacun la quantité à utiliser.

On ajoute PlanPDF dans ModelePalette.

On crée une relation entre ModelePalette et Composant. Dans la relation (n,n) on ajoute la propriété « quantité ».

Fabriquer une palette consiste à découper ses composants dans les matières premières, qui sont les éléments de bois achetés et stockés, puis à les assembler. Les composants d’une même palette sont tous issus d’une même essence de bois.

On relie Composant(id, longueur, largeur, épaisseur) à MatierePremiere.

Un même composant de palette peut être découpé dans différentes matières premières. La quantité découpée sera à mémoriser pour gérer au mieux les stocks de bois. Pour chaque couple composant/matière première, on conservera également les longueurs de perte et de chute.

Longueur de perte : les pertes sont causées par l’épaisseur des traits de scie.

Longueur de chute : la longueur du composant à découper peut être inférieure à celle de la matière première utilisée. Il reste donc après la découpe un morceau appelé chute.

Pour information, les chutes sont valorisées en allume-feux mais cette fabrication annexe ne rentre pas dans le cadre de cette mission.

On ajoute LongueurPerte et LongueurChute dans la relation (n,n) entre Composants et MatierePremiere.

Chaque site dispose de sa propre zone de stockage gérée par le chef d'atelier. Pour accéder à la future application, chaque employé.e du site sera authentifié.e par un identifiant et un mot de passe.

On crée une entité Site et on la relie à MatierePremière. C’est une relation (n,n). On ajoute ensuite une relation entre Employe (identifiant, nom, prénom, motDePasse, estChef) et Site.

Pour gérer correctement les niveaux de stock des matières premières, il est important de pouvoir mémoriser, pour chaque site et pour chaque matière première, la quantité en stock exprimée en m3 mais également le niveau de son stock d’alerte qui permettra de déclencher un réapprovisionnement. Les sorties de stock de matières premières seront prises en compte lorsque les palettes d'une ligne de commande seront déclarées fabriquées.

On ajoute les propriétés stockActuel et StockAlerte dans la relation entre Site et MatierePremiere. On les supprime de MatierePremiere.

En raison de l’éloignement des deux sites, chaque entreprise cliente est rattachée à un seul site.

On ajoute une relation entre Client et Site.

Mission 3 - Question 1

Il n’y a pas de réseau WIFI. L’application native permet de travailler plus facilement en mode déconnecté. Une application web permet aussi de travailler en mode déconnecté mais on aurait pu difficilement stocker la base de données en local.

Mission 3 - Question 2

for (LigneCommande uneLigne : lesLignes)
{
    lesDescriptions.add(uneLigne.getLaMatierePremiere().toString());		
}
//La méthode ToString de MatierePremiere retourne directement la bonne chaîne. Il n’est pas possible de concaténer les chaînes car on n’a pas accès au champs libellé.
ArrayAdapter monAdaptateur = new ArrayAdapter (this, android.R.layout.simple_list_item_1, lesDescriptions);	


ListView listeViewLignes = (ListView) findViewById(R.id.listeLignes);
TextView textView = new TextView(this); 	
textView.setText("Contenu commande n°" + numeroCommande);
listeViewLignes.addHeaderView(textView);
//Il suffit de recopier l’exemple précédent en changeant le texte du header.

listeViewLignes.setAdapter(monAdaptateur); 

Mission 3 - Question 3

uneLigneCommande.ajoutQuantiteMesuree(quantiteMesureeSaisie);

TextView tvTotalLivre;
tvTotalLivre = (TextView) findViewById(R.id.totalLivre);
tvTotalLivre.setText("Quantite totale livrée : " +  String.valueOf(uneLigneCommande.getQuantiteReelleLivree( ) + " m3"); 	

LigneCommandeDAO.miseAJour(uneLigneCommande);

Mission 4 - Question 1

AllumeFeu (unId : entier, unLibellé : chaîne, unNbKilosParSac : entier, unPrixUnitaire : réel, unLibelEssence : Chaine, uneValeurEnergétique : réel) 
Début
	Super(unId , unLibellé , unNbKilosParSac, unPrixUnitaire )   
	libelEssence = unLibelEssence   
	valeurEnergétique = uneValeurEnergétique 
Fin

Le mot clé super appelle le constructeur de la classe mère.

Mission 4 - Question 2

Fonction totalCA() :réel
Var
	uneCommande : Commande  
	total : réel
Début
	total = 0 
	Pour chaque uneCommande dans lesCommandes 
		total = total + uneCommande.getMontantTotal() 
	FinPour
	Retourner total 
Fin

Mission 4 - Question 3

La méthode retourne un dictionnaire qui a pour clés les libellés d’essence de bois de type allumeFeu et pour valeur le total du nombre de sacs.

Mission 4 - Question 4

Fonction getPoidsTotal() : entier
Var
		lesTypesDéchet : Collection de TypeDéchet	
		unTypeDéchet : TypeDéchet
		totalPoids : entier
Début
	totalPoids = 0 
	// On crée à partir du dictionnaire une liste de clés
    //On parcourt ensuite toutes les clés
	lesTypesDéchet = lesLignes.donnerLesClés()
	Pour chaque unTypeDéchet dans lesTypesDéchet
		totalPoids = totalPoids + unTypeDéchet.getNbKilosParSac() * lesLignes.donnerValeur(unTypeDéchet).getNbSacs()	 
		//On récupère le nombre de sacs à partir de la clé unTypeDéchet
	FinPour
	Retourner totalPoids 
Fin