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

VBA Access Discussion :

Comment lier un subform à un form DYNAMIQUEMENT [AC-2007]


Sujet :

VBA Access

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    116
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2007
    Messages : 116
    Points : 52
    Points
    52
    Par défaut Comment lier un subform à un form DYNAMIQUEMENT
    Bonjour,

    Le contexte: un form qui affiche une personne et ses enfants (dans un subform)

    La personne est identifiée par idPerson, chaque enfant identifie ses parents par idFather et idMother

    Selon que la personne est M ou F, le lien entre le form et le subform change:
    si la personne est M, Chid.idFather = Person.idPerson
    si la personne est F, Chid.idMother = Person.idPerson
    et le sexe de la personne n'est connu que lorsque la personne est affichée dans le form, c'est pourquoi le lein doit être fait dynamiquement.

    Je cherche à savoir:
    1. comment faire le lien entre le form et le subform dynamiquement , en VBA
    2. où placer le code (à quel événement le rattacher)

    Merci d'avance pour vos indications et conseils.

    JL

  2. #2
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 648
    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 648
    Points : 14 626
    Points
    14 626
    Par défaut
    bonjour
    les propriétés champ/père et champ/fils en VBA sont LinkMasterFields et LinkChildFields, ton code devrait ressembler à cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    If Me.GenrePerson = "M"  Then
        Me.[nomSousFormulaire].LinkMasterFields = "Chid.idMother"
    Else
        Me.[nomSousFormulaire].LinkMasterFields = "Chid.idFather"
    End If
    Me.[nomSousFormulaire].LinkChildFields = "Person.idPerson"
    Tu peux mettre ce code dans l'évènement Load (Au chargement) du formulaire si le parent est déjà connu, sinon il faut le mettre dans un évènement qui suit le changement d'Identifiant du parent (After Update ou Click)
    Quand on est derrière l'écran on n'a aucun clavier sous les mains ...
    ah non ? donc devant l'écran c'est la connectique ?

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    116
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2007
    Messages : 116
    Points : 52
    Points
    52
    Par défaut
    Merci.

    Malheureusement, cela ne fonctionne pas: toutes les personnes sont dans le subform (au lieu des enfants seulement), ce qui indique que le subform n'a pas pris les valeurs de LinkChildFields et LinkMasterFields qui sont fixées par le code VBA.
    Pour info, LinkChildFields et LinkMasterFields sont vides dans le subform en statique (pour pouvoir être affectées en dynamique par le code VBA).

  4. #4
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 648
    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 648
    Points : 14 626
    Points
    14 626
    Par défaut
    Si tu pouvais donner plus d'informations cela serait plus facile, par exemple : comment sont organisées les données dans le formulaire principal ? L'affichage par défaut est-il en mode formulaire continu ou en formulaire unique ?
    Après lecture de l'aide sur les propriétés champ/père champ/fils, je me rend compte que ce n'est pas possible de les rendre dynamiques. La seule solution serait de fusionner les 2 champs IdFather et IdMother en un seul dans la requête
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Select iif(Genre="M",[Idmother],[IdFather]) as IdParent from ...
    Quand on est derrière l'écran on n'a aucun clavier sous les mains ...
    ah non ? donc devant l'écran c'est la connectique ?

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    116
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2007
    Messages : 116
    Points : 52
    Points
    52
    Par défaut
    C'est astucieux.

    Mais c'est le sexe du parent (form personne) qui détermine si le lien avec l'enfant (subform) doit se faire sur idPere ou sur idMere de l'enfant, donc un iif ne va pas marcher puisque les tables parent et enfant doivent être liées pour ça. Donc pas possible.

    2ème solution: générer dynamiquement la source du subform en fonction du genre du parent: générer le Select dans le Private Sub Form_Current() do form. Ca ne marche pas non plus.

    3ème solution: mettre 2 subforms (un par genre: ListeEnfantsPere et ListeEnfantsMere) et afficher/masquer selon le genre du parent:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
        Select Case Me.Sexe
            Case "M":
                'Me.ListeEnfantsPere.IsVisible = True
                'Me.ListeEnfantsMere.IsVisible = False
            Case "F"
                'Me.ListeEnfantsPere.IsVisible = False
                'Me.ListeEnfantsMere.IsVisible = True
            Case Else
                'ListeEnfantsMere.IsVisible = False
                'Me.ListeEnfantsMere.IsVisible = False
        End Select
    Problème: le compilateur n'admet pas une affectation genre ListeEnfantsMere.IsVisible = True

    Alors comment afficher/masquer un subform dans un form ?

  6. #6
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 331
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 331
    Points : 23 786
    Points
    23 786
    Par défaut
    La solution la plus simple est d'avoir 2 sous-formulaires et un contrôle onglet, un sous-formulaire par onglet.
    Et le plus beau de cette solution c'est que ce peut être le même sous-formulaire utilisé 2 fois, une fois lié sur le père et une fois lié sur la mère.
    Tu à juste à basculer d'un onglet à l'autre (et éventuellement cacher l'onglet inutile).

    Et, as-tu pensé aux familles où les 2 parents sont de même sexe ?

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    116
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2007
    Messages : 116
    Points : 52
    Points
    52
    Par défaut
    Excellent!
    Même si on peut déplorer qu'Access ne permet pas de créer dynamiquement la source d'un subform, ta solution est relativement élégante puisqu'elle n'utilise qu'un seul sousform.
    En mode édition, Access n'aime pas que l'on mette deux fois le même sousform sur un même form, mais il y moyen d'y arriver quand même.
    Merci.
    JL

  8. #8
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 331
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 331
    Points : 23 786
    Points
    23 786
    Par défaut
    Parfois il faut savoir tricher :-).

    Si tu considères le sujet clos, merci d'appuyer sur en bas de discussion.

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  9. #9
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 648
    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 648
    Points : 14 626
    Points
    14 626
    Par défaut
    Bonsoir,
    je pense qu'avec une requête Union il est possible d'avoir la solution, il faut juste confirmer que IdFather et IdMother ne peuvent pas être égaux (clé unique IdPerson dans Person) et bien évidemment, les 2 sont obligatoirement renseignés (dans ce cas INNER JOIN remplacera LEFT JOIN), il suffit donc de "dupliquer" les enfants pour chaque parent et créer ainsi un identifiant unique composé de l'idParent et GenreParent (sexe du parent) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT IdChld, Child.NomEnfant, Child.IdFather AS Idparent, Person.GenreParent
    FROM Child LEFT JOIN Person ON Child.IdFather = Person.IdPerson
    UNION ALL 
    SELECT IdChld, Child.NomEnfant, Child.IdMother AS Idparent, Person.GenreParent
    FROM Child LEFT JOIN Person ON Child.IdMother = Person.IdPerson;
    Après il suffit de créer champ père IdPerson, champ fils IdParent ... et cela marcherait aussi pour les parents de même sexe !
    Quand on est derrière l'écran on n'a aucun clavier sous les mains ...
    ah non ? donc devant l'écran c'est la connectique ?

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    116
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2007
    Messages : 116
    Points : 52
    Points
    52
    Par défaut
    Merci pour ta suggestion qui simplifie le form.

    Mais:
    1. dans quel event mettre l'exécution de la requête UNION
    2. comme Access ne semble pas permettre la création en dynamique (à l'exécution) de la source d'un subform, on pourrait mettre le résultat de la requête dans une table de travail , mais alors retour à la question 1.

  11. #11
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 648
    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 648
    Points : 14 626
    Points
    14 626
    Par défaut
    Bonjour,
    1. dans quel event mettre l'exécution de la requête UNION
    c'est dans la propriété Source du sous-formulaire qu'il faut mettre la requête et il ne s'agit pas d'exécution, ce sont le données qui seront affichées.
    2. comme Access ne semble pas permettre la création en dynamique (à l'exécution) de la source d'un subform,
    Non c'est juste le lien champ/père champ/fils qui ne peut pas être dynamique : la source peut l'être.
    Quand on est derrière l'écran on n'a aucun clavier sous les mains ...
    ah non ? donc devant l'écran c'est la connectique ?

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

Discussions similaires

  1. [Débutant] Comment lier des forms
    Par Simon's Desigm dans le forum C#
    Réponses: 5
    Dernier message: 28/11/2016, 06h35
  2. comment lier plusieurs TEdit à un edit d'une autre form
    Par miss-unknown dans le forum Débuter
    Réponses: 3
    Dernier message: 23/10/2014, 15h16
  3. Comment lier user controle au windows form ?
    Par genius4evers dans le forum C#
    Réponses: 2
    Dernier message: 17/11/2011, 09h22
  4. [VI-2003] comment lier les formes ?
    Par graphicsxp dans le forum Visio
    Réponses: 1
    Dernier message: 06/05/2010, 19h29
  5. comment lier deux tables?????
    Par baboune dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 16/03/2004, 14h45

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