Bonjour,
je vous expose mon problème, pour simplifié j'ai dans ma base de donnée 3 tables :
- table 'application' : id_app (primary-key, type : numauto), et les autres champs qui n'ont pas d'importance pour la problématique.
-table 'departements' : id_dept (primary-key, type :texte), avec un champs nom_dept sans importance ici encore.
- table 'affect_app_dept' : id_app (primary-key,type : numérique), id_dept (primary-key, type : texte).
La table 'application' est reliée à la table 'affect_app_dept' qui est elle même reliée à la table 'departement', une simple relation n:m quoi.
J'ai créée un formulaire pour remplir ces tables, une fois que l'application est renseignée dans la table 'application', je récupère sont id_app (à l'aide d'un module permettant de trouver le dernier numéroauto inséré dans la base de donnée) que j'insert dans une zone de texte (nom : 'id_app'). Je sélectionne ensuite les départements contenus dans la table 'departement' à l'aide d'une zone de liste à choix multiple (nom : 'liste_dept_selectionne'). Jusque là tous se passe bien
Ensuite je lance une boucle vba permettant de lire l'ensemble des départements sélectionnés dans la zone de liste et lors de chaque chaque itération de la boucle j'effectue une requête SQL de type INSERT INTO dans la table affect_app_dept, dont voici le code :
En SQL "normal", c'est a dire directement sous forme de requete SQL (INSERT INTO affect_app_dept (id_app, id_dept) VALUES (n° de l'application à renseigner, n° du ou des départements sélectionnés) sous Access cela fonctionne mais pas lorsque je passe par le code vba.
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
28
29
30
31
32
33
34
35
36
37 '-------------------------------------------------------------------------------------------------------------------------------- 'ENREGISTREMENT DE LA SELECTION DES DEPARTEMENTS DANS LA TABLE AFFECT_APP_DEPT '-------------------------------------------------------------------------------------------------------------------------------- Private Sub enregistrer_select_dept_Click() Dim reponse As String 'création d'une variable texte pour enregistrer la réponse de la boite de dialogue Dim varI As Variant Dim SQL As String reponse = MsgBox("Etes vous sur de bien vouloir enregistrer la sélection de département pour cette application dans la base ?", vbYesNo, "ATTENTION, PAS D'ANNULATION POSSIBLE PAR LA SUITE !!") If reponse = vbYes Then 'On vérifie d'abord si il y a au moins un département de sélectionné dans la zone de liste 'liste_dept_selectionne' If Me.liste_dept_selectionne.ItemsSelected.Count = 0 Then MsgBox "Merci de sélectionner au moins un département" Else 'On passe en revue chacune des sélections dont on insert le numéro dans la table affect_app_dept avec l'id d'application définie précédemment For Each varI In Me!liste_dept_selectionne.ItemsSelected SQL = "INSERT INTO affect_app_dept(id_app, no_dept) VALUES ('" & Me!id_app.Value & " ', ' " & Me!liste_dept_selectionne.ItemData(varI) & " ');" DoCmd.RunSQL SQL Next varI End If Else 'message avertissant de l'annulation de l'enregistrement MsgBox "L'enregistrement de la sélection de département a été annulé", vbInformation End If End Sub
En effet j’obtiens un message d'erreur du type "Microsoft Access ne peut pas ajouter tout les enregistrement à la requête Ajout, 1 enregistrement(s) n'ont pas été ajoutés à la table à la suite de la violation de clé.".
Alors mes hypothèses sont que :
- Il y a un problème dans le format du caractère retourné par la zone de texte 'id_app', je m'explique : dans ma zone de texte j'ai bien un chiffre (ex :"6") mais il est alors sous forme de texte, et le champ 'id_app' de la table étant définit en numérique, sa bloque lors de l'insertion.
Dans ce cas comment connaitre le format du/des caractères contenus dans la zone de texte, et le cas échéant passer d'un type texte => type numérique ?
- Il y a un problème dans mon code, mais j'ai quand même vérifié que la boucle me retournait bien des valeurs grâce à un debug.print et c'est le cas, j’obtiens bien l'id_app contenu dans la zone texte et le premier département sélectionné dans la zone de liste (id_app = "6" et id_dept = "16" par exemple).
- Un autre problème dont je n'aurait pas pensé ? (très possible ça ^^).
Auriez vous une/des idées ?
Merci d'avance.
Florent.
Partager