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

  1. #1
    Membre éclairé

    Homme Profil pro
    Inscrit en
    juillet 2005
    Messages
    626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : juillet 2005
    Messages : 626
    Points : 712
    Points
    712

    Par défaut Mise à jour automatisée d’un frontal alternative N° 2

    Bonjour à tous,

    Un frontal quel qu’il soit ne peut se mettre à jour tout seul. Pour qu’un frontal se mette à jour tout seul il faut un fichier de type « bootstrap ».

    Je suis sur cette problématique depuis un moment déjà, et le hasard de la navigation dans les anneaux access m’a fait tomber sur un script incroyable. Ce script à l’origine était destiné au compactage à la demande avec relance du frontal.

    J’ai sauté dessus et je l’ai adapté pour les mises à jour de frontaux. Pour utiliser le script l’auteur demande de faire figurer une URL qui affiche ses conditions de licence qui sont gratuites.

    Ce qu’il y a d’original et qui la force de ce script c’est la boucle d’attente basée sur un PING et non pas un WAIT ou un SLEEP.

    Ce que je propose plus bas est très simple par rapport à l’originalité de ce script. Cela peut-être adapté aux versions inférieures à 2007.

    Dans le frontal une table locale « version » avec :

    NumVersion (texte) : Le numéro de version pour le « versionning » du développeur
    ladate (date) : La date de mise à jour On utilise la date pour effectuer le test.
    NomCompletFrontalMaJ (texte) : De type i:\frontal\maj\monfrontal.accdr
    Ici l’emplacement et le nom du nouveau frontal, (il peut être différent de celui de l’utilisateur) ex la mise à jour est FRT5200.accdr et l’utilisateur fait tourner FRTJEANJACQUES.accdr.

    On pourra faire un formulaire de gestion des versions avant la diffusion sur le réseau.

    Sur les remarques qui ont été faites sur ma précédente proposition maintenant il n’y a plus rien en dur et surtout la mise à jour est forcée, l’utilisateur n’a pas le choix même si il change le nom du frontal ou le copie quelque part.

    Avant la mise à jour on fait 3 Tests
    Le fichier frontal en cours d'utilisation n’est pas une source, type accdb
    Présence du fichier à l’emplacement enregistré dans la table
    Comparaison des dates des 2 frontaux local et distant, si c’est supérieur alors on envoi la 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
     
     
    'Test avant mise à jour du frontal
    ‘ accdb pour 2007 mdb pour les autres versions
    ‘ est-ce un frontal compilé ?
    If right(Application.CurrentProject.Name, 5) <> "accdb" Then
    'Vérification de l'éxistance du fichier et contrôle de la date 
        If VerificationMaJ <> "Aucun" Then
            MsgBox "Une mise à jour du frontal est disponible !" + vbCrLf + "Le programme va se fermer puis redémarrer." + vbCrLf + "Veuillez patienter", vbInformation, "Attention"
            Restart
        End If
     
    End If
    Script d'arrêt, de copie et de redémarrage

    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
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
     
    ' Licence to http://creativecommons.org/licenses/by/3.0/
    Option Compare Database
    Option Explicit
     
    Private Const TIMEOUT = 60
     
    Public Sub Restart(Optional Compact As Boolean = False)
        ' L'option Compact pour un compactage !!
        Dim scriptpath As String
     
        scriptpath = Application.CurrentProject.FullName & ".dbrestart.bat"
     
        If Dir(scriptpath, vbNormal) <> "" Then
            If DateAdd("s", TIMEOUT * 2, FileDateTime(scriptpath)) < Date Then
                Kill scriptpath
            Else
                Application.Quit acQuitSaveAll
                Exit Sub
            End If
        End If
     
        Dim s As String
        s = s & "SETLOCAL ENABLEDELAYEDEXPANSION" & vbCrLf
        s = s & "SET /a counter=0" & vbCrLf
        s = s & ":CHECKLOCKFILE" & vbCrLf
        s = s & "ping 0.0.0.255 -n 1 -w 100 > nul" & vbCrLf
        s = s & "SET /a counter+=1" & vbCrLf
        s = s & "IF ""!counter!""==""" & TIMEOUT & """ GOTO CLEANUP" & vbCrLf
        s = s & "IF EXIST ""%~f2.%4"" GOTO CHECKLOCKFILE" & vbCrLf
     
        If VerificationMaJ <> "Aucun" Then
            s = s & "COPY " & VerificationMaJ & " " & Application.CurrentProject.FullName & vbCrLf
        End If
     
        If Compact Then
            s = s & """%~f1"" ""%~f2.%3"" /compact" & vbCrLf
        End If
     
        s = s & "start "" "" ""%~f2.%3""" & vbCrLf
        s = s & ":CLEANUP" & vbCrLf
        s = s & "del %0"
     
        ' Enregistrement du script construit plus haut
        Dim intFile As Integer
        intFile = FreeFile()
        Open scriptpath For Output As #intFile
        Print #intFile, s
        Close #intFile
     
        Dim dbname As String, ext As String, lockext As String, accesspath As String
        Dim idx As Integer
     
        accesspath = SysCmd(acSysCmdAccessDir) & "msaccess.exe"
     
        ' Retrouve l'extension du frontal
        For idx = Len(CurrentProject.FullName) To 1 Step -1
            If Mid(CurrentProject.FullName, idx, 1) = "." Then Exit For
        Next idx
        dbname = left(CurrentProject.FullName, idx - 1)
        ext = Mid(CurrentProject.FullName, idx + 1)
     
        '  En fonction du frontal on détermine l'extension du fichier de verrouillage
        If left(ext, 2) = "ac" Then
            lockext = "laccdb"
        Else
            lockext = "ldb"
        End If
     
        ' Appel du script
        s = """" & scriptpath & """ """ & accesspath & """ """ & dbname & """ " & ext & " " & lockext
         Shell s, vbHide
     
        ' Ferme l'appli
       Application.Quit acQuitSaveAll
    End Sub
    Fonction de test
    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
     
     
    Function VerificationMaJ() As String
    'Fonction de test existence si oui compare les dates
    'La fonction retourne l'emplacement et le nom du nouveau fichier 
    Dim EmplacementFrt As String
    Dim ladateLocal
    Dim ladateFrontalMaJ
     
    Dim rst As New ADODB.Recordset
     
    rst.Open "Version", CurrentProject.Connection, adOpenStatic, adLockReadOnly
    rst.MoveFirst
    ladateLocal = rst!ladate
    EmplacementFrt = Nz(rst!NomCompletFrontalMaJ)
    rst.Close: Set rst = Nothing
     
    If FichierExiste(EmplacementFrt) = True Then
        'Recherche la date sur Frontal MàJ
        ladateFrontalMaJ = donneladate(EmplacementFrt)
        Else
        'Le fichier de MàJ n'existe pas
        VerificationMaJ = "Aucun"
        Exit Function
    End If
     
     
    If ladateFrontalMaJ > ladateLocal Then
        VerificationMaJ = EmplacementFrt
        Else
        VerificationMaJ = "Aucun"
    End If
    End Function
    Fonction qui récupère la date en ADO
    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
     
    Function donneladate(kelbase)
    'Connexion au frontal et interrogation de la date
        Dim conn, strConnect, rs
        Dim leSQL As String
        Set conn = CreateObject("ADODB.Connection")
        strConnect = "Provider=Microsoft.Ace.OLEDB.12.0;Data Source=" & kelbase & ";Persist Security Info=False;"
        conn.Open strConnect
        leSQL = "SELECT Version.ladate FROM Version"
        Set rs = conn.Execute(leSQL)
        rs.MoveFirst
        donneladate = rs(0)
        conn.Close
        Set conn = Nothing
    End Function
    Fonction standard de test existance d'un fichier
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
     
    Function FichierExiste(leFichier As String) As Boolean
    ' Le fichier existe ?
        Dim filesys
        Set filesys = CreateObject("Scripting.FileSystemObject")
        If filesys.FileExists(leFichier) Then
            FichierExiste = True
        End If
    End Function

    A+
    je suis preneur de vos remarques afin d'améliorer cette seconde alternative

  2. #2
    Membre régulier Avatar de Mike550
    Homme Profil pro
    Inscrit en
    janvier 2008
    Messages
    69
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : Canada

    Informations professionnelles :
    Secteur : Service public

    Informations forums :
    Inscription : janvier 2008
    Messages : 69
    Points : 94
    Points
    94

    Par défaut

    C'est vraiment parfait, il ne reste qu'à ajouter la mise à jour des connections dans le cas où la dorsale n'est pas un fichier commun à tous las utilisateurs. il suffit de copier le chemin de la dorsale dans la table appropriée dans le master avant de faire l'échange.
    Merci encore pouur ce beau cadeau.
    Mike
    @+ Mike

  3. #3
    Rédacteur

    Avatar de Tofalu
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    octobre 2004
    Messages
    9 501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Associations - ONG

    Informations forums :
    Inscription : octobre 2004
    Messages : 9 501
    Points : 32 236
    Points
    32 236

    Par défaut

    FileExists retournant un booleen, le test IF est superflu :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Function FichierExiste(leFichier As String) As Boolean
    ' Le fichier existe ?
        Dim filesys
        Set filesys = CreateObject("Scripting.FileSystemObject")
        FichierExiste = filesys.FileExists(leFichier)
    End Function
    Le coup du ping est sympa

  4. #4
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    avril 2006
    Messages
    1 074
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : avril 2006
    Messages : 1 074
    Points : 1 403
    Points
    1 403

    Par défaut

    Bonjour, j'utilise un principe similaire mais je ne suis pas sûr qu'il fonctionne avec le runtime.
    L'idée est d'utiliser deux instances access et les paramètres de ligne de commande.
    En l' absence de paramètres sur la ligne de commande, je vérifie la présence d'un fichier de mise à jour sur le serveur, si oui alors je fais une copie locale du fichier et l'ouvre dans une nouvelle instance access avec pour paramètres sur la ligne de commande la fonction à appeler et le nom complet du fichier à remplacer, et je déconnecte le frontal de la première instance access.
    En présence de paramètres(fonction à appeler et nom complet du frontal) , la fonction de remplacement est appelée, vide les paramètres de la ligne d'appel, récupère les tables paramètres du frontal, sauvegarde l'ancienne version du frontal en ".bak" et renomme la copie locale de la mise à jour avec le nom du frontal passé en paramètre, puis réaffecte à la première instance access le nouveau frontal et ferme la seconde instance.
    L'utilisateur se retrouve donc avec la nouvelle version du frontal ouverte.

  5. #5
    Membre éclairé

    Homme Profil pro
    Inscrit en
    juillet 2005
    Messages
    626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : juillet 2005
    Messages : 626
    Points : 712
    Points
    712

    Par défaut la mise à jour

    Bonjour,

    Ilank, c’est un peu à cause de tes remarques que j’ai cherché puis proposé cette alternative à ma première contribution de mise à jour, car tu disais qu’il y avait trop de chose en dur dans un script modifiable !

    Cette alternative fonctionne avec les runtime nickel,
    le seul souci c’est les utilisateurs qui n’éteignent jamais leur pc et qui laisse les frontaux ouverts.
    On peut mettre un timer sur le formulaire principal mais j’ai constaté une consommation légèrement accrue du temps machine.

    a+

  6. #6
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    avril 2006
    Messages
    1 074
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : avril 2006
    Messages : 1 074
    Points : 1 403
    Points
    1 403

    Par défaut

    Bonjour naphta,
    effectivement je me souviens de ces remarques.
    Ce qui me gênait également était l'utilisation de fichiers externes à Access.
    Ma proposition n'utilise qu'Access en revanche je ne sais pas si elle est viable en runtime.

  7. #7
    Membre éclairé

    Homme Profil pro
    Inscrit en
    juillet 2005
    Messages
    626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : juillet 2005
    Messages : 626
    Points : 712
    Points
    712

    Par défaut a pas compris

    Bonsoir

    Là j'ai pas compris ton questionnement ...
    dans cette proposition tout est dans le frontal qui se met à jour seul pas de script externe, une table et du code c'est tout.

    Les mises à jour deviennent incontournables même si on change le nom de frontal en cours d'utilisation.

    Les mises à jour ne concernent que les runtime, un accdb qui a même code et table ne peut se mettre à jour.

    tout ce que l'on trouve sur le net nécessite 2 frontaux ce qui me gênait particulièrement.

  8. #8
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    avril 2006
    Messages
    1 074
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : avril 2006
    Messages : 1 074
    Points : 1 403
    Points
    1 403

    Par défaut

    Bonjour,
    d'accord, on a des approches similaires excepté que selon moi la procédure de mise à jour proprement dite, doit se trouver dans le fichier de mise à jour et non dans le frontal, le frontal se contente de vérifier si une mise à jour est disponible si oui, il demande à être mis à jour.
    Pour faire simple, mon objectif est de pouvoir présenter à l'utilisateur la progression de la mise à jour.

  9. #9
    Futur Membre du Club
    Profil pro
    Inscrit en
    décembre 2007
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : décembre 2007
    Messages : 5
    Points : 6
    Points
    6

    Par défaut Mise à jour automatisée d’un frontal avec Batch File

    Bonjour, j'aimerais partager ma façon de faire 6 ans plus tard .

    Pour la mise à jour automatisée de ma frontal Access avec mon "back end" MySQL, j'utilise un Batch File de quelques lignes.

    Sur le bureau de mes clients, un lien est lié au Batch File pour l'ouverture de leur base de données.

    Dans le dossier où réside mon fichier accdr, j'ai les éléments suivants:

    Le fichier Batch File nommé "version.bat".

    Une fichier texte nommé version.txt >> qui contient le numéro de ma version actuelle (ie 104).

    Lorsque je lance mon Batch File, je récupère un fichier texte sur mon serveur nommé "version_serveur.txt" (ie 105). Ce fichier est télécharger dans mon dossier via une commande powershell.

    Avec la commande FC, je vérifie si les 2 fichiers sont différents via le paramètre "/L".

    Si la version est la même pour les 2 fichiers TXT (ie 104), la base de données s'ouvre immédiatement et le fichier "version_serveur.txt" est effacé.

    Si une nouvelle version est disponible, la nouvelle base de données est téléchargée via la même fonction powershell et écrase l'ancienne version. Le fichier "version.txt" est effacé et le fichier "version_serveur.txt" (ie 105) est renommé "version.txt".

    Voici mon code:
    Code Batch : 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
    @echo off
     
    REM Fond noir / texte bleu pale
    COLOR 0b
     
    ECHO.
    ECHO   Verification de la derniere version avec le serveur
    ECHO.
    REM Télécharger la dernière version dans le dossier local depuis le serveur
    powershell -command "(new-object System.Net.WebClient).DownloadFile('http://MonServeur/version_serveur.txt', 'version_serveur.txt')"
     
    REM Comparer les 2 fichiers pour la version
    FC /L version.txt version_serveur.txt > NUL
     
    REM Si la version est différente, télécharger le fichier ACCDR
    if errorlevel 1 (
    ECHO   Une nouvelle version est disponible !
    ECHO.
    ECHO   Mise a jour du logiciel...
    powershell -command "(new-object System.Net.WebClient).DownloadFile('http://VotreServeur/x.accdr', 'x.accdr')"
    REM Effacer l'ancienne version et renommer la nouvelle
    DEL version.txt
    REN version_serveur.txt version.txt
    ECHO. 
    ECHO   Ouvrir la base de donnees...
    start x.accdr
    Exit /b
    )
    REM La version serveur est la meme que la version locale
    if not errorlevel 1 (
    ECHO. 
    ECHO   Le logiciel est a jour
    ECHO. 
    ECHO   Ouvrir ACCDR
    DEL version_serveur.txt
    start x.accdr
    Exit /b
    )

    J'ai testé ce Batch File plusieurs fois et ça fonctionne comme un charme. Au plaisir d'avoir vos suggestions pour l'améliorer !

  10. #10
    Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    mars 2019
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 21
    Localisation : France, Vosges (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : mars 2019
    Messages : 2
    Points : 3
    Points
    3

    Par défaut

    Bonjour a tous !

    J'essaye de puis un bon moment a reproduire le bout de code proposé par Naphta mais je n'arrive pas à reproduire la partie "Script d'arrêt, de copie et de redémarrage"
    J'arrive bien à détecter que mon Frontale n'est pas à jour et j'arrive bien à savoir où se trouve la nouvelle version mais le remplacement du fichier ne se fait pas...

    De plus à quoi correspond ces lignes:
    Code Batch : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    """%~f1"" ""%~f2.%3""
    "%~f2.%4"
    IF EXIST ""%~f2.%4"" GOTO CHECKLOCKFILE

    merci de vos réponses

  11. #11
    Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    mars 2019
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 21
    Localisation : France, Vosges (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : mars 2019
    Messages : 2
    Points : 3
    Points
    3

    Par défaut

    Rebonjour !

    Après quelques essais j'ai réussi à trouver mon problème !
    il suffisai de remplacer cette ligne:
    Citation Envoyé par naphta Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    s = s & "COPY " & VerificationMaJ & " " & Application.CurrentProject.FullName & vbCrLf
    par celle ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    s = s & "COPY " & Chr(34) & VerificationMaJ & Chr(34) & " " & Chr(34) & Application.CurrentProject.FullName & Chr(34) & vbCrLf

Discussions similaires

  1. Mise à jour automatisée d’une frontal
    Par sylv20 dans le forum VBA Access
    Réponses: 4
    Dernier message: 22/09/2011, 18h13
  2. [AC-2003] Automatiser une requete mise à jour
    Par BqiKo dans le forum Access
    Réponses: 1
    Dernier message: 30/07/2009, 15h12
  3. Réponses: 1
    Dernier message: 26/03/2009, 17h17
  4. Automatiser la mise à jour de drivers.
    Par Radio_8 dans le forum Windows XP
    Réponses: 5
    Dernier message: 02/08/2007, 12h36
  5. Automatiser la mise à jour de la bD SQL SERVER from Access
    Par Nadaa dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 11/11/2003, 15h23

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