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 :

Attendre la fin de la commande "compacter la base de données"


Sujet :

VBA Access

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    175
    Détails du profil
    Informations personnelles :
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 175
    Points : 129
    Points
    129
    Par défaut Attendre la fin de la commande "compacter la base de données"
    Bonjour,
    ne disposant pas de l'option "compacter à la fermeture" dans Access 97, je suis en train de concocter une fonction pour le faire.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Function Compacter_bdd()
    Dim Db, tempDb As String
    Db = "\\Serveur\appli appro\bdd.v2.0.mdb"
    tempDb = (Left(Db, (Len(Db) - 4)) & "temp.mdb")
     
    Name Db As tempDb
     
    DBEngine.CompactDatabase tempDb, Db
    Kill tempDb
     
    MsgBox "Base de donnée compactée avec succès !"
     
    End Function
    Le souci c'est qu'il faut attendre la fin du compactage avant de "killer" le fichier tempDb.
    Je pourrais me contenter de rajouter un truc du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    For i = 1 To 10000000
    Next
    mais le risque c'est de surdimensionner le délai d'attente car la durée du compactage peut être parfois assez longue...

    Quelqu'un pourrait-il donc m'indiquer comment insérer une boucle d'attente qui capterait la fin de l'exécution du compactage ?

  2. #2
    Expert éminent sénior
    Avatar de Domi2
    Homme Profil pro
    Gestionnaire
    Inscrit en
    Juin 2006
    Messages
    7 194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : Suisse

    Informations professionnelles :
    Activité : Gestionnaire
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 194
    Points : 16 044
    Points
    16 044
    Par défaut
    Bonjour,

    Tu as essayé de placer un

    Avant l'instruction Kill ?

    Domi2

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    175
    Détails du profil
    Informations personnelles :
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 175
    Points : 129
    Points
    129
    Par défaut
    Citation Envoyé par dut-dut
    Parfait, ça résout bien mon problème. Je n'avais effectivement pas pensé à cette solution.
    Merci Domi2 !


    Au cas où certains aient une autre réponse à fournir sur le sujet, je laisse le post ouvert jusqu'à ce soir...
    Je rectifie : lorsque la bdd est trop importante celà ne fonctionne pas. Je retrouve le message d'erreur "Fichier introuvable" lorsque VBA tente d'exécuter la commande kill.

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    175
    Détails du profil
    Informations personnelles :
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 175
    Points : 129
    Points
    129
    Par défaut
    (au cas où ça aide certains à comprendre le problème qui se pose)

    En fait la commande "kill" n'avait pas fonctionné la première fois. Par contre la base de données avait bien été compactée.

    Du coup quand j'ai relancé la macro complète après avoir supprimé manuellement le fichier tempDb, ça a bien marché.
    (je suppose que c'est parce que le délai de compactage a été bien plus court cette fois là)

    Cependant quand j'ai réessayé d'appliquer la macro à la base de départ non-compactée, ça a de nouveau planté.

  5. #5
    Expert éminent sénior
    Avatar de Domi2
    Homme Profil pro
    Gestionnaire
    Inscrit en
    Juin 2006
    Messages
    7 194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : Suisse

    Informations professionnelles :
    Activité : Gestionnaire
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 194
    Points : 16 044
    Points
    16 044
    Par défaut
    Bonjour,

    Regarde du côté de la fonction Dir... voir dans la FAQ.

    Tu boucles, si le fichier existe tu exécutes ta commande et tu sors, sinon, tu continues à boucler.

    Je ne vois pas mieux...

    Domi2

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    175
    Détails du profil
    Informations personnelles :
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 175
    Points : 129
    Points
    129
    Par défaut
    J'ai modifié mon code pour essayer cette solution.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    ...
    DBEngine.CompactDatabase tempDb, Db
    
    Do
    DoEvents
    Loop Until Dir(tempDb, vbHidden) <> ""
        
    MsgBox "sorti de la boucle"
        
    Kill tempDb
    ...
    Finalement, le problème vient de la commande "kill" car le msgbox s'affiche bien mais ensuite j'ai toujours l'erreur "Fichier introuvable". Et après investigations, je me rends compte que même si j'essaie d'exécuter la commande "kill" longtemps après le compactage, ça ne fonctionne pas alors que le fichier existe bien...


    Quelqu'un a-t-il une idée ???
    Je ne m'explique pas pourquoi ça fonctionne quand je retente le coup avec une base déjà compactée...

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    175
    Détails du profil
    Informations personnelles :
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 175
    Points : 129
    Points
    129
    Par défaut
    ça y est !!


    en fait tout va bien dans mon code sauf que le fichier initial Db = "\\Serveur\appli appro\bdd.v2.0.mdb" est un fichier caché... C'est pourquoi la commande Kill ne fonctionnait pas.

    Le nouveau fichier Db obtenu après un premier compactage, lui, n'avait pas la propriété "Fichier caché", du coup lorsque je relançais la macro la fois suivante tout fonctionnait très bien.

    Bref au final je n'ai plus qu'à me débarrasser de cette propriété en début de macro pour arriver à mes fins.



    Rem : ce qui est bizarre c'est que les commandes CompactDatabase ou Dir() n'ont pas "bronché" sur le fait que le fichier était caché...

  8. #8
    Expert éminent sénior
    Avatar de Domi2
    Homme Profil pro
    Gestionnaire
    Inscrit en
    Juin 2006
    Messages
    7 194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : Suisse

    Informations professionnelles :
    Activité : Gestionnaire
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 194
    Points : 16 044
    Points
    16 044
    Par défaut
    Re,

    Ben pour la fonction Dir, vbHidden permet justement d'en tenir compte... Donc, pas "".

    Domi2

  9. #9
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    175
    Détails du profil
    Informations personnelles :
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 175
    Points : 129
    Points
    129
    Par défaut
    Au final pour ceux que ça intéresse, voici le code obtenu :
    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
    Function Compacter_bdd()
    On Error GoTo Compacter_bdd_Err
    Dim Db, tempDb As String
    Db = "\\Td02srvvds1\TURBOMECA\DSO\DSO-Ressources\Activites\DSO-RN\appli appro\Copie de ApproVision.v2.0_bdd.mdb"
    tempDb = (Left(Db, (Len(Db) - 4)) & "temp.mdb")
     
    Dim AttributOriginal, ObjFSO, objFile
    Set ObjFSO = CreateObject("Scripting.FileSystemObject")
    Set objFile = ObjFSO.GetFile(Db)
    AttributOriginal = objFile.Attributes 'mémoriser l'attribut actuel (sans doute 34 si fichier caché)
    objFile.Attributes = 32 '= visible
     
    Name Db As tempDb
     
        DBEngine.CompactDatabase tempDb, Db
        DoEvents
        Kill tempDb
     
        objFile.Attributes = AttributOriginal 'rétablir en l'état original
     
     
        MsgBox "Base de donnée compactée avec succès !", vbInformation, "Compactage de la base de donnée"
     
    Compacter_bdd_Exit:
        Exit Function
     
    Compacter_bdd_Err:
        MsgBox Error$
        Resume Compacter_bdd_Exit
     
    End Function
    A+

  10. #10
    Membre habitué
    Homme Profil pro
    Inscrit en
    Août 2007
    Messages
    184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2007
    Messages : 184
    Points : 188
    Points
    188
    Par défaut
    Bonjour à tous,
    J'ai testé (en Access87 of course)

    Si je comprend bien l'usage, avant ton code
    1°) tu fais une copie de ta base d'origine

    2°) tu executes ton code (celui transmis)

    3°) tu renommes la copie vers la base d'origine



    Ton objectif est il de compacter ta dorsale, ou une autre base de données ?

    Pour ma part, je travaille plutôt par fichier .bat qui lance le compactage de la base lors de la sortie de l'application ; en effet, moi je n'arrive pas à compacter la base dorsale depuis la frontale.

    amicalement,
    fevec

  11. #11
    Expert éminent sénior
    Avatar de Domi2
    Homme Profil pro
    Gestionnaire
    Inscrit en
    Juin 2006
    Messages
    7 194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : Suisse

    Informations professionnelles :
    Activité : Gestionnaire
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 194
    Points : 16 044
    Points
    16 044
    Par défaut
    Bonjour,

    moi je n'arrive pas à compacter la base dorsale depuis la frontale
    Tu ne précises pas pourquoi...

    Mais attention qu'il faut que personne ne soit connecté à la dorsale pour faire ton compactage...

    Domi2

  12. #12
    Membre habitué
    Homme Profil pro
    Inscrit en
    Août 2007
    Messages
    184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2007
    Messages : 184
    Points : 188
    Points
    188
    Par défaut
    Justement, je ne le fais pas car l'utilisateur est connecté à la frontale qui a des tables liées vers la dorsale que je veux compacter, d'ou le recours à des un fichier de commande .bat que je génére en VBA, qui s'éxécute à la sortie de l'application (si l'utilisateur choisit ce "mode de sortie")

    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
     
    Function QuitterCompactage() ' 09/08/07   Quitte en compactant et réparant les data
    ' 20/ 08/07 - génération du bat si besoin et paramètrage du chemin complet
    Dim fs As FileSystemObject
    Dim F As TextStream
     
    Dim Commentaire As String, Destination As String, Base As String, Repertoire As String
    Call LecParam("NomData", Null, Null, Commentaire)
    Base = Commentaire ' nom de la base de données ex : datafev.mdb
    ' Commentaire   ' nom de la base de données contenant les data   ex : datafev.mdb)
    Destination = Left(Commentaire, Len(Commentaire) - 4) ' nom de la base de données sans l'extension
    Call LecParam("Repertoire", Null, Null, Commentaire)
    Repertoire = Nz(Commentaire, "c:\base97\")
     
     
     
       ' 20/08/07
       ' vérification si le fichier c:\base97\system\COMPACTnomdelabase.bat existe
       ' sinon génération du fichier
    If Dir(Repertoire & "system\COMPACT" & Destination & ".bat", vbHidden) <> "" Then
        'le fichier existe (vbHidden permet de le retrouver même s'il est caché)
    Else
    ' création du fichier de commande
        Set fs = CreateObject("Scripting.FileSystemObject")
        Set F = fs.opentextfile(Repertoire & "system\COMPACT" & Destination & ".bat", 2, True)
        F.write "Rem Lance lle compactage des données "
        F.WriteLine
        F.write "Rem FEVEC"
        F.WriteLine
        F.write "Rem 10/08/07 - génération depuis le code au 20/08/07 "
     '   F.WriteLine
     '   F.write "pause"
        F.WriteLine
        Dim SGBD As String
        SGBD = SysCmd(acSysCmdAccessDir) & "MSAccess.exe"  '20/08/07 ' nom et chemin d'access
        F.write Chr(34) & SGBD & Chr(34) & " " & Chr(34) & Repertoire & Base & Chr(34) & " /compact"
        F.WriteLine
        F.write Chr(34) & SGBD & Chr(34) & " " & Chr(34) & Repertoire & Base & Chr(34) & " /REPAIR"
        F.WriteLine
        F.write "Exit"
        F.Close
    End If
     
    '' lancement du bat de compression
    Dim Retval, Commande
    Commande = Repertoire & "system\COMPACT" & Destination & ".bat"
    Retval = Shell(Commande, 0) '  - 0 => fenêtre cachée
     
    ' quitter
    Application.Quit
    End Function
    attention dans ce code, j'appelle 2 fois une fonction Lecparam, vous devez mettre vos paramètres à la place (repertoire, nom de la base de données)


    Mais il y a certainement d'autres solutions et je suis partant pour échanger

    bonne journée à tous...

    Fevec

  13. #13
    Expert éminent sénior
    Avatar de Domi2
    Homme Profil pro
    Gestionnaire
    Inscrit en
    Juin 2006
    Messages
    7 194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : Suisse

    Informations professionnelles :
    Activité : Gestionnaire
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 194
    Points : 16 044
    Points
    16 044
    Par défaut
    Re,

    Justement, je ne le fais pas car l'utilisateur est connecté à la frontale qui a des tables liées vers la dorsale que je veux compacter, d'ou le recours à des un fichier de commande .bat que je génére en VBA, qui s'éxécute à la sortie de l'application (si l'utilisateur choisit ce "mode de sortie")
    Et le jour ou tu as deux utilisateur, dont un qui est encore connecté, que va-t-il se passer ?

    Domi2

  14. #14
    Membre habitué
    Homme Profil pro
    Inscrit en
    Août 2007
    Messages
    184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2007
    Messages : 184
    Points : 188
    Points
    188
    Par défaut FACON DE COMPACTER SOUS ACCESS 97
    en général, j'ai peu d'utilisateurs connectés en même temps (1, 2).
    c'est l'utilisateur "responsable" de la BD qui fait le choix de quitter en compactant (de temps en temps) (l'application tourne dans des TPE, 3-4 personnes)

    Je sais, je devrais tester les connectés avant de lancer cela...
    (je vais m'y mettre !)

    alors, et vous comment compacter vous sous Access97 ?

    moi : par fichier .bat à la sortie


    Fevec

  15. #15
    Expert éminent sénior
    Avatar de Domi2
    Homme Profil pro
    Gestionnaire
    Inscrit en
    Juin 2006
    Messages
    7 194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : Suisse

    Informations professionnelles :
    Activité : Gestionnaire
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 194
    Points : 16 044
    Points
    16 044
    Par défaut
    Bonjour,

    Bon, en principe, pas très compliqué...

    Si tu veux faire compliqué, tu regardes le nombre de connectés dans le .ldb.

    Il y'a quantité de discussions la-dessus dans le forum...

    Moi, je fais trivial... Un formulaire de ma base est totalement indépendant, donc je n'ai plus de connection à la dorsale...

    Et je teste si le .ldb existe... Si la réponse est non, je compacte...

    Domi2

  16. #16
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    175
    Détails du profil
    Informations personnelles :
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 175
    Points : 129
    Points
    129
    Par défaut
    Citation Envoyé par fevec Voir le message
    Bonjour à tous,
    J'ai testé (en Access87 of course)

    Si je comprend bien l'usage, avant ton code
    1°) tu fais une copie de ta base d'origine

    2°) tu executes ton code (celui transmis)

    3°) tu renommes la copie vers la base d'origine



    Ton objectif est il de compacter ta dorsale, ou une autre base de données ?

    Pour ma part, je travaille plutôt par fichier .bat qui lance le compactage de la base lors de la sortie de l'application ; en effet, moi je n'arrive pas à compacter la base dorsale depuis la frontale.

    amicalement,
    fevec
    Salut,
    je ne fais pas vraiment de copie de ma dorsale. C'est l'opération de compactage qui en fait obligatoirement une. En fait le code ci-dessus exécute les opérations suivantes :
    1- renommer la base de données en bdd_temp
    2- compacter la base de données (équivaut à une copie de bdd_temp en bdd)
    3- supprimer la base de données bdd_temp

    Le reste c'est un simple test pour éviter le problème lié à la propriété "fichier caché" de ma dorsale.

    Derrière j'ai également rajouté un test pour vérifier la présence d'autres utilisateurs connectés (voir FAQ) et c'est nickel.

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

Discussions similaires

  1. [Débutant] Attendre la fin d'une commande lançant un .bat
    Par ludo40190 dans le forum VB.NET
    Réponses: 2
    Dernier message: 07/02/2012, 18h11
  2. Attendre la fin d'une commande WMI pour continuer
    Par ovcrash dans le forum VBScript
    Réponses: 1
    Dernier message: 11/02/2010, 07h06
  3. [Émulateur de terminal VTE] attendre la fin de la commande
    Par Skami 18 dans le forum Bibliothèques tierces
    Réponses: 0
    Dernier message: 03/10/2009, 18h14
  4. compacter une base de donnée
    Par tpdm dans le forum Access
    Réponses: 1
    Dernier message: 14/10/2005, 11h30
  5. Compacter une base de donnée
    Par Floyd dans le forum Access
    Réponses: 4
    Dernier message: 13/10/2005, 16h05

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