Fractionner les tables dans MS-Access

Résolu
Titou1989 - 4 janv. 2024 à 17:00
Titou1989 Messages postés 2 Date d'inscription vendredi 5 janvier 2024 Statut Membre Dernière intervention 9 janvier 2024 - 9 janv. 2024 à 16:06

Bonjour,

Je cherche à réaliser un utilitaire MS-Access pour le suivi d’opérations de construction de logements

L’enregistrement de base sur l’utilitaire est l’opération, à laquelle seront associées plusieurs dizaines de caractéristiques (surface, type de logement, dates d’avancement, législation applicable, prix de revient, etc…).

L’utilitaire est prévu pour traiter entre 50 et 500 opérations, avec entre 100 et 300 champs répartis dans ses tables.

Un grand nombre de ces champs s’appliquent à une seule opération

Voici mon problème :

  • Afin d’éviter d’avoir une table principale avec plusieurs dizaines de champs, difficile à manipuler, j’ai imaginé séparer ces données entre plusieurs tables,  avec :
    • une table mère « T_Ope » qui aurait un champ « Num_Ope » comme clé primaire, généré automatiquement par excel (champ de type « NumeroAuto »)
    • Plusieurs tables filles (par exemple « T_Carac_Ope », qui auraient toutes une clé primaire appelée également « Num_Ope », de type « Entier Long » avec une relation de 1 à 1 avec le champ « T_Ope.Num_Ope »
      • Lorsque je paramètre cette relation, je coche les boutons​​​​​​​
        • ​​​​​​​"Appliquer l'intégrité référentielle"
        • "Mettre à jour en cascade les champs correspondants"
        • "Effacer en cascade les champs correspondants"
  • Mon problème, est que, lorsque je crée un nouvel enregistrement dans la table mère T_Ope (en passant par le menu des tables pour par une fonction dédiée), cela crée bien un nouvel enregistrement dans la table fille T_Carac_Ope, mais le champ T_Carac_Ope.Num_Ope y est égal à 0

Pour sortir de ce problème, j’avais comme idée de paramétrer la valeur par défaut du champ T_Carac_Ope.Num_Ope pour qu’elle soit égale au champ T_Ope.Num_Ope de l’enregistrement correspondant, mais je n’arrive pas à trouver le moyen.

J’ai essayé d’indiquer [T_Ope].[Num_Ope] dans la valeur par défaut du champ T_Carac_Ope.Num_Ope, mais cela me renvoie le message d’erreur suivant "Impossible de trouver le champ [T_Ope].[Num.Ope]"

Pouvez-vous m’indiquer quelle serait la marcher à suivre pour me sortir de cette impasse ?

Merci d'avance pour vos retours !


Windows / Chrome 118.0.0.0

A voir également:

3 réponses

yg_be Messages postés 23327 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 15 novembre 2024 Ambassadeur 1 551
4 janv. 2024 à 19:09

bonjour,

Es-tu certain de ce que tu écris "lorsque je crée un nouvel enregistrement dans la table mère T_Ope (en passant par le menu des tables pour par une fonction dédiée), cela crée bien un nouvel enregistrement dans la table fille"?

Je me demande si ce que tu crois être un enregistrement dans la table fille n'est pas simplement une ligne destinée à encoder le contenu d'un nouvel enregistrement.

L'intégrité référentielle ne va pas créer d'enregistrements, elle ne peut que modifier ou supprimer des enregistrements.

Surtout, je pense que tes tables ne sont pas structurées correctement.  Il n'est pas gênant, en soi, d'avoir de nombreux champs dans une table.  C'est cependant souvent signe d'une mauvaise conception.

Si tu nous donnes beaucoup plus d'information sur ce que tu veux réaliser, nous pourrons peut-être te suggérer commet structurer tes tables.

0
Titou1989 Messages postés 2 Date d'inscription vendredi 5 janvier 2024 Statut Membre Dernière intervention 9 janvier 2024
5 janv. 2024 à 15:31

Bonjour, merci pour ton retour,

Quand je parle de créer un nouvel enregistrement, je suis dans ma table T_Ope, en mode Feuille de Données, et je remplis plusieurs lignes avec des données de test (voir image ci-dessous).

J'ai aussi essayé de créer un formulaire permettant d'afficher toutes les données de la table T_Ope, ce qui permet également de créer de nouveaux enregistrements. Mais la valeur de la clé primaire Num_Ope reste à 0 dans les tables filles.

J'imagine que ce n'est pas très clair, je vais essayer de reprendre depuis le début pour un peu plus de contexte.

Je cherche à créer un utilitaire pour faciliter mon travail et celui des autres chefs de projets dans ma boite. Nous travaillons pour un bailleur social et réalisons des opérations de construction de logements. 

Dans la pratique, nous avons un portefeuille de plusieurs dizaines d'opérations (entre 30 et 40 chacun), qui durent entre 3 et 5 ans chacune (trouver un terrain, concevoir une opération immobilière dessus, obtenir les financements pour la réaliser, désigner les entreprises qui feront les travaux, suivre les travaux, livrer l'opération, gérer le SAV).

Aujourd'hui, nous n'avons pas d'outil de suivi opérationnel dédié, malgré nos demandes, et j'essaie de pallier à ça en bricolant une solution maison (le sujet m'intéresse).

J'ai une formation d'ingénieur bâtiment, mais assez peu de notions de code. J'ai pu avoir une formation de 3 jours sur Access, et j'essaie de partir de ça pour bidouiller un truc.

Je ne maîtrise pas du tout VBA, du coup j'essaie de passer par les fonctions intégrées dans Access, ça fait déjà un paquet de trucs à maîtriser…

L'utilitaire serait centré sur une opération, et centraliserait plusieurs types de données :

  • Des caractéristiques techniques séparées entre
    • celles qui s'appliquent à l'ensemble de l'opération (situation géographique, type de financement, contacts, chef de projet, présence de commerces, Labels de construction, législation applicable, etc...)
    • Le détail des logements qui la composent (n° du logt, surface, typologie, présence d'un Pk, etc...)
  • Des caractéristiques financières (la décomposition du prix de revient de l'opération, et celle de son plan de financement)
  • Des éléments de planning prévisionnel et réalisé (les dates importantes pour le suivi de l'opération : achat du terrain, obtention des financements, démarrage des travaux…)

Aujourd'hui, nous traitons ces données avec des tableaux Excel, mais vu leur nombre, nous ne pouvons avoir un seul tableau, donc on se retrouve avec des données redondantes entre tableaux, des incohérences, du temps perdu...

L'idée de l'utilitaire Access serait de rentrer les informations une seule fois, de pouvoir les modifier au jour le jour, et de publier des Etats prédéfinis en fonction de nos besoins (suivi hebdomadaire, reportings...).

J'ai bien conscience que la masse de travail pour arriver à quelque chose de fonctionnel est considérable, mais, encore une fois, le sujet m'intéresse, et l'expérience acquise pourra toujours me servir pour réaliser des utilitaires un peu moins gros.

Et si j'arrive a faire quelque chose d'un peu fonctionnel, j'essaierai sans doute d'y incorporer de nouvelles fonctionnalités (des dates de suivi plus précises, la création de remarques attribuées à une opération…)

Tu trouveras dans l'image ci-dessous mon projet de tables de relations, pour te faire une idée des volumes dont on parle (les clés primaires sont identifiées avec des étoiles).

Les tables qui aujourd'hui me posent problème sont les suivantes :

  • T_Ope : La table "Mère" qui définit une opération avec sa situation géographique, et son référencement dans ma société
  • T_Carac_Ope : une table dans laquelle j'intègre des données techniques qui s'appliquent à l'ensemble de l'opération. Elles sont assez nombreuses, et pourraient amener à être encore augmentées, d'où mon idée d'en faire une table séparée
  • T_Prix_Revient : Des éléments financiers s'appliquant à l'ensemble de l'opération (il ne s'agit pas de données calculées, mais bien de nombre rentrés par l'utilisateur). Là aussi, possibilité d'en rajouter au fil de l'eau
  • T_Reel_Ope : les dates auxquelles ont été atteints les jalons principaux de l'opération 

Les 3 dernières tables sont reliées à la table T_Ope par le champ Num_Ope, avec une relation de 1 à 1 (un seul enregistrement par opération).

Le champ T_Ope.Num_Ope est un champ de type NuméroAuto 

Par contre les champs T_Carac_Ope.Num_Ope, T_Prix_Revient.Num_Ope et T_Reel_Ope.Num_Ope sont de type entier long :

Le fonctionnement de l'utilitaire serait donc : dans un formulaire qui affiche mes opération, je crée une nouvelle opération en passant par un bouton qui crée simultanément un enregistrement dans chacune des quatre tables ci-dessus, avec un champ Num_Ope identique pour ces quatre nouveaux enregistrements.

C'est là dessus que je bute.

J'espère que ces éléments rendent ma demande un peu plus claire.

0
yg_be Messages postés 23327 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 15 novembre 2024 1 551
5 janv. 2024 à 18:21

Je ne vois toujours pas de bonne raison de faire des tables séparées.

L'idée d'utiliser une clé étrangère comme clé primaire me chiffonne un peu.

L'idée que des champs vont venir se rajouter un peu au hasard m'inquiète un peu.  Il est parfois préférable d'ajouter des enregistrements plutôt que des champs.

Pour les éléments financiers, par exemple, on pourrait imaginer une table "finance", avec des champs ref_opération, libellé, montant.  

0
yg_be Messages postés 23327 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 15 novembre 2024 1 551
Modifié le 5 janv. 2024 à 20:09

Si tu veux faire des tables séparées pour faciliter la vie de l'utilisateur, c'est une fausse piste: la conception des tables doit se faire en fonction de la réalité du monde réel et des données qu'on enregistre, sans tenir compte de comment les éléments seront présentés à l'utilisateur.

La première chose à faire quand on passe de Excel à Access, c'est d'oublier Excel.

Dans Access, il y a les requêtes, les formulaires et les rapports, qui permettent d'interagir avec l'utilisateur en lui cachant la structure des tables.

0
Titou1989 Messages postés 2 Date d'inscription vendredi 5 janvier 2024 Statut Membre Dernière intervention 9 janvier 2024
9 janv. 2024 à 16:06

Ok, merci beaucoup pour ce retour ! Je pense comprendre. Je vais essayer de repenser mes tables avec ces principes en tête !

0