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 :

Ajout dans 3 tables d'enregistrements provenant de 3 autres tables ayant des relations entre elles [AC-2003]


Sujet :

Requêtes et SQL.

  1. #1
    Membre actif
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    355
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2006
    Messages : 355
    Points : 238
    Points
    238
    Par défaut Ajout dans 3 tables d'enregistrements provenant de 3 autres tables ayant des relations entre elles
    Bonjour,

    Mon p'tit problème dont je n'ai pas réussi à solutionner en parcourant le forum. (Peut-être pas vu les discussions adéquates?)

    J'ai 2 bases de données.
    La première db1 est mon ancienne qui contient 3 tables liées entre elles par 2 relations:
    - la première est une relation une relation simple entre la table Datacollect et la table NbrEmergence
    - la seconde est une relation 1 à plusieurs entre la table NbrEmergence et la table DataIdentification

    La seconde db2 est ma DB actuelle. Elle contient également 3 tables qui ont les même relations que la première db. La seule différence est que certains champs de la table DataCollect ont un nom différent de celui de la table correspondante de la première db. C'est également le cas pour mes 2 autres tables de la seconde db2.

    Mon but est de transférer les données de la db1 dans les tables et champs adéquat de la db2.
    Vu que leur nombre n'est pas trop important, j'ai commencé par faire un copier/coller.
    Ca fonctionne entre les tables DataCollect et NbrEmergence des deux base de données.
    Mais en copiant/collant dans la table DataIdentification de ma db2, je ne parviens pas à garder la correspondance(le lien) entre les données de la table identification et la table NbrEmergence.
    Je comprends que cela est du au fait que les données de la table DataIdentification sont reliées à l'ID correspondant de la table NbrEmergence. ID qui est un champ NumAuto (qui s'incrémente à chaque fois et donc je ne retrouve jamais le même ID si je fais un copie/coller).

    Est-ce que vous avez une suggestion pour une autre méthode de transfert de données? entre tables liées (dont 2 liées par un champs ID autoincrémenter)?

    Merci à vous

  2. #2
    Membre éclairé
    Homme Profil pro
    Comptable
    Inscrit en
    Mars 2005
    Messages
    511
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Comptable

    Informations forums :
    Inscription : Mars 2005
    Messages : 511
    Points : 678
    Points
    678
    Par défaut
    Bonjour,

    une solution peut-être, c'est de copier la bd1 sous un nom bd2 puis de renommer le champs des tables!

    autre solution d'importer les tables de la bd1 et ensuite à l'aide de requête ajout de les ajouter dans les nouvelles tables. Cependant pour les tables dépendantes il sera nécessaire de recréer un champs avec les nouvelles valeur du n° d'incrémentation afin de pouvoir ajouter les données de la table dépendante, c'est un peu plus compliqué.

    bonne chance

  3. #3
    Membre actif
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    355
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2006
    Messages : 355
    Points : 238
    Points
    238
    Par défaut
    Bonjour Alexandre,

    Merci pour ta réponse.

    La première me semble inappropriées car il y a des données dans les deux bases que je souhaiterai conserver.

    La seconde me semble plus adéquate dans mon cas. Comment je peux faire pour recréer un champs avec le nouveau numéro d'incrémentation?

    Merci de ton aide

  4. #4
    Membre éclairé
    Homme Profil pro
    Comptable
    Inscrit en
    Mars 2005
    Messages
    511
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Comptable

    Informations forums :
    Inscription : Mars 2005
    Messages : 511
    Points : 678
    Points
    678
    Par défaut
    bonjour,

    Je vais te donner une solution pour importer 2 tables liées (1 à plusieurs) dans une nouvelle Bd avec des champs auto

    Dans la base Bd2

    Tu as une table Tbl2 (avec n° auto) liée par ce N° à une table Tbl2Liee

    Tu vas importer Tbl1 (avec n° auto) liée par ce n° à une table liée Tbl1Liee

    Puis les opérations suivantes sont nécessaire.

    1° dans Tbl2 tu ajoutes un champ entier long qui va recevoir le N° auto de la Table Tbl1
    2° tu fais une requête ajout pour ajouter les données de Tbl1 dans Tbl2 en important aussi le N° auto de Tbl1 dans le nouveau champ

    3° tu vas maintenant crée un nouveau champ entier long dans Tbl1liee, qui va recevoir le Nouveau N° auto crée dans Tbl2 lors de l'importation

    4 ° tu fais une requête mise à jour du nouveau n° auto de Tbl2 dans Tbl1liee. tu prends Tbl2 et Tbl1liee et tu relie les tables Dans Tbl2 le champs qui contient l'ancien n° auto avec Tbl1lee. et tu mets à jour le nouveau champ
    5° tu importes Tbl1liee dans Tbl2liee en important le nouveau N° de liaison.

    et le tour est joué.

    j'espère avoir été assez clair. Car c'est pas trop compliqué si tu maîtrises assez bien les requêtes ajout et la création de champs

    c'est en essayant que l'on apprend

    bonne chance

  5. #5
    Membre actif
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    355
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2006
    Messages : 355
    Points : 238
    Points
    238
    Par défaut
    Bonjour Alexandre,

    Tout d'abord une très bonne années 2010 à toi et à tous les membres du forum.

    J'étais en vacances et à mon retour j'ai testé ta méthode. Et..... Elle fonctionne
    Mais pendant mes congés j'ai aussi trituré mes méninges et ai trouvé une solution que j'ai finalement gardée car je compte la modifié dans un futur proche.
    Cette solution consiste à ouvrir différents recordsets simultanés et grâce à ceux-ci, je récupère l'ancien ID de la table 1 (ancienne DB, avant transfert), je transfère les données (lignes par ligne) de la table 1 (ancienne DB) dans la table correspondant de la nouvelle DB, récupère le nouvel ID de chacun des enregistrements dans la table de la nouvelle DB. Puis, pour chaques enregistrement de la table 1 (ancienne DB), je filtre les enregistrements liés dans la table 2 (ancienne DB), les transfère dans la table 2 (nouvelle Db) et remplace l'ancien ID par la valeur du nouvel ID.
    Et ainsi de suite jusqu'à la fin de la table 1 et 2 (ancienne DB).

    En espérant aussi être clair dans mon explication ...

    J'ai mis cela sur un l'évennement click d'un bouton d'un formulaire. Voici le code pour qui veut s'en inspirer.

    En tout cas, nos solutions respectives apportent encore une preuve de la flexibilité d'access pour résoudre un problème

    Encore merci à toi et à bientôt pour de nouvelles.... lignes de codes



    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
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
     
    Private Sub TransfertDB_Click()
    '***********************************************************************
    ' Code pour un bouton qui m'a servi à transférer les données de l'ancienne base DBEntomo10
    ' dans celle-ci (la nouvelle DBEntomo en betatest)
    '***********************************************************************
     
        Dim rst As DAO.Recordset ' recordset for data
        Dim rst2 As DAO.Recordset 'recordset sur la table temporaire admin
        Dim fld As DAO.Field 'pour les champs du rst2
     
     
        Dim oldID As Long
        Dim newID As Long
     
        Dim db As DAO.Database
        Set db = CurrentDb
     
        Call TransfertDataCollect
     
        ' open recordset basé sur la table NbrEmergence1
        Set rst = db.OpenRecordset("SELECT * from NbrEmergence1")
        ' open recordset basé sur la table NbrEmergence
        Set rst2 = db.OpenRecordset("SELECT * from NbrEmergence")
     
        'on ajoute à la table NbreEmergence les données de NbrEmergence1
        If rst.RecordCount <> 0 Then
        rst.MoveFirst
            Do While rst.EOF = False
                rst2.AddNew
                For Each fld In rst.Fields
                    If fld.Name = "ID" Then
                    oldID = rst.Fields(fld.Name).Value
                    Else
                        If fld.Name = "DateHeureEncodage" Then
                        'Ce champs s'appelle maintenant DateModif
                        Else
                        rst2.Fields(fld.Name).Value = fld.Value
                        End If
                    End If
                Next fld
                    newID = rst2.Fields("ID").Value
                rst2.Update
     
                Call TransfertDataIdentification(oldID, newID)
     
                rst.MoveNext
     
                    'MsgBox "AncienID = " & oldID & " - NouveauID = " & newID
            Loop
        Else
            MsgBox "La table NbrEmergence1 n'a pas d'enregistrements"
        End If
     
    DoCmd.Close acForm, "TransfertDB"
     
    rst.Close
    Set rst = Nothing
    rst2.Close
    Set rst2 = Nothing
    db.Close
    Set db = Nothing
     
    End Sub
     
    Private Function TransfertDataIdentification(ByVal oldID As Long, ByVal newID As Long)
    '***********************************************************************
    ' Code pour un bouton qui m'a servi à transférer les données de l'ancienne base DBEntomo10
    ' dans celle-ci (la nouvelle DBEntomo en betatest)
    '***********************************************************************
     
        Dim rst As DAO.Recordset ' recordset for data
        Dim rstFiltre As DAO.Recordset ' recordset for data Filtrée
        Dim rst2 As DAO.Recordset 'recordset sur la seconde table
        Dim fld As DAO.Field 'pour les champs du rst2
        Dim nomtaxon As String
        Dim nomauteur As String
        Dim db As DAO.Database
        Set db = CurrentDb
     
        ' open recordset basé sur la table NbrEmergence1
        Set rst = db.OpenRecordset("SELECT * from DataIdentification1", dbOpenDynaset)
        ' open recordset basé sur la table NbrEmergence
        Set rst2 = db.OpenRecordset("SELECT * from DataIdentification", dbOpenDynaset)
     
        'Filtrage de la table DataIdentification pour ressortir juste les enregistrments concernant l'oldID
        rst.Filter = "(IDBteEmergence) = " & oldID
        Set rstFiltre = rst.OpenRecordset
     
        nomtaxon = ""
        nomauteur = ""
     
        'on ajoute à la table DataIdentification les données de DataIdentification1
        If rstFiltre.RecordCount <> 0 Then
        rstFiltre.MoveFirst
            Do While rstFiltre.EOF = False
                rst2.AddNew
                For Each fld In rstFiltre.Fields
                    If fld.Name = "IDBteEmergence" Then
                        rst2.Fields(fld.Name).Value = newID
                    Else
                        If fld.Name = "IdEspeceParrain" Then    'on scinde ici le champs en 2 champs
                            If Not IsNull(fld.Value) And fld.Value <> "sp. Indet." Then
                                nomtaxon = Trim(Left(fld.Value, InStr(1, fld.Value, " ")))
                                nomauteur = Trim(Right(fld.Value, Len(fld.Value) - InStr(1, fld.Value, " ")))
                            Else
                                If fld.Value = "sp. Indet." Then
                                    nomtaxon = "sp. Indet."
                                    nomauteur = ""
                                Else
                                    nomtaxon = ""
                                    nomauteur = ""
                                End If
                            End If
     
                            rst2.Fields("IdEspeceParrain").Value = nomtaxon
    '                        rst2.Fields("Auteur") = nomauteur
     
                        Else
                            rst2.Fields(fld.Name).Value = fld.Value
                        End If
                    End If
                Next fld
                rst2.Update
                If rst2.RecordCount > 0 Then
                    rst2.MoveLast
                    rst2.Edit
                    rst2.Fields("Auteur") = nomauteur
                    rst2.Update
                End If
                rstFiltre.MoveNext
            Loop
        Else
            MsgBox "La table DataIdentification1 n'a pas d'enregistrements"
        End If
     
    rst.Close
    Set rst = Nothing
    rstFiltre.Close
    Set rstFiltre = Nothing
    rst2.Close
    Set rst2 = Nothing
    db.Close
    Set db = Nothing
     
    End Function
     
    Private Function TransfertDataCollect()
    '***********************************************************************
    ' Code pour un bouton qui m'a servi à transférer les données de l'ancienne base DBEntomo10
    ' dans celle-ci (la nouvelle DBEntomo en betatest)
    '***********************************************************************
     
        Dim rst As DAO.Recordset ' recordset for data
        Dim rst2 As DAO.Recordset 'recordset sur la table temporaire admin
        Dim fld As DAO.Field 'pour les champs du rst2
     
        Dim db As DAO.Database
        Set db = CurrentDb
     
        ' open recordset basé sur la table NbrEmergence1
        Set rst = db.OpenRecordset("SELECT * from DataCollect1")
        ' open recordset basé sur la table NbrEmergence
        Set rst2 = db.OpenRecordset("SELECT * from DataCollect")
     
        'on ajoute à la table DataCollect les données de DataCollect1
        If rst.RecordCount <> 0 Then
        rst.MoveFirst
            Do While rst.EOF = False
                rst2.AddNew
                For Each fld In rst.Fields
                    If fld.Name = "ID" Then
                    Else
                        If fld.Name = "NumDeCD" Then
                            rst2.Fields("NumCD").Value = fld.Value
                        Else
                            If fld.Name = "DatePrelevement" Or fld.Name = "Recolteurs" Or fld.Name = "Commentaires/notes" Or fld.Name = "HeurePrélèvement" Or fld.Name = "NumSondeTerrain" Then
                            'ces champs sont dans la table InfosPrelevements - Faire une fonction pour les y transférer si besoin dans le futur
                            Else
                            rst2.Fields(fld.Name).Value = fld.Value
                            End If
                        End If
                    End If
                Next fld
                rst2.Update
                rst.MoveNext
            Loop
        Else
            MsgBox "La table DataCollect1 n'a pas d'enregistrements"
        End If
     
    rst.Close
    Set rst = Nothing
    rst2.Close
    Set rst2 = Nothing
    db.Close
    Set db = Nothing
     
    End Function

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 28
    Points : 20
    Points
    20
    Par défaut
    Bonjour Forum
    Bonjour Alexandre.

    J'ai suivi ta méthode mais je bloque à la 4° étape où j'ai pas tout saisis.

    Pourrais tu m'apporter plus de précision STP ?

    Bien à toi

  7. #7
    Membre éclairé
    Homme Profil pro
    Comptable
    Inscrit en
    Mars 2005
    Messages
    511
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Comptable

    Informations forums :
    Inscription : Mars 2005
    Messages : 511
    Points : 678
    Points
    678
    Par défaut
    Bonjour,

    Pourrais tu préciser ce que tu n'as pas compris! peut être que je pourrais t'éclairer.

    à bientôt

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 28
    Points : 20
    Points
    20
    Par défaut
    Salut Alexandre,

    1° dans Tbl2 tu ajoutes un champ entier long qui va recevoir le N° auto de la Table Tbl1

    2° tu fais une requête ajout pour ajouter les données de Tbl1 dans Tbl2 en important aussi le N° auto de Tbl1 dans le nouveau champ

    3° tu vas maintenant crée un nouveau champ entier long dans Tbl1liee, qui va recevoir le Nouveau N° auto crée dans Tbl2 lors de l'importation

    4 ° tu fais une requête mise à jour du nouveau n° auto de Tbl2 dans Tbl1liee.
    Comment faire ici pour mettre à jour le bon enregistrement ? Dois mettre ici en critère le Nouveau N° auto crée dans Tbl2 ? Du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [Tbl1liee].[N° auto]=[Tbl2].[N° auto]
    tu prends Tbl2 et Tbl1liee et tu relie les tables Dans Tbl2 le champs qui contient l'ancien n° auto avec Tbl1lee.
    Je suis perdu Que veux tu dire ?

    Désolé moi yen a être un peu neuneu

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 28
    Points : 20
    Points
    20
    Par défaut

    J'ai été m'acheter des neurones, j'ai investis dans le dico de l'informatique pour les nuls, j'ai décrypté tel Champollion devant des hiéroglyphes et Cool
    C'est ok.

    Par contre j'ai deux requêtes "Ajout" et une "Mise à jour" sur les bras.
    Crois Tu que je puisse transformer cela en VBA ? pour ne traiter tout cela en un clic . En tout cas je m'y attèle.

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 28
    Points : 20
    Points
    20
    Par défaut
    Oki ça marche avec un Currentdb.execute

    Encore un grand merci à tous

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 27/01/2015, 17h44
  2. Ajouter clés primaires provenant de 3 autres tables
    Par Acris dans le forum Requêtes
    Réponses: 8
    Dernier message: 17/02/2012, 21h05
  3. Réponses: 11
    Dernier message: 27/10/2009, 17h12
  4. [Debutant] Appel d'enregistrement issu d'une autre table
    Par grasduslip dans le forum Access
    Réponses: 15
    Dernier message: 21/07/2006, 16h34
  5. Réponses: 2
    Dernier message: 23/06/2006, 14h36

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