[Résolu] Liens entre plusieurs tables

Discussions sur le module de base de données Base et plus particulièrement sur le langage SQL ou sur les connexions aux SGBD tiers.
Les questions sur les macros doivent être postées dans la section dédiée en dessous.

Modérateur : Vilains modOOs

Règles du forum
Cette section est dédiée au module Base et plus particulièrement sur le langage SQL ou sur les connexions aux SGBD tiers. Vous ne devez pas poster ici de questions sur les macros mais utiliser la section éponyme.
Pour accélérer les réponses, vous pouvez mettre en ligne votre base en joignant un fichier ODB : comment faire.
martinterrier
Membre OOrganisé
Membre OOrganisé
Messages : 97
Inscription : 21 avr. 2021 19:28

[Résolu] Liens entre plusieurs tables

Message par martinterrier »

Bonjour à tous,

Nouveau dans l'utilisation de BASE, je suis bloqué à une étape très proche du démarrage mais dont je ne parviens pas à me sortir.

Je cherche à créer une base de donnée qui me permette de suive la vie administrative d'un dossier.

Ma table principale est la table "SUIVI". J'ai trois tables "secondaires" qui chacune contiennent au moins un champ que l'on retrouve dans la table principale : un numéro employé, un numéro employeur, un code produit, ainsi que plusieurs autres champs que l'on ne retrouvera pas dans la table "SUIVI".

Je cherche à faire un lien entre ces tables afin de ne pas avoir à répéter, par exemple, une information telle que la ville de l'employeur, ou les détails associés à un code produit, dans ma table "SUIVI". Mon objectif serait, en faisant l'usage du publipostage sur libre WRITER (ou peut-être sur RAPPORT mais je ne maitrise pas l'outil), de pouvoir créer des documents sur lesquels les informations de ma table SUIVI, mais également les informations associées des tables secondaires (et non reprises, donc, dans ma table SUIVI), puissent figurer automatiquement. Concrètement, j'aurais besoin de quelques informations de chacune de ces tables pour envoyer un courrier : l'état civil de l'employeur, le code produit, l'état civil de l'employé, etc.

Cette opération me permettrait :
- d'éviter la redondance d'information entre deux tables
- de profiter un maximum de mes tables "secondaires", qui sont elles-mêmes des tableur extraits de logiciels.
Concrètement, cela simplifierait ma table SUIVI et m'évite d'avoir à reprendre tout un tas d'informations qui viennent de sources fiables, dans ces tables "secondaires".

Deux questions, donc :
- Sur un plan général, je ne suis pas sur qu'il s'agisse de la bonne démarche ou manière de concevoir le logiciel ODB.
- Et sur un plan pratique je suis en échec lorsque je veux créer des relations (par exemple entre le champ "Numéro employé" de TABLE_SUIVI et "Numéro employé" de TABLE_EMPLOYE_ETAT_CIVIL": j'obtiens le message d'erreur :
Primary or unique constraint required on main table: "Table_EMPLOYE_ETAT CIVIL" in statement [ALTER TABLE "Table_SUIVI" ADD FOREIGN KEY ("Numéro employé") REFERENCES "Table_EMPLOYE_ETAT CIVIL" ("Numéro employé")]

Je retrouve ce message d'erreur sur d'autres forums mais pas associés à ma démarche exactement; de telle sorte que je ne parviens pas à m'en sortir.

J'ai joint ma base en PJ.

Je m'excuse par avance si ces difficultés ne naissent que de ma méconnaissance du logiciel, j'ai cherché en vain avant d'écrire ici...
Et je remercie chaque futur contributeur par avance pour le temps qu'il me consacrera!

Bonne journée!
Pièces jointes
Test.odb
(5.04 Kio) Téléchargé 61 fois
Dernière modification par micmac le 23 avr. 2021 16:58, modifié 2 fois.
Raison : [Résolu] remplace [RESOLU] + ajout de la coche verte
Obligation de version :
Libre Office 7.1.8.1 (x64) sous Windows 10
Avatar de l’utilisateur
jeanmimi
Grand Maître de l'OOffice
Grand Maître de l'OOffice
Messages : 16955
Inscription : 03 mars 2006 17:02
Localisation : Venise verte

Re: Liens entre plusieurs tables

Message par jeanmimi »

Bonjour,
D’abord, il faut passer les ID des Tables en INTEGER Auto-valeur : Oui
Puis, dans la Table_Suivi, il faut aussi passer les enregistrements en Relation avec les Tables en ID INTEGER
Une fois que c'est fait, les Relations entre Table se font correctement.
Relation_Suivi_Dossier.jpg
Les modifications sont effectuées sur le Champ ID_employeur de la Table_Suivi et ID en Autovaleur : Oui pour la Table_Suivi et la Table_Employeur.
A faire pour les autres champs de la Table_Suivi et les autres Tables.
Base_suivi_dossier.odb
Modifications effectuées sur Table_Suivi et Table_Employeur.
(6.08 Kio) Téléchargé 69 fois
LibreOffice : Version : 24.2.1 (x64)(14 mars 2024)
Adoptium JRE ou Oracle JRE (x64), Windows 10, Thunderbird, Firefox
martinterrier
Membre OOrganisé
Membre OOrganisé
Messages : 97
Inscription : 21 avr. 2021 19:28

Re: Liens entre plusieurs tables

Message par martinterrier »

Bonsoir,

Merci pour votre réponse très rapide.

J'ai pu reproduire le cheminement que vous m'avez montré.

Cela suscite de nouvelles questions, afin que je comprenne bien le fonctionnement de la Base :

1) Vous avez renommé un des champs "Numéro employeur" en "ID_Numéro_employeur" : Le ID a-t-il un rôle purement "cosmétique", c'est à dire pour le distinguer des autres champs, ou cela a-t-il un rôle concret?
Pareillement, l'ajout des _ est-il là parce que préférable à l'espace (vecteur de confusion)?

2) Je pensais que la relation apparaissait visuellement de champ à champ : elle part bien du champ concerné (par ex. ID_Numéro_employeur", mais le lien n'arrive pas sur le champ "Numéro_employeur" de la table "Employeur_Etat_Civil" mais sur celui "ID". Aucun autre champ ne fonctionne Or, le champ ne porte pas le même nom ("Numéro employeur"), sans ID et sans _. Je me demande donc comment la reconnaissance est faite entre les deux tables? Comment est-ce que le logiciel "sait" qu'il va chercher le champ "Numéro employeur" plutôt qu'un autre? S'il ne s'agissait que du même type de colonne (INTEGER dans les deux cas), comment distinguerait-il deux champs qui seraient, dans la même table INTEGER?

3) Ce type de relation ne peut-il être fait qu'entre champs INTEGER? En effet, cela me fait rencontrer une difficulté dans le cadre de la tabe "CODE_PRODUIT" dont le champ "Code" n'est pas censé être un nombre mais 3 lettres (type ERC.

Je remets la base actualisée et, pour le point 3) avec le champ "Code" en INTEGER.

Bonne soirée,
Bien cordialement!
Pièces jointes
Base_suivi_dossier.odb
(6.09 Kio) Téléchargé 59 fois
Obligation de version :
Libre Office 7.1.8.1 (x64) sous Windows 10
Avatar de l’utilisateur
jeanmimi
Grand Maître de l'OOffice
Grand Maître de l'OOffice
Messages : 16955
Inscription : 03 mars 2006 17:02
Localisation : Venise verte

Re: Liens entre plusieurs tables

Message par jeanmimi »

Vous posez des questions de fond qui dépassent mes compétences, plus empiriques que théoriques.
Pour le point 1 : les espaces dans les noms des champs, ainsi que les caractères accentués, rendent plus compliqués les analyses des enregistrements par les instructions SQL
Pour les points 2 et 3 : les champs ID INTEGER en Autovaleur sont garants de la non redondance des ID. Pour être en relation, les champs ID des deux Tables doivent être de même qualité : INTEGER en relation avec INTEGER, TEXTE avec TEXTE.
L’avantage des champs INTEGER c’est qu’ils sont économes en octets et simples à analyser.
LibreOffice : Version : 24.2.1 (x64)(14 mars 2024)
Adoptium JRE ou Oracle JRE (x64), Windows 10, Thunderbird, Firefox
martinterrier
Membre OOrganisé
Membre OOrganisé
Messages : 97
Inscription : 21 avr. 2021 19:28

Re: Liens entre plusieurs tables

Message par martinterrier »

Bonjour,

Merci pour vos réponses. Cela m'a permis de mieux comprendre le fonctionnement de ces liens.

je retiens également :
- qu'il ne peut y avoir qu'un lien entre deux tables
- qu'au moins un des deux champs en relation doit être une clé primaire.

J'ai donc supprimé les champs "ID" des tables "secondaires" de mon exemple, ce qui m'a permir le lien "direct" que j'évoquais entre deux champs d'une table.

Bon weekend,
Bien cordialement.
Obligation de version :
Libre Office 7.1.8.1 (x64) sous Windows 10
Verrouillé