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 :

Impossible de supprimer une table [AC-2007]


Sujet :

VBA Access

  1. #1
    Membre éclairé Avatar de dumas.blr
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2010
    Messages
    598
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2010
    Messages : 598
    Points : 879
    Points
    879
    Par défaut Impossible de supprimer une table
    Bonjour,

    Je bute sur le problème suivant :

    Afin de faire une mise à jour en bloc, j'ai créé une table temporaire TMP_MAJMensuelle sur lequel j'ai basé un formulaire qui me sert à faire mes MAJ.

    Lors de la MAJ de la table source, j'effectue les opérations suivantes :
    1. Lancement d'une première requête de mise à jour à partir d'une requête issue de la table temporaire TMP_MAJMensuelle vers la table source
      (instuction :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      DoCmd.OpenQuery ("Upd_MajMensuelle_step2")
      )
    2. Lancement d'une seconde requête de mise à jour à partir d'une requête issue de la table temporaire TMP_MAJMensuelle vers la table source.
      (instuction :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      DoCmd.OpenQuery ("Upd_MajMensuelle_dateSortie")
      )
    3. fermeture du formulaire de MAJ sur lequel est basée ma table temporaire TMP_MAJMensuelle(au cas ou clui-ci verrouillerait l'accès à ma table temporaire ).
    4. drop de ma table temporaire en utilisant l'instruction suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CurrentDb.Execute "DROP TABLE TMP_MAJMensuelle;"
    Or, sur l'instruction de DROP de la table temporaire, je reçois le message suivant :
    erreur 3211. Le moteur de base de données n'a pas pu verrouiller la table « TMP_MAJMensuelle » car elle est déjà utilisée par une autre personne ou un autre processus.
    Or, je n'ai ouvert aucun recordset basé sur cette table.

    quel en est l'origine ? Est-ce que les requête de MAJ, ou le formulaire, ne déverouillent pas tout de suite la table ? dois-mettre une temporisation ?

    Merci d'avance pour vos réponses éclairées.

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour

    Est-ce qu'un formulaire ou une requête ayant cette table comme source est ouvert ?

    Philippe

  3. #3
    Membre éclairé Avatar de dumas.blr
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2010
    Messages
    598
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2010
    Messages : 598
    Points : 879
    Points
    879
    Par défaut
    a priori, rien n'est ouvert.

    Y a t'il une instruction VBA que je puisse lancer pour tester si certains formulaires/requetes/recordsets sont toujours ouverts/actifs ?

    Quelle instruction puis-je utiliser pour verifier quel process verrouille ma table ?

  4. #4
    Membre éclairé Avatar de dumas.blr
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2010
    Messages
    598
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2010
    Messages : 598
    Points : 879
    Points
    879
    Par défaut
    Bonjour,

    Mes test m'ont amené à envisager l'hypothèse suivante.

    les opérations suivantes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    DoCmd.OpenQuery ("Upd_MajMensuelle_step2")) 
    DoCmd.OpenQuery ("Upd_MajMensuelle_dateSortie")) 
    DoCmd.Close acForm, "FrmAideMajMensuelle"
    CurrentDb.Execute "DROP TABLE TMP_MAJMensuelle;"
    s'exécutent à partir d'une procédure xxx_click contenue dans le formulaire FrmAideMajMensuelle que je viens de fermer précédemment (cf. code ci dessus)

    Le code VBA doit donc être en mémoire, sinon, l'instruction suivante ne s'exécuterait plus. Mais est-ce que le verrouillage est toujours présent malgrès l'instruction docmd.close acForm ?

    Est-ce qu'un Unload pourrait résoudre le problème ?

  5. #5
    Membre émérite Avatar de Godzestla
    Homme Profil pro
    Chercheur de bonheur
    Inscrit en
    Août 2007
    Messages
    2 392
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de bonheur
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2007
    Messages : 2 392
    Points : 2 985
    Points
    2 985
    Par défaut
    Essaie avec ADO,

    regarde ici

  6. #6
    Membre éclairé Avatar de dumas.blr
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2010
    Messages
    598
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2010
    Messages : 598
    Points : 879
    Points
    879
    Par défaut
    Bonjour,

    Merci pour ton aide, mais la sanction est identique avec ADO : j'ai toujours la même erreur :
    erreur 3211. Le moteur de base de données n'a pas pu verrouiller la table « TMP_MAJMensuelle » car elle est déjà utilisée par une autre personne ou un autre processus.

    Je me et je deviens

  7. #7
    Invité
    Invité(e)
    Par défaut
    Bonjour

    Un petit test, peut-être que lorsque tu lances la destruction de la table un des processus précédent n'est pas été fini.

    Essayes en intercalant l'instruction DoEvents avant ton drop.

    C'est une hypothèse.

    Philippe

  8. #8
    Membre émérite Avatar de Godzestla
    Homme Profil pro
    Chercheur de bonheur
    Inscrit en
    Août 2007
    Messages
    2 392
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de bonheur
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2007
    Messages : 2 392
    Points : 2 985
    Points
    2 985
    Par défaut
    Bonjour,
    a tout hasard, ta DB n'est pas partagée et ouverte ailleurs ?

  9. #9
    Membre éclairé Avatar de dumas.blr
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2010
    Messages
    598
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2010
    Messages : 598
    Points : 879
    Points
    879
    Par défaut
    Bonjour,

    Merci à tous pour votre aide.

    1) nom ma BDD n'est pas partagée, et ce n'est pas non plus une table liée à une autre BDD.

    2) j'avais effectivement essayé le doevents en pensant que ça allait résoudre mon PB. J'ai d'abords fait une boucle à 1000 et j'ai eu le même message au bout d'1 seconde. J'ai monté ma boucle à 10000 et j'ai attendu environ 12 secondes, avant d'obtenir le même message.

    Je persiste donc à penser que le process, tant qu'il est en mémoire (même orphelin, car lié à un formulaire fermé par un docmd.close) verouille la table tant que sa dernière instruction (matérialisée par un end sub/function ou un exit sub/function) n'a pas été exécutée.

    En attendant, je vais essayer de travailler autrement, à savoir vider ma table temporaire après la MAJ, et faire le drop de ma table lors de l'ouverture de mon formulaire en testant si ma table temporaire est vide. Inconvénient : la place ne sera pas libérée dans la base, et le compactage en fermeture risque de ne pas être aussi efficace.

  10. #10
    Membre éprouvé
    Avatar de keita
    Homme Profil pro
    Inscrit en
    Novembre 2002
    Messages
    881
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations forums :
    Inscription : Novembre 2002
    Messages : 881
    Points : 1 121
    Points
    1 121
    Par défaut
    bonjour
    1/fais une sauvegarde de ta bd
    2/ferme tous les formulaires
    3/essaies de supprimer cette table (si recalcitrante) manuellemnt.

    @+

  11. #11
    Membre éclairé Avatar de dumas.blr
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2010
    Messages
    598
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2010
    Messages : 598
    Points : 879
    Points
    879
    Par défaut
    Bonjour Keita,

    Ma table "récalcitante" se ferme très bien manuellement. Seulement, elle ne veut pas se supprimer automatiquement dans le VBA. Il y a donc un process qui la verouille. J'ai plutôt l'impression d'être dans le cas du gars qui scie la branche sur laquelle il est assis ...

  12. #12
    Membre éprouvé
    Avatar de keita
    Homme Profil pro
    Inscrit en
    Novembre 2002
    Messages
    881
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations forums :
    Inscription : Novembre 2002
    Messages : 881
    Points : 1 121
    Points
    1 121
    Par défaut
    hello
    ...le cas du gars qui scie la branche sur laquelle il est assis ...
    Possiblement; mais on aura sa peau.
    et si on essayait par élimination;non? Détruire la table après chacune des requêtes.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    DoCmd.OpenQuery ("Upd_MajMensuelle_step2")) 
    CurrentDb.Execute "DROP TABLE TMP_MAJMensuelle;"
    ' DoCmd.OpenQuery ("Upd_MajMensuelle_dateSortie")) 
    ' DoCmd.Close acForm, "FrmAideMajMensuelle"
    ' CurrentDb.Execute "DROP TABLE TMP_MAJMensuelle;"
    Et apres on fait pareille pour la 1ère.
    Au passage désactive tous les On Error resume.... s'il y en a; sait on jamais.
    Je ne crois pas que FrmAideMajMensuelle intervienne dans cette affaire du moment que TMP_MAJMensuell n'est pas sa source.

    A bientôt

  13. #13
    Membre éclairé Avatar de dumas.blr
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2010
    Messages
    598
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2010
    Messages : 598
    Points : 879
    Points
    879
    Par défaut
    Hello

    Je ne crois pas que FrmAideMajMensuelle intervienne dans cette affaire du moment que TMP_MAJMensuell n'est pas sa source.
    Si, justement !! et les autres requêtes aussi. Je dois donc bien détruire la table à la fin.

  14. #14
    Membre éprouvé
    Avatar de keita
    Homme Profil pro
    Inscrit en
    Novembre 2002
    Messages
    881
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations forums :
    Inscription : Novembre 2002
    Messages : 881
    Points : 1 121
    Points
    1 121
    Par défaut
    Hello
    Ah ok.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    DoCmd.OpenQuery ("Upd_MajMensuelle_step2")) 
    DoCmd.OpenQuery ("Upd_MajMensuelle_dateSortie")) 
    Me.Recordsource = ""   ' On vide la source du form ici.
    CurrentDb.Execute "DROP TABLE TMP_MAJMensuelle;"
    DoCmd.Close
    @+

  15. #15
    Membre éclairé Avatar de dumas.blr
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2010
    Messages
    598
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2010
    Messages : 598
    Points : 879
    Points
    879
    Par défaut
    ... et donc, là, tu me proposes de fermer le formulaire FrmAideMajMensuelle, dont TMP_MAJMensuelle est la source ...

    Là, bien sûr, ça ne marchera surement pas ... (j'ai qd même fait la vérif et testé par acquis de conscience avant de t'écrire)

    @+

  16. #16
    Membre éprouvé
    Avatar de keita
    Homme Profil pro
    Inscrit en
    Novembre 2002
    Messages
    881
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations forums :
    Inscription : Novembre 2002
    Messages : 881
    Points : 1 121
    Points
    1 121
    Par défaut
    Autrement dit tu as le meme msg d'erreur et la table n'est pas supprimée?
    sinon c'est toi meme qui le ferme a la fin de ton traitement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DoCmd.Close acForm, "FrmAideMajMensuelle"
    c'est la meme chose que de faire ça
    @+

  17. #17
    Membre éclairé Avatar de dumas.blr
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2010
    Messages
    598
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2010
    Messages : 598
    Points : 879
    Points
    879
    Par défaut
    tout a fait Th...

    et donc, ce n'est pas le formulaire qui libère la table, mais la procédure qu'il a lui-meme lancée avant de se fermer.

  18. #18
    Membre éprouvé
    Avatar de keita
    Homme Profil pro
    Inscrit en
    Novembre 2002
    Messages
    881
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations forums :
    Inscription : Novembre 2002
    Messages : 881
    Points : 1 121
    Points
    1 121
    Par défaut
    Mes soupsons vont vers une une erreur de conception:
    Est il possible de voir tes (2) requêtes?
    C'est juste pour voir en quoi et comment FrmAideMajMensuelle intervient.
    Utilises-tu des controls sur FrmAideMajMensuelle comme critères des requêtes?
    ou bien c'est juste pour lancer le code de mise à jour?
    si oui, alors ne mets rien du tout dans sa source.
    Utilises-tu un sous form?

    Eclaire ma lanterne, please!

    @+

  19. #19
    Membre éprouvé
    Avatar de keita
    Homme Profil pro
    Inscrit en
    Novembre 2002
    Messages
    881
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations forums :
    Inscription : Novembre 2002
    Messages : 881
    Points : 1 121
    Points
    1 121
    Par défaut
    bonjour
    Les autres questions que je me pose:
    1/Comment crées-tu la table TMP_MAJMensuelle?
    manuellement? par code?
    2/dans les 2 cas, quellles contraintes!!! je ne comprends pas pourquoi vouloir la supprimer à chaque traitement? tu n'en aurais plus besoin?(eventuellement pour d'autres mises à jour?
    si eventuellement tu devrais l'utiliser pour d'autres mises à jour, tu pourrais la vider (supprimer les enreg. seulement) après chaque traitement avec un DoCmd.RunSQL DELETE ..............
    plutot que de la détruire. ceci pourrait peut etre éviter le cycle (infernal) de:
    creation-destruction-creation-destruction .... non?
    3/Bon!?! au cas où tout ceci ne te dirais pas, je te propose de supprimer TMP_MAJMensuelle en sortant de ta bd; non? par exemple sur l'evenement fermeture de ton formulaire MENU GENERAL; tout en esperant que tu fermes tous les autres forms en quittant ta bd.

    bon; peut etre que j'ai rien compris à ton pb. bon week end

    @+

  20. #20
    Rédacteur/Modérateur
    Avatar de argyronet
    Homme Profil pro
    Panseur de bobos en solutions ETL
    Inscrit en
    Mai 2004
    Messages
    5 123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Panseur de bobos en solutions ETL
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 5 123
    Points : 12 172
    Points
    12 172
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    Il y a plusieurs raisons possible...
    Par exemple en mode transactionnel, il est souvent impossible de supprimer une table. Or les requêtes via OpenQuery s'exécutent dans ce mode ce qui laisse entendre dans ton cas que cette table est encore utilisée pour y puiser des données.
    En fait, ce qui ne va pas dans tonc code, c'est que tu mélanges du DoCmd.OpenQuery avec du DB.Execute
    Soit tu fais du vrai VBA DAO soit tu fais du DoCmd mais pas les deux car le DoCmd n'est pas en mesure de te retourner un succès ou un échec dans le cycle de son exécution... Donc à bannir pour ma part.

    Pour vérifier la possibilité physique de la supprimer, lance cette instruction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    Function DeleteThisTable(ByVal TableName As String) As Boolean
        On Error Resume Next
        DoCmd.SelectObject acTable, TableName, True
        If Err = 0 Then
            DoCmd.DeleteObject acTable, TableName
        Else
            MsgBox "Error " & Err.Number & ": " & Err.Description, vbExclamation, Err.Source
        End If
        DeleteThisTable = (Err = 0)
    End Function
    et via CurrentDB :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Function DeleteThisTable(ByVal TableName As String) As Boolean
     
        On Error GoTo DeleteThisTable_Error
        CurrentDb.Execute "DROP TABLE [" & TableName & "];"
        DeleteThisTable = (Err.Number = 0)
        On Error GoTo 0
    DeleteThisTable_Exit:
        Exit Function
     
    DeleteThisTable_Error:
        MsgBox "Error " & Err.Number & ": " & Err.Description, vbExclamation, Err.Source
        Resume DeleteThisTable_Exit
    End Function
    Pour te préciser, l'erreur 2544 sera levée dans ce cas et l'erreur 3376 est levée dans le cas d'un DROP TABLE qui échoue... si non existence de la table...
    Dans ton cas (utilisée par un autre processus), l'erreur 3211 devrait être levée si tu fais un DROP TABLE et 2008 via le DoCmd.

    Argy

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

Discussions similaires

  1. [AC-2010] Impossible de supprimer une table, un formulaire ou une requête
    Par leonnikita dans le forum Access
    Réponses: 4
    Dernier message: 25/03/2014, 18h39
  2. Réponses: 2
    Dernier message: 16/01/2008, 19h13
  3. [ASE] Impossible de supprimer une table de type tempdb..matable
    Par Malau dans le forum Adaptive Server Enterprise
    Réponses: 4
    Dernier message: 21/11/2007, 11h13
  4. ASE 12.5.3 : impossible de supprimer une table
    Par Commandant dans le forum Sybase
    Réponses: 2
    Dernier message: 07/08/2007, 10h26
  5. Impossible de supprimer une table temporaire
    Par benjisan dans le forum Access
    Réponses: 2
    Dernier message: 27/06/2007, 09h43

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