IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Access Discussion :

Trier données dans formulaire par checkbox


Sujet :

Access

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    63
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 63
    Points : 31
    Points
    31
    Par défaut Trier données dans formulaire par checkbox
    Bonjour!

    Voici mon problème:

    --> J'ai crée un formulaire en continu avec les colonnes :
    - Nom projet
    - Année
    - Secteur
    - Chiffre d'affaires

    --> J'ai crée 4 checkBox :
    - Nom projet
    - Année
    - Secteur
    - Chiffre d'affaires

    J'aimerai quand je coche par exemple "Nom projet" que le tableau dans mon formulaire soit classé par ordre alphabétique par rapport au "Nom projet"

    Quand je coche d'abord "Nom projet" puis "Année" que mon tableau soit trié d'abord par "Nom projet" puis par "Année" et vis versa!

    J'espère que j'ai été assez claire. Je sais que c'est de la programmation Vba mais étant débutante je ne vois pas trop comment faire.

    Merci de votre aide

  2. #2
    Membre du Club
    Inscrit en
    Juillet 2006
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 49
    Points : 41
    Points
    41
    Par défaut
    Bonjour
    Bien que n'étant pas un expert en VBA, je ferais quelque chose comme ca:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    Private Sub RefreshQuery()
    Dim SQL As String
     
    SQL = "SELECT Nom, Année, Secteur, CA  FROM TaTable WHERE Année <>0"
     
    If Me.chknom Then
        SQL = SQL & "ORDER BY Nom"
    End If
    If Me.chkAnnée Then
        SQL = SQL & "ORDER BY Année "
    End If
    If Me.chksecteur Then
        SQL = SQL & "ORDER BY Secteur"
    End If
    If Me.chkca Then
        SQL = SQL & "ORDER BY CA "
    End If
     
    SQL = SQL & ";"
     
    Me.lstResults.RowSource = SQL
    Me.lstResults.Requery
     
    End Sub
    En faisant appel à la Sub Refresh Query sur chaque click de tes check box. Par contre je sais pas si on peut cumuler les ORDER BY ...

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    63
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 63
    Points : 31
    Points
    31
    Par défaut
    J'ai fait comme tu m'a dis mais rien ne se passe quand je coche les cases! Je ne sais pas si c'est dû au fait que je suis sur un formulaire en continu?

    Voici ton code ajusté à mon programme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    Private Sub RefreshQuery()
    Dim SQL As String
     
    SQL = "SELECT Code_projet, Annee_projet, Secteur_projet, Client_projet SumOfcout_total_materiel FROM Liste des projets WHERE Annee_projet <>0"
     
    If Me.ChkCode_projet Then
        SQL = SQL & "ORDER BY Code_projet"
    End If
    If Me.ChkAnnee Then
        SQL = SQL & "ORDER BY Annee_projet "
    End If
    If Me.ChkSecteur Then
        SQL = SQL & "ORDER BY Secteur_projet"
    End If
    If Me.ChkCout_total Then
        SQL = SQL & "ORDER BY SumOfcout_total_materiel "
    End If
     
    If Me.ChkClient Then
        SQL = SQL & "ORDER BY Client_projet "
    End If
     
    SQL = SQL & ";"
     
    Me.LstResults.RowSource = SQL
    Me.LstResults.Requery
     
    End Sub
    De plus je voulais savoir pourquoi tu avais mis un where année <> 0 dans le sql?


  4. #4
    Invité
    Invité(e)
    Par défaut C'est plus complexe....
    Kimar, si je peux me permettre, ta syntaxe n'est pas bonne

    Si chknom est coché + chkannée tu obtiens :
    SQL = "SELECT Nom, Année, Secteur, CA FROM TaTable WHERE Année <>0
    ORDER BY NomORDER BY Année "
    Ca ne va pas fonctionner !?

    C'est plus complexe que ça, voilà mon code, a placer dans le formulaire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
     
    Option Compare Database
    Option Explicit
    Dim Order$, Tri(4)
     
    Private Sub Cocher1_AfterUpdate()
    ' La case à cocher 1 s'appelle Cocher1
      If Me.Cocher1.Value = False Then
        ' Tester si existe déjà
        If InStr(1, Order$, Tri(1)) > 0 Then
          'Si existe dans les valeurs ordonnées, alors la supprimée
          Order$ = SupChaine(Order$, Tri(1))
        End If
      Else
        ' Ajoute le champ de tri dans l'ordre de coche
        Order$ = Order$ & ", " & Tri(1)
      End If
      ' Supprime la virgule en début ou en fin de critère
      If Left(Order$, 1) = "," Then Order$ = Mid(Order$, 2, Len(Order$) - 1)
      If Right(Order$, 1) = "," Then Order$ = Left(Order$, Len(Order$) - 1)
      Me.OrderBy = Order$
      Me.Requery
    End Sub
     
    Private Sub Cocher2_AfterUpdate()
      If Me.Cocher2.Value = False Then
        ' Tester si existe déjà
        If InStr(1, Order$, Tri(2)) > 0 Then
          'Si existe dans les valeurs ordonnées, alors la supprimée
          Order$ = SupChaine(Order$, Tri(2))
        End If
      Else
        ' Ajoute le champ de tri dans l'ordre de coche
        Order$ = Order$ & ", " & Tri(2)
      End If
      ' Supprime la virgule en début ou en fin de critère
      If Left(Order$, 1) = "," Then Order$ = Mid(Order$, 2, Len(Order$) - 1)
      If Right(Order$, 1) = "," Then Order$ = Left(Order$, Len(Order$) - 1)
      Me.OrderBy = Order$
      Me.Requery
    End Sub
     
    Private Sub Cocher3_AfterUpdate()
      If Me.Cocher3.Value = False Then
        ' Tester si existe déjà
        If InStr(1, Order$, Tri(3)) > 0 Then
          'Si existe dans les valeurs ordonnées, alors la supprimée
          Order$ = SupChaine(Order$, Tri(3))
        End If
      Else
        ' Ajoute le champ de tri dans l'ordre de coche
        Order$ = Order$ & ", " & Tri(3)
      End If
      ' Supprime la virgule en début ou en fin de critère
      If Left(Order$, 1) = "," Then Order$ = Mid(Order$, 2, Len(Order$) - 1)
      If Right(Order$, 1) = "," Then Order$ = Left(Order$, Len(Order$) - 1)
      Me.OrderBy = Order$
      Me.Requery
    End Sub
     
    Private Sub Cocher4_AfterUpdate()
      If Me.Cocher4.Value = False Then
        ' Tester si existe déjà
        If InStr(1, Order$, Tri(4)) > 0 Then
          'Si existe dans les valeurs ordonnées, alors la supprimée
          Order$ = SupChaine(Order$, Tri(4))
        End If
      Else
        ' Ajoute le champ de tri dans l'ordre de coche
        Order$ = Order$ & ", " & Tri(4)
      End If
      ' Supprime la virgule en début ou en fin de critère
      If Left(Order$, 1) = "," Then Order$ = Mid(Order$, 2, Len(Order$) - 1)
      If Right(Order$, 1) = "," Then Order$ = Left(Order$, Len(Order$) - 1)
      Me.OrderBy = Order$
      Me.Requery
    End Sub
     
    Private Sub Form_Open(Cancel As Integer)
      ' Définition des champs pour le tri
      Tri(1) = "[Nom projet]"
      Tri(2) = "[Année]"
      Tri(3) = "[Secteur]"
      Tri(4) = "[Chiffre d'affaires]"
      Order$ = ""
    End Sub
     
    Function SupChaine(Chaine, TexteASup) As String
        Dim StringTmp As String, Pointer As Integer
        If IsNull(Chaine) Then
            SupChaine = False
        Else
            StringTmp = Chaine
            Pointer = InStr(1, StringTmp, TexteASup)
            Do While Pointer > 0
                StringTmp = Left(StringTmp, Pointer - 1) & Mid(StringTmp, Pointer + Len(TexteASup))
                Pointer = InStr(Pointer, StringTmp, TexteASup)
            Loop
            SupChaine = StringTmp
        End If
    End Function
    Ouf.... On attrappe vite chaud....

  5. #5
    Membre du Club
    Inscrit en
    Juillet 2006
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 49
    Points : 41
    Points
    41
    Par défaut
    - Les résultats doivent s'afficher dans une liste nomée, lstResults.

    En faisant appel à la Sub Refresh Query sur chaque click de tes check box.
    - Par là j'entend écrire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Private Sub chkCode_Projet()
     
    RefreshQuery
     
    End Sub
    pour chaque checkbox.

    - Le est sans interet mais permet de mettre le WHERE dans la chaine SQL.

  6. #6
    Membre du Club
    Inscrit en
    Juillet 2006
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 49
    Points : 41
    Points
    41
    Par défaut
    Oui, le code de Bruno me parait plus probable... J'aurais essayé

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    63
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 63
    Points : 31
    Points
    31
    Par défaut
    Merci merci! Je vais essayer tout cela dès demain car là je dois partir du bureau! Je vous tiens au courant!

  8. #8
    Membre expérimenté
    Avatar de Mahefasoa
    Homme Profil pro
    Manager IT
    Inscrit en
    Octobre 2003
    Messages
    835
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations professionnelles :
    Activité : Manager IT

    Informations forums :
    Inscription : Octobre 2003
    Messages : 835
    Points : 1 664
    Points
    1 664
    Par défaut
    Salut,

    La proposition de BrunoM45 est super et je crois qu'elle marche, mais est-ce qu'elle tient en compte l'ordre dans lequel le tri doit s'effectuer? Car d'après ce que j'ai compris, l'ordre (d'après BrunoM45) est déja pré-établi.
    Si j'ai bien saisi ce que Sofia109 veut c'est que si on coche Nom projet puis Année le tri est Nom projet puis Année; et si on coche Année puis Nom projet, le tri est Année puis Nom projet.
    Cet ordre ne doit jamais être prédéfini (comme du genre 1,2,3 et 4) mais désagréablement aléatoire! (il peut être 2,3,1 et 4 ou 4,3,1 et 2)

    Je pense qu'il faut donner des points de repère au code: quand faut-il commencer le tri suivant l'ordre établi et quand faut-il réinitialiser cet ordre?
    Je propose d'ajouter à coté des checkbox un bouton Trier et lorsqu'on clique dessus, il fait le tri puis réinitialise l'ordre de tri. C'est ce que j'ai trouvé pour l'instant ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
     
    Option Compare Database
    Option Explicit
    'Déclaration d'une variable qui va contenir l'ordre de tri
    Private Orders As String
     
    'Réinitialisation de l'ordre de tri à l'ouverture du formulaire
    Private Sub Form_Open(Cancel As Integer)
    	Orders = ""
    	Me.ChkCode_projet = 0
    	Me.ChkAnnee = 0
    	Me.ChkSecteur = 0
    	Me.ChkCout_total = 0
    End Sub
     
    'Obtention des champs à trier pour chaque checkbox
    Private Sub ChkCode_projet_Click()
    	If Me.ChkCode_projet = -1 Then
    		Orders = Orders & ", [Code_projet]"
    	Else
    		'Si on vient de décochez ce checkbox, retirer le champ à trier de la liste si il y est
    		If Instr(1,Orders,", [Code_projet]",vbTextCompare) <> 0 Then
    			Orders = Replace(Orders,", [Code_projet]","",,,vbTextCompare)
    		End If
    	End If
    End Sub
    Private Sub ChkAnnee_Click()
    	If Me.ChkAnnee = -1 Then
    		Orders = Orders & ", [Annee_projet]"
    	Else
    		'Si on vient de décochez ce checkbox, retirer le champ à trier de la liste si il y est
    		If Instr(1,Orders,", [Annee_projet]",vbTextCompare) <> 0 Then
    			Orders = Replace(Orders,", [Annee_projet]","",,,vbTextCompare)
    		End If
    	End If
    End Sub
    Private Sub ChkSecteur_Click()
    	If Me.ChkSecteur = -1 Then
    		Orders = Orders & ", [Secteur_projet]"
    	Else
    		'Si on vient de décochez ce checkbox, retirer le champ à trier de la liste si il y est
    		If Instr(1,Orders,", [Secteur_projet]",vbTextCompare) <> 0 Then
    			Orders = Replace(Orders,", [Secteur_projet]","",,,vbTextCompare)
    		End If
    	End If
    End Sub
    Private Sub ChkCout_total_Click()
    	If Me.ChkCout_total = -1 Then
    		Orders = Orders & ", [SumOfcout_total_materiel]"
    	Else
    		'Si on vient de décochez ce checkbox, retirer le champ à trier de la liste si il y est
    		If Instr(1,Orders,", [SumOfcout_total_materiel]",vbTextCompare) <> 0 Then
    			Orders = Replace(Orders,", [SumOfcout_total_materiel]","",,,vbTextCompare)
    		End If
    	End If
    End Sub
     
    'Lancement du tri et réinitialisation de l'ordre de tri au clic du le bouton
    Private Sub Commandexxx_Click()
    	Dim StrSQL As String
    	'Vérifier s'il y a un ordre de tri
    	Orders = Trim(Orders)
    	If Len(Orders) <> 0 Then
    		Orders = " ORDER BY " & Mid(Orders,2) 'Enlever la virgule qui commence la chaîne
    	End If
     
    	'Je crois que WHERE Annee_projet <> 0 est inutile ici
    	StrSQL = "SELECT Code_projet, Annee_projet, Secteur_projet, Client_projet, SumOfcout_total_materiel FROM [Liste des projets]"
    	StrSQL = StrSQL & Orders & ";"
     
    	'Réinitialisation de l'order de triage et les checkbox comme à l'ouverture du formulaire
    	Call Form_Open(False)
     
    	Me.LstResults.RowSource = StrSQL
    	Me.LstResults.Requery
    End Sub
    Bon voila, je ne l'ai pas testé et théoriquement ce code fonctionne, à toi de le modifier s'il vient à faire un bug ou je sais pas ...

    Je reviens un peu sur ce que Kimar a écrit en essayant d'accumuler les tris comme suit SQL=SQL & "ORDER BY champ" et cela 4 fois, donc la clause ORDER BY va se répéter 4 fois aussi et cela ne va pas marcher. D'ailleurs, la syntaxe est la suivante pour cette clause:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ORDER BY Table.Champ, Table.Champ, Table.Champ, ...
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ORDER BY Champ, Champ, Champ, ...
    A+
    La théorie, c'est quand on sait tout et que rien ne fonctionne. La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi. Ici nous avons réuni théorie et pratique: Rien ne fonctionne ... et personne ne sait pourquoi!
    Albert Einstein

  9. #9
    Invité
    Invité(e)
    Par défaut Non, non....
    Salut Mahefosoa,

    La proposition de BrunoM45 est super et je crois qu'elle marche, mais est-ce qu'elle tient en compte l'ordre dans lequel le tri doit s'effectuer? Car d'après ce que j'ai compris, l'ordre (d'après BrunoM45) est déja pré-établi.
    Non, pas du tout, cela fonctionne bien

    Tri(1) = "[Nom projet]"
    Tri(2) = "[Année]"
    Tri(3) = "[Secteur]"
    Tri(4) = "[Chiffre d'affaires]"

    J'ai appelé le tableau "Tri", mais les indices 1 à 4 c'est simplement pour ne pas à avoir à resaisir les nom des champs !

    On part de zéro :
    1) Tu cliques sur la case "Nom projet" -> Order$ = "[Nom projet]"
    2) Tu cliques ensuite sur "Année" -> Order$ = "[Nom projet], [Année]"
    3) Tu décoches "Nom projet" -> Order$ = "[Année]"
    4) Tu coches "Secteur" -> Order$ = "[Année], [Secteur]"
    5) Tu coches "Nom projet" -> Order$ = "[Année], [Secteur], [Nom projet]"
    Et ainsi de suite ....
    La dernière case cochée vient toujours se mettre à la fin !

    Donc je persiste et signe ça fonctionne parfaitement....

  10. #10
    Membre expérimenté
    Avatar de Mahefasoa
    Homme Profil pro
    Manager IT
    Inscrit en
    Octobre 2003
    Messages
    835
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations professionnelles :
    Activité : Manager IT

    Informations forums :
    Inscription : Octobre 2003
    Messages : 835
    Points : 1 664
    Points
    1 664
    Par défaut
    Salut,

    Mais certainement BrunoM45, ce n'était qu'une question. Ne te vexe pas! Car ce n'était pas mon intention
    La théorie, c'est quand on sait tout et que rien ne fonctionne. La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi. Ici nous avons réuni théorie et pratique: Rien ne fonctionne ... et personne ne sait pourquoi!
    Albert Einstein

Discussions similaires

  1. [SQL]trier un sous formulaire par une date (par toujours connue)
    Par blin07 dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 26/04/2007, 09h45
  2. Réponses: 2
    Dernier message: 12/06/2006, 11h51
  3. ajout donnée dans formulaire
    Par gregius dans le forum Access
    Réponses: 2
    Dernier message: 09/01/2006, 11h12
  4. saisie de données dans formulaire
    Par philpaul dans le forum Access
    Réponses: 4
    Dernier message: 15/09/2005, 13h13
  5. Réponses: 4
    Dernier message: 29/11/2004, 16h51

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo