OVH Cloud OVH Cloud

compactage de base par vb

8 réponses
Avatar
Bricoleur
Bonjour

y a-t-il moyen de lancer un compactage de la base par une procédure vb lors
de la sortie de la base ? (sous access97)

j'oubliais !

Si oui, comment ?

Merci

8 réponses

Avatar
Lucien ROYERE
"Bricoleur" a écrit dans le message de
news:bum97k$e8t$
y a-t-il moyen de lancer un compactage de la base par une procédure vb lors
de la sortie de la base ? (sous access97)

Trouvé sur ce forum :
Compacter la base de données sans quitter Access (Avec la version Access 97
seulement)

Ajouter la fonction suivante :
Public Function CompacterBaseDonnées()
' Envoie les touches pour exécuter Outils, Utilitaires de bases de données,
Compacter une base de données.
SendKeys "%OUM"
End Function
Vous pouvez appeler la fonction à partir d'un formulaire ou à partir d'un
menu généré avec le gestionnaire de menu principal.

Je viens d'essayer, ça a l'air de fonctionner depuis une macro Test.
Avatar
Bricoleur
Merci

Ca a l'air de marcher.

J'ai mis la fonction à l'entrée du premier formulaire, en examinant la
valeur d'une variable (NbOuvertures) que j'incrémente à chaque ouverture
et tout est ok. Si la base n'est pas dispo (un autre utilisateur en ligne),
j'ai un msg d'erreur non bloquant.
Donc MERCI

Question pour les pros: çà me parait trop simple. Y a-t-il un risque
quelconque sous une autre version d'Access, ou si les menus sont configurés
autrement. Suis-je sur que la barre de bouton à laquelle je fais référence
sera toujours disponible, quelquesoit la configuration locale du poste ?


"Lucien ROYERE" a écrit dans le message de
news:
"Bricoleur" a écrit dans le message de
news:bum97k$e8t$
y a-t-il moyen de lancer un compactage de la base par une procédure vb
lors

de la sortie de la base ? (sous access97)

Trouvé sur ce forum :
Compacter la base de données sans quitter Access (Avec la version Access
97

seulement)

Ajouter la fonction suivante :
Public Function CompacterBaseDonnées()
' Envoie les touches pour exécuter Outils, Utilitaires de bases de
données,

Compacter une base de données.
SendKeys "%OUM"
End Function
Vous pouvez appeler la fonction à partir d'un formulaire ou à partir d'un
menu généré avec le gestionnaire de menu principal.

Je viens d'essayer, ça a l'air de fonctionner depuis une macro Test.




Avatar
Raymond [mvp]
Bonsoir.

Quand on lance un sendkeys c'est pour simuler des frappes de clavier. Donc
cette simulation ne peut être réalisée qu'à l'intérieur d'un module ou d'un
formulaire. simuler le clavier par la fonction envoitouches d'une macro
nécessite l'exécution de cette macro à partir du code vba, sinon elle est
d'une inutilité remarquable. Utiliser le clavier pour exécuter une macro qui
va simuler le clavier ne peut pas entrer dans une logique access. Donc il
faut reconnaître que le compactage de la base par l'envoi de touches
necessite l'utilisation du code vba. Il est bien connu également que le
compactage ne peut pas avoir lieu si du code vb est en exécution. si le
compactage est lancé par un sendkeys à partir d'un module ou d'un
formulaire, il y aura obligatoirement du code en exécution, ce qui va
provoquer une erreur access.(timer proscrit). Si on enlève la macro qui ne
sert à rien car elle nécessite l'utilisation du clavier et si on enlève la
possibilité par le code , il ne doit pas rester grand chose à explorer.
Il reste toutefois, une procédure complexe (que je n'ai jamais homologuée)
qui fonctionnerait mais qui reste sensible dans son utilisation; je peux
fournir le source aux demandeurs.
C'était une simple remarque de ma part.
--
@+
Raymond Access MVP
http://access.seneque.free.fr/
http://access2003.free.fr/
http://users.skynet.be/mpfa/ pour débuter sur le forum


"Bricoleur" a écrit dans le message de
news:bumiu3$l75$
Merci

Ca a l'air de marcher.

J'ai mis la fonction à l'entrée du premier formulaire, en examinant la
valeur d'une variable (NbOuvertures) que j'incrémente à chaque ouverture
et tout est ok. Si la base n'est pas dispo (un autre utilisateur en
ligne),

j'ai un msg d'erreur non bloquant.
Donc MERCI

Question pour les pros: çà me parait trop simple. Y a-t-il un risque
quelconque sous une autre version d'Access, ou si les menus sont
configurés

autrement. Suis-je sur que la barre de bouton à laquelle je fais
référence

sera toujours disponible, quelquesoit la configuration locale du poste ?



Avatar
Bricoleur
Bonsoir

J'ai mis ce qui suit dans mon code et ça marche (en mdb, je n'ai pas testé
le mde)

Private Sub Form_Open(Cancel As Integer)
Req = "UPDATE param SET param.NbOuvertures = [nbouvertures]+1;"
Lance Req ' fonction qui exécute la requète Req
VarNbOuvertures = DLookup("NbOuvertures", "Param")

' teste si besoin de compacter
If VarNbOuvertures > 20 Then
Req = "UPDATE param SET param.NbOuvertures = 0;"
Lance Req
SendKeys "%m" ' j'ai une barre de boutons personalisés avec un
bouton Co%mpacter
End If
end sub

Alors où est le problème ?

"Raymond [mvp]" a écrit dans le message de
news:
Bonsoir.

Quand on lance un sendkeys c'est pour simuler des frappes de clavier. Donc
cette simulation ne peut être réalisée qu'à l'intérieur d'un module ou
d'un

formulaire. simuler le clavier par la fonction envoitouches d'une macro
nécessite l'exécution de cette macro à partir du code vba, sinon elle est
d'une inutilité remarquable. Utiliser le clavier pour exécuter une macro
qui

va simuler le clavier ne peut pas entrer dans une logique access. Donc il
faut reconnaître que le compactage de la base par l'envoi de touches
necessite l'utilisation du code vba. Il est bien connu également que le
compactage ne peut pas avoir lieu si du code vb est en exécution. si le
compactage est lancé par un sendkeys à partir d'un module ou d'un
formulaire, il y aura obligatoirement du code en exécution, ce qui va
provoquer une erreur access.(timer proscrit). Si on enlève la macro qui ne
sert à rien car elle nécessite l'utilisation du clavier et si on enlève la
possibilité par le code , il ne doit pas rester grand chose à explorer.
Il reste toutefois, une procédure complexe (que je n'ai jamais homologuée)
qui fonctionnerait mais qui reste sensible dans son utilisation; je peux
fournir le source aux demandeurs.
C'était une simple remarque de ma part.
--
@+
Raymond Access MVP
http://access.seneque.free.fr/
http://access2003.free.fr/
http://users.skynet.be/mpfa/ pour débuter sur le forum


"Bricoleur" a écrit dans le message de
news:bumiu3$l75$
Merci

Ca a l'air de marcher.

J'ai mis la fonction à l'entrée du premier formulaire, en examinant la
valeur d'une variable (NbOuvertures) que j'incrémente à chaque ouverture
et tout est ok. Si la base n'est pas dispo (un autre utilisateur en
ligne),

j'ai un msg d'erreur non bloquant.
Donc MERCI

Question pour les pros: çà me parait trop simple. Y a-t-il un risque
quelconque sous une autre version d'Access, ou si les menus sont
configurés

autrement. Suis-je sur que la barre de bouton à laquelle je fais
référence

sera toujours disponible, quelquesoit la configuration locale du poste ?







Avatar
Raymond [mvp]
le problème est que tu as encore du code en exécution derrière le sendkeys
quand tu exécutes le compactage et que dans certains cas le compactage ne
sera pas fait. je ne dis pas que ça ne marche pas mais il y a le risque que
ça ne fonctionne pas un jour. si tu as un objet mal fermé par exemple ou un
simple timer . si ça marche sous ton système il n'y a pas de problème. mais
avant de lancer ton compactage il faut arrêter tous les objets en cours.
il te reste à résoudre les multi-utilisateurs et dans ce cas tu auras du
code en exécution.
il te faudra tester aussi sous runtime.
le tout mélangé sera quand même plus lourd que quelques lignes.
si tu arrives à tout résoudre et pour tous les niveaux access, tu seras
d'accord, je pense, pour en faire profiter les contributeurs de ce groupe.
nous t'en remercions par avance.
--
@+
Raymond Access MVP
http://access.seneque.free.fr/
http://access2003.free.fr/
http://users.skynet.be/mpfa/ pour débuter sur le forum


"Bricoleur" a écrit dans le message de
news:bummub$ue4$
Bonsoir

J'ai mis ce qui suit dans mon code et ça marche (en mdb, je n'ai pas testé
le mde)

Private Sub Form_Open(Cancel As Integer)
Req = "UPDATE param SET param.NbOuvertures = [nbouvertures]+1;"
Lance Req ' fonction qui exécute la requète Req
VarNbOuvertures = DLookup("NbOuvertures", "Param")

' teste si besoin de compacter
If VarNbOuvertures > 20 Then
Req = "UPDATE param SET param.NbOuvertures = 0;"
Lance Req
SendKeys "%m" ' j'ai une barre de boutons personalisés avec un
bouton Co%mpacter
End If
end sub

Alors où est le problème ?



Avatar
Bricoleur
Si il n'y a qu'un utilisateur, pas de pb car mon formulaire est celui qui
est ouvert en premier. et il n'y a rien d'autre d'actif.

Si il y a plusieurs utilisateurs, cela ne marche pas, mais ne semble pas
bloquant. Il suffirait d'ailleurs que je sache combien d'utilisateurs sont
connectés (je ne sais pas faire) et ne pas lancer la procédure si il y en a
d'autres. Dans ce cas le premier qui se connecterais seul (ce qui arrivera
nécessairement) lancerait alors le compactage.

Par contre, je ne sais pas ce qui se passe sous d'autres versions en
particulier runtime.

Bricoleur

"Raymond [mvp]" a écrit dans le message de
news:
le problème est que tu as encore du code en exécution derrière le sendkeys
quand tu exécutes le compactage et que dans certains cas le compactage ne
sera pas fait. je ne dis pas que ça ne marche pas mais il y a le risque
que

ça ne fonctionne pas un jour. si tu as un objet mal fermé par exemple ou
un

simple timer . si ça marche sous ton système il n'y a pas de problème.
mais

avant de lancer ton compactage il faut arrêter tous les objets en cours.
il te reste à résoudre les multi-utilisateurs et dans ce cas tu auras du
code en exécution.
il te faudra tester aussi sous runtime.
le tout mélangé sera quand même plus lourd que quelques lignes.
si tu arrives à tout résoudre et pour tous les niveaux access, tu seras
d'accord, je pense, pour en faire profiter les contributeurs de ce groupe.
nous t'en remercions par avance.
--
@+
Raymond Access MVP
http://access.seneque.free.fr/
http://access2003.free.fr/
http://users.skynet.be/mpfa/ pour débuter sur le forum



Avatar
Raymond [mvp]
Pour connaître les utilisateurs, voir la page:
http://access.seneque.free.fr/utilisateurs_en_cours.htm
et aussi la fonction donné par Michel:

Option Compare Database
Option Explicit

Public Sub ShowUserRosterMultipleUsers()
'KB Q285822


Dim rs As New ADODB.Recordset


Set rs = CurrentProject.Connection.OpenSchema(adSchemaProviderSpecific,
_
, "{947bb102-5d43-11d1-bdbf-00c04fb92675}")
Debug.Print rs.Fields(0).Name, "", rs.Fields(1).Name, "",
rs.Fields(2).Name, rs.Fields(3).Name

Do Until rs.EOF
Debug.Print rs.Fields(0), rs.Fields(1), rs.Fields(2), rs.Fields(3)
rs.MoveNext
Loop
End Sub


--
@+
Raymond Access MVP
http://access.seneque.free.fr/
http://access2003.free.fr/
http://users.skynet.be/mpfa/ pour débuter sur le forum


"Bricoleur" a écrit dans le message de
news:bumreb$jfl$
Si il n'y a qu'un utilisateur, pas de pb car mon formulaire est celui qui
est ouvert en premier. et il n'y a rien d'autre d'actif.

Si il y a plusieurs utilisateurs, cela ne marche pas, mais ne semble pas
bloquant. Il suffirait d'ailleurs que je sache combien d'utilisateurs sont
connectés (je ne sais pas faire) et ne pas lancer la procédure si il y en
a

d'autres. Dans ce cas le premier qui se connecterais seul (ce qui arrivera
nécessairement) lancerait alors le compactage.

Par contre, je ne sais pas ce qui se passe sous d'autres versions en
particulier runtime.

Bricoleur



Avatar
Driss HANIB
Bonjour dans VB et DAO il existe une function spécifique pour compacter ta
base de données Access, APRES FERMETURE.
Tu peux regarder la fonction DBEngine.CompactDatabase ancienNomBD,
NouveauNom

Driss

"Bricoleur" a écrit dans le message de
news:bum97k$e8t$
Bonjour

y a-t-il moyen de lancer un compactage de la base par une procédure vb
lors

de la sortie de la base ? (sous access97)

j'oubliais !

Si oui, comment ?

Merci