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 24/01/2012, 11h19   #1
Candidat au titre de Membre du Club
 
Inscription : février 2006
Messages : 48
Détails du profil
Informations personnelles :
Âge : 47

Informations forums :
Inscription : février 2006
Messages : 48
Points : 14
Points : 14
Envoyer un message via MSN à bigounet
Par défaut Remplacer la base de données en cours

Bonjour. Je m'occupe d'une base de données en access 2003. Je fais les nouveaux formulaires, états, etc. Ensuite, je dois envoyer, via le réseau, la nouvelle base de données à tous les utilisateurs. J'ai réussi à faire apparaitre un message dès qu'une mise à jour a été faite. Maintenant, je souhaiterais, que dès qu'un utilisateur clique sur le message de mise à jour, qu'Access se ferme, copie la dernière version sur le serveur (\\xxxsrv001\amt\amt.mdb) et remplace la "vieille" version à l'emplacement défini pour tous les utilisateurs (c:\documents and settings\%username%\my documents\amd.mdb). Puis, la nouvelle version s'ouvre automatiquement. Je suis ouvert à toutes idées. En vous remerciant pour votre aide.
bigounet est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/01/2012, 13h58   #2
Membre éclairé
 
Homme Michel
Développeur informatique
Inscription : février 2008
Messages : 263
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 : 263
Points : 309
Points : 309
Bonjour,
ayant eu la même problématique, je te livre ce qui me sert désormais à faire des mises à jour automatique pour toutes les applications que je développe.

Bien entendu il te faudra l'adapter à tes propres besoins ... un peu de boulot quand même ! Je t'ai néanmoins mis quelques commentaires ...

Michel

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
If (Version <> xVersion) And (xVersion <> "") Then  'il y a une mise à jour à faire : c'est ce test qui me permet de le définir... y mettre ton test à toi
     Dim strDbNouvVersion As String
     Dim accNewApp As Access.Application
     Set fso = CreateObject("Scripting.FileSystemObject")
'ci-dessous récupération du chemin+nom de la nouvelle version
     Path_Intervention = xChemin_Application & "\EXECUTABLE\COREC-RDP v" & Version & ".mdb"
     Set f = fso.GetFile(Path_Intervention)
     'Copie du logiciel nouvelle version à l'endroit où se trouve
     'l'actuel executable
     strDbNouvVersion = CurrentProject.Path & "\COREC-RDP v" & Version & ".mdb"
     f.copy (strDbNouvVersion)
 
     ' 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 "F-fmMajBDD", , , , , acHidden
     ' On donne au formulaire le chemin complet de la base à détruire
     accNewApp.Forms("F-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) 
End If
DoCmd.OpenForm "F_MENU", acNormal 'affichage du 1°formulaire de mon application
Bien sur il te faut intégrer à ton application le formulaire nommé ci-dessus "F-fmMajBDD", qui est un formulaire vide (pas grave, l'utilisateur ne le voit pas) contenant uniquement les codes suivants :

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
Private Sub Form_Timer() 'il s'agit donc d'un procédure évenementielle sur la propriété "on timer" avec intervalle minuterie à 0
On Error GoTo Timer_Err
 
' Si la variable strOldBdd n'est pas vide
' on tente de supprimer la base ancienne
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é (il faut parfois un peu de temps...)
 
' Si le nombre de tentatives dépasse la valeur (arbitraire) de 30 (soit 30 secondes)
If lgTentatives > 30 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
PS : dans cet exemple, ma base se nomme COREC-RDP vx.xx.mdb
x.xx etant le N° de la version

Je dois ce code à ce site !
Bonne chance !
Orion34080 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/01/2012, 14h31   #3
Candidat au titre de Membre du Club
 
Inscription : février 2006
Messages : 48
Détails du profil
Informations personnelles :
Âge : 47

Informations forums :
Inscription : février 2006
Messages : 48
Points : 14
Points : 14
Envoyer un message via MSN à bigounet
Merci pour ta réponse.
Petite question qui peut paraître idiote pour toi.
Le 1er code se met dans un module ?
Ensuite, comme tu changes de nom de version à chaque fois, le nom du raccourci ne correspond plus. Exact ?

En te remerciant.
Francis
bigounet est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/01/2012, 14h40   #4
Membre éclairé
 
Homme Michel
Développeur informatique
Inscription : février 2008
Messages : 263
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 : 263
Points : 309
Points : 309
Il n'y a aucune question idiote quand on ne connait pas la réponse :-)

le premier code je le place au début de la fonction (donc dans un module) qui est appelée quand le programme s'ouvre (je l'ai mise dans un module qui est appelé par un macro de type autoexec). C'est là que je teste (à ma façon, toi à la tienne) s'il doit y avoir ou non un changement de version

Si oui
j'execute le code que je t'ai transmis qui copie la nouvelle version (qui a donc un nom différent de l'ancienne puisque le N° de version inclu dans le nom est différent) à l'emplacement de l'ancienne version (sur le bureau ou dans un dossier, etc.), ensuite j'ouvre une nouvelle instance d'accès dans laquelle je lance la nouvelle version ... qui execute le code du formulaire que je t'ai dit de créer. Lequel formulaire supprime l'ancienne version ... et ensuite j'ouvre mon formulaire de démarrage

Si non
j'ouvre mon formulaire de démarrage

voilà j'espère que cela pourra t'aider.
Michel
Orion34080 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/01/2012, 15h01   #5
Membre éclairé
 
Homme Michel
Développeur informatique
Inscription : février 2008
Messages : 263
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 : 263
Points : 309
Points : 309
Je n'avais pas vu ta deuxieme question :
Je n'utilise pas de raccourci :

d'une part, sur le serveur je ne mets que les table communes (par fractionnement de la base initiale - on appelle ça la dorsale je crois)

et chaque utilisateur a sur son bureau (ou dans un dossier quelqconque) non pas un raccourci mais une copie (pas raccourci) de la partie Frontale de l'application mdb.

ainsi chaque utilisateur quand il lance le module qui est en sa possession fait sa propre mise à jour en allant récupérer (par le programme que je t'ai transmis ci-dessus) la nouvelle frontale que j'ai placée dans un dossier partagé qui leur est accessible.

pour le changement de version, j'ai dans la table paramètre le dernier n° de version utilisable et dans le code du module (avant le test de la mise à jour) j'ai le numéro de la version possédée par les utilisateurs, en dur.

c'est par comparaison avec le n° de version de la table paramètre et du numero dfe version en dur que je détermine si la mise à jour doit ou non etre faite : quand ces 2 versions concordent : pas de mise à jour quand elles ne concordent pas : mise à jour.

Bien entendu dans la nouvelle version (celle que le programme va chercher pour la copier pour les utilisateurs), le n° de version "en dur" concorde parfaitement avec le n° de version de la table paramètre pour éviter toute mise à jour ultérieure.

Donc quand je décide de changer de version par exemple pour passer passer de MonProg v1.00.mdb à MonProg v2.00.mdb j'exécute les opérations suivantes dans l'ordre :

1° dans la nouvelle version, dans le module j'inscris en dur le n° de la nouvelle version (dans ce cas je mets : 2.00), je change le nom du fichier qui s'appelle désormais : MonProg v2.00.mdb
2° je copie cette nouvelle version dans le dossier partagé accessible à tous mes utilisateurs
3° j'ouvre ma base en mode développeur (en appuyant sur shift pour éviter d'exécuter la macro autoexec) et je change dans la table paramètre le n° deversion 1.00 en 2.00

Ces trois opérations étant à exécuter dans cet ordre

Voià j'espère avoir été clair ... un changement de version (150 utilisateurs différents) ne me prends, montre en main que 3 minutes ... et mes utilisateurs se mettent à jour à leur rythme : chaque fois qu'il ouvrent leur logiciel et que le besoin bien sûr est avéré.

Michel
Orion34080 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/01/2012, 15h10   #6
Candidat au titre de Membre du Club
 
Inscription : février 2006
Messages : 48
Détails du profil
Informations personnelles :
Âge : 47

Informations forums :
Inscription : février 2006
Messages : 48
Points : 14
Points : 14
Envoyer un message via MSN à bigounet
c'est exactement ce que je cherchais. Je vais mettre tes idées en pratique.
Un grand merci et très bonne journée.
En te remerciant
Francis
bigounet est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/02/2012, 10h15   #7
Candidat au titre de Membre du Club
 
Inscription : février 2006
Messages : 48
Détails du profil
Informations personnelles :
Âge : 47

Informations forums :
Inscription : février 2006
Messages : 48
Points : 14
Points : 14
Envoyer un message via MSN à bigounet
voilà, j'ai bien avancé. Ma nouvelle base de données (frontale) est bien copiée à l'endroit souhaité mais je n'arrive pas à supprimer l'ancienne base frontale.
J'ai une erreur avec cette ligne :

' On donne au formulaire le chemin complet de la base à détruire
accNewApp.Forms("F-fmMajBDD").SetOldBdd CurrentProject.FullName

Faut-il définir l'endroit pour SetOldBdd ?

En vous remerciant
bigounet est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/02/2012, 17h35   #8
Membre éclairé
 
Homme Michel
Développeur informatique
Inscription : février 2008
Messages : 263
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 : 263
Points : 309
Points : 309
non.
Quelle est l'erreur ?

Tu peux peut être tenter de mettre (temporairement) en route ce que j'ai mis en commentaire :

Code :
1
2
3
4
5
6
If lgTentatives > 30 Then 'Eventuellement augmenter le nombre de tentatives)
  MsgBox lgTentatives & " tentatives infructueuses pour supprimer" & vbCrLf & _
          strOldBdd & vbCrLf & vbCrLf & _
          "Dernière erreur : " & Err.Number & " - " & Err.Description
   Resume Timer_Arret
End If
Cela te pemettra peut être comprendre
Orion34080 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 20h25.


 
 
 
 
Partenaires

Hébergement Web