La référence externe, où lorsque les doublons sont indispensables
Par David Julot le jeudi, 25 juin 2009, 16:00 - La chronique de David Julot - Lien permanent

Un SGBD, Système de Gestion de Bases de Données, a pour objectif de stocker une masse d'information très importante, et de permettre le tri, la recherche et la gestion de ces données.
Un SGBD-R, Système de Gestion de Bases de Données Relationnelles, a pour objectif d'éviter la redondance d'information, par la mise en place de liens relationnels. Un SGBD-R fait partie des SGBD.
FileMaker Pro est un SGBD-R, il permet donc, via la mise en relation des tables qui composent une base de données, d'éviter la redondance d'information. Mais il est des situations où la redondance, doublon, devient utile voire crucial !
Pourquoi éviter les doublons dans une base de données ?
Pour plusieurs raisons :
- Nous sommes foncièrement fainéants, nous n'aimons pas effectuer plusieurs fois la même tâche ;
- Cela prend du temps à saisir toutes ses informations ;
- C'est source d'erreur ;
- Le jour où il faut mettre à jour l'information, il faut la modifier à tous les endroits où elle est stockée.
Les liens relationnels, qui mettent en relation les tables d'une base de données, permettent de stocker l'information à un endroit et un seul. La réalisation d'une base de données relationnelles c'est l'art d'organiser l'information.
Si nous prenons l'exemple d'une base de contacts professionnels, où l'on souhaite par exemple avoir une fiche par société et une fiche par contact. Précisons un peu plus les choses : un contact est rattaché à une société et une seule, et une société peut avoir plusieurs contacts. Nous avons donc le schéma relationnel suivant :

Le lien relationnel entre la table SOCIÉTÉS et la table CONTACTS, permet, entre autres :
- De connaître les coordonnées de la société pour laquelle travaille le contact ;
- De mettre à jour simplement les coordonnées de la société, en un seul endroit (la table SOCIÉTÉS) et en une seule fois.
Qui n'a pas réalisé en son temps une base de données avec une seule table où chaque enregistrement correspond à un contact, comme ceci :

Ce qui pose problème dès lors que la société change de coordonnées. Il faut partir à la recherche de tous les contacts pour mettre à jour, enregistrement par enregistrement, les informations modifiées. Il faut en plus être très vigilant, éviter des erreurs à la saisie... Bref un travail titanesque. Voilà pourquoi les liens sont utiles, on crée une table regroupant toutes les informations propres à la SOCIÉTÉ, ce qui nous permet d'avoir un enregistrement par société, on réduit le nombre de rubriques dans la table CONTACTS et on obtient le schéma relationnel présenté plus haut.
Qu'est-ce que la référence externe vient faire là ?
La référence externe est une option d'entrée automatique de rubrique. Mais avant d'en parler, prenons un deuxième exemple : celui de la facturation.
Une FACTURE peut avoir plusieurs LIGNES DE FACTURATION. Sur une LIGNE DE FACTURATION, il ne peut y avoir qu'une seule référence de PRODUIT. Un PRODUIT (une référence de produit si vous préférez) peut se retrouver sur plusieurs LIGNES DE FACTURATION. Et une LIGNE DE FACTURATION appartient à une FACTURE et une seule. Nous obtenons le schéma relationnel classique suivant :
Et tout va pour le mieux dans le meilleur des mondes...
Que se passe-t-il lorsque nous souhaitons augmenter le prix des produits ? Dans le cas présent, une modification du PRIX UNITAIRE des PRODUITS modifie l'ensemble des LIGNES DE FACTURATION, donc par conséquence les FACTURES ! Il ne faut pas oublier qu'une fois la facture établie, elle ne doit plus être modifiable, c'est une pièce comptable !
Il faut donc pouvoir figer le prix unitaire des produits lors de leur saisie dans une facture. Pour pouvoir figer le prix unitaire, il faut donc stocker sa valeur lors de saisie de la facture. Pour cela nous n'avons pas d'autre moyen que de stocker le prix unitaire dans une rubrique de la table LIGNES DE FACTURATION.
La rubrique PRIX UNITAIRE de la table LIGNES DE FACTURE est de type nombre et a une option d'entrée automatique de type référence externe. Cette option permet la « récupération » d'une valeur de rubrique suivant un lien, ou plus simplement : elle permet de copier-coller une valeur. Voici d'ailleurs la définition de cette rubrique :
Les deux options, Démarrage par la table et Référence externe à partir d'une table liée, définissent le contexte, c'est-à-dire quel chemin doit prendre FileMaker Pro pour aller récupérer la valeur.
Une fois la valeur récupérée, elle est stockée dans la rubrique. Ce qui permet de la « figer », donc de figer la facture et d'éviter toute modification de cette dernière si l'on modifie le prix unitaire des produits. Cela permet aussi de modifier le prix unitaire sur une facture, sans que cela le modifie dans la table PRODUITS, si vous souhaitez appliquer un prix « à la tête du client » !
Si vous avez aussi besoin de figer la désignation du produit, il faut là encore créer une rubrique dans la table LIGNES DE FACTURES avec une référence externe.

Rappelez-vous de ceci : dès que vous avez besoin de figer une valeur à un instant t, utilisez l'option référence externe en entrée automatique.
Ce fonctionnement occasionne bien évidemment des doublons, mais ceci est nécessaire à l'exploitation des données.
Un petit souvenir de l'ancien temps...
Pour celles et ceux qui se souviennent des versions antérieures à FileMaker Pro 3, c'était, à l'époque, la seule option possible pour récupérer une valeur d'un autre fichier. Nous n'avions dans ces anciennes versions que la possibilité d'avoir 1 table par fichier et aucun lien relationnel... À la belle époque 
Pour celles et ceux qui se souviennent des versions 3 à 6, la référence externe était une des possibilités qui nous permettait d'obtenir une valeur d'un fichier de troisième niveau. Car dans ces versions, si un fichier A était lié à un fichier B lui-même lié à un fichier C, si A devait voir ou utiliser une valeur de C, on utilisait une référence externe dans B... À la belle époque là encore 
C'est tout pour aujourd'hui
Je vous laisse méditer sur le sujet, en attendant le prochain... Si vous souhaitez que j'aborde un point ou un sujet en particulier, n'hésitez pas en m'en faire part. En attendant, je vous souhaite une excellente fin de semaine.
Commentaires
Salut David ! Heureux de voir que tu recommences ta prose ! Petit commentaire, toutefois : la réf externe peut aujourd'hui être avantageusement remplacée par un auto-calcul non modifiable, qui donne le même résultat. L'avantage est qu'il peut être rendu totalement non modifiable, si les modèles sont bien faits. Par contre, dans le menu, la fonction "Enregistrements" "Mettre à jour contenu rubr." peut fiche en l'air toutes les références externes dûment et patiemment collectée... Enfin, c'est mon point de vue.
Christian
Tout à fait d'accord Christian,
Ceci est bien évidemment une des méthodes possibles pour figer une information. Concernant la protection des valeurs, nous pouvons supprimer purement et simplement l'item mettre à jour contenu rubr. avec FileMaker Pro Advanced.
Merci beaucoup David. Comme Christian, je suis heureux de voir que tu as recommencé la chronique.
Merci Elmar, Christian, et tous les lecteurs anonymes ou non de ce blog...
Bonjour,
Je viens de découvrir votre blog. Ma question n'a rien à voir avec le sujet du jour, mais j'espère qu'elle vous intéressera. Est-il possible de créer une liste de valeur à partir des données liées d'une table externe, qu'il s'agisse de nombres mais surtout de textes ? Enfin, j'ai survolé vos billets et je ne vois pas la suite de vos chroniques plug-in prévues l'année dernière. Dommage.
Bien cordialement,
Michel
Bonjour Michel,
Merci pour votre message. Effectivement votre question ne concerne pas le sujet de cette chronique, mais je vais y répondre très volontiers. Pour obtenir la liste des valeurs issues d'une table externe vous avez à votre disposition la fonction LISTE(table::rubrique).
Merci David, ça marche, c'est probablement élémentaire pour vous mais je n'étais pas parvenu à trouver la réponse dans le manuel ni dans "The missing manual".
Il y a un autre obstacle qui me chipote avec ce bon vieux FM. Dans l'exemple classique ci-dessus, l'entrée d'une référence produit appelle une référence externe ( une ligne). Pour un abonnement à un fanzine, de 7 N°s par an par exemple, est-il possible par la création de la facture à l'abonné de générer les 7 lignes des 7 numéros suivants auxquels il aura droit ?
BAV
Michel
Bonjour Michel,
Pour obtenir de l'aide sur FileMaker, ce blog n'est pas aussi approprié que le forum FMSource (http://www.fmsource.fr/forum).