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.
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 ?
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
Partager