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

  1. #1
    Membre régulier
    insérer plusieurs enregistrements dans une table
    Bonjour à tous et à toutes

    J'ai un formulaire principal contenant toutes les informations d'un adhérent (basé sur T Adhérents) ; il contient un sous formulaire pour gérer les cotisations (basé sur T_Cotisation)

    Dans le formulaire principal, j'ai un bouton pour créer une nouvelle fiche ; il contient,en partie, le code 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
    16
    17
    18
    19
    20
    21
    Private Sub Nouveau_Click()
    On Error GoTo Err_Nouveau_Click
     
    If Me.NewRecord Then
         N°Adherent = DMax("[N°Adherent]", "[T Adhérents]") + 1
         Me.DateJour.Value = Date
     
         DoCmd.RunCommand acCmdSaveRecord
     
     
         MsgBox "S'il s'agit d'un nouvel adhérent, changer d'enregistrement par roulette souris ou le navigateur en bas à gauche" & Chr(13) & "et revenez sur la fiche du nouveau avant d'ouvrir le formulaire de ses cotisations", vbOKOnly
     
        'Ajout du nouvel enregistrement dans la table T_Cotisation
         Dim T_Cotisation As DAO.Recordset
               Set T_Cotisation = CurrentDb.OpenRecordset("T_Cotisation", dbOpenDynaset)
     
               T_Cotisation.AddNew
               T_Cotisation("T_Adherent_FK") = Me.N°Adherent
               T_Cotisation.Update
     
    End If


    On remplit donc toutes les infos du nouvel adhérent dans le formulaire principal.
    Dans le sous-formulaire j'ai 4 contrôles :
    Cotisation_An (l'année concernée)
    Ag (case à cocher pour valider la présence ou pas)
    Cotisation (case à cocher)
    Cotisation_Du (par défaut à 25 €, qui passe à 0 quand on valide la paiement par la case Cotisation)

    Pour un nouvel adhérent, dans le sous-formulaire j'ai sur une même ligne les 4 contrôles que l'on remplit par exemple de la façon suivante
    2020 Ag (cochée), Cotisation (cochée), 0

    Mon trésorier préféré, qui est le principal utilisateur, souhaiterait que pour un nouvel adhérent, dans le sous-formulaire, s'affichent les contrôles correspondant aux années
    de l'année d'adhésion à l'année 2035.
    Comme cela il n'aura plus, chaque année, qu'à compléter les différentes valeurs.

    Merci de me dire si c'est possible sur le plan raisonnement et si oui comment modifier le code précédent.

    Merci de votre aide
    A+
    C15nantes

  2. #2
    Membre expert
    Salut Castel15
    Tu demandes un avis sur la création ou non des lignes de cotisation jusqu'à 2035.
    Admettons que tu aies enregistré un nouvel adhérent voici 5 ans (2015) et que tu aies créé d'avance les lignes de cotisation jusqu'à 2035.
    Qu'adviendrait-il de ces lignes, si cet adhérent, ce que je souhaite pas, décédait demain ? Il te faudrait alors, en espérant que tu y penses, supprimer toutes les lignes de cotisation superflues (2021 à 2035).
    Je pense que le plus judicieux serait de créer une procédure vba qui te permettrait à chaque début de nouvelle année de créer les lignes de cotisation pour tous les adhérents actifs.

    EDIT 20200909
    Une procédure qui permet de créer des lignes dans T_Cotisation fonction d'une année saisie
    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
    Private Sub Commande0_Click()
    Dim strInput As String
     
    strInput = InputBox("Veuillez saisir une année au format aaaa", "Attention !", Year(Date))
        If StrPtr(strInput) = 0 Then' si clic btn cancel annule la proc
            MsgBox "Opération annulée", vbInformation
            Exit Sub
        End If
        If Not IsNumeric(strInput) Or Len(strInput) = 0 Or Len(strInput) <> 4 Then' on verif la saisie, si alphanum, trop long ou vide on annule la proc
            MsgBox "La valeur est incorrecte", vbCritical
            Exit Sub
        End If
        If IsNumeric(strInput) And Len(strInput) = 4 Then' on verif une saisie de valeur numeric avec 4 caracteres
            If DCount("*", "T_Cotisation1", "Cotisation_An = " & strInput) = 0 Then' on verif que l annee saisie n existe pas dans la tbl
                CurrentDb.Execute "INSERT INTO T_Cotisation ( T_Adherent_FK )" _
                & " SELECT [T Adhérents].N°Adherent" _
                & " FROM [T Adhérents]" _
                & " WHERE DateDeces Is Null AND DateRadiation Is Null", dbFailOnError
                CurrentDb.Execute "UPDATE T_Cotisation SET T_Cotisation.Cotisation_An = " & strInput & "" _
                & " WHERE Cotisation_An = 0", dbFailOnError
            Else
                MsgBox "l'année " & strInput & " existe déjà", vbExclamation
                Exit Sub
            End If
            MsgBox "Mise à jour exécutée", vbInformation
        End If
    End Sub

  3. #3
    Membre régulier
    Bonjour Hyperion 13,

    J'ai testé ta proposition.

    Mes observations sont les suivantes.
    J'ai mis dans mon sous-formulaire (voir PJ) un bouton de commande auquel j'ai associé ton code.
    Effectivement cela me rajoute un enregistrement pour TOUS les adhérents.
    En fait, dans mon sous formulaire est insérée une ligne vide (la nouvelle année n'est pas affichée), au dessus de la ligne correspondant à l'année d'adhésion, avec les 4 contrôles.

    Mais je me suis aperçu que pour les adhérents existants ces lignes 2020 à 2035 existent déjà.
    Ces lignes vides n'existent pas pour un nouvel adhérent (voir PJ)
    Ce que j'aurais voulu, c'est que, lorsque je suis sur un formulaire vierge pour saisir un nouvel adhérent, dans le sous-formulaire, j'ai, non pas une ligne vide où le trésorier doit saisir 2020 et cocher, si besoin "AG" et "Cotisation", mais une ligne par année de 2020 à 2035, les années étant déjà saisies.
    De ce fait, à chaque renouvellement de cotis, le trésorier n'aura plus qu'à cocher les cases adéquates.

    Par ailleurs, concernant les adhérents qui décèdent, sont radiés ou démissionnaires, j'ai un code associé au contrôle "Motif radiation" qui me met à 0 les cotisations.

    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
    Private Sub MotifRadiation_BeforeUpdate(Cancel As Integer)
     
    Dim l_strSql As String
     
    If MotifRadiation <> "" Then
     
            Adherent = False
            TypeAdherent = ""
            Me!NonAdherent.Visible = True
            Me!NonAdherent.Caption = "N'est plus Adhérent"
     
            l_strSql = "UPDATE T_Cotisation SET Cotisation_Du = 0 WHERE Cotisation_An  >= " & Year(Me.DateAdhesion) & " AND T_Adherent_FK = " & Me.N°Adherent
     
              With DoCmd
                ' Desactive les messages système
                .SetWarnings False
                ' Execute la commande Sql
                .RunSQL l_strSql
                ' Réactive les messages système
                .SetWarnings True
              End With
     
        If MotifRadiation = "Radiation" Then
     
            MsgBox "La case 'Adhérent' a été décochée" & Chr(10) & "Les cotisations de cet adhérent radié vont être mises à 0 quand vous aurez validé la fiche", vbExclamation, ""
     
        ElseIf MotifRadiation = "Démission" Then
     
            MsgBox "La case 'Adhérent' a été décochée" & Chr(10) & "Les cotisations de cet adhérent démissionnaire vont être mises à 0 quand vous aurez validé la fiche", vbExclamation, ""
     
        'ElseIf MotifRadiation = "Décès" Then
     
        'MsgBox "La case 'Adhérent' a été décochée" & Chr(10) & "Les cotisations de cet adhérent décédé vont être mises à 0 quand vous aurez validé la fiche", vbExclamation, ""
     
        End If
     
    End If
     
    End Sub

    Il suffirait alors de le modifier pour, en plus, supprimer les lignes "en trop" dans la T_Cotisation
    ...mais cela fera sans doute l'objet d'un autre post.

    Merci de ton aide
    A+
    C15

  4. #4
    Membre expert
    Salut
    Comme indiqué dans mon Post#2 la procédure proposée ne vaut qu'à condition les lignes de cotisations de T_Cotisation comprises entre 2020 à 2035 n'existent pas.
    Pour les supprimer, une req sql
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    DELETE *
    FROM T_Cotisation
    WHERE Cotisation_An>2020

    Concernant l'enregistrement d'un nouvel adhérent et de la création d'une ligne de cotisation pour l'année d'adhésion il faudrait, et de mémoire il me semble que sur le form d'adhésion il y a un btn de validation de la création de la nouvelle fiche (EDIT : Je viens de lire le pdf ), il faudrait placer un truc comme ça (à tester)
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    If Me.NewRecord And Me.Dirty Then
        CurrentDb.Execute "INSERT INTO T_Cotisation ( T_Adherent_FK, Cotisation_An )" _
        & " VALUES (" & Me.Parent!N°Adherent & ", " & Year(Me.Parent!DateAdhesion) & ")", dbFailOnError
        Me!F_Cotisation.Form.Requery
    End If

    Explication pour Me.Parent ici ou .

    En dehors des motifs de radiation et de passer la cotisation à zéro, il serait bon de supprimer les lignes de cotisation qui deviennent superflues.

  5. #5
    Membre régulier
    Bonjour

    J'ai essayé ta proposition, cela rajoute effectivement une ligne dans ma table T_Cotisation et donc dans mon formulaire, mais l'année ne s’affiche pas dans Cotisation_An

    sur mon bouton "créer une nouvelle fiche" j'avais mis un code auquel j'ai rajouté le lignes 19 et 22

    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
    Private Sub Nouveau_Click()
    On Error GoTo Err_Nouveau_Click
     
    If Me.NewRecord Then
         N°Adherent = DMax("[N°Adherent]", "[T Adhérents]") + 1
         Me.DateJour.Value = Date
     
         DoCmd.RunCommand acCmdSaveRecord
     
     
         'MsgBox "S'il s'agit d'un nouvel adhérent, changer d'enregistrement par roulette souris ou le navigateur en bas à gauche" & Chr(13) & "et revenez sur la fiche du nouveau avant d'ouvrir le formulaire de ses cotisations", vbOKOnly
     
        'Ajout du nouvel enregistrement dans la table T_Cotisation
         Dim T_Cotisation As DAO.Recordset
               Set T_Cotisation = CurrentDb.OpenRecordset("T_Cotisation", dbOpenDynaset)
     
               T_Cotisation.AddNew
               T_Cotisation("T_Adherent_FK") = Me.N°Adherent
               T_Cotisation("Cotisation_An").Value = Year(Date)
               T_Cotisation.Update
     
               Me.F_Cotisation.Requery
     
    End If


    Cela ne m'affiche toujours pas l'année en cours (pb de syntaxe ?)
    Par ailleurs, il y a sans doute une meilleure méthode pour rentrer les cotis du nouvel adhérent que de faire ce que je dis dans ma msgbox.

    Merci de ton aide
    A+
    C15

  6. #6
    Membre expert
    Salut
    Vérifier si le champ COTISATION DU a pour valeur par défaut 25
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Private Sub btnNewadhesion_Click()
    If Me.NewRecord And Me.Dirty Then
        N°Adherent = DMax("[N°Adherent]", "[T Adhérents]") + 1
        DoCmd.RunCommand acCmdSaveRecord
     
        Me.F_Cotisation.SetFocus
        Me.F_Cotisation!T_Adherent_FK.SetFocus
        Me.F_Cotisation.Form.Recordset.AddNew
        Me.F_Cotisation!Cotisation_An.SetFocus
        Me.F_Cotisation!Cotisation_An = Year(Forms!0_FORMULAIRE_ADHERENT_AVEC_COTISATIONS_ET_AG.DateAdhesion.Value)
        Me.N°Adherent.SetFocus
    End If
    End Sub

  7. #7
    Membre régulier
    Bonjour Hyperion13,

    J'ai essayé ta procédure, il y a un pb de syntaxe sur la ligne 10. J'ai essayé de corriger sans succès.

    Quelques infos supplémentaires :
    1 Par défaut le sous formulaire est verrouillé.
    Il est modifiable par le bouton "modifier" qui y est intégré (voir PJ précédente) avec le code suivant :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Private Sub Modifier_Click()
     
    Dim Ctl As Control
        For Each Ctl In Me.Détail.Controls
            If (Ctl.ControlType = acTextBox) Or (Ctl.ControlType = acComboBox) Or (Ctl.ControlType = acCheckBox) Then
        Ctl.Locked = False
            End If
        Next Ctl
     
    End Sub



    2 Dans la T_Cotisation, la valeur par défaut est de 25 €

    3 Ci dessous le code complet, actuel, lié au bouton "nouvelle fiche" du formulaire principal :

    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
    Private Sub Nouveau_Click()
    On Error GoTo Err_Nouveau_Click
     
    If Me.NewRecord Then
         N°Adherent = DMax("[N°Adherent]", "[T Adhérents]") + 1
         Me.DateJour.Value = Date
     
         DoCmd.RunCommand acCmdSaveRecord
     
     
         MsgBox "S'il s'agit d'un nouvel adhérent, changer d'enregistrement par roulette souris ou le navigateur en bas à gauche" & Chr(13) & "et revenez sur la fiche du nouveau avant d'ouvrir le formulaire de ses cotisations", vbOKOnly
     
        'Ajout du nouvel enregistrement dans la table T_Cotisation
         Dim T_Cotisation As DAO.Recordset
               Set T_Cotisation = CurrentDb.OpenRecordset("T_Cotisation", dbOpenDynaset)
     
               T_Cotisation.AddNew
               T_Cotisation("T_Adherent_FK") = Me.N°Adherent
               T_Cotisation.Update
     
    End If
     
        Forms![0_FORMULAIRE_ADHERENT_AVEC_COTISATIONS_ET_AG].AllowEdits = True
        DoCmd.GoToRecord , , acNewRec
        DoCmd.GoToControl "Titre"
     
        Me!Titre.Locked = False
        Me!Nom_Adherent.Locked = False
        Me!Prenom_Adherent.Locked = False
        Me!DateNaissance.Locked = False
        Me!Adherent.Locked = False
        Me!DateAdhesion.Locked = False
        Me!Type_Adherent.Locked = False
        Me!Fonction.Locked = False
        Me!Spécialité.Locked = False
        Me!NomOrigine.Locked = False
        Me!DateOrigine.Locked = False
        Me!DateRadiation.Locked = False
        Me!MotifRadiation.Locked = False
        Me!DateDeces.Locked = False
        Me!Adresse.Locked = False
        Me!NomVille.Locked = False
        Me!CP.Locked = False
        Me!Region.Locked = False
        Me!Téléphone.Locked = False
        Me!Mobile.Locked = False
        Me!EMail.Locked = False
        Me!Profession.Locked = False
        Me!Retraite.Locked = False
        Me!DateMiseAJour.Locked = False
        Me!MasquerDonnees = False
     
     
     
     
     
    Exit_Nouveau_Click:
        Exit Sub
     
    Err_Nouveau_Click:
        MsgBox Err.Description
        Resume Exit_Nouveau_Click
    End Sub


    Peut-être y-a-t'il un conflit avec le code que tu proposes ?
    Y'a t'il une différence entre
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    me.F_Cotisation.Locked=False

    et
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    Me.F_Cotisation.SetFocus


    Toujours est-il que hélas, quand je crée un nouvel adhérent, l'année 2020 ne s'affiche toujours pas dans le sous-formulaire
    Encore faut-il savoir à quel moment un adhérent enregistré dans la T_Adhérents l'est dans la T_Cotisation avec affichage immédiat dans le sous-formulaire.

    Merci de ton aide.
    A+
    C15

  8. #8
    Membre régulier
    Bonjour,

    Après plusieurs essais j'ai gardé le code initial sur mon bouton "nouvel adhérent du form principal

    et dans mon sous formulaire j'ai fait ceci

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Private Sub Cotisation_An_Click()
     
    Me.Cotisation_An.Value = Year(Me.Parent!DateAdhesion)
     
    End Sub


    Ce qui fait que lorsque je clique sur le contrôle Cotisation_An du sous formulaire l'année d'adhésion est automatiquement saisie

    C'est pas encore le top mais c'est déjà mieux que rien.

    Je vais essayer de mixer cela avec la procédure que tu m'as proposée plus haut.

    C15

  9. #9
    Membre régulier
    Bonjour,

    La procédure décrite dans le post précédent fonctionne, sauf que lorsque je clique sur la 2ième ligne du sous formulaire pour renseigner, par exemple 2021, c'est 2020 qui s’affiche.

    En m'inspirant d'une procédure que tu m'avais donnée, je voudrais vérifier que l'année n'a pas déjà été renseignée.
    J'ai fais ceci
    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
     
    Private Sub Cotisation_An_Click()
     
    'Dim strInput As String
    'strInput = [T Adhérents].DateAdhesion
     
     Me.Cotisation_An.Value = Year(Me.Parent!DateAdhesion)
     
    If DCount("*", "T_Cotisation", "Cotisation_An = " & Year(Me.Parent!DateAdhesion)) = 0 Then ' on verif que l annee saisie n existe pas dans la tbl
                CurrentDb.Execute "INSERT INTO T_Cotisation ( T_Adherent_FK )" _
                & " SELECT [T Adhérents].N°Adherent" _
                & " FROM [T Adhérents]" _
                '& " WHERE DateDeces Is Null AND DateRadiation Is Null", dbFailOnError
                CurrentDb.Execute "UPDATE T_Cotisation SET T_Cotisation.Cotisation_An = " & Year(Me.Parent!DateAdhesion) & "" _
                & " WHERE Cotisation_An = 0", dbFailOnError
            Else
                MsgBox "l'année " & Year(Me.Parent!DateAdhesion) & " a déjà été renseignée", vbExclamation
                Exit Sub
            End If
     
     
     
    End Sub


    Cela marche à ceci près que dès que je clique sur le contrôle Cotisation_An pour renseigner la 1ère année, 2020 (si l'adhésion a eu lieu en 2020) s'affiche bien, mais ma msgbox aussi
    Comment faire, de façon plus élégante, pour que cela n'apparaisse que sur la 2ième ligne (celle avec l'étoile, comme le montre la PJ et plus tard les suivantes

    Merci de ton aide
    A+
    C15

###raw>template_hook.ano_emploi###