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

Requêtes et SQL. Discussion :

Ajouter plusieurs enregistrements à une table [AC-2019]


Sujet :

Requêtes et SQL.

  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 Ajouter plusieurs enregistrements à une table
    Bonjour à tous et à toutes,

    J'ai 2 tables T Adhérent et T_Cotisation reliées entre elles par avec N°Adhérent <==> NUM_COTISATION_PK

    La première (données des adhérents) contient entre autre Nom Prénom Adhérent (booléen) DateAdhesion...

    La seconde (gestion des cotisations et des présences aux AG contient entre autre Cotisation_An correspondant aux années entre la date d'adhésion et 2035.

    En effet pour faciliter ma relève quand je ne gèrerai plus cette base (cette année ou l'année prochaine, j'avais prévu jusqu’en 2035

    Entre une restructuration de ma base et de nouvelles inscriptions, j'ai un certain nombre d'adhérents pour lesquels les années à venir ne sont pas prévues.

    Je tourne en rond pour faire un requête qui m'ajouterait dans ma T_Cotisation toutes les années manquantes entre l'année d’adhésion et 2035

    Merci de votre aide.

    A+
    C15

  2. #2
    Membre émérite Avatar de Zekraoui_Jakani
    Homme Profil pro
    Inscrit en
    Novembre 2013
    Messages
    1 671
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1 671
    Points : 2 491
    Points
    2 491
    Par défaut
    'Exploiter une fonction à créer dans VBA module indépendant, du style :

    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
    Function FutureAnnee()
       Dim rs As Recordset
       Dim j As Long: j = Year(Now()) + 1
       Set rs = CurrentDb.OpenRecordset("nomDeMaTable", dbOpenDynaset)
     
      With rs
        .MoveFirst
        Do While Not .EOF
         If j > 2035 Then Exit Do
        .Edit
        !AnneeFuture = j
        .Update
        j = j + 1
        .MoveNext
        Loop
      End With
      rs.Close: Set rs = Nothing
     
    End Function

  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 Zekraoui,

    Merci de cette réponse que je vais tester.
    Mon problème, comment appeler cette fonction ,

    J'en profite pour poser une question qui se rapproche de la précédente (dis moi s'il vaut mieux poster une nouvelle discussion):

    J'ai un formulaire principal 0_FORMULAIRE_ADHERENT_AVEC_COTISATIONS_ET_AG (coordonnées des adhérents) avec un sous formulaire F_Cotisation pour gérer leurs cotisations

    Sur le contrôle DateAdhesion du formulaire principal j'ai

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub DateAdhesion_AfterUpdate()
    [Forms]![0_FORMULAIRE_ADHERENT_AVEC_COTISATIONS_ET_AG]![F_Cotisation].[Form]![Cotisation_An].Value = Year(DateAdhesion)
    End Sub
    qui fait que lorsque je rentre un nouvel adhérent, l'année de son adhésion apparait dans le contrôle Cotisation_An du sous formulaire ; cela marche.

    Sur ce contrôle Cotisation_An du sous-formulaire j'ai mis cette procédure
    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
     
    Private Sub Cotisation_An_Click()
    If IsNull(Forms![0_FORMULAIRE_ADHERENT_AVEC_COTISATIONS_ET_AG]![F_Cotisation].Form![Cotisation_An]) And DCount("*", "T_Cotisation", "[T_Adherent_FK]=" & Me.T_Adherent_FK) = 0 Then
        Me.Cotisation_An.Value = Year(Me.Parent!DateAdhesion)
        MsgBox "l'année d'adhésion " & Year(Me.Parent!DateAdhesion) & "  vient d'être renseignée", vbExclamation
     
     
    Else
     
    If IsNull(Forms![0_FORMULAIRE_ADHERENT_AVEC_COTISATIONS_ET_AG]![F_Cotisation].Form![Cotisation_An]) And DCount("*", "T_Cotisation", "[T_Adherent_FK]=" & Me.T_Adherent_FK) > 0 Then
       Me.Cotisation_An.Value = DMax("Cotisation_An", "T_Cotisation", "[T_Adherent_FK]=" & Me.T_Adherent_FK) + 1
     
      MsgBox "Vous venez de rajouter une année", vbExclamation
     
    End If
     
    End If
     
    End Sub
    qui fait que si je clique sur la 1ère ligne vide, je rentre l'année suivante et ainsi de suite...Cela aussi marche parfaitement.

    Pour combiner les 2 questions comment faire pour que lorsque je rentre un nouvel adhérent toutes les années de son année d’adhésion à 2035 soient rentrées, dans le sous-formulaire...et donc dans la table T_Cotisation ?

    Merci de ton aide

    A+
    C15

  4. #4
    Membre émérite Avatar de Zekraoui_Jakani
    Homme Profil pro
    Inscrit en
    Novembre 2013
    Messages
    1 671
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1 671
    Points : 2 491
    Points
    2 491
    Par défaut
    Pour la 1ère question,
    1. faites une copie de vote table "T_Cotisation" au cas ceci génère un problème.
    2. copier/coller ce code dans un module indépendant et lancez le via la touche F5 (ave curseur dans le corp du programme):

    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
    Sub AjoutAnnees()
     
        Dim db As Database
        Dim rs As Recordset
        Dim j As Long: j = 1
     
        Set db = CurrentDb()
        Set rs = db.OpenRecordset("T_Cotisation", dbOpenDynaset)
     
        With rs
            .MoveFirst
            Do While Not .EOF
                adhesion = ![AnneeAdhesion] 'AnneeAdhesion est à remplacer par le vrai nom que vous avez défini
                If adhesion + j > 2035 Then Exit Do
                .Edit
                ![Cotisation_an] = adhesion + j
                .Update
                j = j + 1
                .MoveNext
            Loop
      End With
     
      rs.Close: Set rs = Nothing
      db.Close: Set db = Nothing
     
    End Sub

  5. #5
    Membre émérite Avatar de Zekraoui_Jakani
    Homme Profil pro
    Inscrit en
    Novembre 2013
    Messages
    1 671
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1 671
    Points : 2 491
    Points
    2 491
    Par défaut
    Pour la 2è question, ce n'est pas la solution idéale, mais vous pouvez appliquer la même astuce après avoir encodé un nouveau candidat.
    Si j'avais votre DB devant moi, j'aurais trouvé des solutions plus efficientes.

  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
    J'ai resté ta procédure, il y a un problème de doublons.

    Je joins une version expurgée de ma base qu is'ouvre sur le formulaire principal.
    Les infos sont "bidon".

    Merci de ton aide
    A+
    C15
    Fichiers attachés Fichiers attachés

  7. #7
    Membre émérite Avatar de Zekraoui_Jakani
    Homme Profil pro
    Inscrit en
    Novembre 2013
    Messages
    1 671
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1 671
    Points : 2 491
    Points
    2 491
    Par défaut
    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
    Option Compare Database
    Option Explicit
     
    Sub CreerTableDesAnnees()
        '************************************************************************************************************
        ' Ce module est à lancer une fois par an
        ' mon approche consiste à créer une table des années couvrant les 14 années à venir
        ' il fallait donc ajouter un champ "AnAdhesion" calculant l'année d'adésion dans la table [T Adhérents]
        ' puis créer une requête "R_AnneesDesCotisations" qui donne la liste des années de cotisation jusqu'en 2035
        ' je n'ai plus qu'à exploiter cette requête pour n'importe quel adhérent et les rajouter dans T_Cotisations
        ' en utilisant le numAdhérent et l'année de cotisation comme clefs communes
        '************************************************************************************************************
     
        ' Voir annexe ***********************************************************************************************
     
        Dim minYear, maxYear As Long
        Const delta = 14    'si vous y mettez 95, il y aura 95 ans rajoutées à partir de l'année en cours
                            '(mais Access serait obsolete d'ici là)
     
        minYear = DMin("[AnAdhesion]", "[T Adhérents]")
        maxYear = Year(Now) + delta
     
        Dim rst As Recordset
        Dim j As Integer
     
        DoCmd.SetWarnings False: DoCmd.DeleteObject acTable = acDefault, "TableAnnees": DoCmd.SetWarnings True
        DoCmd.RunSQL "CREATE TABLE TableAnnees([Annee] Long);"
        DoCmd.Close acTable, "TableAnnees", acSaveYes
     
        Set rst = CurrentDb.OpenRecordset("TableAnnees", dbOpenDynaset)
     
        With rst
            Do While True
                If (minYear + j) > maxYear Then Exit Do
                .AddNew
                !Annee = minYear + j
                .Update
                j = j + 1
            Loop
        End With
     
        rst.Close: Set rst = Nothing
     
    End Sub
    Fichiers attachés Fichiers attachés

  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

    Merci de cette piste, mais désolé, je ne comprends pas comment exploiter la requête R_AnneesDesCotisations pour rajouter, dans la T Cotisation, les années qui manquent à chaque adhérent.

    A+
    C15

  9. #9
    Membre émérite Avatar de Zekraoui_Jakani
    Homme Profil pro
    Inscrit en
    Novembre 2013
    Messages
    1 671
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1 671
    Points : 2 491
    Points
    2 491
    Par défaut
    Je vais m'y atteler demain matin, in cha Allah

  10. #10
    Membre émérite Avatar de Zekraoui_Jakani
    Homme Profil pro
    Inscrit en
    Novembre 2013
    Messages
    1 671
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1 671
    Points : 2 491
    Points
    2 491
    Par défaut
    Cette solution remplace la précédente (voir annexe):
    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
    Sub AjouterAnneesFutures()
        'Ce module va rajouter les années futures à la table "T_Cotisation"
        '
        'Champs à mettre à jour
        '   T_Adherent_FK : vient de "T Adhérents"
        '   Nom de l'adhérent : vient de "T Adhérents"
        '   Cotisation_An : année venant de "T_Cotisation"
        '   AG : vient de "T_Cotisation"
        '   Cotisation : vient de "T_Cotisation"
        '   Cotisation_Du : vient de "T_Cotisation"
        '
        'L'approche consiste à créer une table "TableAnneesFutures" pour y stocker les années futures, par membre
        'On injecte ensuite ces données dans "T_Cotisation"; c'est le moyen trouvé pour éviter les conflits des clefs et indexes
     
        On Error GoTo err_Mngr
     
        Dim db As Database
        Dim rstAdherents As Recordset
        Dim rstAnnees As Recordset
     
        Set db = CurrentDb()
        Set rstAdherents = db.OpenRecordset("T Adhérents", dbOpenDynaset)
        Set rstAnnees = db.OpenRecordset("TableAnneesFutures", dbOpenDynaset)
     
        Dim IdAdh As Long  'N°Adherent
        Dim nomAdh As String
        Dim AnneeAdh As Long
        Dim cotisAn As Long
        Dim AssG As Boolean
        Dim Cotis As Boolean
        Dim CotisDue As Long
        Dim DerniereAnCotis
        Dim NouvelAn, maxYear As Long
        Const delta = 14
        Dim j, k As Long
        Dim Nbr As Long
     
        maxYear = Year(Now()) + delta
        DoCmd.SetWarnings False: DoCmd.RunSQL "DELETE TableAnneesFutures.* FROM TableAnneesFutures;": DoCmd.SetWarnings True
     
        j = 0
        With rstAdherents
            .MoveFirst: .MoveLast: Nbr = .RecordCount
            .MoveFirst
            For k = 1 To Nbr
                IdAdh = rstAdherents![N°Adherent]
                nomAdh = DLookup("[Nom]", "[T Adhérents]", "[N°Adherent]=" & IdAdh) & " " & _
                        DLookup("[Prenom]", "[T Adhérents]", "[N°Adherent]=" & IdAdh)
                AnneeAdh = rstAdherents![AnAdhesion]
                DerniereAnCotis = DMax("[Cotisation_An]", "[T_Cotisation]", "[T_Adherent_FK]=" & IdAdh)
                If IsNull(DerniereAnCotis) Then DerniereAnCotis = AnneeAdh
                NouvelAn = 1 + DerniereAnCotis
                If IsNull(DerniereAnCotis) Then NouvelAn = AnneeAdh
     
                With rstAnnees
                    Do While True
                        If (NouvelAn + j) > maxYear Then Exit Do
                        rstAnnees.AddNew
                        rstAnnees![T_Adherent_FK] = IdAdh
                        rstAnnees![Adherent] = nomAdh
                        rstAnnees![Cotisation_An] = NouvelAn + j
                        rstAnnees![AG] = False
                        rstAnnees!Cotisation = False
                        rstAnnees![Cotisation_Du] = 0
                        .Update
                        j = j + 1
                    Loop
                End With
                j = 0
                rstAdherents.MoveNext
            Next k
        End With
     
        rstAdherents.Close: Set rstAdherents = Nothing
        rstAnnees.Close: Set rstAnnees = Nothing
        db.Close: Set db = Nothing
        DoCmd.SetWarnings False: DoCmd.OpenQuery "R_AjoutDesAnneesFutures": DoCmd.SetWarnings True
     
    err_Mngr_Exit:
        Exit Sub
     
    err_Mngr:
        Dim myMsg As String
        myMsg = "La procédure 'AjouterAnneesFutures' a généré une erreur !" & vbLf
        myMsg = myMsg & Err & "; " & Error
        MsgBox myMsg, vbCritical + vbOKOnly, "Erreur de traitement"
        Resume err_Mngr_Exit
     
    End Sub
    Fichiers attachés Fichiers attachés

  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,

    Merci de cette réponse détaillée.
    Je l'ai testée en changeant le delta (16 au lieu de 14) et j'ai effectivement pour chacun des adhérents les années 2036 et 2037 qui se sont rajoutées.

    Cela correspond parfaitement à mon problème, l'affaire est donc résolue

    Bonne journée
    A+
    C15

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 12/11/2020, 11h18
  2. Réponses: 0
    Dernier message: 28/07/2016, 14h03
  3. Réponses: 7
    Dernier message: 19/01/2012, 08h16
  4. Réponses: 1
    Dernier message: 27/03/2011, 19h50
  5. Comment ajouter un enregistrement à une table et modifier les autres
    Par Pepitos dans le forum Requêtes et SQL.
    Réponses: 13
    Dernier message: 20/03/2007, 18h53

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