Guillemet qui s'impose avec access !

Résolu
Gouyav Messages postés 20 Date d'inscription mercredi 22 juin 2005 Statut Membre Dernière intervention 18 juillet 2005 - 28 juin 2005 à 14:02
Gouyav Messages postés 20 Date d'inscription mercredi 22 juin 2005 Statut Membre Dernière intervention 18 juillet 2005 - 29 juin 2005 à 14:14
Bonour à vous, grands maîtres du code !
Ca fait deux jours que je bloque sur ce problème et je ne vois vraiment pas comment m'en sortir !
Dans un formulaire access, je récupère les valeurs slectionnées d'un Listbox. Je les mets dans une variable A. J'affecte cette variable à une fonction B que j'appelle en critère d'une requête. A et B sont déclaré en string. En variant, ça na fonctionne pas non-plus. Je pense que c'est parce que lorsqu'il colle la fonction dans le critère, il colle aussi les guillements avant et après.
Dans le Listbox, selection de 2001 et 2002.
A= 2001 ou 2002
Il collera en critère "2001 ou 2002"
J'ai déjà essayé avec A= 2001" ou "2002, et aucun résultat.
Est-ce que vous ne connaissez pas un moyen de lui dire de ne pas coller ces guillemets ?
Merci d'avance


Gouyav

18 réponses

tbbuim1 Messages postés 940 Date d'inscription jeudi 20 février 2003 Statut Membre Dernière intervention 3 février 2011 9
28 juin 2005 à 16:14
Haaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

J'entraperçois enfin ce que tu veux faire...

C'est extrêmement chhh de faire ce genre de requête

Elles sont beaucoup plus facile à réaliser par le code.

En effet, si tu essayes de le faire en mettant des critères dans
l'assistant, tu vas te heurter au fameux OR, tandis que si tu passes
par le code, tu peux construire ta requête comme tu veux. Maintenant,
que tu as bien avancé, essayes de faire la même chose par le code.

Ecris par exemple:

SQL = "SELECT Year([Date_Real]) AS Année, * FROM Tout WHERE ("
Et
dans ta boucle de listcount à chaque fois que tu as une année 2005,
2004, 2003... rajoutes pour le 1er passage SQL = SQL & "(Year([Date_Real])=2004) "

Pour chaque passage suivant rajoutes SQl = SQL & "or (......) "

et à la fin de la boucle ferme la requête en mettant SQL = SQL & ");"

Ensuite, il ne te reste plus qu'à lancer la requête avec un docmd.runsql SQL

Si tu veux que cette requête soit créée et qu'elle figure dans ta liste
de rq, afin par exemple de l'affecter à un formulaire, tu dois la créer
par cette fonction:

Public sub CreateReq(ByVal chSQL as string, ByVal Nom as string)

Dim db As DAO.Database

'Nom est le nom de la requête que tu veux créer

'Initialisation de la base en cours

Set db = CurrentDb

'Création de la requête à partir de la chaîne chSQL passé en paramètre

Set qdf = db.CreateQueryDef(Nom, chSQL)

qdf.Close

End sub

'ATTENTION tu dois faire référence à Microsoft DAO 3.6 library pour pouvoir utiliser cette fonction.

'Donc dans ton cas, tu écriras pour créer cette requête:

CreateReq SQL, "rq_de_folie"

Maintenant, à toi de jouer

TBBUIM
3
tbbuim1 Messages postés 940 Date d'inscription jeudi 20 février 2003 Statut Membre Dernière intervention 3 février 2011 9
28 juin 2005 à 14:08
Je pense que tu as oublié de dire ce qui ne marche pas dans ton code...

C'est la requête?

T'as fonction renvoie quoi comme type?

As-tu essayé de mettre le résultat de ta fonction dans un Msgbox pour
voir ce qu'elle retourne? As-tu déclaré ta fonction en public, l'as tu
mise dans un module?

Ya pas d'histoire de guillement qui passe en tant que caractère, donc ce n'est pas ça ton erreur... La vérité est ailleurs

Dis nous ce qui ne marche pas précisément, le message d'erreur...
TBBUIM
0
econs Messages postés 4030 Date d'inscription mardi 13 mai 2003 Statut Membre Dernière intervention 23 décembre 2008 24
28 juin 2005 à 14:15
Une chose est sûre : la variable A ne contient pas de guillemets.





Par contre, dans ta requête Access, si tu n'entoures pas la variable A
par des apostrophes, çà plantera à cause des espaces compris dans la
variable A



sRequest = "INSERT INTO maTable(num) VALUES('" & A & "');"



pour qu'au final, la requête vaille :



INSERT INTO maTable(num) VALUES('2001 ou 2002');



Si les apostrophes sont oubliées, l'espace entre '2001' et 'ou' fait planter ta requête.




Manu
-------------------------------------------
Une question bien posée, c'est une chance de réponse bien adaptée.
0
Gouyav Messages postés 20 Date d'inscription mercredi 22 juin 2005 Statut Membre Dernière intervention 18 juillet 2005
28 juin 2005 à 14:26
Oui, j'ai déjà vérifié ce qu'il y a dans la variable en passant par un Msgbox.
En fait, l'utillisateur selectionne des années dans la Listbox. En fonction de son choix, les années selectionnées passe dans la variable. Le Msbox indique par exemple A= 2002 Ou 2003.
Dans un module j'ai :
Public A as String

Function B() as String
B=A
End function
Et dans le critère de la requête, dans le champs année, j'ai : B()
NB: Quand je ne sélectionne qu'une année, ça marche.


Gouyav
0

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

Posez votre question
econs Messages postés 4030 Date d'inscription mardi 13 mai 2003 Statut Membre Dernière intervention 23 décembre 2008 24
28 juin 2005 à 14:31
C'est le code de la requête qui nous intéresse. C'est lui qui doit planter.



Au passage, à quoi sert la fonction B si elle se contente de renvoyer A ?






Manu
-------------------------------------------
Une question bien posée, c'est une chance de réponse bien adaptée.
0
Gouyav Messages postés 20 Date d'inscription mercredi 22 juin 2005 Statut Membre Dernière intervention 18 juillet 2005
28 juin 2005 à 14:37
En fait, je ne sais pas trop comment vous faites pour utiliser ce code, moi, j'ouvre la requête et je lance le générateur d'expression dans le critère pour chercher la fonction B
C'est pourquoi je ne comprends pas très bien cette ligne :
sRequest = "INSERT INTO maTable(num) VALUES('" & A & "');"
Vous auriez peut-être un tutorial à me proposer pour m'aider ?

Gouyav
0
econs Messages postés 4030 Date d'inscription mardi 13 mai 2003 Statut Membre Dernière intervention 23 décembre 2008 24
28 juin 2005 à 14:42
Cette ligne était juste un exemple de construction de requête SQL ...
Rien à voir avec ton code, si ce n'est l'utilisation (peut-être)
d'apostrophes qui auraient pû être ton problème.


Et c'est quoi le code qu'il y a dans la fonction B() ?


Manu
-------------------------------------------
Une question bien posée, c'est une chance de réponse bien adaptée.
0
tbbuim1 Messages postés 940 Date d'inscription jeudi 20 février 2003 Statut Membre Dernière intervention 3 février 2011 9
28 juin 2005 à 14:43
La fonction sert à être utilisée en critère, sous ACCESS, on ne peut
pas passer de variable en critère, mais uniquement des fonctions, d'où
la fonction B.

Toutefois, il serait bien de mettre public Function B() as string

Les values passées dans les rq doivent être entre cotes, sauf pour NULL et cas particuliers... Envoi nous ta requête.

Sinon, tu peux toujours essayé de miniser ta rq, c'est à dire, de faire
le minimum et d'ajouter un par un les éléments en voyant à quel moment
ça bug, tu seras fixé (en principe) sur ce qui n'est pas accepté.

Par exemple, fait un select * from table, ensuite rajoute, le critère de la fonction, ainsi de suite...
TBBUIM
0
tbbuim1 Messages postés 940 Date d'inscription jeudi 20 février 2003 Statut Membre Dernière intervention 3 février 2011 9
28 juin 2005 à 14:48
Pour écrire en SQL, fais une nouvelle requête, une fois la fenêtre
affichée, fais un clic droit dans le fond gris et choisi mode SQL.

Là tu peux taper directement ta requête.

Sinon, tu peux toujours l'écrire dans le code comme l'indique Manu, mais tu dois écrire

Docmd.RunSQL sRequest
TBBUIM
0
Gouyav Messages postés 20 Date d'inscription mercredi 22 juin 2005 Statut Membre Dernière intervention 18 juillet 2005
28 juin 2005 à 14:56
Sub du form lancer au click sur un bouton :
Sub recup_annee()
Dim a As Integer
vannee = ""
For a = 0 To annee.ListCount
If annee.Selected(a) = True Then
If ((annee.Column(0, a)) <> "Null") Then
vannee = vannee & (annee.Column(0, a)) & " Ou "
End If
End If
Next
vannee = Left(vannee, Len(vannee) - 4)
End Sub

Dans le module :
Public vannee As String

Public Function fannee() As String
fannee = vannee
End Function

Dans la requête :

Je ne comprends pas quand vous me dites de faire select * from table. C'est du code SQL ? Je dois le mettre où ?


Gouyav
0
Gouyav Messages postés 20 Date d'inscription mercredi 22 juin 2005 Statut Membre Dernière intervention 18 juillet 2005
28 juin 2005 à 15:00
Ok ! Petit décalage dans les messages !
Voilà mon code rq :

SELECT Tout.N°ICC, [Explosion N°Tour].Région, [Liste ICC].Libellé, Tout.Date_Real, Right([Date_Real],4) AS Année, Sum([CU/ICC].Pièces) AS SommeDePièces, Sum([CU/ICC].[Temps MO]) AS [SommeDeTemps MO], [Liste ICC].LibelléC
FROM [Liste ICC] INNER JOIN ([Explosion N°Tour] INNER JOIN (Tout INNER JOIN [CU/ICC] ON Tout.N°ICC = [CU/ICC].NUM_ICC) ON [Explosion N°Tour].N°Tour = Tout.N°Tour) ON [Liste ICC].N°ICC = Tout.N°ICC
GROUP BY Tout.N°ICC, [Explosion N°Tour].Région, [Liste ICC].Libellé, Tout.Date_Real, Right([Date_Real],4), [Liste ICC].LibelléC
HAVING (((Right([Date_Real],4))=fannee()));


Gouyav
0
tbbuim1 Messages postés 940 Date d'inscription jeudi 20 février 2003 Statut Membre Dernière intervention 3 février 2011 9
28 juin 2005 à 15:03
je viens de te l'expliquer

Select * from Table;

Tu dois le mettre dans la zone de texte qui apparait quand tu fais ta
rq et que tu fais un clic droit mode SQL, Soit dans le code comme Manu
l'a écrit et lancer cette rq par docmd.runSQL TaRequête.

En passant, tu devrais plutot écrire
If not IsNull(annee.Column(0, a)) Then ...

Tu nous as toujours pas indiqué le code de ta requête...

Fais la manip suivante, ouvre, ta requête en question

Fais un clic droit dans la partie gris claire (là ou ya les tables) et choisi dans le menu qui s'affiche MODE SQL

Là, envoi nous le code qui s'affiche.

TBBUIM
0
tbbuim1 Messages postés 940 Date d'inscription jeudi 20 février 2003 Statut Membre Dernière intervention 3 février 2011 9
28 juin 2005 à 15:05
Bien

Maintenant, c'est quoi ton message d'erreur

TBBUIM
0
Gouyav Messages postés 20 Date d'inscription mercredi 22 juin 2005 Statut Membre Dernière intervention 18 juillet 2005
28 juin 2005 à 15:13
Je n'ai pas de message d'erreur ! Juste qu'il ne me sort aucun résultat au lancement de la requête alors qu'il devrait trouver plusieurs enregistrements.


Gouyav
0
tbbuim1 Messages postés 940 Date d'inscription jeudi 20 février 2003 Statut Membre Dernière intervention 3 février 2011 9
28 juin 2005 à 15:27
Bon ok, on avance...

Alors maintenant, essayes d'enlever ton critère.

Et regardes si tu as un résultat satisfaisant

J'entends par là, un résultat qui laisse à penser que si tu rajoutes
ton critère tu auras le résultat voulu. Essayes de simplifier ta
requête comme je te le suggérais tout à l'heure.

Avances petit à petit, rajoutes les éléments au fur et à mesure.

N'essayes pas de tout mettre d'un coup, parce qu'après tu galères pour savoir d'où vient l'erreur...

Déjà jte conseil dans un premier temps de faire ta requête sans faire
de somme, fais uniquement des regroupements, un fois que tu as le
résultat voulu, tu prends la requête et là tu fais les sommes. Avances
petit à petit, pour commencer, c'est plus prudent et surtout plus
facile pour comprendre où ça ne va pas.

TBBUIM
0
Gouyav Messages postés 20 Date d'inscription mercredi 22 juin 2005 Statut Membre Dernière intervention 18 juillet 2005
28 juin 2005 à 15:39
J'ai refait une requête, en mode sql :
SELECT Year([Date_Real]) AS Année, *
FROM Tout
WHERE (((Year([Date_Real]))=2004 Or (Year([Date_Real]))=2005));
Il me sort bien les lignes que je demande. Maintenant, ce que je veux, c'est qu'aulieu de mettre
Year([Date_Real])=2004 Or Year([Date_Real])=2005
je mets une variable.
Dans mon form :
vannee = "((Year([Date_Real]))="
For a = 0 To annee.ListCount
If annee.Selected(a) = True Then
If Not IsNull(annee.Column(0, a)) Then
vannee = vannee & (annee.Column(0, a)) & ") Ou ((Year([Date_Real]))="
End If
End If
Next
vannee = Left(vannee, Len(vannee) - 25)
Et la même fonction que tout-à-l'heure.


Gouyav
0
Gouyav Messages postés 20 Date d'inscription mercredi 22 juin 2005 Statut Membre Dernière intervention 18 juillet 2005
28 juin 2005 à 16:04
Et toujours rien, j'ai beau bidouiller dans tous les sens !


Gouyav
0
Gouyav Messages postés 20 Date d'inscription mercredi 22 juin 2005 Statut Membre Dernière intervention 18 juillet 2005
29 juin 2005 à 14:14
T'es un patron ! Chapeau bas !
Merci beaucoup !


Gouyav
0
Rejoignez-nous