Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Access > IHM
IHM Ce forum est dédié aux questions relatives à la création de formulaires et d'états, avec ou sans code VBA, et macros.
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 18/07/2011, 12h37   #1
Nouveau Membre du Club
 
Homme
Étudiant
Inscription : juillet 2011
Messages : 63
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : Finance

Informations forums :
Inscription : juillet 2011
Messages : 63
Points : 27
Points : 27
Par défaut Recherche multicritères et listview

Bonjour,

Je développe actuellement une application utilisant (entre autre) une recherche multicritère. Pour se faire, j'ai utilisé le tutoriel de caféine: http://cafeine.developpez.com/access...echerchemulti/

Mes besoins aillant évolués, je souhaite remplacer la listbox affichant les résultats de mes recherches par une listview (ActiveX).
Ce remplacement est cependant bien plus dur que je le pensais

Actuellement, je n'arrive pas à afficher les résultats de ma recherche multicritères dans la listview.
Il me faut assigner l'instruction SQL créée de manière dynamique:
commande pour la listbox:

Code :
Me.lstResults.RowSource = SQL
RowSource n'existant pas avec une listview, je suis dans une impasse

En insérant le code suivant dans ma recherche multicritère, j'ai bien entendu une résultat, mais pas de possibilité de trier:

Mon Load ressemble à ça:
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
Private Sub Form_Load()
 
'*********
On Error Resume Next
    DoCmd.Maximize
    Me.VueListe.View = lvwReport
    Set LaListe = Me.VueListe
    With LaListe.ColumnHeaders
        '.Add , , "Id", 1000
        '.Add , , "N° de série", 1300
        '.Add , , "N° national", 1000
        '[......]
        '.Add , , "Gestion", 1500
    End With
    LaListe.GridLines = True
    LaListe.FullRowSelect = True
    VueListe.Checkboxes = True
    Init_List
'*********
 
Dim ctl As Control
 
For Each ctl In Me.Controls
    'Gérer les 3 premières lettres du nom de contrôle
    Select Case Left(ctl.Name, 3)
 
        'Si contrôle = checkbox -> cocher la case (valeur -1)
        Case "chk"
           ctl.Value = -1
 
        'Réinitialiser étiquette du label (lblStats)
        Case "lbl"
            ctl.Caption = "- * - * -"
 
        'Vider le contenu de la textbox et la masquer
        Case "txt"
            ctl.Visible = False
            ctl.Value = ""
        'Si contrôle = textbox -> masquer
        Case "cmb"
            ctl.Visible = False
 
    End Select
Next ctl
 
'Champs affichés dans le tableau à l'ouverture du programme (toutes les lignes de la tables T_Gestion sont affichées)
'Me.lstResults.RowSource = "SELECT Id, [N° national], [.....] FROM T_Gestion ORDER BY T_Gestion.[Date 1ère_MES] DESC;"
'Me.lstResults.Requery
 
End Sub
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
Private Sub Init_List()
    Dim Strsql As String
    Dim SQLWhere As String
 
    Set Db = CurrentDb
 
    Me.VueListe.ListItems.Clear
 
    Strsql = "SELECT * FROM T_Gestion ORDER BY T_Gestion.[Date 1ère_MES] DESC;"
    Set Rs = Db.OpenRecordset(Strsql)
    Rs.MoveFirst
    While Not Rs.EOF
        Set LaLigne = LaListe.ListItems.Add()
        LaLigne.Text = Rs!Id
        LaLigne.SubItems(1) = Nz(Rs![N° de série], "None")
        LaLigne.SubItems(2) = Nz(Rs![N° national], "None")
        [......]
        LaLigne.SubItems(28) = Nz(Rs![Gestion], "None")
        Rs.MoveNext
    Wend
    Rs.Close
    VueListe.SortKey = 0
    VueListe.SortOrder = lvwAscending
    VueListe.Sorted = True
    VueListe.SelectedItem.EnsureVisible
End Sub
facedeharicot est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/07/2011, 14h50   #2
Nouveau Membre du Club
 
Homme
Étudiant
Inscription : juillet 2011
Messages : 63
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : Finance

Informations forums :
Inscription : juillet 2011
Messages : 63
Points : 27
Points : 27
S'il est possible d'utiliser autre chose qu'une listview qui permette de ranger en ordre croissant/décroissant les résultats, je suis preneur aussi.
Je suis passé principalement d'une listbox à une listview pour cette raison
facedeharicot est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/07/2011, 14h55   #3
Rédacteur/Modérateur
 
Avatar de Philippe JOCHMANS
 
Homme Philippe JOCHMANS
Développeur informatique
Inscription : mai 2005
Messages : 17 620
Détails du profil
Informations personnelles :
Nom : Homme Philippe JOCHMANS
Âge : 44
Localisation : France, Loir et Cher (Centre)

Informations professionnelles :
Activité : Développeur informatique
Secteur : Communication - Médias

Informations forums :
Inscription : mai 2005
Messages : 17 620
Points : 30 956
Points : 30 956
Envoyer un message via MSN à Philippe JOCHMANS Envoyer un message via Skype™ à Philippe JOCHMANS
Bonjour

Test avec un sous-formulaire, tu peux modifier la requête SQL qui alimente celui-ci pour modifier l'ordre du tri.

Philippe
__________________
Détaillez vos questions, sinon vous aurez des réponses erronées et vous irez tout droit dans le et lisez les règles sinon
Si vous pensez commencer sans un livre, oublier : livres pour débuter
Vous pouvez consulter mes articles sur Access et PowerPoint
Le blog Office.

Inutile de m'envoyer un MP pour des questions techniques ou de me relancer , je n'y répondrais pas.
Philippe JOCHMANS est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 18/07/2011, 15h57   #4
Nouveau Membre du Club
 
Homme
Étudiant
Inscription : juillet 2011
Messages : 63
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : Finance

Informations forums :
Inscription : juillet 2011
Messages : 63
Points : 27
Points : 27
Pourquoi n'y ai-je pas pensé plus tôt...

Merci beaucoup !

Du coup le tutoriel de caféine et mes combobox ne me servent plus à rien avec un sous formulaires affichant les mêmes possibilité que Access lui même ? (Dans le cas d'un SELECT * FROM T_Table)
Cette méthode est utilisable, cependant, mon utilisateur final a trop "d'options" (supprimer un enregistrement dans une table pour un utilisateur final n'est pas terrible ). C'est pour ça que la listview me convenait si jamais la recherche multicritère de caféine y était adaptable !

Ou bien il est possible de faire des requêtes avec variables comme c'est le cas dans le tutoriel de caféine ? En désactivant la possibilité de filtrer.

Pour la création de mon sous formulaire j'ai fait comme suit:
- création d'un nouveau formulaire
- j'ai glissé-déposé mon formulaire fraichement crée dans mon formulaire principal
- En objet source de ce sous formulaire je lui ai mis ma requête SELECT * FROM T_Table...

Est-ce la bonne méthode pour créer mon sous formulaire?
facedeharicot est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/07/2011, 10h00   #5
Nouveau Membre du Club
 
Homme
Étudiant
Inscription : juillet 2011
Messages : 63
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : Finance

Informations forums :
Inscription : juillet 2011
Messages : 63
Points : 27
Points : 27
Pour cloturer ce poste, je donne la solution que j'ai trouvé pour mon petit soucis: Adapter la recherche multicritère de Caféine à une Listview.

Init_List:

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
Private Sub Init_List()
    Dim strSQL As String
    Dim SQLWhere As String
 
    Set Db = CurrentDb
 
    Me.VueListe.ListItems.Clear
 
    strSQL = "SELECT * FROM T_Gestion ORDER BY T_Gestion.Id DESC;"
    Set Rs = Db.OpenRecordset(strSQL)
    Rs.MoveFirst
    While Not Rs.EOF
        Set LaLigne = LaListe.ListItems.Add()
        LaLigne.Text = Rs!Id
        LaLigne.SubItems(1) = Nz(Rs![N° de série], "None")
        [...]
        LaLigne.SubItems(28) = Nz(Rs![Gestion], "None")
        Rs.MoveNext
    Wend
    Rs.Close
    VueListe.SortKey = 0
    VueListe.SortOrder = lvwAscending
    VueListe.Sorted = True
    VueListe.SelectedItem.EnsureVisible
End Sub
Mon Form_Load:

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
Private Sub Form_Load()
 
'*********
On Error Resume Next
    DoCmd.Maximize
    Me.VueListe.View = lvwReport
    Set LaListe = Me.VueListe
    With LaListe.ColumnHeaders
        '.Add , , "Id", 1000
        .Add , , "N° de série", 1300
        [....]
        .Add , , "Année MES", 1500
    End With
    LaListe.GridLines = True
    LaListe.FullRowSelect = True
    VueListe.Checkboxes = True
    Init_List
 
'*********
 
Dim Ctl As Control
 
For Each Ctl In Me.Controls
    'Gérer les 3 premières lettres du nom de contrôle
    Select Case Left(Ctl.Name, 3)
 
        'Si contrôle = checkbox -> cocher la case (valeur -1)
        Case "chk"
           Ctl.Value = 0
 
        'Réinitialiser étiquette du label (lblStats)
        Case "lbl"
            Ctl.Caption = "- * - * -"
 
        'Vider le contenu de la textbox et la masquer
        Case "txt"
            Ctl.Visible = False
            Ctl.Value = ""
        'Si contrôle = textbox -> masquer
        Case "cmb"
            Ctl.Visible = False
 
    End Select
Next Ctl
 
 
End Sub
Ma fonction RefreshQuery reprise de Caféine:

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
Public Function RefreshQuery()
 
Dim strSQL As String
Dim SQL As String
Dim SQLWhere As String
 
Me.VueListe.ListItems.Clear
 
strSQL = "SELECT T_Gestion.* FROM T_Gestion WHERE T_Gestion!Id <> Null "
' = "valeur": critères de recherches exacts
If Me.chkNumNational Then
    strSQL = strSQL & "And T_Gestion![N° national] like '*" & Me.txtNumNational & "*' "
End If
[.....]
If Me.chkAnnee Then
    strSQL = strSQL & "And T_Gestion![Année MES] = '" & Me.cmbRechAnnee & "' "
End If
 
SQLWhere = Trim(Right(strSQL, Len(strSQL) - InStr(strSQL, "Where ") - Len("Where ") + 1))
 
strSQL = strSQL & "ORDER BY T_Gestion.Id DESC;"
 
'Mise à jour de l'affichage des statistiques
Me.lblStats.Caption = DCount("*", "T_Gestion", SQLWhere) & " / " & DCount("*", "T_Gestion")
 
    Set Db = CurrentDb
    Set Rs = Db.OpenRecordset(strSQL)
    While Not Rs.EOF
        Set LaLigne = LaListe.ListItems.Add()
        LaLigne.Text = Rs!Id
        LaLigne.SubItems(1) = Nz(Rs![N° de série], "None")
        [...]
        LaLigne.SubItems(28) = Nz(Rs![Gestion], "None")
        Rs.MoveNext
    Wend
    Rs.Close
    VueListe.SortKey = 0
    VueListe.SortOrder = lvwAscending
    VueListe.Sorted = True
 
End Function
Voilà, merci pour les pistes de recherche
facedeharicot 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 13h09.


 
 
 
 
Partenaires

Hébergement Web