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 :

Enregistrements selectionnés dans sous formulaire


Sujet :

IHM

  1. #1
    Membre éprouvé Avatar de jean-paul lepetit
    Inscrit en
    Février 2005
    Messages
    842
    Détails du profil
    Informations personnelles :
    Âge : 68

    Informations forums :
    Inscription : Février 2005
    Messages : 842
    Points : 919
    Points
    919
    Par défaut Enregistrements selectionnés dans sous formulaire
    Bonjour à tous,

    Encore une petite question...

    J'ai un formulaire avec un sous formulaire, j'aurais besoin de sélectionner plusieurs enregistrements avec Shift ou Ctrl et d'exécuter une action sur ce groupe d'enregistrement.

    Une idée ?

    Merci

  2. #2
    Membre expert
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Octobre 2012
    Messages
    1 873
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2012
    Messages : 1 873
    Points : 3 459
    Points
    3 459
    Par défaut
    Bonjour jean-paul lepetit,

    Voici une fonction qui parcourt les enregistrements sélectionnés avec le bouton "shift". A mettre dans un module standard.
    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
    Function DisplayRecord(oForm As Access.Form, lHeight As Long)
    Dim i                       As Long
    Dim rst                     As DAO.Recordset
     
         ' Récupérer les enregistrements
         Set rst = oForm.RecordsetClone
     
         ' Aller au premier enregistrement
         rst.MoveFirst
     
         ' Aller au premier enregistrement sélectionné
         rst.Move oForm.SelTop - 1
     
         ' Parcourir les enregistrement
         ' MsgBox pour chaque enregistrement
         For i = 1 To lHeight
           MsgBox rst![Un_champ_de_votre_formulaire]
           rst.MoveNext
         Next i
         Set rst = Nothing
     
      End Function
    Il y a cependant un problème, dès que vous cliqué sur un bouton de commande (mon exemple) vous perdez le focus des enregistrements sélectionnés. Pour contourner cette restriction, dans votre sous formulaire inclure une variable comme suit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Option Compare Database
    Option Explicit
     
    Dim lHeight As Long
     
    Private Sub btnSelection_Click()
    DisplayRecord Me, lHeight
    End Sub
     
    Private Sub Form_Click()
    lHeight = Me.SelHeight
    End Sub
    Cela va fonctionner si vous lancez la fonction à partir de votre sous formulaire. Si vous voulez lancez la fonction du formulaire principal il va falloir récupérer le "SelHeight" du sous formulaire.

    Bonne journée

  3. #3
    Membre éprouvé Avatar de jean-paul lepetit
    Inscrit en
    Février 2005
    Messages
    842
    Détails du profil
    Informations personnelles :
    Âge : 68

    Informations forums :
    Inscription : Février 2005
    Messages : 842
    Points : 919
    Points
    919
    Par défaut
    Bonsoir,

    Merci pour ton code, je teste ça et reviens vers toi si j'ai des questions...

  4. #4
    Membre éprouvé Avatar de jean-paul lepetit
    Inscrit en
    Février 2005
    Messages
    842
    Détails du profil
    Informations personnelles :
    Âge : 68

    Informations forums :
    Inscription : Février 2005
    Messages : 842
    Points : 919
    Points
    919
    Par défaut
    Bonjour Robert,

    Je n'ai pas trouvé comment utiliser ta fonction

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Function DisplayRecord(oForm As Access.Form, lHeight As Long)
    oForm c'est le nom de mon sous formulaire ?
    lHeight nombre d'enregistrements dans mon SF ?

  5. #5
    Membre expert
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Octobre 2012
    Messages
    1 873
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2012
    Messages : 1 873
    Points : 3 459
    Points
    3 459
    Par défaut
    Bonjour jean-paul lepetit,

    En répondant à vos questions je viens de réaliser que la fonction n'est pas complète. En effet si on sélectionne en partant du bas du formulaire et en remontant le ".SelTop" n'est pas bon. Voici la fonction modifiée pour fonctionner de bas en haut et de haut en bas dans un formulaire.
    Comme expliqué dans le poste #2, la fonction est à mettre dans un module standard.
    La fonction accepte en argument "oForm" qui est un formulaire et "lHeight" qui représente le nombre de lignes sélectionnées et "lTop" qui représente dernière la ligne sélectionnée.

    Dans votre formulaire ou sous-formulaire ligne 4 et 5 sont les variables en entête de formulaire. Lignes 7 à 9 sont l'appel de la fonction à l'aide d'un bouton de commande positionné en entête ou pied de formulaire. Les ligne 11 à 14 sont l'événement déclenché à chaque click sur le "RecordSelector" de votre formulaire ou sous-formulaire. Explication du .selheight et du .seltop
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Option Compare Database
    Option Explicit
     
    Dim lHeight As Long
    Dim lTop As Long
     
    Private Sub btnSelection_Click()
    DisplayRecord Me, lHeight, lTop
    End Sub
     
    Private Sub Form_Click()
    lHeight = Me.SelHeight
    lTop = Me.SelTop
    End Sub
    Comme vous pouvez le constater j'ai ajouté un argument "lTop" dans la fonction et ensuite dans le code on teste si le "SelTop" est la plus petite ligne sélectionnées, si ce n'est pas le cas on remet le curseur sur la plus petite ligne. (lignes 12 à 14)
    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
    Function DisplayRecord(oForm As Access.Form, lHeight As Long, lTop As Long)
    Dim i                       As Long
    Dim rst                     As DAO.Recordset
     
         ' Récupérer les enregistrements
         Set rst = oForm.RecordsetClone
     
         ' Aller au premier enregistrement
         rst.MoveFirst
     
         ' Aller au premier enregistrement sélectionné
         If oForm.SelTop > lTop Then
            oForm.SelTop = lTop
         End If
         rst.Move oForm.SelTop - 1
         ' Parcourir les enregistrement
         ' MsgBox pour chaque enregistrement
         For i = 1 To lHeight
           MsgBox rst![LeChampDésiré]
           rst.MoveNext
         Next i
         Set rst = Nothing
     
      End Function
    oForm c'est le nom de mon sous formulaire ?
    Pas vraiment, c'est plutôt le formulaire ou sous-formulaire. C'est un "Object" "Access.Form". On le passe en argument avec le "Me" de la ligne 8 du code dans le formulaire.
    lHeight nombre d'enregistrements dans mon SF ?
    Pas tout à fait, c'est le nombre d'enregistrements sélectionnés. Je vous ai mis en lien les explications Microsoft qui sont très claires.

    Bonne journée

  6. #6
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 769
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 769
    Points : 14 810
    Points
    14 810
    Par défaut
    bonjour robert1957 et Jean-paul lepetit,
    @Robert1957:
    Citation Envoyé par Robert1957
    Comme expliqué dans le poste #2, la fonction est à mettre dans un module standard.
    certes, mais il faut déclarer les variables en Public car il y a un message "Type d'argument byRef incompatible" à la compilation.
    Ensuite pour que le code fonctionne à partir d'un bouton du formulaire avec une sélection dans le sous-formulaire (ce qui est, je pense, le cas pour le formulaire de Jean-Paul) il faut passer l'appel de la fonction comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DisplayRecord Me.Controls("NomDuSousFormulaire").Form, lHeight, lTop
    et ce code reste dans le sous-formulaire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Private Sub Form_Click()
    lHeight = Me.SelHeight
    lTop = Me.SelTop
    End Sub
    on pourrait aussi mettre le bouton dans l'entête du sous-formulaire ...
    En tout cas, merci Robert1957 pour ce code

  7. #7
    Membre expert
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Octobre 2012
    Messages
    1 873
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2012
    Messages : 1 873
    Points : 3 459
    Points
    3 459
    Par défaut
    Bonjour tee_grandbois,

    Les variables auront besoin d'être déclarées publiques seulement si l'appel de la fonction est fait par le formulaire père. Si le bouton, comme dans mon exemple, est dans l'entête ou le pied de formulaire du sous-formulaire, les variables doivent être déclarées en entête du module du sous-formulaire. C'est une meilleure pratique (encapsulation). Je tente de ne pas déclaré de variable publique, si c'est possible, sinon je les inscrits toutes dans un module que je nomme "moPublic" ce qui permet de s'y retrouver plus facilement si l'application est un peu conséquente. Dans le cas présent, pour faire rapide on pourrait créer 2 champs texte (invisible) dans le formulaire père et y placer l'information pour l'appel de la fonction. Ce serait un "Workaround" qui éviterait de déclaré 2 variables publiques. À voir... Il y aurait aussi la possibilité de modifier la fonction pour passer un seul argument et aller plutôt chercher l'information dans 2 champs texte que l'on positionnerait dans l'entête du sous-formulaire, invisible, et qui serait alimentés au click du "RecordSelector". À voir... Ce ne sont pas les solutions qui manquent...

    Pour ce qui est de l'appel de la fonction, s'il est fait dans le formulaire père vous avez tout à fait raison sur la manière de faire l'appel.

    Bonne journée

  8. #8
    Membre expert
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Octobre 2012
    Messages
    1 873
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2012
    Messages : 1 873
    Points : 3 459
    Points
    3 459
    Par défaut
    Bonjour tee_grandbois, jean-paul lepetit,

    Voici ce que pourrait avoir l'air la même fonction mais avec 2 champs texte invisible (nommé: txtSelHeight, txtSelTop) en entête ou pied de page du sous formulaire.
    Le sous formulaire avec appel de la fonction:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Option Compare Database
    Option Explicit
     
    Private Sub btnSelection_Click() 'Ici l'appel de la fonction
    DisplayRecord Me
    End Sub
     
    Private Sub Form_Click()
    Me.txtSelHeight = Me.SelHeight
    Me.txtSelTop = Me.SelTop
    End Sub
    L'appel de la fonction dans le formulaire père:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub btnSelection_Click()
    DisplayRecord Me.Controls("Le_nom_du_sous-formulaire").Form
    End Sub
    La fonction:
    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
    Function DisplayRecord(oForm As Access.Form)
    Dim i                       As Long
    Dim rst                     As DAO.Recordset
     
         ' Récupérer les enregistrements
         Set rst = oForm.RecordsetClone
     
         ' Aller au premier enregistrement
         rst.MoveFirst
     
         ' Aller au premier enregistrement sélectionné
         If oForm.SelTop > oForm.txtSelTop Then
            oForm.SelTop = oForm.txtSelTop
         End If
         rst.Move oForm.SelTop - 1
         ' Parcourir les enregistrement
         ' MsgBox pour chaque enregistrement
         For i = 1 To oForm.txtSelHeight
           MsgBox rst![Un_champ_de_votre_formulaire]
           rst.MoveNext
         Next i
         Set rst = Nothing
     
      End Function
    Bonne journée

  9. #9
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 769
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 769
    Points : 14 810
    Points
    14 810
    Par défaut
    ça paraît bien ...
    dans la fonction je rajouterai bien (en ligne 10) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
         rst.MoveLast
         rst.MoveFirst
         If rst.RecordCount > 0 Then
     
    ...
         End If
    pour le cas où on sélectionne le curseur du nouvel enregistrement

  10. #10
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 769
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 769
    Points : 14 810
    Points
    14 810
    Par défaut
    ERRATUM:
    c'est plutôt comme cela qu'il faut traiter le cas où le curseur du nouvel enregistrement fait partie de la sélection:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
         For i = 1 To oForm.txtSelHeight
              If Not rst.EOF Then
                    MsgBox rst.Fields(0)
                    rst.MoveNext
              End If
         Next i

  11. #11
    Membre expert
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Octobre 2012
    Messages
    1 873
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2012
    Messages : 1 873
    Points : 3 459
    Points
    3 459
    Par défaut
    Bonjour tee_grandbois,

    Bien vu, c'est un détail auquel je n'avais pas pensé.

    Bonne journée

  12. #12
    Membre expert
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Octobre 2012
    Messages
    1 873
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2012
    Messages : 1 873
    Points : 3 459
    Points
    3 459
    Par défaut
    Bonjour tee_grandbois, jean-paul lepetit,

    Tant qu'a être dans les améliorations, l'utilisation de la collection "TempVars" est tout désigné pour remplacer des variables publiques dans notre exemple.
    Le code du sous-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
    Option Compare Database
    Option Explicit
     
    Private Sub btnSelection_Click()
    DisplayRecord Me
    End Sub
     
    Private Sub Form_Click()
    'On crée et renseigne les variables
    TempVars!tvSelHeight = Me.SelHeight
    TempVars!tvSelTop = Me.SelTop
    End Sub
     
    Private Sub Form_Close()
    'A la fermeture du formulaire on détruit les variables
    TempVars.Remove ("tvSelHeight")
    TempVars.Remove ("tvSelTop")
    End Sub
    Pour le formulaire principal, pas de modification:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Option Compare Database
    Option Explicit
     
    Private Sub btnForm_Click()
    DisplayRecord Me.Controls("Le_nom_du_sous-formulaire").Form
    End Sub
    La fonction avec la suggestion de tee_grandbois et les "TempVars":
    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
    Function DisplayRecord(oForm As Access.Form)
    Dim i                       As Long
    Dim rst                     As DAO.Recordset
     
        ' Récupérer les enregistrements
        Set rst = oForm.RecordsetClone
     
        ' Aller au premier enregistrement
        rst.MoveFirst
     
        ' Aller au premier enregistrement sélectionné
        If oForm.SelTop > TempVars!tvSelTop Then
            oForm.SelTop = TempVars!tvSelTop
        End If
        rst.Move oForm.SelTop - 1
        ' Parcourir les enregistrement
        ' MsgBox pour chaque enregistrement
        For i = 1 To TempVars!tvSelHeight
        If Not rst.EOF Then
            MsgBox rst.Fields(0)
            rst.MoveNext
        End If
        Next i
        Set rst = Nothing
     
      End Function
    Je crois que c'est plus propre comme code que les variables publiques ou les txtBox invisibles.

    Bonne journée

  13. #13
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 769
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 769
    Points : 14 810
    Points
    14 810
    Par défaut
    Citation Envoyé par Robert1957
    Je crois que c'est plus propre comme code que les variables publiques ou les txtBox invisibles.
    en effet, je n'y pense jamais, les "TempVars" sont arrivées après que j'ai cessé mon activité professionnelle.

    bonne journée à toi, moi c'est bonne soirée en France .. .

  14. #14
    Membre éprouvé Avatar de jean-paul lepetit
    Inscrit en
    Février 2005
    Messages
    842
    Détails du profil
    Informations personnelles :
    Âge : 68

    Informations forums :
    Inscription : Février 2005
    Messages : 842
    Points : 919
    Points
    919
    Par défaut
    Merci à tous les deux,
    la dernière version avec les "TempVars" fonctionne à merveille.
    Il a juste fallu que je l'adapte à l'action dont j'ai besoin (suppression d'enregistrements).
    il faudra que je me penche un peu plus sur ces bestioles.... (les TempVars)

    Encore Merci

  15. #15
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 769
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 769
    Points : 14 810
    Points
    14 810
    Par défaut
    Il a juste fallu que je l'adapte à l'action dont j'ai besoin (suppression d'enregistrements).
    tout ça pour ça ? mais la touche Suppr suffisait !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Atteindre un enregistrement dans sous formulaire
    Par Kyrha dans le forum Access
    Réponses: 9
    Dernier message: 10/11/2018, 09h06
  2. [AC-2007] Ne pas afficher enregistrement vide dans sous formulaire
    Par Lux (le noob) dans le forum IHM
    Réponses: 2
    Dernier message: 04/03/2014, 11h49
  3. [AC-2000] enregistrement données dans sous formulaire
    Par otaquet dans le forum IHM
    Réponses: 7
    Dernier message: 29/10/2009, 18h43
  4. Réponses: 3
    Dernier message: 14/05/2006, 13h50
  5. Recherche enregistrement dans sous formulaire
    Par 29041977 dans le forum Access
    Réponses: 1
    Dernier message: 09/05/2006, 15h18

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