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 02/10/2011, 20h26   #1
Invité régulier
 
Consultant informatique
Inscription : décembre 2009
Messages : 14
Détails du profil
Informations personnelles :
Localisation : France

Informations professionnelles :
Activité : Consultant informatique

Informations forums :
Inscription : décembre 2009
Messages : 14
Points : 6
Points : 6
Par défaut Problème lancement requete via VBA

Bonsoir à tous,

Voila, j'ai un problème d'execution de requête SQL via VBA. Lorsque l'evenement clic du bouton est enclenché, j'ai l'erreur d'execution 3142 : Caractères trouvés après la fin de l'instruction SQL.

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
 
Private Sub Execution_Click()
     'Definition
     Dim rs As Recordset
     Dim rsc As Recordset
     Dim sqlcom As String
     Dim sqlcnt As String
     Dim sqlb As String
     Dim nbContact As Integer
     Dim nbContrat As Integer
     'Affectation
     Set rs = CurrentDb.OpenRecordset("DCom", dbOpenSnapshot)
     sqlcnt = "SELECT COUNT(I.Cial) FROM [Informations Sources] AS I WHERE I.Cial LIKE "
     sqlb = "SELECT COUNT(I.Nom) FROM [Informations Sources] AS I WHERE VENTE IS NOT NULL AND I.Cial LIKE "
     'Traitement
     With rs
        Do Until .EOF
            'rsc => nb contact + contrats pour un commercial
            sqlcnt = sqlcnt & "'" & rs("Nom").Value & "'" & " ;" & vbCrLf
            Set rsc = CurrentDb.OpenRecordset(sqlcnt, dbOpenDynaset)
            nbContact = rsc.RecordCount
            rsc.Close
            sqlb = sqlb & "'" & rs("Nom").Value & "'" & " ;" & vbCrLf
            Set rsc = CurrentDb.OpenRecordset(sqlb, dbOpenDynaset)
            nbContrat = rsc.RecordCount
            rsc.Close
            'Insertion des valeurs
            sqlb = "INSERT INTO Commercial(nbcontact, nbcontrat)  SELECT " & nbContact & ", " & nbContrat & " FROM Commercial AS c WHERE c.Nom = " & "'" & rs("Nom").Value & "'" & " ;" & vbCrLf
            DoCmd.RunSQL (sqlb)
            .MoveNext
        Loop
     End With
     rs.Close
End Sub
L'erreur se produit lorsque le recordset tente d'ouvrir la requete à la ligne 20 du code. Et j'imagine que pour la ligne 23, je devrais avoir le même problème.

VBA Access est un nouveau langage pour moi et j'ai beau faire des recherches sur le net, je n'ai pas trouvé ou était mon erreur...

Merci d'avance pour vos réponses !
ijunior est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/10/2011, 20h40   #2
Rédacteur/Modérateur

 
Avatar de loufab
 
Homme Fabrice CONSTANS
Ingénieur développement logiciels
Inscription : avril 2005
Messages : 7 089
Détails du profil
Informations personnelles :
Nom : Homme Fabrice CONSTANS
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur développement logiciels

Informations forums :
Inscription : avril 2005
Messages : 7 089
Points : 11 622
Points : 11 622
Bonjour,

Aucun caractères après la fin de la requete.

La fin de la requete est déterminée par le point virgule.

Supprime tes vbcrlf qui sont totalement inutiles.

Cordialement,
__________________
Classe MELA(CRUD) Opérateur IN et zone de liste
MsGraph et VBA - 1e Partie 2e partie
Entête d'états-Opérateur LIKE-Evénements formulaires-Cours 2010
Complément :Générateur de msgbox
Visitez mon Blog
Les questions techniques par MP ne sont pas lues et je ne pratique pas l'extispicine
loufab est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/10/2011, 20h40   #3
Rédacteur/Modérateur
 
Avatar de Philippe JOCHMANS
 
Homme Philippe JOCHMANS
Développeur informatique
Inscription : mai 2005
Messages : 17 620
Détails du profil
Informations personnelles :
Nom : Homme Philippe JOCHMANS
Âge : 44
Localisation : France, Loir et Cher (Centre)

Informations professionnelles :
Activité : Développeur informatique
Secteur : Communication - Médias

Informations forums :
Inscription : mai 2005
Messages : 17 620
Points : 30 954
Points : 30 954
Envoyer un message via MSN à Philippe JOCHMANS Envoyer un message via Skype™ à Philippe JOCHMANS
Bonjour

Pourquoi les vbCrLf

Philippe
__________________
Détaillez vos questions, sinon vous aurez des réponses erronées et vous irez tout droit dans le et lisez les règles sinon
Si vous pensez commencer sans un livre, oublier : livres pour débuter
Vous pouvez consulter mes articles sur Access et PowerPoint
Le blog Office.

Inutile de m'envoyer un MP pour des questions techniques ou de me relancer , je n'y répondrais pas.
Philippe JOCHMANS est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/10/2011, 21h36   #4
Invité régulier
 
Consultant informatique
Inscription : décembre 2009
Messages : 14
Détails du profil
Informations personnelles :
Localisation : France

Informations professionnelles :
Activité : Consultant informatique

Informations forums :
Inscription : décembre 2009
Messages : 14
Points : 6
Points : 6
Tout d'abord merci pour vos réponses !

J'ai fait le test sans les vbcrlf, j'ai la même erreur !

Pour les vbcrlf, je ne serais pas dire, j'ai vu cela sur un tuto sur le net... :p
ijunior est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/10/2011, 21h46   #5
Expert Confirmé Sénior
 
Avatar de f-leb
 
Homme Fabien
Enseignant
Inscription : janvier 2009
Messages : 2 415
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 41
Localisation : France, Sarthe (Pays de la Loire)

Informations professionnelles :
Activité : Enseignant

Informations forums :
Inscription : janvier 2009
Messages : 2 415
Points : 4 446
Points : 4 446
bonsoir,

insère un debug.print sqlcnt pour voir la tête de la chaîne de caractères SQL dans la fenêtre d’exécution (CTR+G dans l'éditeur VBE).

Malgré tout j’ai l’impression qu’on se complique un peu avec du procédural alors qu’avec SQL…

Deux requêtes à tester au préalable :

Code sql :
1
2
3
4
5
SELECT I.Cial, count(*) AS nbcontact
FROM [Informations Sources] AS I
INNER JOIN DCom AS D
ON I.Cial=D.Nom
GROUP BY I.Cial;


Code sql :
1
2
3
4
5
6
SELECT I.Cial, count(I.Nom) AS nbcontrat
FROM [Informations Sources] AS I 
INNER JOIN DCom AS D
ON I.Cial=D.Nom
WHERE VENTE IS NOT NULL
GROUP BY I.Cial;

Si j’ai bien compris, ces deux requêtes doivent renvoyer les nbcontact et nbcontrat pour chaque commercial dont le nom figure dans DCom.
Qu’en est-il ?
f-leb est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/10/2011, 22h13   #6
Expert Confirmé Sénior
 
Avatar de f-leb
 
Homme Fabien
Enseignant
Inscription : janvier 2009
Messages : 2 415
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 41
Localisation : France, Sarthe (Pays de la Loire)

Informations professionnelles :
Activité : Enseignant

Informations forums :
Inscription : janvier 2009
Messages : 2 415
Points : 4 446
Points : 4 446
tu as peut-être aussi des noms de commerciaux avec des apostrophes qui fichent la pagaille dans:
Code :
sqlb = sqlb & "'" & rs("Nom").Value & "'" & " ;" & vbCrLf
Essaye avec:
Code :
sqlb = sqlb & chr(34) & rs("Nom").Value & chr(34) & " ;"
f-leb est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/10/2011, 20h14   #7
Invité régulier
 
Consultant informatique
Inscription : décembre 2009
Messages : 14
Détails du profil
Informations personnelles :
Localisation : France

Informations professionnelles :
Activité : Consultant informatique

Informations forums :
Inscription : décembre 2009
Messages : 14
Points : 6
Points : 6
Bonsoir,

Merci pour tes réponses f-leb.

J'ai tester les 2 requêtes et les résultats sont corrects. Ces deux requêtes doivent effectivement renvoyer les nbcontact et nbcontrat pour chaque commercial dont le nom figure dans DCom.

J'ai mis à jour le code comme tu me l'as dit mais j'ai toujours la même erreur :

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
 
Private Sub Execution_Click()
     'Definition
     Dim rs As Recordset
     Dim rsc As Recordset
     Dim sqlcom As String
     Dim sqlcnt As String
     Dim sqlb As String
     Dim nbContact As Integer
     Dim nbContrat As Integer
     'Affectation
     Set rs = CurrentDb.OpenRecordset("DCom", dbOpenSnapshot)
     sqlcnt = "SELECT COUNT(I.Cial) FROM [Informations Sources] AS I WHERE I.Cial LIKE "
     sqlb = "SELECT COUNT(I.Nom) FROM [Informations Sources] AS I WHERE VENTE IS NOT NULL AND I.Cial LIKE "
     'Traitement
     With rs
        Do Until .EOF
            'rsc => nb contact + contrats pour un commercial
            sqlcnt = sqlcnt & Chr(34) & rs("Nom").Value & Chr(34) & " ;"
            Set rsc = CurrentDb.OpenRecordset(sqlcnt, dbOpenDynaset)
            Debug.Print sqlcnt
            nbContact = rsc.RecordCount
            rsc.Close
            sqlb = sqlb & Chr(34) & rs("Nom").Value & Chr(34) & " ;"
            Set rsc = CurrentDb.OpenRecordset(sqlb, dbOpenDynaset)
            nbContrat = rsc.RecordCount
            rsc.Close
            'Insertion des valeurs
            sqlb = "INSERT INTO Commercial(nbcontact, nbcontrat)  SELECT " & nbContact & ", " & nbContrat & " FROM Commercial AS c WHERE c.Nom = " & Chr(34) & rs("Nom").Value & Chr(34) & " ;"
            DoCmd.RunSQL (sqlb)
            .MoveNext
        Loop
     End With
     rs.Close
End Sub
Voici le résultat du debug.print : SELECT COUNT(I.Cial) FROM [Informations Sources] AS I WHERE I.Cial LIKE "A. F." ;

Merci encore à tous pour votre aide !
ijunior est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/10/2011, 23h06   #8
Expert Confirmé Sénior
 
Avatar de f-leb
 
Homme Fabien
Enseignant
Inscription : janvier 2009
Messages : 2 415
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 41
Localisation : France, Sarthe (Pays de la Loire)

Informations professionnelles :
Activité : Enseignant

Informations forums :
Inscription : janvier 2009
Messages : 2 415
Points : 4 446
Points : 4 446
bonsoir,

Code sql :
SELECT COUNT(I.Cial) FROM [Informations Sources] AS I WHERE I.Cial LIKE "A. F." ;
cette requête renvoie l'erreur 3142 : Caractères trouvés après la fin de l'instruction SQL ???

De toute façon, on devrait faire plus simple avec les deux requêtes:
Code sql :
1
2
3
4
5
6
7
8
9
10
11
12
SELECT I.Cial, count(*) AS nbcontact
FROM [Informations Sources] AS I
INNER JOIN DCom AS D
ON I.Cial=D.Nom
GROUP BY I.Cial;
 
SELECT I.Cial, count(I.Nom) AS nbcontrat
FROM [Informations Sources] AS I 
INNER JOIN DCom AS D
ON I.Cial=D.Nom
WHERE VENTE IS NOT NULL
GROUP BY I.Cial;

la première tu l'enregistre sous Rcontact, la deuxième Rcontrat.

Toujours si je te suis bien, la requête:
Code sql :
1
2
3
SELECT D.Nom, R1.nbcontact, R2.nbcontrat
FROM (Dcom D INNER JOIN Rcontact R1
ON D.Nom=R1.idCial) INNER JOIN Rcontrat R2 ON D.Nom=R2.idCial
devrait renvoyer les lignes que tu souhaites insérer dans ta table commercial (quoi que, pas évident, à vérifier ça dépend).

Si c'est le cas tu bascules en requête "ajout" que tu complètes avec les assistants pour insérer dans Commercial et il ne reste plus qu'à appeler cette requête sur clic du bouton.
f-leb est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/10/2011, 09h28   #9
Rédacteur/Modérateur

 
Avatar de loufab
 
Homme Fabrice CONSTANS
Ingénieur développement logiciels
Inscription : avril 2005
Messages : 7 089
Détails du profil
Informations personnelles :
Nom : Homme Fabrice CONSTANS
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur développement logiciels

Informations forums :
Inscription : avril 2005
Messages : 7 089
Points : 11 622
Points : 11 622
Peut-être un caractère de controle invisible qui traine en fin de chaine.

Fait une copie de ton code dans Notepad++ et passe en visu de caractères invisibles.
__________________
Classe MELA(CRUD) Opérateur IN et zone de liste
MsGraph et VBA - 1e Partie 2e partie
Entête d'états-Opérateur LIKE-Evénements formulaires-Cours 2010
Complément :Générateur de msgbox
Visitez mon Blog
Les questions techniques par MP ne sont pas lues et je ne pratique pas l'extispicine
loufab est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/10/2011, 20h32   #10
Invité régulier
 
Consultant informatique
Inscription : décembre 2009
Messages : 14
Détails du profil
Informations personnelles :
Localisation : France

Informations professionnelles :
Activité : Consultant informatique

Informations forums :
Inscription : décembre 2009
Messages : 14
Points : 6
Points : 6
Bonsoir,

Merci à tous !

@loufab : il n'y a malheuresement pas de caractères invisibles au niveau du code ! Je l'ai passer à la moulinette Notepad++.

@f-leb :
Citation:
Toujours si je te suis bien, la requête:
Code sql :
Sélectionner tout - Visualiser dans une fenêtre à part
Code :
1
2
3
SELECT D.Nom, R1.nbcontact, R2.nbcontrat
FROM (Dcom D INNER JOIN Rcontact R1
ON D.Nom=R1.idCial) INNER JOIN Rcontrat R2 ON D.Nom=R2.idCial
devrait renvoyer les lignes que tu souhaites insérer dans ta table commercial (quoi que, pas évident, à vérifier ça dépend).
Cela donne bien un résultat cohérent mais cela ne donne uniquement les commerciaux qui ont signés des contrats et pas les autres. J'ai essayé avec left join on, mais cela ne fonctionne pas...

Je commence a désespérer, surtout que cela fait trop longtemps que je suis sur cette fonctionnalité du projet...
ijunior est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/10/2011, 22h01   #11
Expert Confirmé Sénior
 
Avatar de f-leb
 
Homme Fabien
Enseignant
Inscription : janvier 2009
Messages : 2 415
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 41
Localisation : France, Sarthe (Pays de la Loire)

Informations professionnelles :
Activité : Enseignant

Informations forums :
Inscription : janvier 2009
Messages : 2 415
Points : 4 446
Points : 4 446
bonsoir,

Avec cette erreur 3142, tu me surprends une fois de plus

Citation:
Envoyé par ijunior
Cela donne bien un résultat cohérent mais cela ne donne uniquement les commerciaux qui ont signés des contrats et pas les autres. J'ai essayé avec left join on, mais cela ne fonctionne pas...
Code :
1
2
3
4
5
6
7
DCom :

Nom
Riri
Fifi
Loulou
Donald
Code :
1
2
3
4
5
RContact :

idCial	nbcontact
fifi	2
loulou	4
Code :
1
2
3
4
5
RContrat :

idCial	nbcontrat
fifi	3
riri	5
La requête avec LEFT JOIN :
Code sql :
1
2
3
SELECT D.Nom, R1.nbcontact, R2.nbcontrat
FROM (Dcom D LEFT JOIN Rcontact R1
ON D.Nom=R1.idCial) LEFT JOIN Rcontrat R2 ON D.Nom=R2.idCial

J’obtiens :

Code :
1
2
3
4
5
Nom	  nbcontact   nbcontrat
riri     		5
fifi     	2	3
loulou         	4	
donald
Si au lieu des cases vides on veut des zéro :
Code sql :
1
2
3
4
 
SELECT D.Nom, nz(R1.nbcontact,0) AS nbcontact, nz(R2.nbcontrat,0) AS nbcontrat
FROM (Dcom D LEFT JOIN Rcontact R1
ON D.Nom=R1.idCial) LEFT JOIN Rcontrat R2 ON D.Nom=R2.idCial

Si avec ça tu n’obtiens toujours pas le résultat, il va falloir détailler ce que tu entends précisément par "cela ne fonctionne pas".
f-leb est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/10/2011, 16h28   #12
Invité régulier
 
Consultant informatique
Inscription : décembre 2009
Messages : 14
Détails du profil
Informations personnelles :
Localisation : France

Informations professionnelles :
Activité : Consultant informatique

Informations forums :
Inscription : décembre 2009
Messages : 14
Points : 6
Points : 6
Merci beaucoup f-leb, cela fonctionne enfin correctement !

Ayant peu de temps, je vais adopter cette solution de contournement. Je vais passer le statut de cette discussion en résolu et une fois que j'aurais plus de temps, je regarderais pourquoi avec mes recordset cela ne fonctionne pas.

Si je trouve la solution, je la posterai car cela pourrais débloquer quelqu'un d'autre !

En tout cas merci à tous pour votre aide !
ijunior 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 19h08.


 
 
 
 
Partenaires

Hébergement Web