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 13/12/2010, 18h28   #1
Invité de passage
 
Inscription : décembre 2010
Messages : 13
Détails du profil
Informations forums :
Inscription : décembre 2010
Messages : 13
Points : 1
Points : 1
Par défaut Bloqué sur fonction Buildcriteria

Bonjour à tous,

Je bloque depus qqs heures sur un problème , et avant de casser la machine, je vais avoir besoin de vos conseils :

J'ai un formulaire "Frm Principal" dans lequel j'ai un champ [FILTRE] que je souhaite utiliser comme critère de requête. Ce champ contient par exemple "comme '*10*' ou comme '*11*' ou comme '*12*'".

Je n'arrive pas à récupérer la valeur de ce champ comme critère de requête.

Pour ce faire, j'utiliser le code ci-dessous:

Code :
1
2
3
4
5
Public Function RECUPFILTRE() As String
    Dim strInput  As String
    strInput = Forms![Frm Principal]![FILTRE]
    RECUPFILTRE = BuildCriteria("[critereselection]", dbText, strInput)
End Function
puis dans ma requête, j'ai RECUPFILTRE() en critère

La variable RECUPFILTRE() existe bien (avec les bonnes valeurs - jusque là, RAS), mais impossible de la mettre en critère... le résultat affiche 0 ligne sans message d'erreur...

Merci d'avance pour votre aide !
fabaccess est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/12/2010, 20h01   #2
Membre éprouvé
 
Avatar de dumas.blr
 
Homme Jean-Yves DUMAS
Consultant informatique
Inscription : juin 2010
Messages : 325
Détails du profil
Informations personnelles :
Nom : Homme Jean-Yves DUMAS
Âge : 48
Localisation : France, Hauts de Seine (Île de France)

Informations professionnelles :
Activité : Consultant informatique
Secteur : Conseil

Informations forums :
Inscription : juin 2010
Messages : 325
Points : 447
Points : 447
Bonjour fabaccess,

Une remarque : Pourquoi ne mets tu pas ton formulaire en paramètre d'entrée de ta fonction ? Tu compliques inutilement le code en utilisant une variable qui va rechercher une valeur d'un formulaire précis.

Le principe d'une fonction est d'être réutilisable au moins une fois. Si tu ne le portes pas dans un module externe, autant coder sans fonction.

Question:
une fois que tu a récupéré le retour de ton buildcriteria, qu'en fais-tu ?
Il faut ensuiter l'appliquer à ton formulaire.

Voila ce que j'ai trouvé comme exemple dans l'aide en ligne Access :


Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Sub SetFilter()
    Dim frm As Form, strMsg As String
    Dim strInput As String, strFilter As String
 
    ' Open Products form in Form view.
    DoCmd.OpenForm "Products"
    ' Return Form object variable pointing to Products form.
    Set frm = Forms!Products
    strMsg = "Enter one or more letters of product name " _
        & "followed by an asterisk."
    ' Prompt user for input.
    strInput = InputBox(strMsg)
    ' Build criteria string.
    strFilter = BuildCriteria("ProductName", dbText, strInput)
    ' Set Filter property to apply filter.
    frm.Filter = strFilter
    ' Set FilterOn property; form now shows filtered records.
    frm.FilterOn = True
End Sub
dumas.blr est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 13/12/2010, 21h21   #3
Invité de passage
 
Inscription : décembre 2010
Messages : 13
Détails du profil
Informations forums :
Inscription : décembre 2010
Messages : 13
Points : 1
Points : 1
Par défaut Suite...

Bonjour Dumas, et un grand merci pour ta réponse.
J'avais commencé à utiliser ce code mais qui ne me convient pas pour la suite des traitements. En effet, j'ai non seulement un formulaire à filtrer (ça pas de souci, je l'avais paramétré avec Frm.filter = Buildcriteria...), mais j'ai également différents requêtes et états à filtrer, d'ou l'utilisation de ce RECUPFILTRE = BuildCriteria("[critereselection]", dbText, strInput)...

J'essaie donc de filtrer des requêtes avec critère = RECUPFILTRE (), mais j'ai du louper un truc ...

Merci d'avance pour tes éventuels commentaires
Cdt
fabaccess est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/12/2010, 21h49   #4
Membre éprouvé
 
Avatar de dumas.blr
 
Homme Jean-Yves DUMAS
Consultant informatique
Inscription : juin 2010
Messages : 325
Détails du profil
Informations personnelles :
Nom : Homme Jean-Yves DUMAS
Âge : 48
Localisation : France, Hauts de Seine (Île de France)

Informations professionnelles :
Activité : Consultant informatique
Secteur : Conseil

Informations forums :
Inscription : juin 2010
Messages : 325
Points : 447
Points : 447
Je ne comprends pas exactement ce que tu cherche à faire dans ta fonction.

Si elle te sert à récupérer uniquement le critère de ta requête, OK.
Maintenant, il te suffit d'appliquer aux différents états et formulaires.
Est-ce qu'au moins le filtre marche pour l'ensemble des états et formulaires visés ?

Pour une requête, je suis plus partagé.
L'interêt est d'utiliser les critères de sélections au moment de l'exécution de la requête. Or l'application d'un filtre ne se fait qu'après l'ouverture du recordset/snapshot issu de la requête.
Il semblerait plus pertinent d'utiliser le rajouter le contenu du filtre dans une clause WHERE que tu ajouterait à la requête cible.
dumas.blr est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/12/2010, 21h59   #5
Invité de passage
 
Inscription : décembre 2010
Messages : 13
Détails du profil
Informations forums :
Inscription : décembre 2010
Messages : 13
Points : 1
Points : 1
Je vais essayer d'expliquer ma problématique :
Sur un formulaire (Frm Principal), j'ai une liste d'enregistrements que l'utilisateur peut filtrer selon plusieurs critères. Ce formulaire est alimenté par une table, elle même issue par ODBC d'un ERP sous AS400.

Dans ce Formulaire, j'ai un champ [critereselection] qui peut contenir une ou plusieurs valeurs :
[Nom] [critreselection]
fabaccess est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/12/2010, 22h09   #6
Invité de passage
 
Inscription : décembre 2010
Messages : 13
Détails du profil
Informations forums :
Inscription : décembre 2010
Messages : 13
Points : 1
Points : 1
Je vais essayer d'expliquer ma problématique :
Sur un formulaire (Frm Principal), j'ai une liste d'enregistrements que l'utilisateur peut filtrer selon plusieurs critères. Ce formulaire est alimenté par une table, elle même issue par ODBC d'un ERP sous AS400.

Dans ce Formulaire, j'ai deux champs [Nom] & [critereselection] qui peut contenir une ou plusieurs valeurs :
[Nom] ; [critereselection]
1 ; 10,11,12
2 ; 10,11
3 ; 11,12
Comme tu peux le voir, le champ criteteselection n'est pas bien formaté car il peut contenir plusieurs valeurs. Hélas je ne peux pas toucher au champ issu de l'ERP... L'objectif est que l'utilisateur puisse filtrer les enregistrements (s'il demande 10, tous les enregistrements qui contiennent 10 doivent s'afficher). J'ai donc créé par DAO un champ [FILTRE] qui s'affiche dans le formulaire : 'comme "*10*"'. Si l'utilisateur demande les critères 10 et 11, le champ [FILTRE] du formulaire devient 'commme "*10*" ou comme "*11*". Jusque la tout fonctionne et j'arrive à appliquer le filtre pour l'affichage du formulaire.

La ou je bloque, c'est pour les extractions (requêtes et Etats). J'ai en effet des reportings ou mailings à faire selon ce fameux champ [FILTRE]. Je suis donc passé par une fonction mais je ne parviens pas à définir correctement mon critère. J'ai également essayé : comme Forms![Frm principal]![FILTRE] mais ca ne marche pas. J'en suis donc à la fonction buildcriteria mais c'est pareil !!

Merci encore pour ton aide.
fabaccess est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/12/2010, 09h54   #7
Membre confirmé
 
Jacques Lesueur
Inscription : mai 2006
Messages : 180
Détails du profil
Informations personnelles :
Nom : Jacques Lesueur

Informations forums :
Inscription : mai 2006
Messages : 180
Points : 209
Points : 209
Bonjour,
essai avec la correction apportée(en rouge)
Code :
1
2
3
4
5
Public Function RECUPFILTRE() As String
    Dim strInput  As String
    strInput = Forms![Frm Principal].filter
    RECUPFILTRE = BuildCriteria("[critereselection]", dbText, strInput)
End Function
Jack78960 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/12/2010, 10h34   #8
Invité de passage
 
Inscription : décembre 2010
Messages : 13
Détails du profil
Informations forums :
Inscription : décembre 2010
Messages : 13
Points : 1
Points : 1
Bonjour et merci pour ta réponse Jack,
J'ai essayé la modif, mais ca ne marche pas : "appel de fonction illégal"

Je ne comprends vraiment pas l'erreur... suis bloqué depuis 24 heures
fabaccess est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/12/2010, 10h59   #9
Membre éprouvé
 
Avatar de dumas.blr
 
Homme Jean-Yves DUMAS
Consultant informatique
Inscription : juin 2010
Messages : 325
Détails du profil
Informations personnelles :
Nom : Homme Jean-Yves DUMAS
Âge : 48
Localisation : France, Hauts de Seine (Île de France)

Informations professionnelles :
Activité : Consultant informatique
Secteur : Conseil

Informations forums :
Inscription : juin 2010
Messages : 325
Points : 447
Points : 447
Bonjour fabaccess,

Avant de pousser plus loin mon analyse, Pourrais-tu nous communiquer la valeur de résultat de certains de tes buidcriterias ?
J'aimerais contrôler si la syntaxe est en Français ou en Anglais.
dumas.blr est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/12/2010, 11h40   #10
Invité de passage
 
Inscription : décembre 2010
Messages : 13
Détails du profil
Informations forums :
Inscription : décembre 2010
Messages : 13
Points : 1
Points : 1
Bonjour Dumas et merci pour ton aide,

exemples de valeurs récupérées :
[critereselection] Like '*10*'
[critereselection] Like '*20*' or [critereselection] Like '*21*'

Cdt
fabaccess est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/12/2010, 12h18   #11
Membre éprouvé
 
Avatar de dumas.blr
 
Homme Jean-Yves DUMAS
Consultant informatique
Inscription : juin 2010
Messages : 325
Détails du profil
Informations personnelles :
Nom : Homme Jean-Yves DUMAS
Âge : 48
Localisation : France, Hauts de Seine (Île de France)

Informations professionnelles :
Activité : Consultant informatique
Secteur : Conseil

Informations forums :
Inscription : juin 2010
Messages : 325
Points : 447
Points : 447
Très bien,

Maintenant, peux tous nous communiquer les rowsources de tes formulaires ou tes états (1 qui marche + 1 ou plusieurs qui ne marchent pas)
dumas.blr est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/12/2010, 12h36   #12
Invité de passage
 
Inscription : décembre 2010
Messages : 13
Détails du profil
Informations forums :
Inscription : décembre 2010
Messages : 13
Points : 1
Points : 1
Pour exemple le formulaire suivant fonctionne (issu d'une requête 500 - datas sous frm principal):

Code :
1
2
3
Private Sub Form_Current()
Me.RecordSource = "select * from [500 - datas sous frm principal] where " + RECUPFILTRE() + " ;"
End Sub
Mais la requête ci-dessous ne fonctionne pas : j'ai mis comme critère RECUPFILTRE() dans le champ [critereselection] :

Code :
1
2
3
SELECT [200 - détails clients avec visites et CA].client, [200 - détails clients avec visites et CA].critereselection
FROM [200 - détails clients avec visites et CA]
WHERE ((([200 - détails clients avec visites et CA].critereselection)=RECUPFILTRE()));
Merci encore pour ton aide ...
fabaccess est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/12/2010, 15h45   #13
Membre éprouvé
 
Avatar de dumas.blr
 
Homme Jean-Yves DUMAS
Consultant informatique
Inscription : juin 2010
Messages : 325
Détails du profil
Informations personnelles :
Nom : Homme Jean-Yves DUMAS
Âge : 48
Localisation : France, Hauts de Seine (Île de France)

Informations professionnelles :
Activité : Consultant informatique
Secteur : Conseil

Informations forums :
Inscription : juin 2010
Messages : 325
Points : 447
Points : 447
Essaye de faire les tests suivants :
- copie le sql de ta requête sur la table [200 - détails clients avec visites et CA] (avec bien sur le contenu de ton recupfiltre() )
colle le dans l'éditeur de requête et exécute le SQL. Est-ce que la requête retourne quelque chose ?
si négatif, il peut y avoir 2 possibilités :
- soit la table [200 - détails clients avec visites et CA] ne contient pas le champs issu du recupfiltre(). Dans ce cas, adapte le SQL pour que ça marche
- soit le récupfiltre() ne retourne rien, et là je suppose que le formulaire à l'origine de ta fonction doit être fermé, et donc le recordset associé ne pointe sur rien. Tu devrais t'en tirer en stockant le contenu du récupfiltre() dans une variable globale déclaration en public dim ou dans un module externe, et en récupérant celui-ci au moment ou tu execute le formulaire/état/requête.

Tiens nous au courant.
dumas.blr est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/12/2010, 16h04   #14
Invité de passage
 
Inscription : décembre 2010
Messages : 13
Détails du profil
Informations forums :
Inscription : décembre 2010
Messages : 13
Points : 1
Points : 1
Re-bonjour

Ma table [200 - détails clients avec visites et CA] contient bien le champ sur lequel je fais un filtre (recupfiltre)
et le recupfiltre retourne bien une valeur ([critereselection] Like "*11*")

J'ai paramétré ma variable en global mais ca ne change rien...

Je continue à chercher.. et un grand merci pour ton aide
fabaccess est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/12/2010, 16h27   #15
Membre éprouvé
 
Avatar de dumas.blr
 
Homme Jean-Yves DUMAS
Consultant informatique
Inscription : juin 2010
Messages : 325
Détails du profil
Informations personnelles :
Nom : Homme Jean-Yves DUMAS
Âge : 48
Localisation : France, Hauts de Seine (Île de France)

Informations professionnelles :
Activité : Consultant informatique
Secteur : Conseil

Informations forums :
Inscription : juin 2010
Messages : 325
Points : 447
Points : 447
oui mais,est-ce que le sql généré, quand tu l'exécute dans la fenêtre SQL, retourne bien quelque chose ?
dumas.blr est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/12/2010, 16h33   #16
Invité de passage
 
Inscription : décembre 2010
Messages : 13
Détails du profil
Informations forums :
Inscription : décembre 2010
Messages : 13
Points : 1
Points : 1
Non, le SQL ci-dessous que je viens de copier ne retourne rien :

Code sql :
1
2
3
SELECT [200 - détails clients avec visites et CA].client, [200 - détails clients avec visites et CA].critereselection
FROM [200 - détails clients avec visites et CA]
WHERE ((([200 - détails clients avec visites et CA].critereselection)=RECUPFILTRE()));
fabaccess est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/12/2010, 16h42   #17
Membre confirmé
 
Jacques Lesueur
Inscription : mai 2006
Messages : 180
Détails du profil
Informations personnelles :
Nom : Jacques Lesueur

Informations forums :
Inscription : mai 2006
Messages : 180
Points : 209
Points : 209
Citation:
Envoyé par fabaccess Voir le message
Bonjour et merci pour ta réponse Jack,
J'ai essayé la modif, mais ca ne marche pas : "appel de fonction illégal"

Je ne comprends vraiment pas l'erreur... suis bloqué depuis 24 heures
Ote moi d'un doute :ton formulaire est ouvert avant l'appel de cette procédure?
Jack78960 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/12/2010, 16h58   #18
Invité de passage
 
Inscription : décembre 2010
Messages : 13
Détails du profil
Informations forums :
Inscription : décembre 2010
Messages : 13
Points : 1
Points : 1
oui Jack, frm est bien ouvert !
fabaccess est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/12/2010, 17h16   #19
Membre éprouvé
 
Avatar de dumas.blr
 
Homme Jean-Yves DUMAS
Consultant informatique
Inscription : juin 2010
Messages : 325
Détails du profil
Informations personnelles :
Nom : Homme Jean-Yves DUMAS
Âge : 48
Localisation : France, Hauts de Seine (Île de France)

Informations professionnelles :
Activité : Consultant informatique
Secteur : Conseil

Informations forums :
Inscription : juin 2010
Messages : 325
Points : 447
Points : 447
Citation:
Non, le SQL ci-dessous que je viens de copier ne retourne rien :

SELECT [200 - détails clients avec visites et CA].client, [200 - détails clients avec visites et CA].critereselection
FROM [200 - détails clients avec visites et CA]
WHERE ((([200 - détails clients avec visites et CA].critereselection)=RECUPFILTRE()));
Ah, il faut donc creuser par ici.

Je me répète peut-être, mais remplace la syntaxe RECUPFILTRE() par le résutlat de ton RECUPFILTRE() soit :

Code :
1
2
3
SELECT [200 - détails clients avec visites et CA].client, [200 - détails clients avec visites et CA].critereselection
FROM [200 - détails clients avec visites et CA]
WHERE ((([200 - détails clients avec visites et CA].critereselection)Like "*11*"));
Si ca retourne des données, est ce que le cast de ton recupfiltre() ne donnerait pas quelque chose comme
Code :
WHERE ((([200 - détails clients avec visites et CA].critereselection)="([critereselection] Like "*11*")"
Utilise la commande débug pour printer le contenu du .filter
dumas.blr est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 14/12/2010, 17h55   #20
Invité de passage
 
Inscription : décembre 2010
Messages : 13
Détails du profil
Informations forums :
Inscription : décembre 2010
Messages : 13
Points : 1
Points : 1
Je sens une piste ...

pour la première question : ca marche :
Code sql :
1
2
3
SELECT [200 - détails clients avec visites et CA].client, [200 - détails clients avec visites et CA].critereselection
FROM [200 - détails clients avec visites et CA]
WHERE ((([200 - détails clients avec visites et CA].critereselection)LIKE "*11*"));

pour la deuxième question :
en effet, je retrouve ton code et je sens que l'erreur est ici...mais n'arrive pas à la résoudre Je suis depuis 2 jours sur ce problème et je n'y comprends plus rien !

Enfin pour le dernier point, je n'ai pas l'habitude du debug.print (honte à moi)
Merci (vraiment) pour votre aide !
fabaccess 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 00h33.


 
 
 
 
Partenaires

Hébergement Web