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 :

Renseigner formulaire et sous formulaire [AC-2007]


Sujet :

VBA Access

  1. #1
    Membre habitué Avatar de C15nantes
    Homme Profil pro
    retraité
    Inscrit en
    Février 2011
    Messages
    379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : retraité
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2011
    Messages : 379
    Points : 137
    Points
    137
    Par défaut Renseigner formulaire et sous formulaire
    Bonjour et bonne année à tous et à toutes,

    J'ai un formulaire concernant les données d'adhérents d'une association.
    J'y ai inséré un sous-formulaire affichant les cotisations de cet adhérent (liés champs-père/champ-fils par N°Adherent).

    Cela marche bien pour la consultation des adhérents actuels.
    Par contre, lorsque je crée un nouvel adhérent (via un bouton sur mon formulaire principal) cela ne marche pas en ce qui concerne mon sous-formulaire.

    Quelques lignes que j'utilise sur le formulaire principal :

    Sur bouton "nouvel enregistrement" :
    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
    Private Sub Nouveau_Click()
     
    On Error GoTo Err_Nouveau_Click
     
        Forms![F Adhérents avec cotisations].AllowEdits = True
     
        DoCmd.GoToRecord , , acNewRec
     
     
        DoCmd.GoToControl "Titre"
     
        Me!Titre.Locked = False
        Me!NomAdherent.Locked = False
        Me!Prénom.Locked = False
        Me!DateNaissance.Locked = False
        Me!Adherent.Locked = False
        Me!DateAdhesion.Locked = False
        Me!TypeAdherent.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
     
     
    Exit_Nouveau_Click:
        Exit Sub
     
    Err_Nouveau_Click:
        MsgBox Err.Description
        Resume Exit_Nouveau_Click
     
    End Sub
    Sur "Avant insertion" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Private Sub Form_BeforeInsert(Cancel As Integer)
     
    N°Adherent = DLast("[N°Adherent]", "[T Adhérents]") + 1
    Forms![F Adhérents avec cotisations]![T Cotisations].Form!N°Adherent.Value = Forms![F Adhérents avec cotisations].N°Adherent.Value
     
    End Sub
    Ce qui fait que, dès que je commence à saisir le nom du nouvel adhérent, un nouveau N°Adherent lui est attribué dans le formulaire principal et le sous-formulaire.
    Cela fonctionne parfaitement.

    Sur bouton "nouvel enregistrement" :
    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
    Private Sub Nouveau_Click()
     
    On Error GoTo Err_Nouveau_Click
     
        Forms![F Adhérents avec cotisations].AllowEdits = True
     
        DoCmd.GoToRecord , , acNewRec
     
     
        DoCmd.GoToControl "Titre"
     
        Me!Titre.Locked = False
        Me!NomAdherent.Locked = False
        Me!Prénom.Locked = False
        Me!DateNaissance.Locked = False
        Me!Adherent.Locked = False
        Me!DateAdhesion.Locked = False
        Me!TypeAdherent.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
     
     
    Exit_Nouveau_Click:
        Exit Sub
     
    Err_Nouveau_Click:
        MsgBox Err.Description
        Resume Exit_Nouveau_Click
     
    End Sub
    Ce que je voudrais c'est que, quand je saisis les premières données de l'adhérent dans le formulaire principal, cela s'affiche aussitôt dans le sous-formulaire.
    Ou alors, quand je valide les données du formulaire principal, les données apparaissent dans mon sous-formulaire.

    Le code associé à mon bouton "Valider les données" de mon 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
    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
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    Private Sub Sauvegarde_Click()
     
     ' Dim stDocName As String
     
               ' On Error GoTo Err_Sauvegarde_Click
     
        If Me.Dirty And IsNull(Me.DateDeces) And Me.N°Adherent <= DLast("[N°Adherent]", "[T Adhérents]") Then
     
               'DoCmd.RunCommand acCmdSaveRecord
     
               'Me.Refresh
     
        '
        'Sauvegarde anciennes valeurs
        '
     
        Dim T_Anciennes_valeurs As Recordset
                Set T_Anciennes_valeurs = CurrentDb.OpenRecordset("T_Anciennes_valeurs", DB_OPEN_TABLE)
     
                T_Anciennes_valeurs.AddNew
     
                T_Anciennes_valeurs("N°Adherent") = Me.N°Adherent.OldValue
                T_Anciennes_valeurs("Titre") = Me.Titre.OldValue
                T_Anciennes_valeurs("NomAdherent") = Me.NomAdherent.OldValue
                T_Anciennes_valeurs("PrenomAdherent") = Me.Prénom.OldValue
                T_Anciennes_valeurs("Adherent") = Me.Adherent.OldValue
                T_Anciennes_valeurs("DateAdhesion") = Me.DateAdhesion.OldValue
                T_Anciennes_valeurs("TypeAdherent") = Me.TypeAdherent.OldValue
                T_Anciennes_valeurs("Fonction") = Me.Fonction.OldValue
                T_Anciennes_valeurs("Specialite") = Me.Spécialité.OldValue
                T_Anciennes_valeurs("Origine") = Me.NomOrigine.OldValue
                T_Anciennes_valeurs("DateOrigine") = Me.DateOrigine.OldValue
                T_Anciennes_valeurs("DateNaissance") = Me.DateNaissance.OldValue
                T_Anciennes_valeurs("DateRadiation") = Me.DateRadiation.OldValue
                T_Anciennes_valeurs("MotifRadiation") = Me.MotifRadiation.OldValue
                T_Anciennes_valeurs("DateDeces") = Me.DateDeces.OldValue
                T_Anciennes_valeurs("Adresse") = Me.Adresse.OldValue
                T_Anciennes_valeurs("Ville") = Me.NomVille.OldValue
                T_Anciennes_valeurs("CP") = Me.CP.OldValue
                T_Anciennes_valeurs("Region") = Me.Region.OldValue
                T_Anciennes_valeurs("Pays") = Me.Pays.OldValue
                T_Anciennes_valeurs("Telephone") = Me.Téléphone.OldValue
                T_Anciennes_valeurs("Mobile") = Me.Mobile.OldValue
                T_Anciennes_valeurs("Fax") = Me.Fax.OldValue
                T_Anciennes_valeurs("EMail") = Me.EMail.OldValue
                T_Anciennes_valeurs("Profession") = Me.Profession.OldValue
                T_Anciennes_valeurs("Retraite") = Me.Retraite.OldValue
                'T_Anciennes_valeurs("DerniereMAJ") = Me.DateMiseAJour.OldValue
                T_Anciennes_valeurs("Divers") = Me.Divers.OldValue
                T_Anciennes_valeurs("MiseAJour") = Now
     
                T_Anciennes_valeurs.Update
                T_Anciennes_valeurs.Close
     
        '
        'sauvegarde nouvelles valeurs
        '
        Dim T_Nouvelles_valeurs As Recordset
                Set T_Nouvelles_valeurs = CurrentDb.OpenRecordset("T_Nouvelles_valeurs", DB_OPEN_TABLE)
     
                T_Nouvelles_valeurs.AddNew
     
                T_Nouvelles_valeurs("N°Adherent") = Me.N°Adherent
                T_Nouvelles_valeurs("Titre") = Me.Titre
                T_Nouvelles_valeurs("NomAdherent") = Me.NomAdherent
                T_Nouvelles_valeurs("PrenomAdherent") = Me.Prénom
                T_Nouvelles_valeurs("Adherent") = Me.Adherent
                T_Nouvelles_valeurs("DateAdhesion") = Me.DateAdhesion
                T_Nouvelles_valeurs("TypeAdherent") = Me.TypeAdherent
                T_Nouvelles_valeurs("Fonction") = Me.Fonction
                T_Nouvelles_valeurs("Specialite") = Me.Spécialité
                T_Nouvelles_valeurs("Origine") = Me.NomOrigine
                T_Nouvelles_valeurs("DateOrigine") = Me.DateOrigine
                T_Nouvelles_valeurs("DateNaissance") = Me.DateNaissance
                T_Nouvelles_valeurs("DateRadiation") = Me.DateRadiation
                T_Nouvelles_valeurs("MotifRadiation") = Me.MotifRadiation
                T_Nouvelles_valeurs("DateDeces") = Me.DateDeces
                T_Nouvelles_valeurs("Adresse") = Me.Adresse
                T_Nouvelles_valeurs("Ville") = Me.NomVille
                T_Nouvelles_valeurs("CP") = Me.CP
                T_Nouvelles_valeurs("Region") = Me.Region
                T_Nouvelles_valeurs("Pays") = Me.Pays
                T_Nouvelles_valeurs("Telephone") = Me.Téléphone
                T_Nouvelles_valeurs("Mobile") = Me.Mobile
                T_Nouvelles_valeurs("Fax") = Me.Fax
                T_Nouvelles_valeurs("EMail") = Me.EMail
                T_Nouvelles_valeurs("Profession") = Me.Profession
                T_Nouvelles_valeurs("Retraite") = Me.Retraite
                T_Nouvelles_valeurs("MiseAjour") = Now
                T_Nouvelles_valeurs("Divers") = Me.Divers
                'T_Nouvelles_valeurs("DerniereMAJ") = Me.DateMiseAJour.OldValue
     
                T_Nouvelles_valeurs.Update
                T_Nouvelles_valeurs.Close
     
     
                Me.DateMiseAJour = Now
     
        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 = True
        End If
        Next Ctl
     
     
       End If
     
    Exit_Sauvegarde_Click:
       Exit Sub
     
     
     
    Err_Sauvegarde_Click:
       MsgBox Err.Description
    '   Resume Exit_Sauvegarde_Click
     
    End Sub

    Merci de votre aide.

    A+
    C15

  2. #2
    Rédacteur/Modérateur
    Avatar de loufab
    Homme Profil pro
    Entrepreneur en solutions informatiques viables et fonctionnelles.
    Inscrit en
    Avril 2005
    Messages
    12 006
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Entrepreneur en solutions informatiques viables et fonctionnelles.
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2005
    Messages : 12 006
    Points : 24 598
    Points
    24 598
    Par défaut
    Bonjour,

    Champs père/Champs fils ?

    Ces 2 propriétés sont-elles correctement réglées ?

    Cordialement,
    Détecter les modifications formulaire Cloud storage et ACCESS
    Classe MELA(CRUD) Opérateur IN et zone de liste Opérateur LIKE
    Visitez mon Blog
    Les questions techniques par MP ne sont pas lues et je ne pratique pas la bactériomancie

  3. #3
    Membre habitué Avatar de C15nantes
    Homme Profil pro
    retraité
    Inscrit en
    Février 2011
    Messages
    379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : retraité
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2011
    Messages : 379
    Points : 137
    Points
    137
    Par défaut
    Bonjour Loufab,

    Je confirme que les champs père et fils sont bien liés par N°adherent.

    J'ai trouvé !

    Ce que je voulais, c'est que le nom le prénom et la date d'adhésion saisis dans le formulaire principal soit reportés automatiquement dans le sous formulaire.

    Ce que j'ai fait, c'est que sur sortie du nom, du prénom et de la date d'adhésion, j'ai mis, par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Private Sub NomAdherent_Exit(Cancel As Integer)
    Me.NomDeChemin = Me.Nom & " " & Me.Prénom & ".jpg"
    Forms![F Adhérents avec cotisations]![T Cotisations].Form!Nom.Value = Forms![F Adhérents avec cotisations].Nom.Value
    End Sub
    C'est ce que j'avais fait sur avant insertion pour le N°Adherent

    Ce n'est peut-être pas la meilleure méthode, mais a priori cela marche.

    Pour info, je joins une copie écran du formulaire

    Merci de ton aide

    C15
    Images attachées Images attachées  

  4. #4
    Membre habitué Avatar de C15nantes
    Homme Profil pro
    retraité
    Inscrit en
    Février 2011
    Messages
    379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : retraité
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2011
    Messages : 379
    Points : 137
    Points
    137
    Par défaut
    Rebonjour,

    Désolé, j'ai parlé trop tôt

    En effet, si les contrôles nom, prénom et date d'adhésion sont renseignés dans mon sous formulaire, je ne peux y accéder pour saisir les cotisations d'un nouvel adhérent
    J'ai un message d'erreur
    "modifications non effectuées, risque de doublon..."

    J'ai modifié mon code avant insertion de mon formulaire principal, mais cela ne change rien.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Private Sub Form_BeforeInsert(Cancel As Integer)
     
    N°Adherent = DLast("[N°Adherent]", "[T Adhérents]") + 1
    Forms![F Adhérents avec cotisations]![T Cotisations].Form!N°Adherent.Value = Forms![F Adhérents avec cotisations].N°Adherent.Value
     
    Dim Ctl As Control
        For Each Ctl In Forms![F Adhérents avec cotisations]![T Cotisations].Form.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
    Mon raisonnement n'est pas le bon, mais je n'arrive pas à voir la faille.
    Je confirme que mon processus fonctionne correctement pour un enregistrement existant.
    Cela veut dire que pour accéder à mon sous-formulaire, il faut que mon nouvel adhérent soit enregistré...mais je ne vois pas comment le faire.

    Si j'utilise, après la saisie des données du formulaire principal, le bouton [valider cette fiche], cela bloque sur (en rouge)
    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
    Private Sub Sauvegarde_Click()
      
     ' Dim stDocName As String
    
               ' On Error GoTo Err_Sauvegarde_Click
    
        If Me.Dirty And IsNull(Me.DateDeces) And Me.N°Adherent <= DLast("[N°Adherent]", "[T Adhérents]") Then          
         
        '
        'Sauvegarde anciennes valeurs
        '
        
        Dim T_Anciennes_valeurs As Recordset
                Set T_Anciennes_valeurs = CurrentDb.OpenRecordset("T_Anciennes_valeurs", DB_OPEN_TABLE)
    
    ...
    Il y a peut être aussi un problème au niveau du code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If Me.Dirty And IsNull(Me.DateDeces) And Me.N°Adherent <= DLast("[N°Adherent]", "[T Adhérents]") Then
    Cette procédure de sauvegarde des anciennes valeurs ne doit s'appliquer qu'aux enregistrements existants et pas au nouveau que je suis en train de saisir.

    Merci de votre aide.

    A+

    C15

  5. #5
    Rédacteur/Modérateur
    Avatar de loufab
    Homme Profil pro
    Entrepreneur en solutions informatiques viables et fonctionnelles.
    Inscrit en
    Avril 2005
    Messages
    12 006
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Entrepreneur en solutions informatiques viables et fonctionnelles.
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2005
    Messages : 12 006
    Points : 24 598
    Points
    24 598
    Par défaut
    Bonsoir,
    Il y a un truc qui m'échappe dans l'ergonomie de ton application.

    Pourquoi cette redondance d'information ?
    Tu as tout dans le formulaire principal et bien visible. Ces informations (nom...) sont bien à titre informatif, elles n'existe pas dans ta table cotisation ?

    Laissons ce détail de côté, voici la cause du problème.

    Un formulaire lié à une source de données fonctionne de cette manière :

    Lorsque tu édites un enregistrement existant, les données sont placées dans la propriété Value de chaque contrôle de zone de texte.
    Par contre lorsque le formulaire est en mode saisie (curseur sur Newrec, testable en vba en utilisant la propriété éponyme me.newrecord où true = nouvel ernegistrement) ce que tu rentres à la mimine est stocké non pas dans Value mais dans Text. Et ce jusqu'à que tu sauvegardes (me.dirty=false - attention dirty à la différence de newrec est à la fois une propriété et une méthode)

    Voici le code qu'il te faut utiliser :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    'nouvel enregistrement en cour d'édition
    if me.newrecord and me.dirty then
      'valeur en cours de saisie.
      me.sfCotisation.form.controls("nom").value = me.nomadherent.text
    else
      'valeur existe en table
      me.sfCotisation.form.controls("nom").value = me.nomadherent.value  
    endif
    En plaçant cela dans une sub de ton formulaire principal tu pourras y faire appel depuistes évènement Après_MAJ mais surtout et plus important depuis ton événement Form_Current, ainsi à chaque déplacement dans le rst les zones de texte vont se rafraichir.

    Cordialement,
    Détecter les modifications formulaire Cloud storage et ACCESS
    Classe MELA(CRUD) Opérateur IN et zone de liste Opérateur LIKE
    Visitez mon Blog
    Les questions techniques par MP ne sont pas lues et je ne pratique pas la bactériomancie

  6. #6
    Membre habitué Avatar de C15nantes
    Homme Profil pro
    retraité
    Inscrit en
    Février 2011
    Messages
    379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : retraité
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2011
    Messages : 379
    Points : 137
    Points
    137
    Par défaut
    Bonjour Loufab,

    Merci de cette réponse.

    Pour ta 1ere interrogation (nom, prénom et date adhésion dans le sous formulaire), c'est parce que mon sous formulaire est en fait un autre formulaire que j'ai inséré dans mon formulaire principal.
    Ce formulaire (sous formulaire) SfCotisations est basée sur une requête elle -même basée sur les tables T adhérents, T cotisations, T cotisations dues et la requête R cotisdues.
    Ainsi, en cochant, par exemple, en cochant la case C18, la valeur Du18 passe de 25 (valeur par défaut) à 0.

    Mais je me pose la question suivante, lorsque je saisis un nouvel adhérent dans mon formulaire principal, comment est-il enregistré dans les tables T Cotisations et T cotisations dues ?

    Je ne suis pas sur d'avoir la bonne méthode.

    Enfin, pour être clair, ma base que j'ai créée tant bien que mal il y a près de 15 ans, et avec l'aide d'un grand nombre de contributeurs, est basée actuellement sur une table adhérents contenant toutes les coordonnées, les cotisations et les cotisations dues (base Excel comme on me l'a dit une fois). C'était plus facile pour moi à l'époque...et cela marche parfaitement bien.
    Depuis quelques temps, j'essaye de la restructurer de manière "plus Access" en répartissant le tout entre différentes tables ; et là, tu t'en aperçois, je galère pas mal.

    Merci de ton aide.

    A+

    C15

  7. #7
    Expert confirmé Avatar de nico84
    Homme Profil pro
    Consultant/développeur ERP
    Inscrit en
    Mai 2008
    Messages
    3 088
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant/développeur ERP
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 3 088
    Points : 5 204
    Points
    5 204
    Par défaut
    Citation Envoyé par C15nantes Voir le message
    Mais je me pose la question suivante, lorsque je saisis un nouvel adhérent dans mon formulaire principal, comment est-il enregistré dans les tables T Cotisations et T cotisations dues ?
    Et bien justement, il n'y est enregistré que lorsqu'on saisit une cotisation !

    Pour qu'il apparaisse à la création d'un nouvel adhérent il faut créer aussi une ligne "cotisation due" par une instruction du type
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CurrentDb.Execute "INSERT INTO cotis_due (adherent, annee) VALUES (" & num_adherent & ",year(date()))", dbFailOnError
    Utilisez Planet, gestion d'entreprise gratuite pour TPE / PME

  8. #8
    Membre habitué Avatar de C15nantes
    Homme Profil pro
    retraité
    Inscrit en
    Février 2011
    Messages
    379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : retraité
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2011
    Messages : 379
    Points : 137
    Points
    137
    Par défaut
    Bonjour,

    Je vais essayer cela car effectivement, lorsque je crée un nouvel enregistrement dans ma table T Adhérent, je veux qu'il soit aussi créé dans mes autres tables (T cotisations et T Cotisations dues) afin que je mette à jour ces données ; mais où placer cette procédure ?

    Merci de ton aide.

    A+
    C15

  9. #9
    Rédacteur/Modérateur
    Avatar de loufab
    Homme Profil pro
    Entrepreneur en solutions informatiques viables et fonctionnelles.
    Inscrit en
    Avril 2005
    Messages
    12 006
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Entrepreneur en solutions informatiques viables et fonctionnelles.
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2005
    Messages : 12 006
    Points : 24 598
    Points
    24 598
    Par défaut
    Bonsoir,

    En effet si à chaque création d'un adhérent tu souhaites que les enregistrements connexes se crée automatiquement il te faut employer la méthode de Nico.

    Cordialement,
    Détecter les modifications formulaire Cloud storage et ACCESS
    Classe MELA(CRUD) Opérateur IN et zone de liste Opérateur LIKE
    Visitez mon Blog
    Les questions techniques par MP ne sont pas lues et je ne pratique pas la bactériomancie

  10. #10
    Expert confirmé Avatar de nico84
    Homme Profil pro
    Consultant/développeur ERP
    Inscrit en
    Mai 2008
    Messages
    3 088
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant/développeur ERP
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 3 088
    Points : 5 204
    Points
    5 204
    Par défaut
    Citation Envoyé par C15nantes Voir le message
    lorsque je crée un nouvel enregistrement dans ma table T Adhérent
    A ce moment là. Soit tu as un bouton de validation "créer adhérent ok", soit avec l'évènement access idoine (personnellement je n'utilise pas cette 2e méthode car il est difficile de garantir ainsi des données de qualité).

    Citation Envoyé par C15nantes Voir le message
    je veux qu'il soit aussi créé dans mes autres tables (T cotisations et T Cotisations dues)
    Je ne vois pas l'intérêt de 2 tables ici : s'il doit une cotisation il suffit de marquer dans la table quand est-ce qu'il la paie...

    Enfin des espaces dans les noms de table ou champ ça ne fait pas très pro
    Utilisez Planet, gestion d'entreprise gratuite pour TPE / PME

  11. #11
    Membre habitué Avatar de C15nantes
    Homme Profil pro
    retraité
    Inscrit en
    Février 2011
    Messages
    379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : retraité
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2011
    Messages : 379
    Points : 137
    Points
    137
    Par défaut
    Bonjour Nico, bonjour Loufab,

    Merci de vos réponses respectives.

    Des infos supplémentaires : j'ai repris, dans l'urgence suite au décès brutal de son concepteur, une base existante. C'est pour cette raison que les tables et/ou champs ont des espaces dans leurs dénominations. C'est aussi pour cela qu'il y a la notion de cotisations et cotisations dues. Comme dit dans un autre post, initialement j'avais un table unique T Adhérents avec tout. J'ai voulu améliorer la structure en répartissant les données entre plusieurs tables. Je peux effectivement regrouper les cotisations et les cotisations dues en une table unique.

    enfin, j'ai voulu adapter comme ceci la procédure de Nico :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CurrentDb.Execute "INSERT INTO [T Cotisations]([N°Adherent],[Nom],[Prenom],[Adherent],[DateAdhesion]) VALUES (" & [N°Adherent] & ",[Nom] & ", [Prenom] & ", & ", [Adherent] & ",[DateAdhesion])", dbFailOnError
    puis comme ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    INSERT INTO [T Cotisations]([N°Adherent],[Nom],[Prenom],[Adherent],[DateAdhesion]) Select ([N°Adherent],[Nom],[Prenom],[Adherent],[DateAdhesion]) from [T Adhérents];
    Ni l'un ni l'autre ne marche pas (erreur de compilation nombre d'arguments incorrect)
    Cette procédure, je l'a iassociée à mon bouton validant la saisie du nouvel enregistrement



    Merci de votre aide
    A+

    C15

  12. #12
    Membre habitué Avatar de C15nantes
    Homme Profil pro
    retraité
    Inscrit en
    Février 2011
    Messages
    379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : retraité
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2011
    Messages : 379
    Points : 137
    Points
    137
    Par défaut
    Rebonjour,

    J'ai corrigé mon code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Private Sub Sauvegarde_Click()
     
        If Me.NewRecord Then
          CurrentDb.Execute "INSERT INTO [T Cotisations]([N°Adherent],[Nom],[Prenom],[Adherent],[DateAdhesion]) VALUES (" & [N°Adherent] & ",'" & [Nom] & "','" & [Prenom] & "', " & [Adherent] & "," & [DateAdhesion] & ")", dbFailOnError
        End If
     
        If Me.Dirty And IsNull(Me.DateDeces) And Me.N°Adherent < DLast("[N°Adherent]", "[T Adhérents]") Then
    ....
    Cela m'enregistre bien le N°Adherent, le nom, le prénom...dans ma table Cotisations sauf que
    Dans ma table T adhérents quand je saisis un nouvel enregistrement, il écrase le précédent;
    Dans ma table T cotisations, le N° adhérent est toujours le même (le dernier N° adhérent de la T Adhérent +1)
    mon sous formulaire n'affiche rien

    Merci de votre aide.

    A+

    c15

  13. #13
    Rédacteur/Modérateur
    Avatar de loufab
    Homme Profil pro
    Entrepreneur en solutions informatiques viables et fonctionnelles.
    Inscrit en
    Avril 2005
    Messages
    12 006
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Entrepreneur en solutions informatiques viables et fonctionnelles.
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2005
    Messages : 12 006
    Points : 24 598
    Points
    24 598
    Par défaut
    Bonjour,

    Je ne voudrais pas paraître désagréable mais ce modèle de données me semble un peu "moisi".

    L'id de l'adhérent est suffisant dans la table cotisation, tous le reste est superflu, inutile voire pénalisant.

    Exemple :
    L'utilisateur qui a l'id 10, change de nom, rajoute son conjoint... l'id adhérent sera toujours valide dans cotisation mais le reste sera à modifier.

    Une règle importante sinon la première : Pas de redondance d'information dans une base de données. (sauf contrainte).

    Ici il n'y a aucune contrainte qui l'y oblige.

    Cordialement,
    Détecter les modifications formulaire Cloud storage et ACCESS
    Classe MELA(CRUD) Opérateur IN et zone de liste Opérateur LIKE
    Visitez mon Blog
    Les questions techniques par MP ne sont pas lues et je ne pratique pas la bactériomancie

  14. #14
    Membre habitué Avatar de C15nantes
    Homme Profil pro
    retraité
    Inscrit en
    Février 2011
    Messages
    379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : retraité
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2011
    Messages : 379
    Points : 137
    Points
    137
    Par défaut
    Bonjour Loufab,

    Tu as raison, il faut que je revois ma copie.
    La seule chose qu je vais garder en plus de l'ID, c'est la date d'adhésion, car c'est par rapport à elle qu'est basée une lourde procédure me permettant de n'afficher les cotisations qu'à partir de l'année d'adhésion.

    Merci pour tes conseils, bon dimanche
    C15

  15. #15
    Rédacteur/Modérateur
    Avatar de loufab
    Homme Profil pro
    Entrepreneur en solutions informatiques viables et fonctionnelles.
    Inscrit en
    Avril 2005
    Messages
    12 006
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Entrepreneur en solutions informatiques viables et fonctionnelles.
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2005
    Messages : 12 006
    Points : 24 598
    Points
    24 598
    Par défaut
    En effet la date est essentielle et très bien placée dans cette table. (y)

    Je pense qu'une fois le MCD assainie tu auras moins de difficulté pour faire vivre ton application.
    Détecter les modifications formulaire Cloud storage et ACCESS
    Classe MELA(CRUD) Opérateur IN et zone de liste Opérateur LIKE
    Visitez mon Blog
    Les questions techniques par MP ne sont pas lues et je ne pratique pas la bactériomancie

  16. #16
    Expert confirmé Avatar de nico84
    Homme Profil pro
    Consultant/développeur ERP
    Inscrit en
    Mai 2008
    Messages
    3 088
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant/développeur ERP
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 3 088
    Points : 5 204
    Points
    5 204
    Par défaut
    D'accord avec loufab, il faut bien cibler dans quelle table doit se trouver quelle info !

    La date d'adhésion est unique, elle est donc dans la table d'adhérent
    La table des cotisations (une par an à priori) doit juste comporter une ligne par cotisation due/réglée (date due=anniversaire de l'adhésion, date réglée)

    Citation Envoyé par C15nantes Voir le message
    Dans ma table T adhérents quand je saisis un nouvel enregistrement, il écrase le précédent;
    Soit il est sur la même ligne donc il écrase, soit l'id adhérent n'est pas numauto, soit il faut faire un refresh après je ne sais quelle saisie pour transférer les données du formulaire vers la table... Est-ce une saisie en tableau ou en formulaire ?
    Utilisez Planet, gestion d'entreprise gratuite pour TPE / PME

  17. #17
    Membre habitué Avatar de C15nantes
    Homme Profil pro
    retraité
    Inscrit en
    Février 2011
    Messages
    379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : retraité
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2011
    Messages : 379
    Points : 137
    Points
    137
    Par défaut
    Bonsoir Nico

    C'est une saisie en formulaire.

    Par ailleurs, j'ai voulu appliquer ceci pour rajouter mon nouvel enregistrement dans ma TCotisations

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    If Me.NewRecord And Me.Dirty = False Then
     
      Dim TCotisations As DAO.Recordset
               Set TCotisations = CurrentDb.OpenRecordset("TCotisations", dbOpenDynaset)    
     
               TCotisations.AddNew
               TCotisations("N°Adherent") = Me.N°Adherent.Value
    end if
    cela ne marche pas.

    est-ce la bonne méthode (j'ai vu par ailleurs une procédure du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Dim TCotisations As Recordset
               'Set TCotisations = CurrentDb.OpenRecordset("TCotisations", DB_OPEN_TABLE)
    TCotisations.AddNew
               TCotisations("N°Adherent") = Me.N°Adherent.Value
    end if
    Je ne saisis pas la différence.

    N'y a t il pas aussi un problème avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If Me.NewRecord And Me.Dirty = False then
    Merci de ton aide.

    A+

    C15

  18. #18
    Expert confirmé Avatar de nico84
    Homme Profil pro
    Consultant/développeur ERP
    Inscrit en
    Mai 2008
    Messages
    3 088
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant/développeur ERP
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 3 088
    Points : 5 204
    Points
    5 204
    Par défaut
    Je n'utilise jamais la saisie en tableau "standard access" : soit je demande la saisie des champs obligatoires puis crée l'enregistrement par un INSERT, soit j'utilise la saisie en tableau où on voit bien si on est sur une ligne existante ou sur la nouvelle (en bas avec une *)

    En pratique je n'arrive pas à travailler proprement avec les outils access de base, rien ne vaut la programmation
    Utilisez Planet, gestion d'entreprise gratuite pour TPE / PME

  19. #19
    Membre habitué Avatar de C15nantes
    Homme Profil pro
    retraité
    Inscrit en
    Février 2011
    Messages
    379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : retraité
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2011
    Messages : 379
    Points : 137
    Points
    137
    Par défaut
    Bonjour,

    Merci de cette réponse.
    Cependant n'ayant ni la formation ni la compétence en programmation, j'utilise les moyens du bord

    Concernant l'ajout d'un nouvel enregistrement dans ma table TCotisations, j'ai enfin trouvé la solution que j'ai insérée sur mon bouton validant la saisie de ce nouvel enregistrement

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    If Me.NewRecord Then
         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
     
         Dim TCotisations As DAO.Recordset
               Set TCotisations = CurrentDb.OpenRecordset("TCotisations", dbOpenDynaset)
     
               TCotisations.AddNew
               TCotisations("N°Adherent") = Me.N°Adherent
     
               TCotisations.Update
     
        End If
    Par contre, mon sous formulaire ne me permet toujours pas de mettre à jour les cotisations de ce nouvel adhérent.
    J'ai essayé d'appliquer le code qui m'avait été donné plus tôt.
    Cela ne marche pas

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    'nouvel enregistrement en cour d'édition
    If Me.Dirty Then
      'valeur en cours de saisie.
      Forms![F Adhérents1]![sfCotisations].Form.Controls("N°Adherent").Value = Me.N°Adherent.Text
     
    Else
      'valeur existe en table
      'Forms![F Adhérents1]![sfCotisations].Form!N°Adherent.Value = Forms![F Adhérents1].N°Adherent.Value
     
    End If
    Je l'ai mis Sur activation (form_Current)
    Je ne l'ai pas mis en après mise à jour.

    Merci de ton aide.
    A+
    c15

  20. #20
    Expert confirmé Avatar de nico84
    Homme Profil pro
    Consultant/développeur ERP
    Inscrit en
    Mai 2008
    Messages
    3 088
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant/développeur ERP
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 3 088
    Points : 5 204
    Points
    5 204
    Par défaut
    Désolé comme indiqué plus haut ce n'est pas comme ça que j'utilise access donc je n'y comprend pas grand chose...

    Si j'ai bien compris le besoin j'aurais tendance à programmer ainsi :
    1. un champ "membre jusqu'à" dans la table des membres
    2. une table "cotisations payées"
    3. quand on ajoute une cotisation payée (avec un bouton) cela prolonge la date 1

    Citation Envoyé par C15nantes Voir le message
    et revenez sur la fiche du nouveau avant d'ouvrir le formulaire de ses cotisations
    Ce message m'incite à penser que les cotisations sont gérées dans un formulaire annexe et non un sous-formulaire ce qui n'est pas du tout pareil
    Utilisez Planet, gestion d'entreprise gratuite pour TPE / PME

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

Discussions similaires

  1. Lier un sous-formulaire à un sous-formulaire
    Par bobosh dans le forum IHM
    Réponses: 2
    Dernier message: 02/03/2021, 11h45
  2. Réponses: 5
    Dernier message: 06/05/2015, 12h24
  3. Réponses: 2
    Dernier message: 24/06/2013, 09h31
  4. Réponses: 2
    Dernier message: 23/06/2013, 21h07
  5. Accéder à un sous-formulaire de sous-formulaire
    Par touftouf57 dans le forum VBA Access
    Réponses: 2
    Dernier message: 01/11/2008, 19h04

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