Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Access > VBA Access
VBA Access Le forum pour les questions relatives au code VBA sous Access, et à son environnement de développement VBE.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 14/02/2011, 16h48   #1
Membre éclairé
 
Homme Michel
Développeur informatique
Inscription : février 2008
Messages : 261
Détails du profil
Informations personnelles :
Nom : Homme Michel
Localisation : France, Hérault (Languedoc Roussillon)

Informations professionnelles :
Activité : Développeur informatique
Secteur : Finance

Informations forums :
Inscription : février 2008
Messages : 261
Points : 304
Points : 304
Par défaut Lancement Application puis suppression

Bonsoir,

J'aimerais pouvoir, depuis un module ACCESS qui s'ouvre grâce à une macro autoexec (pas encore de fenêtre ouverte) lancer une deuxième application Access et refermer l'actuelle application... puis la supprimer !

J'explique le but :

La première application à son ouverture teste si une mise à jour du programme existe (dans un dossier partagé sur serveur), si c'est le cas, elle la récupère depuis ce dossier partagé, la recopie sur le poste local (jusque là, je sais faire) et l'exécute, puis se ferme d'elle même (là ça devient problématique pour moi en ce qui concerne la dite "exécution").

Les Noms des deux applications (la première et sa mise à jour) intègrent le numéro de version, ce qui me permet de différencier l'une de l'autre. (exêmple : monappli v1.0 et monappli V1.1)

Cerise sur le gâteau, j'aimerais que la 2° application dès lors que la première est fermée supprime cette première version devenue obsolète. (Ca à priori, je dois pouvoir le faire plus tard lorsque l'utilisateur "quitte" la 2° application, ce qui laissera le temps à la première de ne plus être "en prise". Mais j'aurais aimé le faire dans la foulée ).

J'ai tenté avec shellexecute... jusqu'à présent sans succès, d'autant que devant l'exécuter depuis un module avant toute ouverture de fenêtre, je ne vois pas comment indiquer un quelconque handle en premier paramètre, puisque pas de fenêtre encore ouverte.

PS : je travaille sur XP avec ACCESS 2002 et les utilisateurs de mon application sont soit sous acces 2002 SP3, soit sous ACCESS 2003

Merci par avance à qui voudra bien perdre un peu de tps à m'éclairer.

Michel
Orion34080 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/02/2011, 20h38   #2
Membre régulier
 
Homme Bruno Escaron
Inscription : janvier 2010
Messages : 84
Détails du profil
Informations personnelles :
Nom : Homme Bruno Escaron
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 84
Points : 96
Points : 96
Salut,

J'ai déjà configuré ce que tu veux faire.
Mais je lance toujours la même base qui elle vérifie l'existence de nouvelle version puis la lance :

Code :
1
2
3
Dim ret As Long
ret = Shell("MSACCESS.exe " & NomVersion, vbNormalFocus)
Me.Application.Quit
avec NomVersion nom de la base à lancer

Bon courage
B_SKO est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/02/2011, 22h02   #3
Rédacteur
 
Avatar de LedZeppII
 
Homme
Maintenance données produits
Inscription : décembre 2005
Messages : 3 939
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Maintenance données produits
Secteur : Distribution

Informations forums :
Inscription : décembre 2005
Messages : 3 939
Points : 6 278
Points : 6 278
Bonsoir,

Citation:
Envoyé par Orion34080 Voir le message
j'aimerais que la 2° application dès lors que la première est fermée supprime cette première version devenue obsolète. (Ca à priori, je dois pouvoir le faire plus tard lorsque l'utilisateur "quitte" la 2° application, ce qui laissera le temps à la première de ne plus être "en prise". Mais j'aurais aimé le faire dans la foulée ).
La seule méthode que j'ai trouvée, c'est d'ouvrir la nouvelle base par automation, et d'utiliser un formulaire avec Timer pour tenter de supprimer l'ancienne version à intervalle régulier.

1) Ouverture par automation.
Je pars du principe que j'ai une fonction VerifNouvVersion() qui vérifie l'existence d'une nouvelle version de l'application.
Cette fonction, si elle détecte une nouvelle version, recopie la nouvelle base dans le dossier de l'application, et renvoie le chemin complet vers la nouvelle base.
Dans le cas contraire elle ne renvoie rien, c'est à dire une chaîne vide.
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Dim strDbNouvVersion As String
Dim accNewApp As Access.Application
 
' Vérifie si une nouvelle version existe
strDbNouvVersion = VerifNouvVersion()
' Si aucune, quitter la procédure
If Len(strDbNouvVersion) = 0 Then Exit Sub
 
' Création d'une nouvelle instance d'Access
Set accNewApp = New Access.Application
accNewApp.Visible = True
accNewApp.UserControl = True
' Ouverture Base Nouvelle Version
accNewApp.OpenCurrentDatabase strDbNouvVersion
' Ouverture du formulaire qui va supprimer la version en cours
accNewApp.DoCmd.OpenForm "fmMajBDD"
' On donne au formulaire le chemin complet de la base à détruire
accNewApp.Forms("fmMajBDD").SetOldBdd CurrentProject.FullName
' On quitte la base en cours
Application.Quit acQuitSaveNone
' Après cette ligne, plus aucune ligne de code n'est exécutée
2) Code du formulaire fmMajBDD
Code :
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
Option Compare Database
Option Explicit
 
' Chemin complet vers bdd à supprimer
Private strOldBdd As String
' Compte du nombre de tentatives
Dim lgTentatives As Long
 
Public Sub SetOldBdd(strBdd As String)
strOldBdd = strBdd
' Démarre le Timer sur un intervalle d' 1/2 sec
Me.TimerInterval = 500
End Sub
 
Private Sub Form_Timer()
On Error GoTo Timer_Err
 
' Si la variable strOldBdd n'est pas vide
' on tente de supprimer la base
If Len(strOldBdd) > 0 Then
   lgTentatives = lgTentatives + 1
   Kill strOldBdd
End If
 
' Si la variable strOldBdd était vide
' ou si la suppression a réussi
' fermer le formulaire
Timer_Arret:
Me.TimerInterval = 0
DoCmd.Close acForm, Me.Name
 
Timer_Sortie:
Exit Sub
 
Timer_Err:
' La suppression de la bdd a échoué.
 
' Si le nombre de tentatives dépasse la valeur (arbitraire) de 15
If lgTentatives > 15 Then
   MsgBox lgTentatives & " tentatives infructueuses pour supprimer" & vbCrLf & _
          strOldBdd & vbCrLf & vbCrLf & _
          "Dernière erreur : " & Err.Number & " - " & Err.Description
   Resume Timer_Arret
End If
 
' Sortir de la procédure.
' Une nouvelle tentative aura lieu au prochain
' déclenchement du timer
Resume Timer_Sortie
End Sub
Dans ce code, on retrouve la procédure SetOldBdd utilisée dans 1).
Elle permet de désigner au formulaire (nouvelle version), la base de données à supprimer (ancienne version), et aussi de démarrer le Timer.

A+
LedZeppII est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/02/2011, 09h50   #4
Membre éclairé
 
Homme Michel
Développeur informatique
Inscription : février 2008
Messages : 261
Détails du profil
Informations personnelles :
Nom : Homme Michel
Localisation : France, Hérault (Languedoc Roussillon)

Informations professionnelles :
Activité : Développeur informatique
Secteur : Finance

Informations forums :
Inscription : février 2008
Messages : 261
Points : 304
Points : 304
Par défaut Réponse à B_SKO

Tout d'abord merci pour ta réponse

Citation:
Dim ret As Long
ret = Shell("MSACCESS.exe " & NomVersion, vbNormalFocus)
Me.Application.Quit
j'ai donc écrit le code suivant dans mon module de démarrage:

Code :
1
2
3
4
5
Dim ret As Long
Dim NomVersion As String
NomVersion = CurrentProject.Path & "\Bd2.mdb"
ret = Shell("MSACCESS.exe " & NomVersion, vbNormalFocus)
Application.Quit
BD2.mdb étant une bd vide juste pour tester...

A l'exécution ... c'est l'Hécatombe de messages :

1/ La ligne de commande utilisée pour lancer MS Access comporte une option que MS Access ne reconnait pas : quittez Ms Access et relancez-le en utilisant les options de la ligne de cde. (2 fois ce message)

2/ Ensuite ouverture d'accès avec message : Ms Access Ne peut trouver le fichier de Base de données c:\documents.mdb ...

Bref : soucis !
Orion34080 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/02/2011, 10h09   #5
Membre éclairé
 
Homme Michel
Développeur informatique
Inscription : février 2008
Messages : 261
Détails du profil
Informations personnelles :
Nom : Homme Michel
Localisation : France, Hérault (Languedoc Roussillon)

Informations professionnelles :
Activité : Développeur informatique
Secteur : Finance

Informations forums :
Inscription : février 2008
Messages : 261
Points : 304
Points : 304
Par défaut Réponse à LedZeppII

Merci pour ce code ... qui va m'occuper quelque temps (j'avoue qu'ouvrir "par automation" ne veut pour l'instant pas dire grand chose pour moi ... mais je promets de m'y mettre )

Le dommage est de devoir ouvrir un formulaire ... j'aurais aimé que le changement de version soit totalement transparent pour l'utilisateur d'où l'idée de faire ça dans le module lancé par l'autoexec avant toute ouverture de formulaire.

Deux renseignements supplementaires :

dans le code d'ouverture "par automation", je n'arrive pas à repérer :

1/ à quel moment se copie la nouvelle version sur le poste local

2/ à quel moment alors qu'on travaillait avec l'ancienne version (pour tester l'existence de la nlle version et la "copier" en local, on la quitte pour travailler avec la nouvelle (celle qui, in fine, supprimera l'ancienne version)

... Je sais pas si je suis très clair, là, dans mes demandes !!!

Merci en tous cas pour les tentatives d'explication !
Michel
Orion34080 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/02/2011, 14h33   #6
Membre éclairé
 
Homme Michel
Développeur informatique
Inscription : février 2008
Messages : 261
Détails du profil
Informations personnelles :
Nom : Homme Michel
Localisation : France, Hérault (Languedoc Roussillon)

Informations professionnelles :
Activité : Développeur informatique
Secteur : Finance

Informations forums :
Inscription : février 2008
Messages : 261
Points : 304
Points : 304
Par défaut bon ... tout est ok maintenant

Merci aux deux intervenants qui m'ont aidé. Grâce à eux j'ai pu réaliser le programme tel que je le voulais.

J'ai un peu tatonné, mais les codes fournis par LedZeppII m'ont été d'une aide considérable. Je peux mainteant faire des mises à jour sur les postes "clients" d'une manière quasi-transparente pour les 200 utilisateurs

Merci donc
Michel
Orion34080 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/02/2011, 18h54   #7
Rédacteur
 
Avatar de LedZeppII
 
Homme
Maintenance données produits
Inscription : décembre 2005
Messages : 3 939
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Maintenance données produits
Secteur : Distribution

Informations forums :
Inscription : décembre 2005
Messages : 3 939
Points : 6 278
Points : 6 278
Par défaut Explications

Bonsoir,

Citation:
j'avoue qu'ouvrir "par automation" ne veut pour l'instant pas dire grand chose pour moi ...
C'est le fait de lancer Access avec ces lignes de code :
Code :
1
2
3
4
5
6
Dim accNewApp As Access.Application
 
' Création d'une nouvelle instance d'Access
Set accNewApp = New Access.Application
accNewApp.Visible = True
accNewApp.UserControl = True
Citation:
dans le code d'ouverture "par automation", je n'arrive pas à repérer :

1/ à quel moment se copie la nouvelle version sur le poste local
Je n'ai effectivement proposé aucun code pour cette tâche .
Je l'ai matérialisée par la fonction VerifNouvVersion().

Citation:
dans le code d'ouverture "par automation", je n'arrive pas à repérer :

2/ à quel moment alors qu'on travaillait avec l'ancienne version (pour tester l'existence de la nlle version et la "copier" en local), on la quitte pour travailler avec la nouvelle (celle qui, in fine, supprimera l'ancienne version)
On quitte l'ancienne version à cet endroit du code :
Code :
1
2
3
' On quitte la base en cours
Application.Quit acQuitSaveNone
' Après cette ligne, plus aucune ligne de code n'est exécutée
Citation:
Le dommage est de devoir ouvrir un formulaire ... j'aurais aimé que le changement de version soit totalement transparent pour l'utilisateur d'où l'idée de faire ça dans le module lancé par l'autoexec avant toute ouverture de formulaire.
Mon choix s'est porté sur l'utilisation d'un formulaire, parce que ce dernier possède la fonctionnalité «Timer».
Lorsque l'ancienne base donne la main à la nouvelle base avant de se fermer, la nouvelle base ne peut pas supprimer l'ancienne, immédiatement.
Erreur 70 : accès (sous entendu au fichier) refusé.
Il y a un certain délai (dont la durée est inconnue) avant que l'ancienne base soit totalement fermée et libérée (plus aucun verrou).
D'où l'idée d'utiliser un Timer pour faire des tentatives répétées de suppression du fichier de l'ancienne base.

A+
LedZeppII est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 10h39.


 
 
 
 
Partenaires

Hébergement Web