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

Requêtes et SQL. Discussion :

Requête d'ajout dans 2 tables avec liaison un-à-un [AC-365]


Sujet :

Requêtes et SQL.

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur
    Inscrit en
    Mars 2002
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Ingénieur

    Informations forums :
    Inscription : Mars 2002
    Messages : 34
    Points : 32
    Points
    32
    Par défaut Requête d'ajout dans 2 tables avec liaison un-à-un
    Bonjour,
    Je poste ici un problème que je pense avoir résolu avec du vba, mais j'aimerais avoir confirmation que je suis dans la bonne voie avant de généraliser l'idée à tous mes champs et tables et surtout j'aimerais savoir s'il y a une façon de faire directement à l'aide de requêtes.

    Voici mes tables :
    Materiels (ID, Type, Controle)
    Controles(ID, Date)
    Le champ Materiels.Controle est sans doublon et lié à Controles.ID. Leur liaison est donc un-à-un. Le choix de séparer les deux tables est discutable. Mais j'ai déjà passé le seuil de développement de la base où ça commencerait à être pénible de les fusionner.

    J'ai commencé avec un formulaire de saisie basé sur une requête de sélection de mes deux tables, permettant de modifier, ajouter, etc. les champs de mes tables. Les 2 champs du formulaire avaient comme source contrôle "Materiels.type" et "Controles.date" et Access me remplissait tout seul le champ "Materiels.Controle". Nickel.
    Dans un deuxième temps, j'ai voulu rendre ce formulaire indépendant et n'ajouter les données aux tables qu'après clic sur un bouton Valider.

    Solution requête (qui ne marche pas) :
    Le bouton Valider appelle deux requêtes d'ajout :
    • R_Ajout_Materiel
    • R_Ajout_Controle

    Le souci c'est qu'avec les requêtes d'ajout, apparemment je n'ai droit de choisir qu'une seule table. Donc je dois faire 2 requêtes. Mais je ne trouve pas le moyen d'avoir ce même remplissage automatique du champ Materiels.Controle qui permet de faire le lien entre les deux tables. A l'exécution de la requête R_Ajout_Controle, j'ai d'ailleurs un message d'erreur : "Access ne peut pas ajouter tous les enregistrements. 1 enregistrement(s) n'ont pas été ajoutés à la table à la suite de violations de clé".

    Solution VBA (correcte ?) :
    Je me suis très largement inspiré de la réponse de Robert1957 dans cette discussion https://www.developpez.net/forums/d1...2-tables-lies/
    Remarque: dans cette version, je ne tire pas encore les données du formulaire. Je pense pouvoir le faire sans trop de problème ultérieurement. Je voulais d'abord valider le principe d'ajout dans les deux tables.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
        Dim db As DAO.Database: Set db = CurrentDb
        Dim rstMateriel As DAO.Recordset, rstControle As DAO.Recordset
        Dim lgMat As Long
    
        'Initialisation des records
        Set rstMateriel = db.OpenRecordset("SELECT Materiels.* FROM Materiels;", dbOpenDynaset, dbSeeChanges)
        Set rstControle = db.OpenRecordset("SELECT Controles.* FROM Controles;", dbOpenDynaset, dbSeeChanges)
    
        'On ajoute dans la table Controles
        rstControle.AddNew
            rstControle("Date") = Date     'valeur pour test
        'On récupère le numéro automatique
        lgMat = rstControle("ID")
    
    
        'On ajoute dans la table Materiels
        rstMateriel.AddNew
            rstMateriel("Type") = 1    'valeur pour test
            rstMateriel("Controle") = lgMat
        rstMateriel.Update
        rstControle.Update   ' placé après Materiel.Update, sinon erreur
    
        rstMateriel.Close
        rstControle.Close
        Set rstMateriel = Nothing
        Set rstControle = Nothing
        Set db = Nothing
    Est-ce que ce code peut me poser problème dans certains cas ? Est-ce qu'il est possible de s'en passer et de tout faire avec des requêtes ?

  2. #2
    Expert confirmé
    Homme Profil pro
    retraité
    Inscrit en
    Juin 2012
    Messages
    3 265
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : retraité
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Juin 2012
    Messages : 3 265
    Points : 5 652
    Points
    5 652
    Par défaut
    Bonjour,

    Effectivement, il serait vraiment très très préférable de n'avoir qu'une table, même si cela peut prendre du temps à corriger. En avoir 2 risque fort de causer des ennuis à un moment ou l'autre, et qu'il ne soit pas facile de trouver que cela en est l'origine. Mais si l'on reste avec ces 2 tables, une autre solution pourrait être celle-ci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Private Sub btnAjout_Click()
        Dim kCnt As Long, sSQL As String
        sSQL = "INSERT INTO Controles (DateC) VALUES (#" & Me.DateC2 & "#);"
        CurrentDb.Execute sSQL, dbFailOnError
        kCnt = DMax("id", "Controles")          '--- dernier n° attribué automatiquement
        sSQL = "INSERT INTO Materiels (Type, Controle) VALUES (" & Me.Type2 & ", " & kCnt & ");"
        CurrentDb.Execute sSQL, dbFailOnError
        Me.Requery
        DoCmd.GoToRecord , , acLast
    End Sub
    A noter que, toujours pour éviter les ennuis, il ne faut surtout pas nommer un champ "Date", ou "Nom", ou de tout autre libellé déjà utilisé par Access (en anglais ou en français).

    Cordialement.
    Fichiers attachés Fichiers attachés

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur
    Inscrit en
    Mars 2002
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Ingénieur

    Informations forums :
    Inscription : Mars 2002
    Messages : 34
    Points : 32
    Points
    32
    Par défaut
    Ok, merci pour la réponse

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

Discussions similaires

  1. [PDO] Requête d'insertion dans une table avec une clé étrangère
    Par MrDev dans le forum PHP & Base de données
    Réponses: 11
    Dernier message: 26/10/2019, 13h42
  2. Réponses: 1
    Dernier message: 02/10/2010, 10h00
  3. ajout dans une table avec clé étrangère
    Par lahmar.abdel1 dans le forum Hibernate
    Réponses: 0
    Dernier message: 30/03/2010, 16h59
  4. Ajouter des champ dans une table avec une procedure sp
    Par Abdou1 dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 26/07/2006, 19h32
  5. Ajout dans une table et relation avec d'autres
    Par climz dans le forum Access
    Réponses: 5
    Dernier message: 12/05/2006, 16h32

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