IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Access Discussion :

Problème avec requête ajout pour des enregistrements de tables liées [AC-2016]


Sujet :

Access

  1. #1
    Membre à l'essai
    Homme Profil pro
    Technicien
    Inscrit en
    Décembre 2014
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Technicien

    Informations forums :
    Inscription : Décembre 2014
    Messages : 23
    Points : 12
    Points
    12
    Par défaut Problème avec requête ajout pour des enregistrements de tables liées
    Bonjour,

    Je ne suis pas parvenu à résoudre ce problème.

    J'ai créé 2 tables Liées : T_Prix et T_SousPrix (à gauche sur le schéma)
    Des copies de ces 2 tables vierges ont été envoyées à 2 personnes (Julien et JR) afin qu'elles les complètent suivant leur domaine de compétences.

    Pour faire simple, (voir schéma ci dessous), je souhaite rapatrier les données des tables de Julien et JR, dans les tables T_Prix et T_SousPrix. Afin d'avoir une table générale T_Prix et une table générale T_SousPrix. Toutes les tables copies ont une structure identique aux tables sources. Il y a donc des numéros automatiques de ID identiques sur toutes les copies

    Nom : Import_Table_liées.jpg
Affichages : 74
Taille : 72,9 Ko

    J'ai un message de violation de clé lorsque je déclenche une requête ajout sur la table T_SousPrix

    Merci d'avance pour votre aide.

  2. #2
    Rédacteur/Modérateur
    Avatar de loufab
    Homme Profil pro
    Entrepreneur en solutions informatiques viables et fonctionnelles.
    Inscrit en
    Avril 2005
    Messages
    12 015
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Entrepreneur en solutions informatiques viables et fonctionnelles.
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2005
    Messages : 12 015
    Points : 24 550
    Points
    24 550
    Par défaut
    Bonjour,

    Cela peut provenir de 2 choses :

    1) cas : Il faut créer d'abord un enregistrement dans la table mère (T_Prix) pour pouvoir créer un enregistrement dans la table enfant (T_sousprix). Et ce n'est pas le cas.

    2) cas :
    Pour transférer des enregistrements d'une table avec ID numéroAuto (donc normalement toutes tables correctement créées) il ne faut pas transférer le N° ID ou bien lui ajouter la valeur du dernier ID de la table destination.

    Exemple :
    Tsource ID = 1, 2 ,3 ...500
    TDestination ID = 1,2,3 ... 1200

    Nouvel tsource.id + max(tdestination.id)
    1 devient 501, 2 = 502, ... 1200 = 1700.
    Faire la même chose avec la clef externe dans la table enfant source.

    Evidemment avant de lancer ce type de requête Ajout il faut faire un compactage de la base destination qui contient les tables (pas les attaches).

    Cordialement,

  3. #3
    Membre à l'essai
    Homme Profil pro
    Technicien
    Inscrit en
    Décembre 2014
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Technicien

    Informations forums :
    Inscription : Décembre 2014
    Messages : 23
    Points : 12
    Points
    12
    Par défaut
    Merci d'voir répondu,
    je préfère garder la numérotation automatique de l'Id car je pense ne pas pourvoir repasser en numérotation auto une fois l'import des enregistrements effectué.
    Par ailleurs comment le nouvelle Id dans la table mère se met à jour dans la table enfant ?
    Les liens sont rompus lorsque j'importe des enregistrements d'un table parent vers l'autre table parent ...

  4. #4
    Rédacteur/Modérateur
    Avatar de loufab
    Homme Profil pro
    Entrepreneur en solutions informatiques viables et fonctionnelles.
    Inscrit en
    Avril 2005
    Messages
    12 015
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Entrepreneur en solutions informatiques viables et fonctionnelles.
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2005
    Messages : 12 015
    Points : 24 550
    Points
    24 550
    Par défaut
    Qui parle d'abandonner la numérotation auto ?

    Dans ton modèle tu indiques 1 table mère et 1 enfant, rien d'autre. Donc l'id de l'enfant on s'en tape complètement. L'important c'est la clef externe qui suit la même méthode.

    Ils sont rompus car tu n'utilises pas la même méthode.

    Donc je répète :

    1) tu compactes ta destination
    2) tu sauves ta clef max de la table mère de la destination (dmax(), select max()... à toi de choisir ta méthode)
    3) tu transfères tes enregistrements de mère Source vers Destination en ajoutant à ton id source le max que tu as sauvé. (id+Idmax)
    4) tu transfères tes enreg d'enfant source vers destination en ajoutant à clef externe le max sauvé en (2).
    Inutile de transférer l'id enfant dans ce cas, puisqu'il n'y a pas de lien vers d'autre tables enfant de cet enfant. Si ce le cas utiliser la même méthode.

    Compris ?

  5. #5
    Membre expert
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Octobre 2012
    Messages
    1 873
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2012
    Messages : 1 873
    Points : 3 459
    Points
    3 459
    Par défaut
    Bonjour Mstrflux, loufab,

    Juste une précision, lors d'un insert il est possible d'affecter un nombre choisi au champ numéro auto à la condition que ce nombre ne soit pas déjà existant dans la table. C'est ce que loufab vous donne comme solution pour importer les données de vos 2 autres tables.

    Bonne journée

  6. #6
    Membre à l'essai
    Homme Profil pro
    Technicien
    Inscrit en
    Décembre 2014
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Technicien

    Informations forums :
    Inscription : Décembre 2014
    Messages : 23
    Points : 12
    Points
    12
    Par défaut
    Bonjour à vous deux et merci pour vos éclairages.

    J'ai pris le temps de comprendre et de faire des essais avant de revenir vers vous.

    J'ai bien compris la démarche, par contre bien que cela vous semble évident je ne sais pas et n'arrive pas malgré plusieurs recherches à modifier l'Id en numérotation auto

    Lorsque j'essaie de modifier la valeur de l'Id de la table source en allant sur l'onglet général -> Nouvelles valeurs je n'ai que deux choix possibles "incrément ou aléatoire"

    Nom : Changement Id.jpg
Affichages : 40
Taille : 145,0 Ko

    Concrètement comment faites-vous pour rajouter la valeur de Idmax de la table destination à l'Id de la table source ?

    J'arrive seulement par une requête ajout à faire repartir les enregistrement de la table destination à partir d'un ID que je peux fixer. Mais si je rajoute à cette requête les champs de la table source la requête plante

    Nom : Rqt_Demarrage.jpg
Affichages : 37
Taille : 12,0 Ko

    MERCI d'avance pour votre aide et PATIENCE.

  7. #7
    Membre expert
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Octobre 2012
    Messages
    1 873
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2012
    Messages : 1 873
    Points : 3 459
    Points
    3 459
    Par défaut
    Bonjour Mstrflux,

    Tel que suggéré par loufab, il faut d'abord compacter la base, ensuite vous récupérer le dernier numéro, ici j'ai mis 500. Ensuite une requête qui ressemblerait à ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    INSERT INTO T_Prix ( Id_Prix, Domaine, Titre, Libellé, etc... )
    SELECT [Id_Prix]+500 AS NouveauID, T_PrixJR.Domaine, T_PrixJR.Titre, T_PrixJR.Libellé, etc...
    FROM T_PrixJR;
    C'est identique pour la table "T_SousPrix" sauf qu'ici le champ impliqué est "ID_Prix" de la table sous prix.

    Bonne journée

  8. #8
    Membre à l'essai
    Homme Profil pro
    Technicien
    Inscrit en
    Décembre 2014
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Technicien

    Informations forums :
    Inscription : Décembre 2014
    Messages : 23
    Points : 12
    Points
    12
    Par défaut
    Merci pour l'aide apportée Robert.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XL-2010] Utilisation d'un UserForm pour ajouter/modifier des enregistrements
    Par adashame dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 02/08/2014, 22h15
  2. Réponses: 3
    Dernier message: 26/10/2008, 11h10
  3. Réponses: 3
    Dernier message: 08/06/2007, 13h26
  4. Réponses: 3
    Dernier message: 10/05/2007, 10h42
  5. [VB.net] Probleme avec une dll pour l'enregistrer
    Par Diablo_22 dans le forum Windows Forms
    Réponses: 6
    Dernier message: 09/08/2006, 20h41

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo