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 15/12/2010, 00h39   #1
Nouveau Membre du Club
 
Inscription : novembre 2010
Messages : 105
Détails du profil
Informations forums :
Inscription : novembre 2010
Messages : 105
Points : 36
Points : 36
Par défaut Me.OrderBy avec une jointure sur la table

Bonsoir,

J'ai ajouter un bouton "Trier" à un des champs de mon formulaire.
Le rôle de ce bouton est de trier les enregistrements courant (pas forcément tous donc, car je peux faire une sélection) en fonction d'une liste déroulante appelée "Degré". Cette liste contient 3 valeurs: "Faible", "Moyen" et "Fort".
Quand j'appuie sur le bouton "Trier", ce code vba s'active:
Code :
1
2
Me.OrderBy = "[MaTable].[Degré]"
Me.OrderByOn = True
Le problème: le tri est fait par ordre alphabétique donc: Faible puis Fort puis Moyen (logique ).
Début de solution: j'ai créée une table secondaire "TblTriDegré" qui comporte 2 champs: "Degré" et "Importance". J'y ai attribué une importance de 1 à "Faible", 2 à "Moyen" et 3 à "Fort". Lorsque je fais un appel de RecordSource j'écris donc le code suivant pour pouvoir bénéficier du tri par "Importance" (qui est bon donc):
Code :
Me.RecordSource = "SELECT * FROM TblTriDegré LEFT JOIN [MaTable] ON TblTriDegré.[Degré] = [MaTable].[Degré] ORDER BY TblTriDegré.Importance;"
Comment utiliser le même principe de jointure avec la fonction Me.OrderBy ??

Merci d'avance
Cinesra est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/12/2010, 14h01   #2
Rédacteur/Modérateur

 
Avatar de argyronet
 
Homme Jean-Philippe AMBROSINO
Panseur de bobos en solutions ETL
Inscription : mai 2004
Messages : 3 650
Détails du profil
Informations personnelles :
Nom : Homme Jean-Philippe AMBROSINO
Localisation : France

Informations professionnelles :
Activité : Panseur de bobos en solutions ETL
Secteur : Finance

Informations forums :
Inscription : mai 2004
Messages : 3 650
Points : 6 210
Points : 6 210
Envoyer un message via MSN à argyronet
Bonjour,

Dans ce cas, tu n'utilises pas tes appels :
Code :
1
2
Me.OrderBy = "[MaTable].[Degré]"
Me.OrderByOn = True
mais simplement un
Code :
Me.RecordSource = "SELECT...
avec les conditions Where et Order By après chaque sélection... et tout cela représenté par des boutons idoines AZet ZA.

Argy
__________________
Ils comptent sur vous...

Ce qui donne son sens à la communication, c´est la réponse que l´on obtient. Si vous n´obtenez pas la réponse voulue, communiquez différemment.

Web Site@Mail
Livres : VBA pour OFFICE 2007 et MICROSOFT ACCESS 2007
Nouveau Tutoriel : Déployer vos applications avec Microsoft Access 2010
MDB Viewer : Visionneuse Access v4.0
argyronet est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/12/2010, 15h26   #3
Nouveau Membre du Club
 
Inscription : novembre 2010
Messages : 105
Détails du profil
Informations forums :
Inscription : novembre 2010
Messages : 105
Points : 36
Points : 36
Le problème c'est que j'aimerais effectuer ce tri sur les enregistrements courant, et pas forcément tous les enregistrements donc, car j'ai ajouté des fonctions de sélection d'enregistrements dans mon formulaire.

C'est impossible donc?!
Cinesra est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/12/2010, 15h34   #4
Rédacteur/Modérateur

 
Avatar de argyronet
 
Homme Jean-Philippe AMBROSINO
Panseur de bobos en solutions ETL
Inscription : mai 2004
Messages : 3 650
Détails du profil
Informations personnelles :
Nom : Homme Jean-Philippe AMBROSINO
Localisation : France

Informations professionnelles :
Activité : Panseur de bobos en solutions ETL
Secteur : Finance

Informations forums :
Inscription : mai 2004
Messages : 3 650
Points : 6 210
Points : 6 210
Envoyer un message via MSN à argyronet
Bien oui, j'ai bien compris...
Tu redéfinis ta clause SELECT à chaque fois et tu réaffectes ton RecotdSource à chaque fois aussi.
C'est ainsi que je procède...

Tu créés dynamiquement ta requête qui est la source de ton formulaire et tu invoques un Requery chaque fois qu'une selection ou un tri est appelé.

Argy
__________________
Ils comptent sur vous...

Ce qui donne son sens à la communication, c´est la réponse que l´on obtient. Si vous n´obtenez pas la réponse voulue, communiquez différemment.

Web Site@Mail
Livres : VBA pour OFFICE 2007 et MICROSOFT ACCESS 2007
Nouveau Tutoriel : Déployer vos applications avec Microsoft Access 2010
MDB Viewer : Visionneuse Access v4.0
argyronet est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/12/2010, 12h53   #5
Nouveau Membre du Club
 
Inscription : novembre 2010
Messages : 105
Détails du profil
Informations forums :
Inscription : novembre 2010
Messages : 105
Points : 36
Points : 36
Nié
Je dois être bête mais j'avoue que je ne comprends pas là.
Prenons un exemple:

[MaTable] contient les champs [Degré] et [Nom] et j'ai ces enregistrements:

[Degré] : Fort , Faible, Moyen, Faible
[Nom] : abb , bba , aba , aaa

Je souhaiterais que le tri sur [Degré] grâce à mon bouton "Tri" se fasse comme ça: Fort, Moyen, Faible.
Donc ici, le code pour avoir ce tri serait:
Code :
Me.RecordSource = "SELECT * FROM TblTriDegré LEFT JOIN [MaTable] ON TblTriDegré.[Degré] = [MaTable].[Degré] ORDER BY TblTriDegré.Importance;"
Maintenant je fais un tri et je ne garde que les [Degré] = "Faible" par exemple.
Le code ne marche plus, il me renverra tous les enregistrement, pas seulement ceux dont le [Degré] est "Faible"

Faut il que dans la "Private Sub BoutonTri_Click()" je prévois tous les cas de sélection? Par exemple:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
If Me.RecordSource = Sélection 1 Then
...
End if
 
If Me.RecordSource = Sélection 2 Then
...
End if
 
If Me.RecordSource = Sélection 3 Then
...
End if
 
...
Ça va me faire beaucoup trop de cas à traiter malheureusement pour moi.

Comment dois-je procéder du coup? Dsl de ne pas comprendre.
Cinesra est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/12/2010, 13h33   #6
Rédacteur/Modérateur

 
Avatar de argyronet
 
Homme Jean-Philippe AMBROSINO
Panseur de bobos en solutions ETL
Inscription : mai 2004
Messages : 3 650
Détails du profil
Informations personnelles :
Nom : Homme Jean-Philippe AMBROSINO
Localisation : France

Informations professionnelles :
Activité : Panseur de bobos en solutions ETL
Secteur : Finance

Informations forums :
Inscription : mai 2004
Messages : 3 650
Points : 6 210
Points : 6 210
Envoyer un message via MSN à argyronet
Déjà, ta table contenant les dégrés doit être pourvue d'une clé primaire avec une valeur numérique correspondant à chacun des degrés
Code :
1
2
3
4
IDDegré		Degré
1		Faible
2		Moyen
3		Fort
Ensuite, ta table de données doit contenir la valeur numérique correspondant aux degrés que chaque enregistrement représente.
Un Update s'impose donc...

Il sera alors aisé de trier sinon Fort et Faible vont se heurter par leur lettre F et l'ordre de tri sera systématiquement Faible, Fort et Moyen puisque :
Une fois cela fait, tu créés une requête que tu nommes en conséquence de ce que représente ton formulaire.
Code :
SELECT * FROM TblTriDegré LEFT JOIN [MaTable] ON TblTriDegré.[Degré] = [MaTable].[Degré] ORDER BY TblTriDegré.IDImportance;"
Tu attaches alors la source de ton formulaire à cette dernière.

Chaque fois que tu fais une sélection, je ne sais pas comment est construit ton formulaire, tu reconstruits la requête sur la base de la première avec les nouveau élements de condition WHERE...
Voici un exemple :
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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
Option Compare Database
Option Explicit
 
Private Const SQL_DEFAULT                              As String = "SELECT * FROM TblTriDegré LEFT JOIN [MaTable] ON TblTriDegré.[IDDegré] = [MaTable].[IDDegré] "
Private Const ORDERBY_DEFAULT                          As String = "ORDER BY TblTriDegré.IDDegré;"
Private Const QRY_FORM_RECORD_SOURCE                   As String = "reqDonneesTriParDegres"
 
Private Sub Form_Load()
Dim strErrorMessage                                    As String
    If CreateThisQuery(CurrentDb, QRY_FORM_RECORD_SOURCE, SQL_DEFAULT & ORDERBY_DEFAULT, True, strErrorMessage) = False Then
        MsgBox strErrorMessage, vbExclamation
        DoCmd.Close acForm, Me.Name
        Exit Sub
    End If
    Me.RecordSource = QRY_FORM_RECORD_SOURCE
End Sub
 
Private Sub BoutonTri_Click()
Dim strSQL                                             As String
    strSQL = SQL_DEFAULT & " "
    'Si il y a un filtre sur un champ (à définir de ton coté avec la priseen compte des numérique et des 'chaînes')
    If Len(Me!Filtre) Then
        strSQL = strSQL & "WHERE NomDuChamp = " & Me!Filtre & " "
    End If
    'Me!cboDegrees est un combobox bindé sur la table des degrés
    strSQL = strSQL & "ORDER BY " & Me!cboDegrees
    If CreateThisQuery(CurrentDb, QRY_FORM_RECORD_SOURCE, strSQL, True, strErrorMessage) = False Then
        MsgBox strErrorMessage, vbExclamation
    End If
    Me.RecordSource = QRY_FORM_RECORD_SOURCE
End Sub
 
Private Function CreateThisQuery(ByRef DB As DAO.Database, ByVal QueryName As String, ByVal SQL As String, ByVal RaiseErrorIfNoData As Boolean, Optional ByRef ErrDescription As String) As Boolean
'A mettre en Public et dans un Module si partagée (Recommandé)
Dim oQDF                                               As DAO.QueryDef
 
    On Error Resume Next
    Set oQDF = DB.CreateQueryDef(QueryName, SQL)
    If Err <> 0 Then
        On Error GoTo CreateThisQuery_Error
        Set oQDF = DB.QueryDefs(QueryName)
        oQDF.SQL = SQL
    End If
    If RaiseErrorIfNoData Then
        If SQLDynasetHasRecords(DB, SQL) = False Then
            Err.Raise 3021, "", "No record found with these criteria"
        End If
    End If
    CreateThisQuery = True
    On Error GoTo 0
 
CreateThisQuery_Exit:
    Set oQDF = Nothing
    Exit Function
 
CreateThisQuery_Error:
    CreateThisQuery = False
    ErrDescription = "(" & Err.Number & ") " & Err.Description
    Resume CreateThisQuery_Exit
End Function
Argy
__________________
Ils comptent sur vous...

Ce qui donne son sens à la communication, c´est la réponse que l´on obtient. Si vous n´obtenez pas la réponse voulue, communiquez différemment.

Web Site@Mail
Livres : VBA pour OFFICE 2007 et MICROSOFT ACCESS 2007
Nouveau Tutoriel : Déployer vos applications avec Microsoft Access 2010
MDB Viewer : Visionneuse Access v4.0
argyronet est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/12/2010, 14h40   #7
Nouveau Membre du Club
 
Inscription : novembre 2010
Messages : 105
Détails du profil
Informations forums :
Inscription : novembre 2010
Messages : 105
Points : 36
Points : 36
Oh boy!!
C'est définitively de trop haut niveau pour moi. Mais tu m'as donné une idée plus simple par contre Argyronet:
J'ajoute un champ numérique à ma table que je met à jour par un update comme ça:

Code :
1
2
3
4
 
Docmd.RunSQL "UPDATE [MaTable].[ChampNumDegrée] SET = 1 WHERE ([Degré] = 'Faible');"
Docmd.RunSQL "UPDATE [MaTable].[ChampNumDegrée] SET = 2 WHERE ([Degré] = 'Moyen');"
Docmd.RunSQL "UPDATE [MaTable].[ChampNumDegrée] SET = 3 WHERE ([Degré] = 'Fort');"
(la rédaction n'est peut être pas bonne mais l'idée est là)

Merci bcp Argyronet (j'essaierais quand même ton idée si jamais, mais ça n'a vraiment pas l'air de mon niveau )
Cinesra est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/12/2010, 15h46   #8
Rédacteur/Modérateur

 
Avatar de argyronet
 
Homme Jean-Philippe AMBROSINO
Panseur de bobos en solutions ETL
Inscription : mai 2004
Messages : 3 650
Détails du profil
Informations personnelles :
Nom : Homme Jean-Philippe AMBROSINO
Localisation : France

Informations professionnelles :
Activité : Panseur de bobos en solutions ETL
Secteur : Finance

Informations forums :
Inscription : mai 2004
Messages : 3 650
Points : 6 210
Points : 6 210
Envoyer un message via MSN à argyronet
Oui, il y a une erreur dans ton SET...
SET quoi ?
Il faut spécifier le nom du champ.
Code :
UPDATE MaTable SET ChampNumDegrée = 3 WHERE Degré = 'Fort'
Argy
__________________
Ils comptent sur vous...

Ce qui donne son sens à la communication, c´est la réponse que l´on obtient. Si vous n´obtenez pas la réponse voulue, communiquez différemment.

Web Site@Mail
Livres : VBA pour OFFICE 2007 et MICROSOFT ACCESS 2007
Nouveau Tutoriel : Déployer vos applications avec Microsoft Access 2010
MDB Viewer : Visionneuse Access v4.0
argyronet est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/12/2010, 17h22   #9
Nouveau Membre du Club
 
Inscription : novembre 2010
Messages : 105
Détails du profil
Informations forums :
Inscription : novembre 2010
Messages : 105
Points : 36
Points : 36
Re, Argyronet

J'ai finalement trouvé encore plus facile: j'ai ajouté la zone de texte correspondant au champ Tri (numérique) de MaTable et je l'ai rendu invisible + ce code:

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
 
Private Sub ListeDegré_Click()
    'permet le tri
If Me.ListeDegré = "inconnu" Then
Me.DegréTri = "1"
End If
If Me.ListeDegré = "Nul" Then
Me.DegréTri = "2"
End If
If Me.ListeDegré = "Faible" Then
Me.DegréTri = "3"
End If
If Me.ListeDegré = "Moyen" Then
Me.DegréTri = "4"
End If
If Me.ListeDegré = "Fort" Then
Me.DegréTri = "5"
End If
End Sub
C'était tellement simple (c'est pas de la très belle programmation je te l'accorde mais bon, on fait avec ce qu'on a )
Cinesra est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/12/2010, 09h00   #10
Rédacteur/Modérateur

 
Avatar de argyronet
 
Homme Jean-Philippe AMBROSINO
Panseur de bobos en solutions ETL
Inscription : mai 2004
Messages : 3 650
Détails du profil
Informations personnelles :
Nom : Homme Jean-Philippe AMBROSINO
Localisation : France

Informations professionnelles :
Activité : Panseur de bobos en solutions ETL
Secteur : Finance

Informations forums :
Inscription : mai 2004
Messages : 3 650
Points : 6 210
Points : 6 210
Envoyer un message via MSN à argyronet
Non, il y a encore plus simple mais cela dépend comment tu as construit ta liste - elle doit avoir 2 colonne avec des Largeurs colonnes 0cm;2cm et bindé sur la Colonne 1 où les champs ChampNumDegrée et Degrée sont dans la source :
Code :
SELECT ChampNumDegrée, Degrée FROM MaTable ORDER BY ChampNumDegrée
Ce qui fait que ton code se résume à
Code :
1
2
3
Private Sub ListeDegré_Click()
    Me.DegréTri = Me!ListeDegré
End Sub
En fait, imagine une seconde que tu aies 1500 tris possible, tu te vois écrire 1500 blocs If/End If ???
Non, alors le plus simple est le mieux

Argy
__________________
Ils comptent sur vous...

Ce qui donne son sens à la communication, c´est la réponse que l´on obtient. Si vous n´obtenez pas la réponse voulue, communiquez différemment.

Web Site@Mail
Livres : VBA pour OFFICE 2007 et MICROSOFT ACCESS 2007
Nouveau Tutoriel : Déployer vos applications avec Microsoft Access 2010
MDB Viewer : Visionneuse Access v4.0
argyronet 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 02h10.


 
 
 
 
Partenaires

Hébergement Web