Erreur lors d'une requête d'insertion vba dans une table de liaison n:m
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 :
Code:
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 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.
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.