OVH Cloud OVH Cloud

De l'aide en VBA

12 réponses
Avatar
Caro
Bonjour,

J’ai réussi ( en buchant très fort ) à créer cette fonction et cela semble
fonctionner, mais l’exécution est assez longue… Est-ce que mon code est «
sensé » ou y aurait-il une meilleure façon de procéder ?

Le but de cette fonction est de comparer les 3 premières lettres du code
postal de l’employé avec une table [Tbl_Région_CodeP] afin de trouver le
numéro de la région attribuée à ce code postal (3 premiers caractères
seulement) et ensuite d’utiliser cette fonction dans une requete, afin de
sortir des liste d’employés appartenant a une région en particulier.

Voici mon code :

Dim CPostal_Abreg As String
CPostal_Abreg = Left([CP], 3) 'Couper les dernier 3 caracteres du cp

Dim db As Database
Dim rst As DAO.Recordset
Dim sSQL As String
Set db = CurrentDb()
sSQL = "Select * From [Tbl_Région_CodeP] where " & " ([Code_Postal] = '" &
[CPostal_Abreg] & "');"
Set rst = db.OpenRecordset(sSQL)
AnalyseRégion = rst("Région").Value
rst.Close
Set db = Nothing

Votre aide serait grandement appréciée

Caro
Une débutante qui s’essaie…

2 réponses

1 2
Avatar
Buddy
Hé bonjour,

Bon y a pas 36 manières pour avoir un temps d'extraction supportable. Il faut directement travailler sur la source en SQL et éviter de passer par les filtres.

Le hic c'est qu'il faut connaitre un peu le SQL pour s'en sortir. Si tu estimes ne pas avoir le temps de t'y consacrer alors reste sur les filtres sinon regardes de ce côté de LEFT JOIN, INNER JOIN

Dans ton cas par exemple cela donnerait qq chose du genre :

v_sql = "SELECT tbl_employes.Nom, tbl_employes.Prenom, tbl_niveau_fr.Niveau FROM tbl_employes LEFT JOIN tbl_niveau_fr ON tbl_employes.IdNiveauFr = tbl_niveau_fr.Id WHERE tbl_niveau_fr.Niveau = 'Moyen';"

Pour mieux comprendre, utilise l'éditeur de requêtes et passe en mode SQL (click droit et sélectionne SQL) et apprends ;-)

Ouala
Bye
Buddy

Caro wrote:
Salut Buddy,

L'idée du "Bouton", c'est que j'ai fait au début, mais ensuite je me
suis-dit que ça serait plus "hot" si je filtrais immédiatement, d'onc j'ai
masqué mon bouton, mais j'applique le filtre après chaque MAJ de critères.
Sauf qu'à ce moment là j'avais pas de critères qui étaient long à filtrer...

Si je comprends bien ton code (pas sûre..) toi tu changerais la source de
mon sous-formulaire... et tu travaillerais directement avec la table ?

Ma requete source est toujours la même, car plusieurs de mes champs
utilisent des petites fonctions car j'ai pas l'info. directement dans ma
table. Je m'explique : "Emp_Bil" est une fonction qui regarde dans ma table
employés qui analyse plusieurs champs, ex: Francais écrit: (Bon, moyen,
Faible)..., Francais Parlé... tu vois le genre...
C'est pourquoi j'applique un filtre sur le sous-formulaire. Il ne me reste
qu'à trouver la formule pour mon champ "AnalyseRégion" de ma requete.

Merci encore de ton aide.

Caro






Re-salut

bon alors au niveau de la démarche, je pense que c'est pas le top.

Il est préférable de créer une zone qui ne sert qu'à la saisie des critères avec un beau gros bouton FILTRER.
Il te suffit sur Click du bouton FILTRER de créer à la volée ton critère et de mettre en source de ton ssform la chaine sql ainsi créée.
Rien empêche les gens de cliquer sur le bouton quand bon leur semble.

L'intérêt de cette approche réside dans le fait que si tu as un critère qui prend 30s pour afficher le résultat, tes utilisateurs vont à la longue devenir fous et puis bonjour les conséquences pour toi...

Cela donnerait qq chose comme ça :

Private Sub btnFiltrer_Click()
Dim v_critere As String, v_sql As String

' Ici tu passes en revue tous tes critères
If AutoReq Then v_critere = v_critere & Iif(Len(v_critere) > 0, " AND ", "") & "AutoReq = True"
If Emp_Bil Then v_critere = v_critere & Iif(Len(v_critere) > 0, " AND ", "") & "Emp_Bil = True"

' Ici tu continue le montage de ton critère

v_sql = "SELECT * FROM tbl_employes" & Iif(Len(v_critere) > 0, " WHERE ", "") & v_critere & ";"
Me.ssFormEmployes.Form.RecordSource = v_sql
End Sub

Ouala
Bye
Buddy

Caro wrote:

Salut Buddy,

J'ai corrigé ma fonction avec ton code et ça fonctionne très bien. J'en ai
encore beaucoup à apprendre...

Dans ma requete, quand j'utilise la fonction sans aucun critères, c'est
rapide, mais si je met un critères, exemple région 6, c'est un peu plus
long... j'ai 1400 employés... et ça prends 35 secondes avant d'avoir le
résultat... J'imagine que c'est normal.

Merci beaucoup de ton aide

Caro










Salut

je ferais bcp + court :
AnalyseRegion = DLookUp("Région", "Tbl_Région_CodeP", "Code_Postal='" & Left(CP, 3)& "'")

Oulà
Bye

Buddy

Caro wrote:


Bonjour,

J’ai réussi ( en buchant très fort ) à créer cette fonction et cela semble
fonctionner, mais l’exécution est assez longue… Est-ce que mon code est «
sensé » ou y aurait-il une meilleure façon de procéder ?

Le but de cette fonction est de comparer les 3 premières lettres du code
postal de l’employé avec une table [Tbl_Région_CodeP] afin de trouver le
numéro de la région attribuée à ce code postal (3 premiers caractères
seulement) et ensuite d’utiliser cette fonction dans une requete, afin de
sortir des liste d’employés appartenant a une région en particulier.

Voici mon code :

Dim CPostal_Abreg As String
CPostal_Abreg = Left([CP], 3) 'Couper les dernier 3 caracteres du cp

Dim db As Database
Dim rst As DAO.Recordset
Dim sSQL As String
Set db = CurrentDb()
sSQL = "Select * From [Tbl_Région_CodeP] where " & " ([Code_Postal] = '" &
[CPostal_Abreg] & "');"
Set rst = db.OpenRecordset(sSQL)
AnalyseRégion = rst("Région").Value
rst.Close
Set db = Nothing

Votre aide serait grandement appréciée

Caro
Une débutante qui s’essaie…












Avatar
Caro
Re Bonjour Buddy,

Le SQL... hum, sûrement un jour... quand ça ira mieux en VBA...

En tout cas, merci encore pour tes bons conseils et bonne journée.

Ciao!

Caro


Hé bonjour,

Bon y a pas 36 manières pour avoir un temps d'extraction supportable. Il faut directement travailler sur la source en SQL et éviter de passer par les filtres.

Le hic c'est qu'il faut connaitre un peu le SQL pour s'en sortir. Si tu estimes ne pas avoir le temps de t'y consacrer alors reste sur les filtres sinon regardes de ce côté de LEFT JOIN, INNER JOIN

Dans ton cas par exemple cela donnerait qq chose du genre :

v_sql = "SELECT tbl_employes.Nom, tbl_employes.Prenom, tbl_niveau_fr.Niveau FROM tbl_employes LEFT JOIN tbl_niveau_fr ON tbl_employes.IdNiveauFr = tbl_niveau_fr.Id WHERE tbl_niveau_fr.Niveau = 'Moyen';"

Pour mieux comprendre, utilise l'éditeur de requêtes et passe en mode SQL (click droit et sélectionne SQL) et apprends ;-)

Ouala
Bye
Buddy

Caro wrote:
Salut Buddy,

L'idée du "Bouton", c'est que j'ai fait au début, mais ensuite je me
suis-dit que ça serait plus "hot" si je filtrais immédiatement, d'onc j'ai
masqué mon bouton, mais j'applique le filtre après chaque MAJ de critères.
Sauf qu'à ce moment là j'avais pas de critères qui étaient long à filtrer...

Si je comprends bien ton code (pas sûre..) toi tu changerais la source de
mon sous-formulaire... et tu travaillerais directement avec la table ?

Ma requete source est toujours la même, car plusieurs de mes champs
utilisent des petites fonctions car j'ai pas l'info. directement dans ma
table. Je m'explique : "Emp_Bil" est une fonction qui regarde dans ma table
employés qui analyse plusieurs champs, ex: Francais écrit: (Bon, moyen,
Faible)..., Francais Parlé... tu vois le genre...
C'est pourquoi j'applique un filtre sur le sous-formulaire. Il ne me reste
qu'à trouver la formule pour mon champ "AnalyseRégion" de ma requete.

Merci encore de ton aide.

Caro






Re-salut

bon alors au niveau de la démarche, je pense que c'est pas le top.

Il est préférable de créer une zone qui ne sert qu'à la saisie des critères avec un beau gros bouton FILTRER.
Il te suffit sur Click du bouton FILTRER de créer à la volée ton critère et de mettre en source de ton ssform la chaine sql ainsi créée.
Rien empêche les gens de cliquer sur le bouton quand bon leur semble.

L'intérêt de cette approche réside dans le fait que si tu as un critère qui prend 30s pour afficher le résultat, tes utilisateurs vont à la longue devenir fous et puis bonjour les conséquences pour toi...

Cela donnerait qq chose comme ça :

Private Sub btnFiltrer_Click()
Dim v_critere As String, v_sql As String

' Ici tu passes en revue tous tes critères
If AutoReq Then v_critere = v_critere & Iif(Len(v_critere) > 0, " AND ", "") & "AutoReq = True"
If Emp_Bil Then v_critere = v_critere & Iif(Len(v_critere) > 0, " AND ", "") & "Emp_Bil = True"

' Ici tu continue le montage de ton critère

v_sql = "SELECT * FROM tbl_employes" & Iif(Len(v_critere) > 0, " WHERE ", "") & v_critere & ";"
Me.ssFormEmployes.Form.RecordSource = v_sql
End Sub

Ouala
Bye
Buddy

Caro wrote:

Salut Buddy,

J'ai corrigé ma fonction avec ton code et ça fonctionne très bien. J'en ai
encore beaucoup à apprendre...

Dans ma requete, quand j'utilise la fonction sans aucun critères, c'est
rapide, mais si je met un critères, exemple région 6, c'est un peu plus
long... j'ai 1400 employés... et ça prends 35 secondes avant d'avoir le
résultat... J'imagine que c'est normal.

Merci beaucoup de ton aide

Caro










Salut

je ferais bcp + court :
AnalyseRegion = DLookUp("Région", "Tbl_Région_CodeP", "Code_Postal='" & Left(CP, 3)& "'")

Oulà
Bye

Buddy

Caro wrote:


Bonjour,

J’ai réussi ( en buchant très fort ) à créer cette fonction et cela semble
fonctionner, mais l’exécution est assez longue… Est-ce que mon code est «
sensé » ou y aurait-il une meilleure façon de procéder ?

Le but de cette fonction est de comparer les 3 premières lettres du code
postal de l’employé avec une table [Tbl_Région_CodeP] afin de trouver le
numéro de la région attribuée à ce code postal (3 premiers caractères
seulement) et ensuite d’utiliser cette fonction dans une requete, afin de
sortir des liste d’employés appartenant a une région en particulier.

Voici mon code :

Dim CPostal_Abreg As String
CPostal_Abreg = Left([CP], 3) 'Couper les dernier 3 caracteres du cp

Dim db As Database
Dim rst As DAO.Recordset
Dim sSQL As String
Set db = CurrentDb()
sSQL = "Select * From [Tbl_Région_CodeP] where " & " ([Code_Postal] = '" &
[CPostal_Abreg] & "');"
Set rst = db.OpenRecordset(sSQL)
AnalyseRégion = rst("Région").Value
rst.Close
Set db = Nothing

Votre aide serait grandement appréciée

Caro
Une débutante qui s’essaie…















1 2