Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Access > VBA Access
VBA Access Le forum pour les questions relatives au code VBA sous Access, et à son environnement de développement VBE.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 07/07/2011, 14h09   #1
Invité de passage
 
Homme Florent Millet
Étudiant
Inscription : juin 2011
Messages : 6
Détails du profil
Informations personnelles :
Nom : Homme Florent Millet
Localisation : France, Loiret (Centre)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : juin 2011
Messages : 6
Points : 3
Points : 3
Par défaut 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.
Florent_45 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/07/2011, 19h05   #2
Rédacteur
 
Avatar de LedZeppII
 
Homme
Maintenance données produits
Inscription : décembre 2005
Messages : 3 939
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Maintenance données produits
Secteur : Distribution

Informations forums :
Inscription : décembre 2005
Messages : 3 939
Points : 6 278
Points : 6 278
Bonjour,

La seule erreur de syntaxe que je vois est ici :
Code :
SQL = "INSERT INTO affect_app_dept(id_app, no_dept) VALUES ('" & Me!id_app.Value & " ', ' " & Me!liste_dept_selectionne.ItemData(varI) & " ');"
Comme id_app est numérique (Entier Long) il ne faut pas encadrer la valeur Me!id_app.Value par des guillemets.
Il y a aussi un espace en trop à gauche et à droite de Me!liste_dept_selectionne.ItemData(varI).
Code :
SQL = "INSERT INTO affect_app_dept(id_app, no_dept) VALUES (" & Me!id_app.Value & ", '" & Me!liste_dept_selectionne.ItemData(varI) & "');"
Citation:
... n'ont pas été ajoutés à la table à la suite de la violation de clé.
Ça peut aussi être un problème de doublon.

A+
LedZeppII est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 08/07/2011, 09h25   #3
Invité de passage
 
Homme Florent Millet
Étudiant
Inscription : juin 2011
Messages : 6
Détails du profil
Informations personnelles :
Nom : Homme Florent Millet
Localisation : France, Loiret (Centre)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : juin 2011
Messages : 6
Points : 3
Points : 3
C'est bon sa marche
Merci beaucoup LedZeppII, en fait c'était juste un problème de syntaxe, dès fois il vaut mieux chercher le plus simple plutôt que d'essayer de trouver la petite bête ^^.
Bonne journée, @+.
Florent_45 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 21h50.


 
 
 
 
Partenaires

Hébergement Web