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

IHM Discussion :

Filtre sur formulaire avec récupération de valeur dans zone de liste


Sujet :

IHM

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 38
    Points : 31
    Points
    31
    Par défaut Filtre sur formulaire avec récupération de valeur dans zone de liste
    ReBonjour à tous,

    Je vois que mon message n'est pas très clair.
    J'ai un formulaire basé sur une table TXD.
    Celui-ci contient une zone de liste qui affiche une requête basée aussi sur TXD.
    Et enfin un sous formulaire basé sur une table TXH (liée à TXD) sur lequel j'applique des filtres.

    Je veux synchroniser les données du formulaire et du SF avec la liste modifiable.

    Le but : naviguer dans les enregistrements soit par la liste soit par les sélecteurs en bas du formulaire.

    PB : comment associer le focus de la liste avec les enregistrements encours pour le formulaire et le SF ?

    En espérant avoir été plus clair




    voilà mon pb.

    Dans un formulaire, j'applique un filtre dans le champ 'source'.

    Je souhaite applique comme critère une valeur extraite à partir d'une zone de liste, par exemple la valeur de la 3ème colonne.

    A partir d'une zone de texte, cela donne :
    [forms]![F_Arborescence]![tb_Serie] OK

    Mais à partir d'une zone de liste :
    [forms]![F_Arborescence]![lb_ListeConf]...

    J'ai essayé des trucs du genre : [forms]![F_Arborescence]![lb_ListeConf].column(3)

    Merci pour votre aide.


    Cédric

  2. #2
    Expert éminent
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Points : 7 765
    Points
    7 765
    Par défaut
    Bonsoir,

    La seule manière dont je sache le faire :

    zone de liste tb_Serie
    Colonne liée : 3

    sous formulaire
    Champs pères : tb_Serie

    D'après l'aide, Champs pères et champs fils n'acceptent que des noms de champs ou de contrôles.

    A+

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 38
    Points : 31
    Points
    31
    Par défaut
    Bonjour LedZeppII, le forum,

    ok mais comment faire quand l'identifiant d'un renregistrement est l'association de 5 champs. Or je constate qu'un SF ne peut être lié que par 3 champs.
    Comment puis-je faire, est-ce que la solution est de faire un champ dans lequel je concatène lesx 5 champs ?

  4. #4
    Expert éminent
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Points : 7 765
    Points
    7 765
    Par défaut
    Bonsoir,

    Je m'apperçois que j'ai mal lu la phrase
    Je veux synchroniser les données du formulaire et du SF avec la liste modifiable.
    Donc oublie l'histoire des liaisons formulaire/sous-formulaire.
    J'ai cru que tu voulais lier le sous-formulaire à la liste.

    Apparement ton critère de filtrage est dans la source du formulaire elle-même, c'est à dire une requête.
    Je n'y arrive pas non plus avec .Column(n). Apparement ça ne fonctionne qu'en VBA ou dans la source d'un contrôle type zone de texte.

    Ce que tu peux faire, c'est redéfinir la source du formulaire chaque fois que la sélection change dans la liste.

    Un exemple de code avec une liste lstEmploye dans un formulaire basé sur la table Employés.
    Le code filtre sur les colonnes 2 et 3 de la liste correspondant aux champs Nom, Prénom.
    Il se met dans l'événement Après MAJ de la liste.
    Code vb : 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
    Private Sub lstEmploye_AfterUpdate()
    Dim strSource As String, strSELECT As String
    Dim strWhere As String, strCritere As String
     
    ' Requête SELECT de base
    strSELECT = "SELECT * FROM Employés"
     
    ' Critère champ Nom (2e colonne)
    strCritere = Nz(Me.lstEmploye.Column(1))
    If strCritere <> "" Then
       ' ajouter AND si nécessaire
       If strWhere <> "" Then strWhere = strWhere & " AND "
       ' ajout critère
       strWhere = strWhere & "([Nom]='" & strCritere & "')"
    End If
     
    ' Critère champ Nom (3e colonne)
    strCritere = Nz(Me.lstEmploye.Column(2))
    If strCritere <> "" Then
       ' ajouter AND si nécessaire
       If strWhere <> "" Then strWhere = strWhere & " AND "
       ' ajout critère
       strWhere = strWhere & "([Prénom]='" & strCritere & "')"
    End If
     
    ' requête source
    If strWhere <> "" Then
       strSource = strSELECT & " WHERE " & strWhere
    Else
       strSource = strSELECT
    End If
     
    ' Propriété Source
    Me.RecordSource = strSource
     
    ' re-exécuter la requête source du formulaire
    Me.Requery
    End Sub

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 38
    Points : 31
    Points
    31
    Par défaut
    Bonjour,

    merci pour ta patience

    En fait, j'ai un formulaire : F_Arborescence (cf en pj)

    http://dl.free.fr/n2rr5OVkL/Formulaire2.pdf

    Il se compose de 5 champs clés. J'en affiche 2 dans des textes-box et les 3 autres champs (c'est pour de la gestion de configuration) apparaîssent dans la zone de liste.

    et en bas du formulaire, le SF pour lequel je pourrai utiliser ton code !

    Mais là où j'ai pas d'idée, c'est pour pouvoir me déplacer soit avec avec la zone de liste soit avec les sélecteurs Access.

    Encore merci

  6. #6
    Expert éminent
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Points : 7 765
    Points
    7 765
    Par défaut
    Bonsoir,

    J'arrive à synchroniser la liste sur l'enregistrement du formulaire principal avec l'événement Form_Current().
    Problème : il ne faut déclencher d'évènement sur la liste si on veut par la suite que cet événement permette de faire l'inverse.
    Sinon événements en cascade sans fin.
    Je pense y être parvenu. Je verrai demain pour la fonction inverse : sélection liste => déplacement vers enregistrement correspondant.

    A+

  7. #7
    Expert éminent
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Points : 7 765
    Points
    7 765
    Par défaut
    Bonjour,

    Voila ce que j'ai créé pour simuler ta situation.

    Table TXD (Code Projet, LCN, Série, Version, Variante, Quantite, Designation, Rang LCN, LCN Père)
    Table TXH (Code Projet, LCN, Série, Version, Variante, Ref)

    Formulaire principal basé sur TXD.
    Contrôle zone de texte tb_CodeProjet <--> champ Code Projet
    Contrôle zone de texte tb_LCN <--> champ LCN
    Contrôle zone de liste lb_ListeConf
    &#160;&#160;contenu :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT [TXD].[Code Projet], [TXD].[LCN], [TXD].[Série], [TXD].[Version], [TXD].[Variante], [TXD].[Quantite] FROM TXD WHERE (((TXD.[Code Projet])=[]![tb_CodeProjet]) AND ((TXD.LCN)=[]![tb_LCN]));
    &#160;&#160;Colonne liée : 0
    &#160;&#160;Nbre de colonne : 6
    &#160;&#160;Largeur colonnes : 0cm;0cm;3cm;2cm;2cm;2cm

    Code événementiel:
    Formulaire : Sur Activation (Form_Current())
    zone de liste lb_ListeConf : Après MAJ (lb_ListeConf_AfterUpdate())

    Module de code du formulaire.
    Partie déclaration (variables globales)
    Code vb : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Dim blnEvFormCurrent As Boolean
    Dim blnEvlb_ListeConf As Boolean
    Code événement Sur Activation (formulaire)
    Code vb : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Private Sub Form_Current()
    If blnEvlb_ListeConf Then Exit Sub
    blnEvFormCurrent = True
    Call SyncList
    blnEvFormCurrent = False
    End Sub
    Code événement Après MAJ (lb_ListeConf)
    Code vb : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Private Sub lb_ListeConf_AfterUpdate()
    If Me.lb_ListeConf.ListIndex = -1 Then Exit Sub
    If blnEvFormCurrent Then Exit Sub
     
    blnEvlb_ListeConf = True
    Call SyncForm
    blnEvlb_ListeConf = False
    End Sub

    Les Sub appelées par les évènements:
    Code vb : 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
    Sub SyncList()
    Dim strKeyF As String, strKeyL As String
    Dim i As Integer
     
    ' re-exécute requête de la liste si nécessaire
    ' (filtrée sur Code Projet et [LCN] du formulaire)
    If Me.lb_ListeConf.ListCount > 0 Then
       If Me.lb_ListeConf.Column(0) <> Me.tb_CodeProjet _
          Or Me.lb_ListeConf.Column(1) <> Me.tb_LCN Then
          Me.lb_ListeConf.Requery
       End If
    Else
    Me.lb_ListeConf.Requery
    End If
     
    ' concaténe les 5 chps clés du formulaire
    strKeyF = Nz([Code Projet]) & Nz([LCN]) & _
              Nz([Série]) & Nz([Version]) & Nz([Variante])
     
    For i = 1 To Me.lb_ListeConf.ListCount
        ' concaténe 2 premiers chps clés du formulaire et
        ' les 3 1eres colonnes de la liste
        strKeyL = [Code Projet] & [LCN] & _
                  Me.lb_ListeConf.Column(2, i - 1) & _
                  Me.lb_ListeConf.Column(3, i - 1) & _
                  Me.lb_ListeConf.Column(4, i - 1)
        ' Si clés identiques sélectionner ligne de la liste
        If strKeyL = strKeyF Then
           Me.lb_ListeConf = i - 1 ' Colonne liée = 0 => ListIndex
           ' cette méthode ne fonctionne pas
           'Me.lb_ListeConf.Selected(i - 1) = True
           Exit For
        End If
    Next
    End Sub
    Sub SyncForm()
    Dim strRecherche As String, rs As DAO.Recordset
     
    strRecherche = "[Code Projet]='" & Nz([Code Projet]) & "'"
    strRecherche = strRecherche & " AND [LCN]='" & Nz([LCN]) & "'"
     
    strRecherche = strRecherche & " AND [Série]='" & Me.lb_ListeConf.Column(2) & "'"
    strRecherche = strRecherche & " AND [Version]='" & Me.lb_ListeConf.Column(3) & "'"
    strRecherche = strRecherche & " AND [Variante]='" & Me.lb_ListeConf.Column(4) & "'"
     
    Set rs = Me.RecordsetClone
    rs.FindFirst strRecherche
    If Not rs.NoMatch Then
       Me.Bookmark = rs.Bookmark
    End If
    End Sub
    Les deux variables booléennes me servent à éviter que les événements ne se déclenchent en boucle.

    Essaie déjà avec ça. On verra le cas du sous-formulaire ensuite.

    A+

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 38
    Points : 31
    Points
    31
    Par défaut
    Bonjour LedZeppII,

    Un grand merci pour ton aide. C'est génial
    Ton code marche du premier coup ! ça correspond tout à fait à mes besoins.

    Maintenant, je vais me pencher sur le SF !

    A+

Discussions similaires

  1. [AC-2010] Filtre sur formulaire avec copie dans une autre table
    Par alainnolahc dans le forum VBA Access
    Réponses: 1
    Dernier message: 09/10/2010, 19h26
  2. Réponses: 4
    Dernier message: 30/08/2007, 09h47
  3. Supprimer valeur dans zone de liste
    Par benjisan dans le forum Access
    Réponses: 3
    Dernier message: 27/06/2007, 14h45
  4. récupération de valeur dans un sous-formulaire
    Par Sebastien_INR59 dans le forum Access
    Réponses: 2
    Dernier message: 05/06/2006, 11h48
  5. Réponses: 2
    Dernier message: 08/05/2006, 21h08

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