{Access} instruction sql dans code vba

Fermé
sliverpopop Messages postés 924 Date d'inscription dimanche 1 mars 2009 Statut Membre Dernière intervention 6 janvier 2010 - 30 oct. 2009 à 08:50
sliverpopop Messages postés 924 Date d'inscription dimanche 1 mars 2009 Statut Membre Dernière intervention 6 janvier 2010 - 30 oct. 2009 à 15:24
Bonjour à tous,

Je vous explique mon problème, j'ai un petite requête dont voici le code SQL :
SELECT dbo_Production.PARTNUMBER, Count(dbo_Production.SERIALNUMBER) AS CompteDeSERIALNUMBER
FROM dbo_Production
GROUP BY dbo_Production.PARTNUMBER
HAVING (((dbo_Production.PARTNUMBER)="4127363L"));

C'est plutôt simple.

Je vous donne maintenant mon code dans lequel je veux le mettre :

Private Sub Commande48_Click()

Dim PN As String
Dim rs As Recordset
Dim sqlstring As String

PN = Modifiable8.Value

sqlstring = "SELECT dbo_Production.PARTNUMBER, Count(dbo_Production.SERIALNUMBER) AS [CompteDeSERIALNUMBER] FROM dbo_Production GROUP BY dbo_Production.PARTNUMBER WHERE dbo_Production.PARTNUMBER = 4127363L;"

Set rs = CurrentDb.OpenRecordset(sqlstring)

MsgBox (rs!CompteDeSERIALNUMBER)

Voila le code. Le problème est que lorsque je met la clause HAVING ( ou même quand je la remplace par un WHERE) il me donne ce message :

Erreur d'exécution '3075':

Erreur de syntaxe (opérateur absent) dans l'expression :
'dbo_Production.PARTNUMBER WHERE dbo_Production.PARTNUMBER = 4127363L".

Si j'enlève le WHERE et tou ce qu'il y a après dans la requête, et que je la met dans la variable sqlstring, il exécute bien la requête mais il me renvoie la valeur de la première ligne du recordset 'rs'.
Je voudrais pouvoir lui dire que je cherche le compte pour la référence '4127363L',

Comment faire ???

Merci de votre aide

SliverPopop

A voir également:

21 réponses

sliverpopop Messages postés 924 Date d'inscription dimanche 1 mars 2009 Statut Membre Dernière intervention 6 janvier 2010 77
30 oct. 2009 à 08:56
Non access 2003
1
kim57 Messages postés 357 Date d'inscription vendredi 29 février 2008 Statut Membre Dernière intervention 6 août 2022 36
30 oct. 2009 à 08:55
Excuse moi, utilise-tu acces 2007??
0
kim57 Messages postés 357 Date d'inscription vendredi 29 février 2008 Statut Membre Dernière intervention 6 août 2022 36
30 oct. 2009 à 08:59
C'est pas du sql ou du vba de débutant !! Moi en terminale, je ne fais pas encore ça !!
0
sliverpopop Messages postés 924 Date d'inscription dimanche 1 mars 2009 Statut Membre Dernière intervention 6 janvier 2010 77
30 oct. 2009 à 09:01
C'est pas encore trop compliqué, mais ça veut dire que tu peux pas m'aider ??
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Bonjour

4127363L doit être entre " " comme tu le mets toi-même au début de ton message
Mais quand tu le mets dans sqlstring, tu retires ces ", sans doute parce qu'ils te provoquaient une erreur, puisque le premier était pris comme la fin de la requête
Pour mettre des " à l'intérieur d'une chaîne en VB, il suffit de les doubler, tu dois donc écrire :
sqlstring = "SELECT dbo_Production.PARTNUMBER, Count(dbo_Production.SERIALNUMBER) AS [CompteDeSERIALNUMBER] FROM dbo_Production GROUP BY dbo_Production.PARTNUMBER WHERE dbo_Production.PARTNUMBER = ""4127363L"";"
0
J'ai oublié mon nick
30 oct. 2009 à 09:09
Salut
la structure de la requete n'est pas respectée. elle doit être de la forme
SELECT ...
FROM ....
WHERE ...
GROUP BY ...
HAVING ...
ORDER BY ...
0
sliverpopop Messages postés 924 Date d'inscription dimanche 1 mars 2009 Statut Membre Dernière intervention 6 janvier 2010 77
30 oct. 2009 à 09:13
Haaaaa, tu es venu le père, j'espèrais que tu allais passer par là...
J'ai combiné vos deux réponses pour donner cette mise en forme :

sqlstring = "SELECT dbo_Production.PARTNUMBER, Count(dbo_Production.SERIALNUMBER) AS [CompteDeSERIALNUMBER] FROM dbo_Production WHERE dbo_Production.PARTNUMBER = ""4127363L"" GROUP BY dbo_Production.PARTNUMBER ;"

Et ça fonctionne parfaitement, merci à vous deux.

Je vais probablement repasser vous voir, mais je met ce poste en résolu.

Merci encore et à bientôt.

SliverPopop
0
sliverpopop Messages postés 924 Date d'inscription dimanche 1 mars 2009 Statut Membre Dernière intervention 6 janvier 2010 77
30 oct. 2009 à 09:22
En fait j'ai une autre petite question, J'associe ma variable PN une liste déroulante sur le formulaire ou se trouve le bouton 48.

D'où le PN = Modifiable8.Value.

Comment lui dire que la valeur de Modifiable8 n'est pas toujours égal à la valeur '4127363L' mais à ce qui se trouve dans Modifiable8 ( il y a au moins 300 valeurs possible dans Modifiable8) ?

0
sliverpopop Messages postés 924 Date d'inscription dimanche 1 mars 2009 Statut Membre Dernière intervention 6 janvier 2010 77
30 oct. 2009 à 10:00
Siouplait....... !!!!!
0
Tu ne connais pas l'opérateur & pour concaténer des chaînes ?
Si, alors tu n'as qu'à créer une chaine avec la valeur de PN à la place du 4127363L :
sqlstring = "SELECT dbo_Production.PARTNUMBER, Count(dbo_Production.SERIALNUMBER) AS [CompteDeSERIALNUMBER] FROM dbo_Production WHERE dbo_Production.PARTNUMBER = """ & PN & """ GROUP BY dbo_Production.PARTNUMBER ;"
C'est de la manipulation de chaîne élémentaire
0
sliverpopop Messages postés 924 Date d'inscription dimanche 1 mars 2009 Statut Membre Dernière intervention 6 janvier 2010 77
30 oct. 2009 à 10:39
Si je connais l'opérateur & mais je ne comprends pas pourquoi tu mets 3 guillemets.
Peux-tu me l'expliquer ?
0
Les 3 " n'ont pas la même signification
Dans les deux cas, sur 3 ", il y en a un qui est un délimiteur de chaîne, et les deux autres qui représentent un seul ", à l'intérieur de la chaîne. Il y en a un "pour l'emballage" et deux qui représentent le contenu de l'emballage.

Comme je te l'ai déjà dit plus haut (message 5) si tu veux mettre un " dans une chaîne entre " " en VB, il faut en mettre 2. Sinon le " indique la fin de la chaîne, et la suite de la ligne ne veut plus rien dire
" bonjour" est une chaîne correcte, elle commence par " et finit par "
"je te dis "bonjour" sliverpopop" n'est pas une chaîne correcte. Il y a au début "je te dis ", ce qui serait correct, mais la suite bonjour" sliverpopop" commence par le mot bonjour que VB ne connaît pas.
Pour remédier à ça, la syntaxe de VB prévoir de doubler les " à l'intérieur des chaînes :
"je te dis ""bonjour"" sliverpopop". Quand VB essaye de comprendre ça, il comprend que les "" avant bonjour veulent dire un seul " à l'intérieur d'une chaîne, et non pas la fin de la chaîne
Tu saisis bien (?) dans cet exemple la différence entre les " qui délimitent les extrémités d'une chaîne, et les "" qui représente un seul caractère " à l'intérieur d'une chaîne délimitée par des "

Pour appliquer ça à ta question, tu cherches à obtenir une requête qui ressemble à "trucsavant" & PN &"trucs après"
mais trucsavant lui-même contient " (car la valeur de PN doit être entre " " ). Et ce " est à la fin de trucsavant. S'il avait été au milieu, ça ne t'aurait sans doute pas dérangé de le doubler. Mais comme il est à la fin, quand tu le doubles et que tu rajoutes le délimiteur ", ça t'en fait 3 à la suite.

Si tu me dis que tu as tout compris dès la première lecture, tu m'épates ^^
0
sliverpopop Messages postés 924 Date d'inscription dimanche 1 mars 2009 Statut Membre Dernière intervention 6 janvier 2010 77
30 oct. 2009 à 11:45
tout compris à la première lecture mais que les deux premiers paragraphes, le troisième je l'ai relu 3 fois.
Je crois donc avoir compris.

Maintenant autre question, celle je pense un peu plus complexe... voire même beaucoup plus. Je vais même en faire un petit jeu tiens, ça s'apelle ' cherchez l'erreur ' :
Où se trouve la faute dans cette expression :

sqlstring = "SELECT 'PASS' avec intervalle.Date, 'PASS' avec intervalle.PARTNUMBER, 'PASS' avec intervalle.[Nombre de cartes] AS [Nombre de PASS], IIf([CompteDePartNumber] Is Null," & _
"0" & ",[CompteDePartNumber]) AS [Nombre de FAIL], IIf([CompteDePartNumber] Is Null," & "0" & _
",[CompteDePartNumber]+[Nombre de cartes]) AS [Total], " & _
"IIf([CompteDePartNumber] Is Null," & "0" & ",[CompteDePartNumber])/IIf([CompteDePartNumber] Is Null," & "0" & _
",[CompteDePartNumber]+[Nombre de cartes])*100 AS [% de défauts] " & _
"IIf([CompteDePartNumber] Is Null," & "0" & ",[CompteDePartNumber]), IIf([CompteDePartNumber] Is Null," & _
"0" & ",[CompteDePartNumber]+[Nombre de cartes]), " & _
"IIf([CompteDePartNumber] Is Null," & "0" & ",[CompteDePartNumber])/IIf([CompteDePartNumber] Is Null," & _
"0" & ",[CompteDePartNumber]+[Nombre de cartes])*100 " & _
"FROM 'FAIL' avec intervalle INNER JOIN 'PASS' avec intervalle " & _
"ON 'FAIL' avec intervalle.PartNumber = 'PASS' avec intervalle.PARTNUMBER " & _
"AND 'FAIL' avec intervalle.Date = 'PASS' avec intervalle.Date " & _
"WHERE 'PASS' avec intervalle.Date) >= """ & DDebut & """ AND 'PASS' avec intervalle.Date <= """ & DFin & """ AND " & _
"'PASS' avec intervalle.PARTNUMBER = """ & PN & """ GROUP BY 'PASS' avec intervalle.Date, " & _
"'PASS' avec intervalle.PARTNUMBER, 'PASS' avec intervalle.[Nombre de cartes]; "

Access me dit :

Dans l'instruction SELECT, un mot réservé ou un argument est mal orthographié ou absent, ou la ponctuation est incorrecte.

Peux-tu m'aider pour cela ? ( Désolé pour la mise en forme de la deuxième requête SQL, ce n'est pas très lisible quand je l'écris en temps réel, j'espère que ça ira mieux dans le post.

Peux-tu m'aider pour cela ??

Merci d'avance.
0
Je crois bien que 'avec' doit être traduit par 'with'. Mais je ne jure rien, je ne sais pas ce que ça veut dire en SQL. D'ailleurs, si tu peux me l'expliquer...
Merci à Microsoft pour ses traductions en français qui marchent dans ses interfaces, mais que dans ses interfaces. Tu as déjà joué aussi au jeu de Est Nul / Isnull et aux autres variantes ?
0
Non, ça n'est pas with. Désolé.
0
sliverpopop Messages postés 924 Date d'inscription dimanche 1 mars 2009 Statut Membre Dernière intervention 6 janvier 2010 77
30 oct. 2009 à 13:13
Tu veux dire l'anglais traduit en francais mais juste la traduction littérale, sans aucun contexte en fait ? J'avoue que non, parce que j'ai un peu plus étudié le VB avec Visual Studio ( Je suis en BTS IG première année en alternance option développement, si ça te parle, et j'ai besoin de Visual Studio). Donc non je le met en anglais en fait eet c'est lui qui me le traduit tout seul, et je ne fais pas trop attention à ce qu'il m'écrit; j'en ai juste une en tête, c'est la fonction ' Iif ', qu'il traduit automatiquement en ' VraiFaux '. Je ne vois pour l'instant que celle ci.

Sinon, as-tu une idée de ce que peut êtr l'erreur dont je parle dans le post d'avant ?

Merci encore de ton aide.
0
Malheureusement non, je ne sais pas d'où vient le problème. Je n'ai jamais étudié access.
Mais ton mot 'avec', d'où vient-il ? Si tu l'as tapé toi même, tu dois savoir ce qu'il veut dire et connaître sa syntaxe ; sinon quelle manip as-tu faite pour l'obtenir ?
0
sliverpopop Messages postés 924 Date d'inscription dimanche 1 mars 2009 Statut Membre Dernière intervention 6 janvier 2010 77
30 oct. 2009 à 14:39
Le 'avec n'est pas une traduction de with (je ne comprenais ce que tu voulais dire), il fait partie du nom d'un des champs de ma requête.
Sinon, connaitrais tu un moyen de vérifier si mon code est bon ??
0
Le moyen simple de vérifier si le code est correct, c'est de le soumettre à Access ;-)

Si 'avec' fait partie d'un nom de champ, il devrait apparaître entre [] sous la forme SELECT 'PASS' [avec intervalle].Date
Mais Ce serait alors un nom de table et non pas de champ
0
sliverpopop Messages postés 924 Date d'inscription dimanche 1 mars 2009 Statut Membre Dernière intervention 6 janvier 2010 77
30 oct. 2009 à 15:22
Le nom de la requête est ['PASS' avec intervalle], le nom du champ c'est [Date].
J'ai bien pigé le coup des [].

Je viens de modifier quelques trucs, et maintenant le message d'erreur est :

Vous avez essayer d'exécuter une requête ne comprenant pas l'expression spécifiée 'Iif([CompteDePartNumber] Is Null, "0", [CompteDePartNumber]]' comme une partie de la fonction d'agrégat.

Qu'est que cela veut dire ??
0