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 :

Créer/Remplir un sous-formulaire à l'aide d'une requête [AC-2007]


Sujet :

VBA Access

  1. #1
    Membre du Club
    Homme Profil pro
    Webdesigner
    Inscrit en
    Mars 2011
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Webdesigner
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2011
    Messages : 64
    Points : 56
    Points
    56
    Par défaut Créer/Remplir un sous-formulaire à l'aide d'une requête
    Bonjour,

    Ma question est peut-être bête mais je débute en Access et je dois réaliser une application pour mon stage. Je vous explique le problème :

    J'ai un formulaire "Opérateur" qui contient une combobox et des onglets. Je travaille actuellement sur l'onglet "Fiches de poste" qui me permet de voir les fiches de l'opérateur sélectionné.
    J'ai donc fait pour l'instant une liste dans cet onglet, contenant toutes les fiches de poste de l'opérateur. Lors du changement d'opérateur dans la liste de recherche, la liste des fiches se met à jour, il n'y a pas de soucis à ce niveau.

    Maintenant, j'aimerais afficher lors de la sélection d'une fiche de poste la liste de tous les éléments de la fiche de poste dans un tableau. Pour cela, j'imagine que j'ai donc besoin d'un sous-formulaire, dont la requête sera modifiée en fonction du changement de fiche et d'opérateur.
    Comment peut-on, à partir d'une requête en VBA, parcourir un Recordset pour afficher les lignes du tableau une par une? Ou faut-il procéder autrement?

    Je vous remercie d'avance pour vos réponses.

    Cordialement,
    Prettyletter

  2. #2
    Membre actif
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Octobre 2007
    Messages
    169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2007
    Messages : 169
    Points : 241
    Points
    241
    Par défaut
    Bonjour,

    Je ne suis pas sûr d'avoir bien compris à 100%ce que tu veux faire!

    Mais une solution simple consiste peut être à créer une table temporaire à partir de ta requête SQL (SELECT INTO) puis d'avoir un formulaire qui pointe dessus.

    Sinon tu peux aussi créer un sous formulaire dont tu changeras la requête SQL source quand nécessaire (évènement after_update par exemple)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Me.NomSousFormulaire.Form.RecordSource = "Requête SQL"

  3. #3
    Membre du Club
    Homme Profil pro
    Webdesigner
    Inscrit en
    Mars 2011
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Webdesigner
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2011
    Messages : 64
    Points : 56
    Points
    56
    Par défaut
    Je te remercie d'avoir répondu!

    J'avais essayé déjà ta deuxième solution mais j'avais des erreurs. Je vais réessayer!
    Sinon, j'ai eu l'idée de créer un sous-formulaire avec champs pères et champs fils mais je ne sais pas comment récupérer la valeur sélectionnée dans la liste pour faire cela..

  4. #4
    Membre actif
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Octobre 2007
    Messages
    169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2007
    Messages : 169
    Points : 241
    Points
    241
    Par défaut
    Personnellement j'utilise beaucoup cette solution et ça fonctionne très bien.

    Pour éviter les erreurs je te conseille de:
    1 - Créer le formulaire qui te servira de sous formulaire
    2 - Lui ta chaîne SQL en propriété record source (basé sur une fiche de poste test) afin de tester
    3 - Une fois que ça marche tu peux mettre le code que je t'ai donné dans le formulaire parent

  5. #5
    Membre du Club
    Homme Profil pro
    Webdesigner
    Inscrit en
    Mars 2011
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Webdesigner
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2011
    Messages : 64
    Points : 56
    Points
    56
    Par défaut
    J'ai peut-être un début de solution mais, évidemment, il me faudrait la fin!

    J'ai donc utilisé un sous-formulaire contenant toutes les informations dont j'ai besoin, créé avec l'assistant. L'idée est d'avoir en champs père l'identifiant de l'opérateur ET l'identifiant de la fiche, et en champs fils les champs correspondants. En revanche, je ne peux pas sélectionner dans les champs père l'identifiant de la fiche. J'ai donc essayé de le modifier par VB, mais ça ne fonctionne pas. Voici ce que j'ai écrit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    ' Evènements lors de la sélection d'une fiche de poste dans la liste
    Private Sub lst_Fiches_poste_AfterUpdate()
     
    Dim str_Modules As String
     
    Me.sf_Modules_FP_Op.LinkMasterFields = Me.lst_Fiches_poste & ";" & Me.cbo_Operateurs
    Me.sf_Modules_FP_Op.LinkChildFields = "[IDX ID_FP];[IDX ID_OP]"
     
    End Sub
    Je ne suis pas sûr de mon coup pour la concaténation de deux champs pères non plus. Si quelqu'un a une idée, je suis preneur!

  6. #6
    Membre actif
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Octobre 2007
    Messages
    169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2007
    Messages : 169
    Points : 241
    Points
    241
    Par défaut
    Je crois qu'il te faut mettre des virgules plutôt que des points virgules.

    Personnellement je n'utilise jamais cette fonction. J'aurais donc du mal à te fournir plus d'aide!

  7. #7
    Membre actif
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Octobre 2007
    Messages
    169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2007
    Messages : 169
    Points : 241
    Points
    241
    Par défaut
    Et je crois aussi que ça serais plutot quelque chose comme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Me.sf_Modules_FP_Op.LinkMasterFields = "lst_Fiches_poste,cbo_Operateur"
    Me.sf_Modules_FP_Op.LinkChildFields = "[IDX ID_FP],[IDX ID_OP]"
    (mais là encore je ne suis pas sûr à 100%...)

  8. #8
    Membre du Club
    Homme Profil pro
    Webdesigner
    Inscrit en
    Mars 2011
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Webdesigner
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2011
    Messages : 64
    Points : 56
    Points
    56
    Par défaut
    Je vais plutôt faire ce que tu m'as dit, je pense que tu sais mieux que moi! C'est peut-être ma requête SQL qui était incorrecte, je vais revérifier et je posterai ma solution quand j'aurai trouvé. Merci beaucoup

  9. #9
    Membre du Club
    Homme Profil pro
    Webdesigner
    Inscrit en
    Mars 2011
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Webdesigner
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2011
    Messages : 64
    Points : 56
    Points
    56
    Par défaut
    J'ai fait comme tu m'as dit mais ça ne veut pas fonctionner. A chaque fois que je sélectionne une fiche dans la liste, j'obtiens d'abord une fenêtre me demandant un paramètre avec pour intitulé "2" puis une autre, la même avec "5".

    Voici mon code VBA :

    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
    ' Evènements lors de la sélection d'une fiche de poste dans la liste
    Private Sub lst_Fiches_poste_AfterUpdate()
     
    Dim str_Modules As String
     
    ' Sélection des modules et des infos concernant leur acquisition par l'opérateur
    str_Modules = "SELECT CODE, [LIBELLE], [FORMATEUR], [DATE_ACQ], [OBSERVATIONS]" _
                & " FROM [MODULES], [OPERATEURS_MODULES]" _
                & " WHERE [MODULES].[IDX ID] IN (SELECT [IDX ID_MOD]" _
                & " FROM [MODULES_FP] WHERE [IDX ID_FP] = " & Me.lst_Fiches_poste & ")" _
                & " AND [OPERATEURS_MODULES].[IDX ID_OP] = " & Me.cbo_Operateurs & ";"
     
    Me.sf_Modules_FP_Op.Form.RecordSource = str_Modules
     
    End Sub

    Edit :
    Après vérification, je me suis trompé dans l'inclusion du sous-formulaire, j'ai mis une requête au lieu du formulaire. Je n'ai plus de boites de dialogue mais je n'ai pas de résultat et je vois un message s'afficher pendant une fraction de seconde dans la barre d'état du logiciel : "Impossible de mettre à jour ce jeu d'enregistrements"...

  10. #10
    Membre du Club
    Homme Profil pro
    Webdesigner
    Inscrit en
    Mars 2011
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Webdesigner
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2011
    Messages : 64
    Points : 56
    Points
    56
    Par défaut
    L'erreur venait bien de la requête qui ne fonctionnait pas. Résolu! Merci beaucoup!

  11. #11
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2014
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2014
    Messages : 18
    Points : 20
    Points
    20
    Par défaut
    Bonjour à tous,

    Lors de l'exécution j'ai le message d'erreur suivant : "Type de données incompatibles dans l'expression du critère" et cette ligne de code est surlignée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Me.SousFormulaire.Form.RecordSource = strSQL
    Ma requête me semble bonne donc je ne sais pas d'où peut venir mon problème, si quelqu'un pouvait m'éclaircir un peu

    Merci

  12. #12
    Expert éminent

    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    3 846
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 846
    Points : 7 983
    Points
    7 983
    Par défaut
    Bonjour,

    Le message d'erreur est explicite. Vous assignez un variable de mauvais type à un champ ou contrôle.
    Pour plus d'explication, il faudrait le code de strSQL.

    Cordialement,

  13. #13
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2014
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2014
    Messages : 18
    Points : 20
    Points
    20
    Par défaut
    Tout d'abord, merci pour votre réponse aussi rapide.

    Le code est le suivant :

    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
    Dim strSQL As String
    Dim SN As String
    Dim jour
     
    jour = Date
    jour = Format(jour, "mm/dd/yyyy")
    jour = DateAdd("yyyy", -2, jour)
    jour = Format(jour, "yyyyddmm")
    SN = "0"
     
    strSQL = "SELECT Count(*) AS nbr, T_Data.Family, T_Data.Market, T_Data.Model, T_Data.SN1, T_Data.SN2, T_Data.Instal " & _
             "FROM T_Data " & _
             "GROUP BY T_Data.Family, T_Data.Market, T_Data.Model, T_Data.SN1, T_Data.SN2, T_Data.Instal, T_Data.Period " & _
             "HAVING (((Count(*))>1) AND ((T_Data.SN1)<>" & SN & ") AND ((T_Data.SN2)<>" & SN & ") AND ((T_Data.Period)>" & jour & ")) " & _
             "ORDER BY Count(*) DESC;"
    Cette requête doit me permettre d'afficher les doublons avec leurs nombres d'apparitions dans un sous formulaire.

    Cordialement,

  14. #14
    Expert éminent

    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    3 846
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 846
    Points : 7 983
    Points
    7 983
    Par défaut
    Il faut vérifier les types des champs SN1,SN2 et period dans les tables sources. Texte ou autre chose.
    Le type de ton variable jour n'est pas clair.

  15. #15
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2014
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2014
    Messages : 18
    Points : 20
    Points
    20
    Par défaut
    Les 3 champs sont de type texte et la variable jour est de type String

  16. #16
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2014
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2014
    Messages : 18
    Points : 20
    Points
    20
    Par défaut
    Pour être un peu plus clair, je suis passé par le mode création pour faire ma requête.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT Count(*) AS nbr, T_Data.Family, T_Data.Market, T_Data.Model, T_Data.SN1, T_Data.SN2, T_Data.Instal
    FROM T_Data
    GROUP BY T_Data.Family, T_Data.Market, T_Data.Model, T_Data.SN1, T_Data.SN2, T_Data.Instal, T_Data.Period
    HAVING (((Count(*))>1) AND ((T_Data.SN1)<>"0") AND ((T_Data.SN2)<>"0") AND ((T_Data.Period)>"20120505"))
    ORDER BY Count(*) DESC;
    Celle-ci marche très bien et fait exactement ce que je souhaite. Cependant j'aimerai que le "((T_Data.Period)>"20120505"))" se mette à jour dans la requête en fonction de la date du jour. E je suis donc obligé de passer par du code vba pour faire cela.

  17. #17
    Expert éminent

    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    3 846
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 846
    Points : 7 983
    Points
    7 983
    Par défaut
    Bonjour,

    Si ce sont des textes donc faut les mettre entre apostrophes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    strSQL = "SELECT Count(*) AS nbr, T_Data.Family, T_Data.Market, T_Data.Model, T_Data.SN1, T_Data.SN2, T_Data.Instal " & _
             "FROM T_Data " & _
             "GROUP BY T_Data.Family, T_Data.Market, T_Data.Model, T_Data.SN1, T_Data.SN2, T_Data.Instal, T_Data.Period " & _
             "HAVING (((Count(*))>1) AND ((T_Data.SN1)<>'" & SN & "') AND ((T_Data.SN2)<>'" & SN & "') AND ((T_Data.Period)>'" & jour & "')) " & _
             "ORDER BY Count(*) DESC;"
    Bonne continuation

  18. #18
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2014
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2014
    Messages : 18
    Points : 20
    Points
    20
    Par défaut
    Quelle doit être la source de mon sous formulaire ?
    Au début la source était la requête sql issue du mode création. Bien entendu je l'ai supprimé pour mettre ma table T_Data comme source du sous formulaire. Est-ce bien ça ? Même si je ne veux pas afficher tous les champs de cette table, je pense que la requête me permet d'afficher uniquement ce que je veux ?
    A l'exécution j'ai l'erreur suivante : La source d'enregistrement "Faux" spécifiée dans ce formulaire ou dans cet état n'existe pas.

  19. #19
    Expert éminent

    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    3 846
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 846
    Points : 7 983
    Points
    7 983
    Par défaut
    Tu ne pouvais pas indiquer ton contexte dès le début?
    Normalement tu mets le strSQL en source de ton sous-formulaire et ça devrait le filtrer.
    D'après ton message, tu as mis "FAUX" dans les propriétés "Source controle" de ton sous-formulaire, c'est pourquoi Access te jette.

  20. #20
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2014
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2014
    Messages : 18
    Points : 20
    Points
    20
    Par défaut
    Comment je dois procéder pour mettre le strSQL en source de mon sous formulaire ?

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [AC-2007] Remplir un sous-formulaire
    Par Marcello5255 dans le forum IHM
    Réponses: 12
    Dernier message: 23/06/2011, 12h06
  2. Ouvrir sous formulaire à l'aide d'un bouton
    Par egg3774 dans le forum IHM
    Réponses: 2
    Dernier message: 30/05/2007, 14h14
  3. Réponses: 20
    Dernier message: 07/05/2007, 16h46
  4. Réponses: 5
    Dernier message: 18/11/2005, 23h28
  5. Réponses: 3
    Dernier message: 24/10/2005, 11h32

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