Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Fichier LDB et compactage

2 réponses
Avatar
Michel Boivin
Access 2003
Situation
Comme il est de pratique courante, j’ai une application qui utilise deux
bases .MDB, une de devant (front end) qui contient les traitements et une
autre (back end) qui contient les données spécifiques de l’utilisateur. Pour
la clarté de ce texte, je nommerai mes bases Frontend.mdb et Backend.mdb.

J’essai de compacter la base Backend.mdb par programmation à partir de ma
base Frontend.mdb.

Problème
Lors de l’exécution de la commande «DBEngine.CompactDatabase olddb, newdb»,
olddb: chemin et nom de Backend.mdb
newdb: nouveau nom pour la base compactée
j’obtiens le message d’erreur suivant :
«Vous avez essayé d’ouvrir une base de données déjà ouverte en mode exclusif
par l’utilisateur ‘Admin’ sur la machine ‘MICHEL-TECRA-A4’. Recommencez
lorsque la base de données sera disponible.»

Dans mes investigations, afin de tenter de connaître les bases ouvertes
juste avant la commande de compaction je demande l’énumération de la
collection Databases:

Dim wrkJet As Workspace
Dim dbsLoop As Database
Set wrkJet = Workspaces(0)
For Each dbsLoop In wrkJet.Databases
With dbsLoop
Debug.Print "Base ouverte -> " & .Name
End With
Next dbsLoop

Ce jeu d’instructions m’indique qu’une seule base est ouverte, ma base des
traitements (front end), ce qui semble conforme à mes attentes. Pourtant, le
fichier Backend.ldb est toujours présent, causant ainsi le message d’erreur.
Le jeu d’instructions répond bien puisque si je l’insère dans le code à un
endroit où je sais que Backend.mdb est ouverte, elle apparait bien dans la
collection. Donc, si avant l'appel de la compaction, Backend.mdb était
ouverte, ce jeu d'instructions me l'indiquerait.

À la suite d’un affichage précédent et de recherches dans ce groupe, j’ai
essayé bien d’autres choses, sans succès :
. fermer la requête sur laquelle est basé mon formulaire ouvert au moment où
la commande de compaction est exécutée;
. détacher de ma base de traitements (front end) toutes les tables liées à
la base des données (back end) avant la compaction;
. la commande «kill backend.ldb» produit l’erreur anticipée: «Accès refusé»

Tous ces travaux sont rendus nécessaires malgré le fait que le paramètre
«Outils/Général/Compacter lors de la fermeture» de Backend.mdb est bien coché
mais ne produit pas ses effets.

J’aimerais bien comprendre où dans Access, se situe le contrôle du fichier
.LDB. Je m’attendrais que si la collection Databases ne contient pas une
base en particulier (Backend.mdb), le fichier .ldb correspondant
(Backend.ldb) soit aussi détruit.

J’ai vraiment besoin de résoudre ce problème qui me hante périodiquement
depuis plusieurs mois. J’apprécierais vos conseils dans ma démarche en vue
d’identifier la cause de ce problème.

2 réponses

Avatar
David PONDA
Bjr Mike,
en fait ce que tu oublie est que ta base FrontEnd ouvre la base Backend par
liaison dynamique, etant donne que tu peux y acceder dans tes requetes et
tes formulaires, donc en fait il est uvert en mode exclusif grace a
FrontEnd... moi je te proposerais pour parrer ce dilemme d'utiliser le
systeme d'autocompactage d'access dans le Menu Outils/Options... ou alors
executer une macros autoexec a l'ouverture de chacune des bases...
@+

"Michel Boivin" a écrit dans le
message de news:
Access 2003
Situation
Comme il est de pratique courante, j'ai une application qui utilise deux
bases .MDB, une de devant (front end) qui contient les traitements et une
autre (back end) qui contient les données spécifiques de l'utilisateur.
Pour
la clarté de ce texte, je nommerai mes bases Frontend.mdb et Backend.mdb.

J'essai de compacter la base Backend.mdb par programmation à partir de ma
base Frontend.mdb.

Problème
Lors de l'exécution de la commande «DBEngine.CompactDatabase olddb,
newdb»,
olddb: chemin et nom de Backend.mdb
newdb: nouveau nom pour la base compactée
j'obtiens le message d'erreur suivant :
«Vous avez essayé d'ouvrir une base de données déjà ouverte en mode
exclusif
par l'utilisateur 'Admin' sur la machine 'MICHEL-TECRA-A4'. Recommencez
lorsque la base de données sera disponible.»

Dans mes investigations, afin de tenter de connaître les bases ouvertes
juste avant la commande de compaction je demande l'énumération de la
collection Databases:

Dim wrkJet As Workspace
Dim dbsLoop As Database
Set wrkJet = Workspaces(0)
For Each dbsLoop In wrkJet.Databases
With dbsLoop
Debug.Print "Base ouverte -> " & .Name
End With
Next dbsLoop

Ce jeu d'instructions m'indique qu'une seule base est ouverte, ma base des
traitements (front end), ce qui semble conforme à mes attentes. Pourtant,
le
fichier Backend.ldb est toujours présent, causant ainsi le message d'erreur.
Le jeu d'instructions répond bien puisque si je l'insère dans le code à un
endroit où je sais que Backend.mdb est ouverte, elle apparait bien dans la
collection. Donc, si avant l'appel de la compaction, Backend.mdb était
ouverte, ce jeu d'instructions me l'indiquerait.

À la suite d'un affichage précédent et de recherches dans ce groupe, j'ai
essayé bien d'autres choses, sans succès :
. fermer la requête sur laquelle est basé mon formulaire ouvert au moment

la commande de compaction est exécutée;
. détacher de ma base de traitements (front end) toutes les tables liées à
la base des données (back end) avant la compaction;
. la commande «kill backend.ldb» produit l'erreur anticipée: «Accès
refusé»

Tous ces travaux sont rendus nécessaires malgré le fait que le paramètre
«Outils/Général/Compacter lors de la fermeture» de Backend.mdb est bien
coché
mais ne produit pas ses effets.

J'aimerais bien comprendre où dans Access, se situe le contrôle du fichier
.LDB. Je m'attendrais que si la collection Databases ne contient pas une
base en particulier (Backend.mdb), le fichier .ldb correspondant
(Backend.ldb) soit aussi détruit.

J'ai vraiment besoin de résoudre ce problème qui me hante périodiquement
depuis plusieurs mois. J'apprécierais vos conseils dans ma démarche en
vue
d'identifier la cause de ce problème.



Avatar
Michel Boivin
Merci David, je vais regarder ça et continuer mes essais. Si je réussis, je
vais sûrement afficher ma solution ici. D'ici là, je continue à chercher.


Bjr Mike,
en fait ce que tu oublie est que ta base FrontEnd ouvre la base Backend par
liaison dynamique, etant donne que tu peux y acceder dans tes requetes et
tes formulaires, donc en fait il est uvert en mode exclusif grace a
FrontEnd... moi je te proposerais pour parrer ce dilemme d'utiliser le
systeme d'autocompactage d'access dans le Menu Outils/Options... ou alors
executer une macros autoexec a l'ouverture de chacune des bases...
@+

"Michel Boivin" a écrit dans le
message de news:
Access 2003
Situation
Comme il est de pratique courante, j'ai une application qui utilise deux
bases .MDB, une de devant (front end) qui contient les traitements et une
autre (back end) qui contient les données spécifiques de l'utilisateur.
Pour
la clarté de ce texte, je nommerai mes bases Frontend.mdb et Backend.mdb.

J'essai de compacter la base Backend.mdb par programmation à partir de ma
base Frontend.mdb.

Problème
Lors de l'exécution de la commande «DBEngine.CompactDatabase olddb,
newdb»,
olddb: chemin et nom de Backend.mdb
newdb: nouveau nom pour la base compactée
j'obtiens le message d'erreur suivant :
«Vous avez essayé d'ouvrir une base de données déjà ouverte en mode
exclusif
par l'utilisateur 'Admin' sur la machine 'MICHEL-TECRA-A4'. Recommencez
lorsque la base de données sera disponible.»

Dans mes investigations, afin de tenter de connaître les bases ouvertes
juste avant la commande de compaction je demande l'énumération de la
collection Databases:

Dim wrkJet As Workspace
Dim dbsLoop As Database
Set wrkJet = Workspaces(0)
For Each dbsLoop In wrkJet.Databases
With dbsLoop
Debug.Print "Base ouverte -> " & .Name
End With
Next dbsLoop

Ce jeu d'instructions m'indique qu'une seule base est ouverte, ma base des
traitements (front end), ce qui semble conforme à mes attentes. Pourtant,
le
fichier Backend.ldb est toujours présent, causant ainsi le message d'erreur.
Le jeu d'instructions répond bien puisque si je l'insère dans le code à un
endroit où je sais que Backend.mdb est ouverte, elle apparait bien dans la
collection. Donc, si avant l'appel de la compaction, Backend.mdb était
ouverte, ce jeu d'instructions me l'indiquerait.

À la suite d'un affichage précédent et de recherches dans ce groupe, j'ai
essayé bien d'autres choses, sans succès :
. fermer la requête sur laquelle est basé mon formulaire ouvert au moment

la commande de compaction est exécutée;
. détacher de ma base de traitements (front end) toutes les tables liées à
la base des données (back end) avant la compaction;
. la commande «kill backend.ldb» produit l'erreur anticipée: «Accès
refusé»

Tous ces travaux sont rendus nécessaires malgré le fait que le paramètre
«Outils/Général/Compacter lors de la fermeture» de Backend.mdb est bien
coché
mais ne produit pas ses effets.

J'aimerais bien comprendre où dans Access, se situe le contrôle du fichier
.LDB. Je m'attendrais que si la collection Databases ne contient pas une
base en particulier (Backend.mdb), le fichier .ldb correspondant
(Backend.ldb) soit aussi détruit.

J'ai vraiment besoin de résoudre ce problème qui me hante périodiquement
depuis plusieurs mois. J'apprécierais vos conseils dans ma démarche en
vue
d'identifier la cause de ce problème.