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 :

actualiser un sous formulaire avec un autre sous formulaire


Sujet :

VBA Access

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur validation
    Inscrit en
    Février 2013
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur validation
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2013
    Messages : 41
    Points : 32
    Points
    32
    Par défaut actualiser un sous formulaire avec un autre sous formulaire
    bonjour ,

    je cherche à actualiser un sous formulaire en fonction des résultats d'un autre sous formulaire

    sachant que sur mon 1er sous formulaire je trie sur des dates et une liste déroulante
    et que sur mon 2eme sous formulaire j'aimerais que se regroupent les produits et la somme en fonction des résultats du premier sous formulaire

    merci pour votre aide


    eexemple.zip

  2. #2
    Membre actif
    Homme Profil pro
    Retraité
    Inscrit en
    Février 2012
    Messages
    284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Bâtiment

    Informations forums :
    Inscription : Février 2012
    Messages : 284
    Points : 284
    Points
    284
    Par défaut
    Bonjour caje17

    Si j'ai bien compris,

    tu veux que lorsque tu choisis Exp dans la liste du formulaire,

    soit affiché :

    BUTA | 103
    SP | 26

    dans le second sous formulaire.
    Un travail qui plait est à moitié fait.

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur validation
    Inscrit en
    Février 2013
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur validation
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2013
    Messages : 41
    Points : 32
    Points
    32
    Par défaut
    oui c'est exactement ça

    en choisissant soit exp soit rec et en choisissant les dates me regroupe les produits entre les dates choisi et avec le choix de la liste déroulante

    merci de t’intéresse a mon sujet

  4. #4
    Membre actif
    Homme Profil pro
    Retraité
    Inscrit en
    Février 2012
    Messages
    284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Bâtiment

    Informations forums :
    Inscription : Février 2012
    Messages : 284
    Points : 284
    Points
    284
    Par défaut
    Bonsoir,

    une solution :

    Remplace le code du formulaire1 par celui-ci :

    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
    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
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    Option Compare Database
     
    Dim m_FiltreDateD As String, m_FiltreDateF As String, m_FiltreExp As String
    Dim m_RecSourceSform1 As String
    Dim m_StrRecSourceSform1 As String
    Dim m_FiltreSform1 As String
    '
    '
     
    Private Sub Form_Load()
        m_FiltreSform1 = ""
        m_StrRecSourceSform1 = _
            "SELECT to2018.Tope, Tore.produits, [T_famille produit].[FAMILLE PRODUIT], [T_Expe rece].recept, to2018.[Date Expédition], Sum(to2018.[Poids (Kg)]) AS [SommeDePoids (Kg)] " & _
            "FROM [T_Expe rece] INNER JOIN ((Tore INNER JOIN to2018 ON Tore.take = to2018.[Tope]) INNER JOIN [T_famille produit] ON Tore.famille = [T_famille produit].[FAMILLE PRODUIT]) ON [T_Expe rece].recept = to2018.[Récep/Expéd] " & _
            "GROUP BY to2018.Tope, Tore.produits, [T_famille produit].[FAMILLE PRODUIT], [T_Expe rece].recept, to2018.[Date Expédition]"
     
        FormsRecordSource1
        Me.[reqprod sous-formulaire1].Form.RecordSource = "SELECT """" as produits, """" AS [SommeDePoids (Kg)] "
    End Sub
     
    Private Sub FormsRecordSource1()
        m_RecSourceSform1 = m_StrRecSourceSform1 & m_FiltreSform1
        Me.cat.Form.RecordSource = m_RecSourceSform1 & ";"
    End Sub
     
    Private Sub FormsRecordSource2()
        Me.[reqprod sous-formulaire1].Form.RecordSource = _
            "SELECT R2.produits, Sum(R2.[SommeDePoids (Kg)]) AS [SommeDeSommeDePoids (Kg)] " & _
            "FROM (" & m_RecSourceSform1 & ") as R2 " & _
            "GROUP BY R2.produits;"
    End Sub
     
    Private Sub Debut_AfterUpdate()
        m_FiltreDateD = IIf(Nz(Me.Debut, 0) = 0, "", "[Date Expédition]<= #" & Format(Me!Debut, "mm/dd/yyyy") & "#")
        FiltreForm
    End Sub
    Private Sub Fin_AfterUpdate()
        m_FiltreDateF = IIf(Nz(Me.Fin, 0) = 0, "", "[Date Expédition]>= #" & Format(Me!Fin, "mm/dd/yyyy") & "#")
        FiltreForm
    End Sub
     
    Private Sub filtrerecep_AfterUpdate()
        m_FiltreExp = IIf(Nz(Me.filtrerecep, "") = "", "", "recept=""" & Me!filtrerecep & """")
        FiltreForm
    End Sub
     
     
    Private Sub FiltreForm()
    Dim strfiltre As String
     
        strfiltre = IIf(m_FiltreExp = "", "", m_FiltreExp) & _
                             IIf(m_FiltreDateD = "", "", IIf(m_FiltreExp = "", m_FiltreDateD, " And " & m_FiltreDateD)) & _
                             IIf(m_FiltreDateF = "", "", IIf(m_FiltreExp = "" And m_FiltreDateD = "", m_FiltreDateF, " And " & m_FiltreDateF))
     
        If strfiltre <> "" Then
            m_FiltreSform1 = " Having " & strfiltre
        Else
            m_FiltreSform1 = ""
        End If
     
        FormsRecordSource1
        FormsRecordSource2
    End Sub
    Tu dois enlever le lien père fils
    Champs père : filtrerecep
    Champs fils : recept
    du sous-formulaire cat avec le formulaire1 pour que mon code fonctionne.

    Les 2 requêtes ne servent plus, elles sont dans le code.

    Bonne continuation
    Un travail qui plait est à moitié fait.

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur validation
    Inscrit en
    Février 2013
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur validation
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2013
    Messages : 41
    Points : 32
    Points
    32
    Par défaut
    bonjour ,

    merci a toi cela fonctionne a merveille

    dernière question :
    Pourrait tu prendre le temps de m'expliquer les lignes que tu as écrire pour que je puisse comprendre et pour que puissent l'adapter a autre chose

    encore grand merci

  6. #6
    Membre actif
    Homme Profil pro
    Retraité
    Inscrit en
    Février 2012
    Messages
    284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Bâtiment

    Informations forums :
    Inscription : Février 2012
    Messages : 284
    Points : 284
    Points
    284
    Par défaut
    Bonjour caje17,

    Au lieu de figer les records sources des 2 sous-formulaire avec des requêtes comme tu l'avais fait,

    je reprends exactement les mêmes requêtes que toi, que j'attribue à chaque sous-formulaire à l'ouverture du formulaire 1,
    (du coup tu peux supprimer les records sources des 2 sous-formulaire, ils ne servent plus à rien, de même que les 2 requêtes),
    à chaque fois qu'un des 3 contrôles "filtres" est activé, le record source de chaque sous-formulaire est recalculé pour afficher le bon résultat.

    Je te remets un code plus simple avec les commentaires :
    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
    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
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    Option Compare Database
    Option Explicit
     
    'variables visibles dans toutes les procédures de ce formulaire
     
    'les 3 variables servant au filtre
    Dim m_FiltreDateD As String
    Dim m_FiltreDateF As String
    Dim m_FiltreExp As String
     
    'variables qui évite de réecrire le Sql fixe du record source du sous-formulaire1, elle est  à l'ouverture du formulaire1 dans le Form-Load()
    Dim m_strSqlSForm1 As String
     
    'variables qui contient le filtre à appliquer sur le Sql du record source du sous-formulaire1,
    'elle est initialisée dans le SForms_RecordSource() à une chaine vide ("") quand aucun filtre est rempli, comme à l'ouverture du formulaire1,
    'du coup tous les enregistrements sont visibles dans les 2 sous-formulaires
    Dim m_FiltreSform1 As String
    '
     
    Private Sub Form_Load()
     
    '   initialise le Sql du record source du sous-formulaire1 [cat] et aussi une partie du sous-formulaire [reqprod sous-formulaire1]
        m_strSqlSForm1 = _
            "SELECT to2018.Tope, Tore.produits, [T_famille produit].[FAMILLE PRODUIT], [T_Expe rece].recept, to2018.[Date Expédition], Sum(to2018.[Poids (Kg)]) AS [SommeDePoids (Kg)] " & _
            "FROM [T_Expe rece] INNER JOIN ((Tore INNER JOIN to2018 ON Tore.take = to2018.[Tope]) INNER JOIN [T_famille produit] ON Tore.famille = [T_famille produit].[FAMILLE PRODUIT]) ON [T_Expe rece].recept = to2018.[Récep/Expéd] " & _
            "GROUP BY to2018.Tope, Tore.produits, [T_famille produit].[FAMILLE PRODUIT], [T_Expe rece].recept, to2018.[Date Expédition]"
     
        SForms_RecordSource '   initialise les records sources des 2 sous-formulaires, ils affiches ici tous les enregistrements
    End Sub
     
    Private Sub SForm1_RecordSource()
    '   ici on voit que le Record Source et formé de 2 variables,
    '   la première m_strSqlSForm1 initialisée à l'ouverture dans la Sub Form_Load()
    '   la seconde m_FiltreSform1 initialisée dans la Sub SForms_RecordSource()
    '   et ajout du ';' pour clore le Sql
        Me.cat.Form.RecordSource = m_strSqlSForm1 & m_FiltreSform1 & ";"
    End Sub
     
    'affectations du filtre Me!Debut à la variable m_FiltreDateD
    Private Sub Debut_AfterUpdate()
        m_FiltreDateD = IIf(Nz(Me.Debut, 0) = 0, "", "[Date Expédition]<= #" & Format(Me!Debut, "mm/dd/yyyy") & "#")
        SForms_RecordSource
    End Sub
    'affectations du filtre sur Me!Fin à la variable m_FiltreDateF
    Private Sub Fin_AfterUpdate()
        m_FiltreDateF = IIf(Nz(Me.Fin, 0) = 0, "", "[Date Expédition]>= #" & Format(Me!Fin, "mm/dd/yyyy") & "#")
        SForms_RecordSource
    End Sub
    'affectations du filtre sur Me!filtrerecep à la variable m_FiltreExp
    Private Sub filtrerecep_AfterUpdate()
        m_FiltreExp = IIf(Nz(Me.filtrerecep, "") = "", "", "recept=""" & Me!filtrerecep & """")
        SForms_RecordSource
    End Sub
     
    Private Sub SForms_RecordSource()
    'calcul du filtre à appliquer aux records sources des 2 sous foemulaire
     
     
    '   pour le calcul du filtre "m_FiltreSform1", on ne sait pas lequel des 3 contrôles de filtre l'utilisateur va utiliser,
    '   donc cette série de 5 IIf pour en venir à bout des 3 filtres.
    '   la première difficulté est de concaténer les filtres actifs en les séparant par des " And " là où il y en a besoin.
     
        m_FiltreSform1 = IIf(m_FiltreExp = "", "", m_FiltreExp) & _
                             IIf(m_FiltreDateD = "", "", IIf(m_FiltreExp = "", m_FiltreDateD, " And " & m_FiltreDateD)) & _
                             IIf(m_FiltreDateF = "", "", IIf(m_FiltreExp = "" And m_FiltreDateD = "", m_FiltreDateF, " And " & m_FiltreDateF))
     
     
     
    '   la deuxième difficulté est de concatténer le Sql du Record Source avec le filtre
    '   en ajouter devant le filtre " Having " que si le filtre n'est pas vide. ('Having' parce qu'il y a un regroupement dans le Sql autrement ça aurait été 'Where')
        If m_FiltreSform1 <> "" Then
            m_FiltreSform1 = " Having " & m_FiltreSform1
        Else
            m_FiltreSform1 = ""
        End If
     
    '   affectation du Sql au sous-formulaire [cat]
        SForm1_RecordSource
     
    '   ce qui suit est une requête imbriquée, j'ai fait comme toi dans tes requêtes,
    '   c'est ce qui permet au sous-formulaire [reqprod sous-formulaire1] d'afficher les bons resultats
    '   je selectionne [produits] que je regroupe et [SommeDePoids (Kg)] que j'additionne depuis la requête que j'appelle R2,
    '   et qui est définie par "FROM (" & m_strSqlSForm1 & m_FiltreSform1 & ") as R2 ",
    '   qui est le record source de sous-formulaire [cat]
    '   R2 est ta requête 'reqexpo' mais filtrée, d'ou tu tires [produits] et [SommeDePoids (Kg)].
    '   Il en résulte que le sous-formulaire [reqprod sous-formulaire1] est filtré par le record source du sous-formulaire [cat],
     
        Me.[reqprod sous-formulaire1].Form.RecordSource = _
            "SELECT R2.produits, Sum(R2.[SommeDePoids (Kg)]) AS [SommeDeSommeDePoids (Kg)] " & _
            "FROM (" & m_strSqlSForm1 & m_FiltreSform1 & ") as R2 " & _
            "GROUP BY R2.produits;"
    End Sub
    Si tu as d'autres questions, ce sera avec plaisir.
    Bien cordialement
    Un travail qui plait est à moitié fait.

Discussions similaires

  1. [AC-2013] Actualiser un sous formulaire d'un autre sous formulaire
    Par morobaboumar dans le forum Access
    Réponses: 2
    Dernier message: 16/11/2018, 09h18
  2. Actualiser un sous-formulaire avec 3 conditions
    Par dav787 dans le forum VBA Access
    Réponses: 2
    Dernier message: 19/12/2016, 15h45
  3. Actualiser un sous formulaire avec un bouton
    Par elwy07 dans le forum Access
    Réponses: 7
    Dernier message: 31/07/2015, 09h04
  4. [AC-2007] Sous formulaire/actualiser Liste et Table avec champs texte
    Par Stobbart dans le forum IHM
    Réponses: 4
    Dernier message: 01/08/2010, 14h53
  5. Réponses: 1
    Dernier message: 05/07/2007, 12h20

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