On ne l'a pas mis sur la page précédente, alors le voilà : le fichier à jour et prêt pour les liens multiples
On va monter d'un cran, et raisonner... Une classe comprenant des élèves, tentons de lier ces élèves à leur classe. Il faut un lien entre la table CLA (les classes) et la table PER (les personnes), qui contient des élèves, mais pas seulement. Quels éléments sont nécessaires ?
- Tout d'abord, rappelons-nous que nous avons prévu de "typer" les personnes. en effet, nous avons créé dans la table PER une rubrique Type, qui pourra prendre la valeur "élève", justement pour les élèves (ou professeur pour les professeurs, et ainsi de suite).
- Au passage, profitons en pour voir un petit complément sur les rubriques, fort utile même et surtout quand on débute : la case "commentaire". Dans nos rubriques, allons sur la table PER_Personnes et sélectionnons la rubrique "Type". Son nom apparait dans l'avant dernière case en bas, "Nom :". Nous allons rajouter un commentaire dans la case du dessous, pour se rappeler, si besoin, à quoi sert cette rubrique ou ce qu'elle fait. Prenez ensuite l'habitude de commenter vos rubriques, vous ne le regretterez jamais (alors que l'inverse, oui, trop souvent).
Mais revenons à nos moutons, car la page est encore longue. Nous avons "typé" nos personnes...
Principe
- Il nous faut filtrer sur le type "élève". Pour ce faire, il faudrait au sein de la table CLA, une rubrique constante, de valeur "élève", qui pointerait vers le type de la table PER.
- Ensuite, un élève étant attribué à une classe, il faudrait identifier cette classe dans une clé externe zkf_CLA au sein de la table PER. Chaque fois que cette rubrique sera complétée à l'aide de la valeur de zkp d'une classe, l'élève sera lié à cette classe.
On pourrait donc schématiser le lien comme suit :
Mais il y a manifestement quelque chose qui ne marche pas : le lien ne tient pas compte de la notion de temps.
les élèves ne sont "rattachés" à la classe que pour un an ! Et une classe est un élément intemporel, presque autant qu'un élève... Si nous bâtissons notre lien comme indiqué sur le schéma, soit nos élèves restent dans la même classe pour toute leur existence en tant qu'élève, soit il faut changer dans la table des personnes la classe, au moins chaque année.
Or il faut parler ici d'une notion importante : les données d'un enregistrement au sein d'une table ne devraient pas varier avec le temps. Si c'est le cas (on doit changer les données chaque mois ou chaque année, p.ex.), la structure n'est pas optimale...
La solution passe par donc par une table intermédiaire. Ce type de table assure le lien entre des valeurs de deux tables et permet, justement de créer un enregistrement nouveau pour chaque évènement. En l'occurrence quelle est-elle ? La table des inscriptions, INS, évidemment ! Une inscription est valable pour un temps donné. Et chaque année, nous avons de nouvelles inscriptions, même si nos élèves et nos classes sont les mêmes. Reprenons...
- Pour lier INS à PER, la chose semble claire via un lien double :
- un lien de zkf_PER dans INS vers le zkp de la table PER. C'est le lien de base.
- un lien de zk_Type dans INS vers Type dans PER. Lors de l'inscription, on mettra "élève" dans la rubrique zk_Type de la table INS.
Mais pourquoi ce lien supplémentaire ?!? Nous avons mis en introduction que nous allions raisonner... Donc, on se dit que cette table intermédiaire pourrait aussi nous servir à rattacher des professeurs à une classe pour un an... Pas besoin en effet d'une autre table, il suffit simplement de renseigner dans la rubrique zk_Type de la table INS un autre type que l'élève, le "professeur"... Malin !
- Pour lier INS à CLA, c'est moins évident :
- Tout d'abord, un lien de zkf_CLA dans INS vers le zkp de la table CLA. C'est, à nouveau, le lien de base.
- Pour aller chercher les élèves uniquement, un lien de zkk_Eleve dans CLA vers le zk_Type de la table INS. Ainsi, on n'aura que les élèves, et non les profs (on fera de même pour les profs, à l'aide d'une autre rubrique constante "zkk_Professeur"). C'est un filtre.
- Un lien temporel : dans INS, une rubrique reprenant l'année scolaire d'inscription (fixe, encodé lors de l'inscription), et dans CLA une rubrique qui calcule l'année scolaire en cours (mobile, par définition).
Donc, partant de l'ancre CLA__, on a :
- le zkp de CLA est lié au zkf_CLA de INS, et le zkf_PER de INS est lié au zkp de PER : c'est le double lien classique d'une table intermédiaire (c'est déjà ça !)
- l'année en cours doit être égale à l'année d'inscription : on ne verra que les inscriptions du moment et non les anciennes. C'est OK si le calcul de l'année en cours fonctionne ! C'est le filtre n°1.
- Partant du lien constant zkk_Eleve, et passant par zk_Type de INS, on va chercher uniquement le type "eleve" dans la table PER. C'est le filtre n°2. Ce filtre est nécessaire, car, comme pressenti, on va se servir de INS pour affecter les professeurs aux classes, sans table supplémentaire !
Bon, au travail !
- Dans la table INS, il faut créer les rubriques :
- zkf_CLA (type Nombre)
- zkf_PER (type Nombre)
- zkc_Annee (texte, auto-calcul - nous développerons ce calcul un peu plus loin)
- zk_Type (texte)
- La table PER semble correcte.
- Dans la table CLA, on doit créer
- la rubrique Zkk_Eleve, de type texte et dans laquelle nous allons rentrer une valeur constante et non modifiable
- la rubrique zkc_AnneeCourante.
zkc_Annee et zkc_AnneeCourante
Commençons par ce calcul, qui semble compliqué... Donc, "Gérer la base de données", onglet Rubriques, dans la table CLA_Classes, on crée une rubrique zkc_AnneCourante, et on indique comme type de rubrique "Calcul". Après avoir cliqué sur "Créer", la fenêtre de calcul s'ouvre automatiquement. Que fait-on ?
On ne va pas rentrer tout de suite dans les détails des calculs, mais on va, à nouveau, raisonner pour faire ce calcul :
- On clôture les inscriptions le 30 septembre. Après, ce sont déjà des inscriptions pour l'année suivante.
- On veut définir l'année scolaire en cours sous la forme "2007-2008", par exemple
- Donc, après le 30 septembre (après le 9e mois...), et jusqu'au 31 décembre à minuit, l'année scolaire en cours est de la forme "année de la date actuelle, + un tiret + année de la date actuelle + 1". Si on est le 20 novembre 2007, l'année est bien 2007-2008...
- Après le 31 décembre à minuit, soit le 1er janvier à 0 h 0 m 1sec, et jusqu'au 30 septembre, l'année en cours est "année de la date actuelle - 1, + un tiret + année de la date actuelle". Le 20 mars 2008, l'année est bien 2007-2008...
- Donc, on a deux cas :
- le mois en cours vaut 10, 11 ou 12 (donc > 9) : année du moment + 1 tiret + (année du moment + 1)
- sinon, (année du moment - 1) + 1 tiret + année du moment
Heureusement, FileMaker Pro n'est franchement pas très compliqué dans ses expressions de calcul et on peut bâtir une expression grâce à la fonction "Obtenir ( DateActuelle)", qui donne la date du jour, et au signe "&", qui concatène (colle ensemble) des chaînes alphanumériques.
Pour nos deux options, nous allons utiliser la fonction Cas( Test1 ; Résultat1 ; Résultat par défaut ) qui permet de donner deux résultats différents (et même plus mais on a dit qu'on ne rentrait pas dans les détails tout de suite) en fonction du test (si le test est vrai, le résultat 1 s'applique, sinon c'est le résultat par défaut) :
Mois ( Obtenir ( DateActuelle ) ) > 9 ;
Annee ( Obtenir ( DateActuelle ) ) & "-" & Annee ( Obtenir ( DateActuelle ) ) + 1 ;
Annee ( Obtenir ( DateActuelle ) ) - 1 & "-" & Annee ( Obtenir ( DateActuelle ) )
)
|
Ouf ! Assez lisible, finalement ! C'est intéressant, ce calcul : à chaque fois qu'on ouvre le fichier, l'année scolaire en cours est calculée ! Bien, on rentre ce calcul très compliqué dans la fenêtre de calcul (vous pouvez même faire un copier ici et coller dans la fenêtre FMP), on précise en bas qu'on souhaite un "résultat du calcul" de type texte et on fait OK.
Le même calcul est utilisé dans la table INS, pour déterminer l'année scolaire lors de l'inscription. La seule différence est que, dans ce cas, la donnée ne peut pas être changée, par définition.
Il n'y a pas de souci : au lieu de faire un calcul, on crée une rubrique texte. Plaçons-nous sur la table INS_Inscriptions. On crée la rubrique Zkc_Annee, de type texte puis on clique sur Créer puis Options... Pour ceux qui ont bien suivit, FileMaker va alors émettre un message disant que ce nom existe déjà. C'est que la rubrique est déjà créée. On la sélectionne et on clique sur Options...
Dans l'onglet "Entrée automatique", on sélectionne "résultat de calcul" pour faire un auto-calcul. La fenêtre de calcul s'ouvre, on y place le même calcul que ci-dessus. Comme notre rubrique est de type "texte", le résultat de calcul est indiqué comme "texte" et on ne peut pas le modifier. On valide par OK. On laisse l'option "Ne pas remplacer val. exist. de la rubrique (si il y a lieu)" cochée et on impose que la rubrique soit une entrée non modifiable lors de la saisie (dernière option en bas). C'est tout.
zkk_Eleve
Revenons sur la table CLA_Classes pour créer la rubrique constante zkk_Eleve. On va se référer à ce qui a déjà été fait pour zkk_0 et zkk_1, selon son choix : donnée non modifiable, auto-calcul non modifiable ou calcul, peut importe, du moment que le résultat soit une chaîne de caractères donnant "eleve".
Mouais... Et si il y avait une faute d'orthographe lorsque l'utilisateur encode le type de personne dans la table PER ? On pourrait encoder Eleve, eleve, éleve, élève, Elève, etc... Un truc : comme la rubrique zkk_Eleve est en charge de pointer vers le type de personne dans la table PER, on ne va pas se contenter d'une seule possibilité, mais de multiples, sous forme de liste (une liste étant des chaines de caractères séparées par des retours chariot). Ainsi, pour zkk_Eleve dans la table CLA, on peut se faire un calcul avec une liste de chaines de caractères :
- "Eleve" & "¶" &
- "eleve" & "¶" &
- "éleve" & "¶" &
- "élève" & "¶" &
- "elève" & "¶" &
- "Elève"
Ainsi, on est à peu près sûr de rencontrer toutes les possibilités : la rubrique zkk_Eleves pointant vers la rubrique "zk_Type" de la table INS et la rubrique "Type" de la table PER, on devrait ainsi pouvoir se lier à toutes les combinaisons possibles. Leçon à retenir : lorsqu'on a plusieurs valeurs sous forme de liste dans une rubrique servant de lien, le lien pointera vers toutes les possibilités de la liste. Bien pratique !
Mise en place des liens
Tout est en place, maintenant. Il nous reste à créer les liens. Hop, allons dans l'onglet "Liens".
Tout d'abord, on duplique une OT de la table INS et on place cette nouvelle OT à côté de l'ancre CLA__, en la renommant cla_INS__. On fait de même en dupliquant une OT de la table PER et on la place à droite de la bouée cla_INS__, en la renommant cla_ins_PER__Eleve, car filtrée sur les élèves.
Ensuite, on commence à faire un premier lien, de CLA::zkp vers cla_INS::zkf_CLA :
Ensuite, on clique deux fois sur le lien ainsi créé (le carré avec le signe "=" entre les deux OT, et celui-ci s'ouvre. On y voit effectivement le premier lien créé entre zkp et zkf_CLA. Dans la liste des rubriques à gauche (OT CLA__), on sélectionne zkc_AnneeCourante, et à droite (OT cla_INS__), on sélectionne zkc_Annee, puis on clique sur "Ajouter". Attention, l'option par défaut n'est pas ajouter mais modifier. Si vous l'activez par inadvertance, vous modifier le lien courant.
Ensuite, on fait de même avec, à gauche, la rubrique zkk_Eleve, et à droite, la rubrique zk_Type :
Finalement, ce premier lien complet devrait ressembler à ceci :
On clique sur "OK" pour fermer le lien. Le graphe des liens se présente ainsi, où on voit très bien le lien triple (attention, on a du placer l'OT cla_INS__ au-dessus de cla_MAT__ pour éviter que les liens se croisent) :
Attaquons maintenant le deuxième lien, entre cla_INS__ et cla_ins_PER__Eleve. Les étapes suivantes conduisent à ce double lien :
- Zkf_PER -> Zkp
- Zk_Type -> Type
Ensuite, on peut fermer la boutique, en cliquant dans les coins supérieurs droits de OT, faire un peu de rangement toujours avec les outils d'alignement et laisser le graphe de lien ainsi :
Ouf ! Nos liens multiples sont ainsi créés, et nos élèves de l'année en cours sont liés à leur classe !
Nous verrons plus tard, dans la section des Modèles, comment les utiliser.
Si on veut créer le même genre de lien pour obtenir les professeurs affectés à une classe, il suffit de créer la rubrique constante zkk_Professeur dans la table CLA, sans oublier de lui indiquer une valeur constante et non modifiable. Puis on met en place les nouvelles bouées et leurs liens. On en profite éventuellement pour renommer notre première bouée cla_INS__ en cla_INS__Eleve.
Un petit peu de ménage, et voilà notre graphe complété et rangé. Comme c'est beau !
Nous reste donc à établir quelques principes à respecter dans les liens
Le fichier bien mérité à l'issue de cette longue étape : il est là