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

Access Discussion :

Compatibilité code entre Access 97 et 2003


Sujet :

Access

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10
    Points : 5
    Points
    5
    Par défaut Compatibilité code entre Access 97 et 2003
    Bonjour,

    Je vous expose mon problème : j'ai une application access déployée chez plusieurs clients. Certains clients migrent actuellement d'Access 97 vers Acess2003.

    Nous possédons une application vierge de données que nous apellons Export et qui contient la dernière version en cours de la structure et du code (requetes, formulaires, états et modules). Lorsque nous devons apporter une correction à un objet (requete, formulaire, état ou module), nous remplaçons dans cet Export l'ancien objet par l'objet corrigé. Ainsi, L'Export contient toujours la dernière version des objets de nos applications clients.

    Nous avons ensuite dévellopé du code bien pratique qui permet de mettre à jour la structure et le code des nos applications clients : suppression dans une application client les objets qui sont présents dans l'Export (et uniquement ceux-ci) puis réinjection de ces mêmes objets de l'Export vers l'application client.

    Tout ceci fonctionne très bien avec une application sous Access 97.

    En 2003, les requetes sont supprimées mais ça ne supprime ni les formulaires, ni les états, ni les modules (sans aucun plantage de code : le code de suppression est lu mais rien ne se passe).

    Du coup, lorsqu'on arrive à l'étape de réinjection, il plante au premier formulaire à réinjecter (erreur d'execution 2501 : l'action TransferDataBase a été annulée) certainement parce qu'on lui demande d'injecter un objet alors qu'il trouve un objet du même nom déjà présent.

    Voici le code de suppression des objets :

    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
     
    [...]
    'Suppression des éléments de la base site
    DoEvents
    For i = 0 To UBound(TabLstQuerys)
    DoCmd.DeleteObject acQuery, TabLstQuerys(i)
    TxtInfo.Value = "Suppression requête : " & TabLstQuerys(i)
    DoEvents
    Next i
    DoEvents
    For i = 0 To UBound(TabLstForms)
    If TabLstForms(i) <> "M_MAJExport" Then
    DoCmd.DeleteObject acForm, TabLstForms(i)
    TxtInfo.Value = "Suppression formulaire : " & TabLstForms(i)
    DoEvents
    End If
    Next i
    DoEvents
    For i = 0 To UBound(TabLstModules)
    If TabLstModules(i) <> "Function_MAJExport" Then
    DoCmd.DeleteObject acModule, TabLstModules(i)
    TxtInfo.Value = "Suppression module : " & TabLstModules(i)
    DoEvents
    End If
    Next i
    DoEvents
    For i = 0 To UBound(TabLstReports)
    DoCmd.DeleteObject acReport, TabLstReports(i)
    TxtInfo.Value = "Suppression état : " & TabLstReports(i)
    DoEvents
    Next i
    [...]
    Auparavant, j'ai défini mes TabLstQuerys, TabLstForms, TabLstModules et TabLstReports en fonction de ce que contient la base Export. J'ai pu vérifier que cette étape fonctionnait bien et que la liste des requêtes, formulaires, états et modules à supprimer et réinjecter étaient bien renseignées.

    TxtInfo est une boite de texte de mon formulaire nommé M_MAJ_Export à partir duquel ce code est exécuté. Ce formulaire n'est bien sur pas supprimé puisqu'il est actif lors de l'exécution de ce code.

    Je seche complet : pourquoi la fonction de suppression DeleteObject fonctionne parfaitement sous access 97 et pas sous access 2003 ? Et pourquoi cela détruit bien mes requêtes mais pas les formulaires, les états et les modules ???

    Etant nouveau ici, j'espère avoir respecté les règles du forum et surtout avoir été clair dans l'exposé de mon problème.

    Et d'avance, un grand merci pour vos réponses et le temps passé !

  2. #2
    Modérateur

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

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 365
    Points : 23 835
    Points
    23 835
    Par défaut
    Quand j'ai travaillé à la suppression d'éléments dans une base j'ai trouvé que de le faire en ordre inverse posait moins de pb que de le faire en ordre croissant.

    Essaye de faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    For i = UBound(TabLstQuerys) to 0 step -1
    A+

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10
    Points : 5
    Points
    5
    Par défaut
    Je viens d'essayer mais sans succès...

  4. #4
    Modérateur

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

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 365
    Points : 23 835
    Points
    23 835
    Par défaut
    Tu n'as pas de message d'érreur ? As-tu tous les droits ? Peux-tu le faire à la main ?

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10
    Points : 5
    Points
    5
    Par défaut
    Le seul message d'erreur que j'ai est "erreur d'execution 2501 : l'action TransferDataBase a été annulée" au moment de la réinjection du premier formulaire (car il trouve déjà un formulaire du même nom).

    J'ai inséré un message box au moment de la suppression des formulaires, modules et états qui m'affiche le nom de l'objet sur lequel il se trouve. Il n'y a aucun problème : tous les formulaires modules et états sont pris en compte... mais ils ne sont pas pour autant supprimés.

    J'ai effectivement tous les droits et cela fonctionne à la main.

    Il y a deux choses curieuses : la première est que la totalité de ce code fonctionne sous access97 ; la seconde est que sous access2003, ce n'est pas la totalité de l'étape de suppression qui plante puisque la suppression des requetes fonctionne... C'est dingue non ?

    En tout cas, merci marot_r de te pencher sur la question.

  6. #6
    Modérateur

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

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 365
    Points : 23 835
    Points
    23 835
    Par défaut
    Essaye d'ajouter un refresh sur les collections que tu vide une fois la suppression faite.

    Regarde aussi en mode debug le .count de la collection à la sortie de ta boucle.

    A+

  7. #7
    Membre expérimenté Avatar de stigma
    Homme Profil pro
    Créateur jeux vidéo
    Inscrit en
    Octobre 2003
    Messages
    1 118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Créateur jeux vidéo
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 118
    Points : 1 614
    Points
    1 614
    Par défaut
    J'ai passé 30 applis Access 97 vers 2003 et je n'ai rencontré aucun problème. ça m'a même surprit !

  8. #8
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10
    Points : 5
    Points
    5
    Par défaut
    Citation Envoyé par marot_r
    Essaye d'ajouter un refresh sur les collections que tu vide une fois la suppression faite.

    Regarde aussi en mode debug le .count de la collection à la sortie de ta boucle.

    A+
    En fait lorsque le code tourne, je me place dans ma fenetre base de donnée et je vois les requetes qui disparaissent au fur et à mesure. Par contre ce n'est pas le cas pour les autres objets : le code est lu mais non exécuté. Après je vois les requetes qui réapparaissent et lorsque l'execution du code arrive au premier formulaire à réinjecter, y'a plantage...




    Citation Envoyé par stigma
    J'ai passé 30 applis Access 97 vers 2003 et je n'ai rencontré aucun problème. ça m'a même surprit !
    C'est encourageant : je me dis bien qu'il y a une solution. Pour l'instant, je ramène mes bases au format 97 pour les mettre à jour puis je les rebascule en 2003 mais ce n'est pas durable comme échappatoire !

  9. #9
    Expert éminent sénior

    Avatar de Tofalu
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Octobre 2004
    Messages
    9 501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Octobre 2004
    Messages : 9 501
    Points : 32 311
    Points
    32 311
    Par défaut
    Les tableaux contiennent bien les noms de formulaires exactes ? On sait jamais, peut être ont ils été renommés.

    En mode pas à pas, ça donne quoi ?

  10. #10
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10
    Points : 5
    Points
    5
    Par défaut
    J'avance en découvrant de nouvelles choses : puisqu'il plante à l'injection du premier formulaire, je supprime dans ma base client le premier formulaire qui est censé être importé.

    Finalement, je me dis qu'en partant d'une base complètement vide, ce serait encore mieux pour tester.

    Le résultat : il passe très rapidement les étapes de suppression (forcément, il n'y a rien à supprimer) puis il m'importe l'ensemble de mes requêtes, puis il plante au premier formulaire.

    Si je mets en commentaire le code d'importation des formulaires, il plante à l'importation du premier module. De la meme façon, il plante à l'importation du premier état lorsque je met en commentaire l'importation des formulaires et des modules.

    Du coup, je me dis que ça ne peut venir que de mes tableaux effectivement. Je vais contrôler tout ça (c'est le seul point commun entre les deux lignes de code de suppression et d'injection).

    Au cas où, je vous met le code que j'utilise pour créer mes tableaux de noms de requetes, formulaires, états et modules. On ne sait jamais...

    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
     
            'Ouvre la base Export pour lister les Forms, Reports et Modules devant être exportés
            Set db_MAJExport = wrkJetExport.OpenDatabase("Export.mdb")
            TxtHistorique.Value = TxtHistorique.Value & "Bilan des éléments contenus dans la base Export." & vbNewLine
            With db_MAJExport
                i = 0
                For Each QueryExport In .QueryDefs
                    With QueryExport
                        'Met à jour la liste des Requetes à mettre à jour
                        ReDim Preserve TabLstQuerys(i)
                        TabLstQuerys(i) = .Name
                        TxtInfo.Value = "Bilan requête export : " & .Name
                        DoEvents
                        i = i + 1
                    End With
                Next QueryExport
     
                For Each CtnExport In .Containers
                    With CtnExport
                        If .Documents.Count > 0 Then
                            If .Name = "Forms" Then
                                For i = 0 To .Documents.Count - 1
                                    'Met à jour la liste des Forms à mettre à jour
                                    ReDim Preserve TabLstForms(i)
                                    TabLstForms(i) = .Documents(i).Name
                                    TxtInfo.Value = "Bilan form export : " & .Documents(i).Name
                                    DoEvents
                                Next i
                            End If
                            If .Name = "Modules" Then
                                For i = 0 To .Documents.Count - 1
                                    'Met à jour la liste des Modules à mettre à jour
                                    ReDim Preserve TabLstModules(i)
                                    TabLstModules(i) = .Documents(i).Name
                                    TxtInfo.Value = "Bilan module export : " & .Documents(i).Name
                                    DoEvents
                                Next i
                            End If
                            If .Name = "Reports" Then
                                For i = 0 To .Documents.Count - 1
                                    'Met à jour la liste des Forms à mettre à jour
                                    ReDim Preserve TabLstReports(i)
                                    TabLstReports(i) = .Documents(i).Name
                                    TxtInfo.Value = "Bilan état export : " & .Documents(i).Name
                                    DoEvents
                                Next i
                            End If
                        End If
                    End With
                Next CtnExport
                .Close
            End With

  11. #11
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2003
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Localisation : Sénégal

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 229
    Points : 1 579
    Points
    1 579
    Par défaut
    Comment as tu déclaré tes tableaux? C'est des variant, des string?

  12. #12
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10
    Points : 5
    Points
    5
    Par défaut
    Ce sont des string effectivement :

    Dim TabLstQuerys() As String
    Dim TabLstForms() As String
    Dim TabLstReports() As String
    Dim TabLstModules() As String

    Je viens de controler ces tableaux : leur contenu est bon.

    Personne n'a une corde ?

  13. #13
    Modérateur

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

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 365
    Points : 23 835
    Points
    23 835
    Par défaut
    Je pense que c'est un pb de sécurité qui t'empèche de modifier la base active. Comme tu ne peux pas modifier une base (à part les requète) si tu n'es pas en mode exclusif. Access 97 etait beaucoup plus laxiste au niveau sécurité.

    Donc essaye de démarer ta base en mode exclusif (avec /excl dans la ligne de commande ou au moment de l'ouverture) et de reexcuter, si cela ne marche pas essaye de manipuler ta base depuis une autre.

    Lache pas tu es plus fort que la machine :-).

    A+

  14. #14
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10
    Points : 5
    Points
    5
    Par défaut
    Salut marot_r

    Je ne pense pas que manipuler une base à partir d'une autre me permette de résoudre le pbm puisqu'il faudra bien que j'importe mes objets après les avoir supprimés et que même à partir d'une base vide, ça plante au moment de l'importation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     DoCmd.TransferDatabase acImport, "Microsoft Access", "export.mdb", acForm, TabLstForms(i), TabLstForms(i), False
    A moins que je puisse importer d'une base vers une autre et cela en exécutant du code à partir d'une troisième base ?

    Plusieurs questions concernant le mode exclusif :
    - si je coche dans Outil/options/ onglet avancé la case mode exclusif ça suffit ?
    - dois je le faire dans ma base client, dans ma base export, dans les deux ?
    - comment mettre /excl à l'ouverture d'une base : j'ai une macro autoexec qui réalise plusieurs choses avant d'executer un module Ouverture base dans lequel j'affiche une barre d'outil perso et je masque la fenetre base de données . Je mets ça dans ce module ?

  15. #15
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2003
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Localisation : Sénégal

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 229
    Points : 1 579
    Points
    1 579
    Par défaut
    Un test simple
    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
     
    Private Sub Commande0_Click()
    Dim wrkJet As Workspace, mbd As Database, mbdA As Database
     
    Dim MonFor() As String, i As Integer, k As Integer
    Dim mform As Container
     
    Set wrkJet = CreateWorkspace("", "admin", "", dbUseJet)
    Set mbd = CurrentDb()
     
    Set mbdA = wrkJet.OpenDatabase("C:\bd12.mdb")
     
        i = 0
        For Each mform In mbdA.Containers
     
            If Mid(mform.Name, 1, 6) = "Forms" Then
                For i = 0 To mform.Documents.Count - 1
                    ReDim Preserve MonFor(i)
                    MonFor(i) = mform.Documents(i).Name
                Next
            End If
     
        Next
     
        For i = 0 To UBound(MonFor)
            DoCmd.DeleteObject acForm, MonFor(i)
        Next
     
        MsgBox "Formulaires supprimés"
     
    For i = 0 To UBound(MonFor)
        DoCmd.TransferDatabase acImport, "Microsoft Access", "C:\bd12.mdb", acForm, MonFor(i), MonFor(i), False
    Next
     
    MsgBox "Formulaires importés"
     
    End Sub
    En mettant en commentaire cette ligne Set mbd = CurrentDb() tout marche sans problème; aussi bien les suppressions que les importations.

    PS : As tu essayer de
    1 - compiler ton application sous Access 97
    2 - le convertir sous ta nouvelle version et
    3 - compacter la nouvelle version

  16. #16
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10
    Points : 5
    Points
    5
    Par défaut Chapeau !
    Fantastique, ça fonctionne !

    Une Ovation pour toi DMboup

    J'ai effectivement mis en commentaire (je n'utilisais Db que pour dire à la fin que Db.name avait été mise à jour).

    Et merci à tous les autres pour leur aide.

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

Discussions similaires

  1. [Toutes versions] Problème compatibilité entre Access 2013 et 2003
    Par hamerpote dans le forum Access
    Réponses: 3
    Dernier message: 03/03/2014, 17h46
  2. Différence entre access 2000 et 2003
    Par anthonyf dans le forum IHM
    Réponses: 2
    Dernier message: 17/02/2009, 15h10
  3. compatibilité entre access 2002 et access 2003
    Par Abdel Illah dans le forum Access
    Réponses: 1
    Dernier message: 03/08/2008, 08h55
  4. pbl de code entre ACCESS 2000 et 97!
    Par tieuphuong dans le forum VBA Access
    Réponses: 2
    Dernier message: 10/07/2007, 09h50
  5. Compatibilité du code entre navigateurs
    Par solp dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 12/04/2006, 16h30

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