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 :

CopyObject - destination [AC-2007]


Sujet :

VBA Access

  1. #1
    Membre éprouvé Avatar de harpyopsis
    Homme Profil pro
    Vétérinaire
    Inscrit en
    Octobre 2015
    Messages
    147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : Indonésie

    Informations professionnelles :
    Activité : Vétérinaire
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2015
    Messages : 147
    Par défaut CopyObject - destination
    Bonjour à tous !

    J'utilise CopyObject pour créer des Backups d'une Table de tarification.

    Cette Table ("Actes") est liée soit à un fichier accdb, soit à un mdf SQL Server. Ces copies "Actes_backup_..." restent locales, elles ne doivent pas être répliquées/synchronisées.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DoCmd.CopyObject , NewTableName, acTable, "Actes"
    CopyObject fonctionne bien, sauf que les copies apparaissent dans le Panneau de Navigation en temps que Tables liées, au lieu de Tables locales (voir image). Après vérification, les copies n'apparaissent effectivement pas dans les fichiers back-end d'origine.

    Nom : Capture.JPG
Affichages : 605
Taille : 31,2 Ko

    Un "Copy" - "Paste Table as" avec choix "Structure and Data (local table)" ne produit pas cette incohérence. Pourquoi ?

    J'ai essayé de mettre le chemin d'accès en "destination", mais sans succès.

    Un Compact and Repair est sans effet.

    J'évite de faire une "Make Table Query" à la place de CopyObject pour des questions de clefs uniques et de tables filles.

    Où se situe le bug ?

    Merci !

  2. #2
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 407
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 407
    Par défaut
    Bonjour.

    Je ne pense pas que tu puisses copier une table liée, tu peux juste copier le lien vers cette table.

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  3. #3
    Membre Expert 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
    Par défaut
    Vous pouvez vous inspirer de ce code:

    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
    Sub unlinkTables()
        Const myTableName As String = "NomDeMaTable"   ' à adapter
        Const SourceDBPath As String = "C:\Users\..etc\NomDeLaDatabase.accdb"  ' à adapter
        Dim tbl As TableDef, B As Boolean: B = False
     
        For Each tbl In CurrentDb.TableDefs
            If tbl.Name Like myTableName Then
                If Len(CurrentDb.TableDefs(myTableName).Connect) > 0 Then
                    ' Supprimer la table liée.
                    DoCmd.DeleteObject acTable, myTableName
                    MsgBox "'" & myTableName & "' vient d'être supprimée !"
                    'Puis l'importer en tant que table locale
                    DoCmd.TransferDatabase acImport, "Microsoft Access", (SourceDBPath), acTable, (myTableName), (myTableName) & "_Copy"
                    MsgBox "'" & myTableName & "' vient d'être importée en LOCAL !"
                Else
                    MsgBox "Attention !  '" & myTableName & "' n'est pas une table liée ! " & _
                            "Elle ne sera pas supprimée.", vbExclamation, "Table NON liée"
                End If
                B = True
                Exit For
            End If
        Next tbl
        If B = False Then MsgBox "la table '" & myTableName & "' n'existe pas !"
     
    End Sub

  4. #4
    Membre éprouvé Avatar de harpyopsis
    Homme Profil pro
    Vétérinaire
    Inscrit en
    Octobre 2015
    Messages
    147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : Indonésie

    Informations professionnelles :
    Activité : Vétérinaire
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2015
    Messages : 147
    Par défaut
    Effectivement, un très grand merci à tous les deux !

    Docmd.CopyObject ne crée bel et bien qu'une copie du lien, soit une coquille vide ! Dangereuse en plus, car si on y effectue des suppressions de nettoyage (Delete Query), les enregistrements en question seront impitoyablement supprimés dans la Table d'origine, ce qu'on ne souhaite évidemment pas !

    Rien de tout ceci ne se trouve clairement expliqué dans la doc de Microsoft, ou alors il faut bien chercher !

    Docmd.TransferDatabase de Zekraoui crée de véritables copies locales (structure + données), c'est parfait !

    Il faut peut-être adapter l'argument DatabaseType en fonction de l'environnement...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    DoCmd.TransferDatabase acImport, "Microsoft Access",
    'ou bien
    DoCmd.TransferDatabase acImport, "ODBC Database",    ' et bien d'autres aussi...
    Voilà le résultat !

    Nom : Capture2.JPG
Affichages : 559
Taille : 20,5 Ko

    Merci encore pour votre éclairage inestimable !

  5. #5
    Membre éprouvé Avatar de harpyopsis
    Homme Profil pro
    Vétérinaire
    Inscrit en
    Octobre 2015
    Messages
    147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : Indonésie

    Informations professionnelles :
    Activité : Vétérinaire
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2015
    Messages : 147
    Par défaut
    Voilà le code complet avec TransferDatabase, qui numérote et nettoie les sauvegardes. Cela peut faire gagner du temps à quelqu'un !

    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
    Private Sub CmdMakeBackUp_Click()
     
        '1. Generate unique incremented name for new Backup (= Name + User + Date + Increment in brackets if needed)
                Dim ObjectRootName As String, ObjectFullName As String
                    ObjectRootName = "Actes_BackUp_" & _
                                    FctGetUserInitial(CrtUserID) & "_" & _
                                    DatePart("d", Now) & "_" & DatePart("m", Now) & "_" & DatePart("yyyy", Now)
                ObjectFullName = ObjectRootName
     
        '2. Iterate Table collection to detect existing backups
                Dim db As DAO.Database, tdf As DAO.TableDef, TableAlreadyExists As Boolean, i As Long, ii As Long
                    Set db = CurrentDb
                TableAlreadyExists = False
                i = 1
                ii = 0
     
                For Each tdf In db.TableDefs
                    If (tdf.Attributes And dbSystemObject) = 0 Then
                        If tdf.Name = ObjectFullName Then
                            TableAlreadyExists = True
                            ObjectFullName = ObjectRootName & " (1)"
                        End If
                        If Right(tdf.Name, 1) = ")" Then
                            i = (Left((Right(tdf.Name, 2)), 1)) + 1
                            ObjectFullName = ObjectRootName & " (" & i & ")"
                        End If
                    End If
                    ii = ii + 1
                Next tdf
     
                Set db = Nothing
     
        '3. Create a local copy of linked Table "ActesTempCopy" (avoid using brackets)
                Dim SourceDBPath As String
                    SourceDBPath = GetDBPath & "Data\VetoDBaseActes.accdb"
                DoCmd.TransferDatabase acImport, "Microsoft Access", (SourceDBPath), acTable, "Actes", "ActesTempCopy"
     
        '4. Cull records belonging to sibling company
                DoCmd.RunSQL "DELETE ActesTempCopy.*, ActesTempCopy.VetStructureID " & _
                            "FROM ActesTempCopy " & _
                            "WHERE (((ActesTempCopy.VetStructureID)<>" & CrtVetStructureID & "));"
     
        '5. Rename Table with full name including brackets if any
                DoCmd.Rename ObjectFullName, acTable, "ActesTempCopy"
     
        '6. Update display
                UpdateMyBackUpList
                EnableMyButtons
     
    End Sub

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

Discussions similaires

  1. importation d'un fichier excel à destination finale : delphi
    Par pier dans le forum Décisions SGBD
    Réponses: 1
    Dernier message: 24/09/2005, 23h23
  2. Faire Choix du fichier destination methode GET grace a JS
    Par ahage4x4 dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 14/06/2005, 15h26
  3. [MFC] Dialog de sélection de destination
    Par toune dans le forum MFC
    Réponses: 3
    Dernier message: 22/03/2005, 15h46
  4. vérifier si un chemin de destination est correct
    Par philistase dans le forum MFC
    Réponses: 6
    Dernier message: 12/01/2005, 11h12

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