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 :

Changement automatique des versions des bases frontales


Sujet :

VBA Access

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Inscrit en
    Janvier 2006
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 7
    Par défaut Changement automatique des versions des bases frontales
    Bonjour,

    J’ai une application ACCESS 2002 version SP3 composée de l’architecture suivante : une base dorsale et 5 bases frontales.
    Ma question est la suivante,a chaque changement de version je voudrais automatisé le changement de version de la base frontale ce qui m’éviterait de passer sur chaque poste utilisateur.
    Est-ce quelqu’un à déjà pensé à ce genre de mécanisme.
    Par avance merci de vos conseils

    Patrick

  2. #2
    Membre chevronné Avatar de mcdotta
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    292
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 292
    Par défaut
    Hello,


    Moi j'ai simplement installé un raccourci vers un fichier.bat dans leur menu Démarrer.

    L'option est MAJ Interface et quand choisie lance le batch qui copie d'un emplacment réseau (là où j'installe la nouvelle version de front-end) le frontend vers le disque local de l'utilisateur.

    Voilà mon fichier batch
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    cd\
     
    c:
     
    md CRM
     
    cd CRM
     
    md %USERNAME%
     
    cd %USERNAME%
     
    copy FromDisque\MonFrontEnd.mdb

  3. #3
    Expert confirmé
    Avatar de Dolphy35
    Homme Profil pro
    Responsable Systemes d'Information
    Inscrit en
    Octobre 2004
    Messages
    4 373
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Responsable Systemes d'Information
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2004
    Messages : 4 373
    Par défaut
    Salut,

    Dans le cadre de ma dernière base j'ai effectué une mise à jour Automatique car j'ai environ 80 utilisateurs potentiels pour l'utilisation de la base.

    dans ma dorsale j'ai une table avec la version de la base, dans ma frontale j'ai une autre table (non liée) avec la version de la base (frontale). Lors de l'ouverture de la base après signature par mot de passe de l'utilisateur je contrôle la concordence des deux versions => Si ma Frontale est inferieur à ma dorsale => j'ouvre une base de mise à jour.

    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
    Option Compare Database
     
    Private Declare Function apiSetForegroundWindow Lib "user32" _
                Alias "SetForegroundWindow" _
                (ByVal hwnd As Long) _
                As Long
     
    Private Declare Function apiShowWindow Lib "user32" _
                Alias "ShowWindow" _
                (ByVal hwnd As Long, _
                ByVal nCmdShow As Long) _
                As Long
     
    Private Const SW_MAXIMIZE = 3
    Private Const SW_NORMAL = 1
    '
     
     
    Function MAJ_Base()
     
    'Fonction permettant la montée de version de la base.
    '1-Ouverture base MAJ.
    '2-Fermeture de cette base.
    '3-Exécution MAJ.
    '4-Fermeture de la Base MAJ
    '5-Ouverture de celle-ci (nouvelle version).
     
        ' Initialise la chaîne au chemin d'accès à la base de données.
        ' Crée une nouvelle instance de Microsoft Access.
     
            Set objAccess = New Access.Application
            With objAccess
                lngRet = apiSetForegroundWindow(.hWndAccessApp)
                lngRet = apiShowWindow(.hWndAccessApp, SW_NORMAL)
                'le premier appel à  ShowWindow semble rester sans effet
                lngRet = apiShowWindow(.hWndAccessApp, SW_MAXIMIZE)
                .OpenCurrentDatabase "C:\MAJ_mabase.mdb"
                .DoCmd.OpenForm "Formulaire1"
            End With
     
        DoCmd.Quit
     
    End Function
    Ce code permet d'ouvrir une base (MAJ_mabase) sur le Formulaire1 et de fermer celle-ci

    sur ce Form il y a un bouton Mise à jour où j'ai mis ce code

    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
    On Error GoTo MAJ_Base_err
     
        link = "\\..." '=> Chemin réseau
        Set Source = CurrentDb.OpenRecordset("SELECT * FROM T_Lien_source")
     
            If Source.RecordCount = 1 Then
     
                FileCopy Source.Fields(0), link
     
                If Dir(link, vbHidden) <> "" Then
     
                    MsgBox "Mise à Jour réussi"
     
                    Call MAJ_Base '=> Appel fonction
     
                    DoCmd.Quit
     
                End If
     
            Else
     
                MsgBox "Erreure sur connexion source distante", vbCritical
     
            End If
     
        Exit Sub
     
    MAJ_Base_err:
     
        Select Case Err.Number
     
            Case 53
     
                MsgBox "Une erreure sur fichier distant a été provoquée." & Chr(13) & _
                "Veuillez contacter le pilote de l'application." & Chr(13) & _
                "Code Erreure -> 53", vbCritical
     
            Case Else
     
                MsgBox "Une erreure a été provoquée." & Chr(13) & _
                "Veuillez contacter le pilote de l'application." & Chr(13) & _
                "Code Erreure -> " & Err.Number & Chr(13) & _
                "Description -> " & Err.Description, vbCritical
     
        End Select
    Ce code permet de copier la base à jour sur un disque réseau sur le Pc utilisateur.

    Ensuite tu dans la base MAJ tu créer une fonction pour réouvrir ta base à jour.

    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
    Option Compare Database
     
    Private Declare Function apiSetForegroundWindow Lib "user32" _
                Alias "SetForegroundWindow" _
                (ByVal hwnd As Long) _
                As Long
     
    Private Declare Function apiShowWindow Lib "user32" _
                Alias "ShowWindow" _
                (ByVal hwnd As Long, _
                ByVal nCmdShow As Long) _
                As Long
     
    Private Const SW_MAXIMIZE = 3
    Private Const SW_NORMAL = 1
    '
     
     
    Function MAJ_Base()
     
            Set objAccess = New Access.Application
            With objAccess
                lngRet = apiSetForegroundWindow(.hWndAccessApp)
                lngRet = apiShowWindow(.hWndAccessApp, SW_NORMAL)
                'le premier appel à  ShowWindow semble rester sans effet
                lngRet = apiShowWindow(.hWndAccessApp, SW_MAXIMIZE)
                .OpenCurrentDatabase "D:\Mes documents\Access\GMR\Base_Uti\GMR.mdb"
    '            .DoCmd.OpenForm "Formulaire1"
            End With
     
        DoCmd.Quit
     
    End Function
    En espérant t'avoi aidé.

  4. #4
    Expert confirmé
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    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 : 4 485
    Par défaut
    J'utilise le même principe de Dolphy35.
    J'ai créé une propriétée AppVersion dans ma base frontale que j'incrément à chaque modification.
    Du code lancé par la macro Autoexec compare cette propriété à celle de la base de référence placée sur le réseau.
    Si la version est inférieure, un message demande à l'utilisateur d'écraser sa base par celle se trouvant sur le réseau, puis je quitte l'application.
    La base est inutilisable et l'utilisateur n'a pas d'autre choix que recopier la base référence.
    C'est moins pro, mais ça marche.

  5. #5
    Expert confirmé
    Avatar de Dolphy35
    Homme Profil pro
    Responsable Systemes d'Information
    Inscrit en
    Octobre 2004
    Messages
    4 373
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Responsable Systemes d'Information
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2004
    Messages : 4 373
    Par défaut
    Salut,

    j'ai fais une petit erreur dans la copie de procédure. je te remet tout avec explications :

    1-Dans la base Frontale (ici on l'appelera "Mabase.mdb") tu créer un nouveau module et tu y colle cette fonction.
    Code VBA : 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
    Option Compare Database
     
    Private Declare Function apiSetForegroundWindow Lib "user32" _
                Alias "SetForegroundWindow" _
                (ByVal hwnd As Long) _
                As Long
     
    Private Declare Function apiShowWindow Lib "user32" _
                Alias "ShowWindow" _
                (ByVal hwnd As Long, _
                ByVal nCmdShow As Long) _
                As Long
     
    Private Const SW_MAXIMIZE = 3
    Private Const SW_NORMAL = 1
    '
    Function MAJ_Base()
     
    'Fonction permettant la montée de version de la base.
    '1-Ouverture base MAJ.
    '2-Fermeture de cette base.
    '3-Exécution MAJ.
    '4-Fermeture de la Base MAJ
    '5-Ouverture de celle-ci (nouvelle version).
     
        ' Initialise la chaîne au chemin d'accès à la base de données.
        ' Crée une nouvelle instance de Microsoft Access.
     
     If Right(Application.CurrentDb.Name, 1) = "\" Then
     
            link = Application.CurrentDb.Name
     
        Else
     
            link = Left(Application.CurrentDb.Name, InStrRev(Application.CurrentDb.Name, "\"))
     
        End If
     
            Set objAccess = New Access.Application
            With objAccess
                lngRet = apiSetForegroundWindow(.hWndAccessApp)
                lngRet = apiShowWindow(.hWndAccessApp, SW_NORMAL)
                lngRet = apiShowWindow(.hWndAccessApp, SW_MAXIMIZE)
                .OpenCurrentDatabase link & "MAJMabase.mdb"
                .DoCmd.OpenForm "Formulaire1"
            End With
     
        DoCmd.Quit
     
    End Function

    Cette fonction permet d'ouvrir Access ensuite d'ouvrir la base MAJMabase.mdb sur le Formulaire Formulaire1 (son nom) et ensuite ferme la base Mabase.mdb

    2-dans la base MAJMabase.mdb tu créer un form "Formulaire1 ou autre" et tu y ajout un bouton sur l'événements click de ce bouton tu met ce code :
    Code VBA : 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
    Private Sub Commande0_Click()
     
    On Error GoTo MAJ_Base_err
     
        If Right(Application.CurrentDb.Name, 1) = "\" Then
     
            link = Application.CurrentDb.Name
     
        Else
     
            link = Left(Application.CurrentDb.Name, InStrRev(Application.CurrentDb.Name, "\"))
     
        End If
     
        FileCopy "\\..", link & "MaBase.mdb"
     
        If Dir(link & "MaBase.mdb", vbHidden) <> "" Then
     
            MsgBox "Mise à Jour réussi"
     
            Call MAJ_Base
     
            DoCmd.Quit
     
        End If
     
        Exit Sub
     
    MAJ_Base_err:
     
        Select Case Err.Number
     
            Case 53
     
                MsgBox "Une erreur sur fichier distant a été provoquée." & Chr(13) & _
                "Veuillez contacter le pilote de l'application." & Chr(13) & _
                "Code Erreur-> 53", vbCritical
     
            Case Else
     
                MsgBox "Une erreur a été provoquée." & Chr(13) & _
                "Veuillez contacter le pilote de l'application." & Chr(13) & _
                "Code Erreur -> " & Err.Number & Chr(13) & _
                "Description -> " & Err.Description, vbCritical
     
        End Select
    End Sub
    Ce code copy avec la fonction FileCopy du disque réseau à l'emplacement où était l'ancienne base.

    ensuite on appel la Foction Maj_Base qui n'est qu'autre la même fonction avec API qui ce trouve dans la base Frontale.

    3-réouverture de la base à jour.
    Code VBA : 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
    Option Compare Database
     
    Private Declare Function apiSetForegroundWindow Lib "user32" _
                Alias "SetForegroundWindow" _
                (ByVal hwnd As Long) _
                As Long
     
    Private Declare Function apiShowWindow Lib "user32" _
                Alias "ShowWindow" _
                (ByVal hwnd As Long, _
                ByVal nCmdShow As Long) _
                As Long
     
    Private Const SW_MAXIMIZE = 3
    Private Const SW_NORMAL = 1
    '
     
     
    Function MAJ_Base()
     
    'Fonction permettant la montée de version de la base.
    '1-Ouverture base MAJ.
    '2-Fermeture de cette base.
    '3-Exécution MAJ.
    '4-Fermeture de la Base MAJ
    '5-Ouverture de celle-ci (nouvelle version).
     
        ' Initialise la chaîne au chemin d'accès à la base de données.
        ' Crée une nouvelle instance de Microsoft Access.
    If Right(Application.CurrentDb.Name, 1) = "\" Then
     
            link = Application.CurrentDb.Name
     
        Else
     
            link = Left(Application.CurrentDb.Name, InStrRev(Application.CurrentDb.Name, "\"))
     
        End If
     
            Set objAccess = New Access.Application
            With objAccess
                lngRet = apiSetForegroundWindow(.hWndAccessApp)
                lngRet = apiShowWindow(.hWndAccessApp, SW_NORMAL)
                lngRet = apiShowWindow(.hWndAccessApp, SW_MAXIMIZE)
                .OpenCurrentDatabase link & "MaBase.mdb"
            End With
     
        DoCmd.Quit
     
    End Function

    ce petit code permet simplement récupérer l'emplacement de la base où qu'elle soit.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    If Right(Application.CurrentDb.Name, 1) = "\" Then
     
            link = Application.CurrentDb.Name
     
        Else
     
            link = Left(Application.CurrentDb.Name, InStrRev(Application.CurrentDb.Name, "\"))
     
        End If
    Seul inconvénient de ce code c'est que la base à jour doit être tout le temps au même endroit (disque réseau) ou il y moyen de l'adapter.

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 10
    Par défaut
    Salut a tous,

    Je voudrais moi aussi intégrer un module de MAJ dans ma base Access.

    J'ai 2 question:

    - Quel code faut-il utiliser pour contrôler la concordance des versions des 2 bases ?

    - J'ai testé le code de Dolphy35 qui permet de lance la base de mise a jour.
    Mon problème : Quand j'exécute le code, il me lance bien la base "MAJMabase.mdb" mais après ,si j'ai bien compris le code, il doit fermer la première base "Mabase.mdb". Et c'est la mon problème il ferme toute les bases ouverte.
    Donc la base "MAJMabase.mdb" s’ouvre et se ferme aussitôt.
    Si quelqu'un a une idée du problème.

    Merci par avance pour vos futur réponse.

  7. #7
    Expert confirmé
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    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 : 4 485
    Par défaut
    Hello dbzzzde,

    J'ai le même comportement.
    Pour contourner le problème, lorsque j'ouvre ma base mise à jour (après FileCopy), j'ouvre en plus un formulaire de Mabase.mdb.
    Du coup quand MAJMabase.mdb se ferme, ça ne ferme plus Mabase.mdb

    A+

  8. #8
    Membre éprouvé
    Inscrit en
    Juillet 2002
    Messages
    150
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 150
    Par défaut
    Bonjour,

    Je vous propose le principe de ma solution qui utilise deux bases sur le poste client en sus de la base centrale.

    une base que l'on appelera BaseA et une seconde BaseB

    le principe est le suivant :
    l'utilisateur démarre l'application en cliquant sur BaseA, cette base fait trois choses :
    1. elle contrôle la disponibilité de la base centrale (utile pour empêcher les connexions en cas de modification ou de compactage de la base centrale)
    2. elle contrôle que la version de la base BaseB correspond à la version de production, si ce n'est pas le cas elle récupère la version adéquate sur le réseau et la copie sur le poste de l'utilisateur
    3. elle lance enfin la base BaseB qui correspond à l'application proprement dite (formulaire/état/requête/code)
    pour cela j'utilise deux fichiers spécifiques situés dans le répertoire de la base centrale :
    le premier fichier comprend 4 lignes
    • version
    • chemin du client
    • nom du client
    • chemin de la base centrale
    une table version est également présente dans la base BaseB. La base BaseA récupère le n° de version de BaseB et le compare au n° de version indiqué dans le fichier de paramétrage. S'il n'est pas possible de lire la version de la base BaseB (base corrompue, introuvable ...) forçage de la mise à jour.
    la ligne chemin du client indique où récupérer la dernier version de BaseB
    la ligne nom du client, le nom de BaseB (pratique si l'on change le format de mdb => mde par ex)
    le chemin de la base centrale permet de récupérer le chemin de la base centrale à utiliser pour le prochain démarrage (utile en cas de déplacement de l'application sur le réseau)

    le second fichier est vide mais comporte une extension particulière (par .xyzi), lorsque je souhaite empêcher les utilisateurs de se connecter il suffit de renommer le fichier en .xyz
    La présence de fichier sert d'indicateur de disponibilité de la base centrale. L'intérêt d'utiliser un fichier externe plutôt que de mettre l'information dans la base ? c'est que justement la base étant indisponible il n'est pas possible de la consulter

    Par ailleurs dans la base BaseB j'ai également une procédure qui surveille à intervalle régulier (toutes les 15') la présence d'un fichier .xyz, s'il est présent l'utilisateur est déconnecté automatiquement dans les 10'. En clair au max en moins d'une demi-heure je suis certain que plus personne n'est connecté que je peux travailler tranquillement sur la base centrale.

    La solution proposé à l'avantage d'un simple puisqu'elle se contente de copier un fichier (BaseB) sur le poste de l'utilisateur en cas de nouvelle version (pas besoin de créer une instance d'Access, pas d'utilisation d'Api ...), et d'utiliser un Dir pour vérifier la disponibilité de la base centrale

    Si tu veux plus de détails n'hésite pas à poser des questions

Discussions similaires

  1. Réponses: 3
    Dernier message: 31/12/2013, 13h59
  2. [AC-2000] MàJ des versions des fichiers 'frontal' à partir du serveur
    Par JesusHansHuberVorme dans le forum VBA Access
    Réponses: 10
    Dernier message: 30/04/2009, 12h00
  3. [EJB3 Entity] Audit des versions des Entity Bean
    Par mehdou dans le forum Java EE
    Réponses: 2
    Dernier message: 10/12/2007, 16h31
  4. Installer plusieurs versions des navigateurs à des fins de test
    Par komoku dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 20/12/2006, 14h47

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