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 :

Comment choisir mon fichier .ini au lancement de mon application ?


Sujet :

VBA Access

  1. #1
    Membre éclairé Avatar de dumas.blr
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2010
    Messages
    598
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2010
    Messages : 598
    Points : 879
    Points
    879
    Par défaut Comment choisir mon fichier .ini au lancement de mon application ?
    Bonjour,

    J'ai développé une application qui, chez l'utilisateur, comporte un back-end sur un serveur et un frontal sur chaque poste client.
    L'adressage des répertoires et emplacement de bases sont paramétrés très classiquement dans un fichier config.ini

    Pour des besoins de maintenance, j'ai sur mon portable le front-end et le back-end au même endroit. Afin de ne pas faire trop de manipulation hasardeuse, j'ai cloné le config.ini dans un config_locale.ini et je pointe sur le bon fichier .ini grace à un module déclaratif, dont je joint le code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Option Compare Database
     
    ' Sert à pointer sur le bon fichier de configuration
    Public Const NomFichConfig = "Config_Locale.ini"
    'Public Const NomFichConfig = "Config.ini"
     
    Public Function Get_NomFichConfig() As String
        Get_NomFichConfig = TempVars("NomFicConfigIni")
    End Function
    je n'ai qu'à mettre en commentaire la ligne adéquate pour pointer sur le bon fichier .ini, qui est stocké dans une variable globale.

    J'aimerais trouver une solution plus élégante pour booter sur le bon fichier au démarrage, sans avoir à manipuler le code VBA.

    Est-ce que quelqu'un auriat une idée à me proposer ?

    En vous remerciant par avance pour vos conseils éclairés

  2. #2
    Membre expérimenté
    Avatar de mumen
    Homme Profil pro
    Développement à façon multisecteur.
    Inscrit en
    Mars 2004
    Messages
    566
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Développement à façon multisecteur.

    Informations forums :
    Inscription : Mars 2004
    Messages : 566
    Points : 1 381
    Points
    1 381
    Par défaut
    Salut dumas

    L'adressage des répertoires et emplacement de bases sont paramétrés très classiquement dans un fichier config.ini
    Personnellement j'utilise plutôt la base de registres. Ce n'est pas ta question, mais c'est bien mieux, car tu trouves ton info indépendamment de ton dossier d'installation.

    Voici : j'ai un choix dans mon application qui permet de changer la connexion au moyen d'une boîte à fichiers. Au passage, ce choix me propose les connexions habituelles sur ce poste et pour le chemin dans lequel est installé le frontal.

    Ce choix n'est disponible que pour le développeur. Il me permet de passer rapidement du mode développement en local au mode "réel" sur le serveur. De plus, ce choix effectue certains réglages du frontal liés à la base data.

    Il me sert aussi dans certains cas, pour un administrateur qui voudrait s'amuser à copier coller la base data sur son portable et décider de se connecter soit au au serveur soit sur le portable. C'est chaud, mais il est supposé être au courant, habituellement, c'est le boss !

    Autre chose, ce choix est lancé par défaut si la connexion est cassée. Par exemple si un admin change l'emplacement de la base data, le lancement de l'application va ouvrir la boîte de dialogue fichiers pour permettre de la relocaliser. La cerise sur le gâteau, c'est que ce choix s'ouvre aussi lors de la première installation. Si le frontal est déplacé, le choix est aussi proposé.

    Tu le vois, j'ai pas mal bossé dessus, mais maintenant, je n'y pense plus pour aucune de mes applications, quelles que soient les conditions.

  3. #3
    Membre éclairé Avatar de dumas.blr
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2010
    Messages
    598
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2010
    Messages : 598
    Points : 879
    Points
    879
    Par défaut
    Bonjour Mathieu

    C'est une bonne idée; J'ai toujours un peu de réticence à utiliser la base de registre car on se retrouve très vite sur des problématique de droit. Mais je veux bien tenter le coup.
    Si ce n'est pas incorrect, pourrais-tu nous communiquer ta partie de code qui met à jour la base et choisit le boot au démarrage ?

    Autre chose, ce choix est lancé par défaut si la connexion est cassée. Par exemple si un admin change l'emplacement de la base data, le lancement de l'application va ouvrir la boîte de dialogue fichiers pour permettre de la relocaliser. La cerise sur le gâteau, c'est que ce choix s'ouvre aussi lors de la première installation. Si le frontal est déplacé, le choix est aussi proposé.
    Je le fais aussi, au moment du lancement et à la première install. Mais c'est justement le problème, car le chemin est dans mon fichier ini ...

    Merci par avance

  4. #4
    Membre expérimenté
    Avatar de mumen
    Homme Profil pro
    Développement à façon multisecteur.
    Inscrit en
    Mars 2004
    Messages
    566
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Développement à façon multisecteur.

    Informations forums :
    Inscription : Mars 2004
    Messages : 566
    Points : 1 381
    Points
    1 381
    Par défaut
    Je confirme les problèmes de droits sur la base de registres. C'est parfois pénible. Je suis passé récemment de LOCAL_MACHINE à CURRENT_USER à cause de ça. D'autre part j'emploie GetObject("winmgmts:\\.\root\default:StdRegProv"), car la méthode classique (j'ai un trou) ne permet pas l'énumération.

    Quand à mon code, il est complètement imbriqué dans ma bibliothèque et c'est assez délicat à exposer clairement. Je vais voir ce que je peux faire.

    Que stockes tu dans ton fichier ini :

    Ton chemin de base data et celui des icônes ? c'est tout ?

    Je crois que pour les icônes, tu devrais chercher un moyen de les stocker dans la base. Quitte à les déployer automatiquement dans le dossier courant du frontal. Ça évitera ces embrouilles.

  5. #5
    Membre expérimenté
    Avatar de mumen
    Homme Profil pro
    Développement à façon multisecteur.
    Inscrit en
    Mars 2004
    Messages
    566
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Développement à façon multisecteur.

    Informations forums :
    Inscription : Mars 2004
    Messages : 566
    Points : 1 381
    Points
    1 381
    Par défaut
    Voici la première procédure : LocaliserDatabase

    Pour ouvrir la base data, je cherche le nom de celle ci (son nom canonique, pas son nom sur le disque) dans la base de registre, pour la base user courante (son nom de fichier sur le disque = CurrentDb.name).

    Sur mon poste :

    Localiser la base commune à tous mes dévs :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ? LocaliserDatabase( "C:\Anima_Développement\V2\Tallendier\Gestion.Mdb", "Système_Data")
    C:\Anima_Développement\V2\Système_Data.mdb
    Localiser la base data de l'application :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ? LocaliserDatabase( "C:\Anima_Développement\V2\Tallendier\Gestion.Mdb", "Gestion_Data")
    C:\Anima_Développement\V2\Tallendier\Gestion_Data.mdb
    C:\Anima_Développement\V2\Tallendier\Gestion_Data2.mdb
    \\Serveur\Données\GestionAnima\Gestion_Data.mdb
    Sur site :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ? LocaliserDatabase( "C:\ProgramFiles\Anima\Gestion.Mdb", "Gestion_Data")
    \\Serveur\Données\GestionAnima\Gestion_Data.mdb

    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 LocaliserDatabase(prmstrBaseUser As String, prmstrBaseData As String) As String
        Dim strConnection       As String
        Dim blnBaseExiste       As Boolean
        Dim blnDéfaut           As Boolean
        Dim strErreur           As String
     
        strConnection = Rga_CheminBaseData(prmstrBaseUser, prmstrBaseData)
        Do
            If strConnection = "" Then
                strConnection = LocaliserDatabase_ConnectionAutomatique(prmstrBaseUser, prmstrBaseData)
                If strConnection = "" Then
                    strConnection = LocaliserDatabase_BoîteDialogue(prmstrBaseUser, prmstrBaseData)
                    If strConnection = "" Then
                        Exit Do
                    End If
                End If
            End If
            If ErrDir(strConnection) Then
                Beep
                MsgBox "La Connection '" & strConnection & "' est inaccessible"
                strConnection = ""
            ElseIf BaseDataReconnue(strConnection, strErreur) = False Then
                Beep
                MsgBox strErreur
                strConnection = ""
            End If
        Loop While strConnection = ""
        LocaliserDatabase = strConnection
        If strConnection > "" Then
            Rga_MémoriseCheminBaseData prmstrBaseUser, prmstrBaseData, strConnection
        End If
    End Function
    Rga_CheminBaseData et Rga_MémoriseCheminBaseData effectuent la mémorisation spécifique.

    LocaliserDatabase_ConnectionAutomatique correspond à certains automatismes, comme la localisation de Système_Data qui est toujours dans le répertoire parent.

    LocaliserDatabase_BoîteDialogue fait la recherche dans la base de registres pour pouvoir proposer de choisir sur liste ou par boîte de dialogue de recherche de fichier.

    BaseDataReconnue va tester une propriété pour éviter que les gens ne se connectent par erreur à leur base user...

    ...Je peux continuer si tu crois en faire quelque chose...

  6. #6
    Membre éclairé Avatar de dumas.blr
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2010
    Messages
    598
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2010
    Messages : 598
    Points : 879
    Points
    879
    Par défaut
    Bonjour Mathieu,

    Merci beaucoup pour ces premiers elements de code
    ...Je peux continuer si tu crois en faire quelque chose...
    Si tu peux retrouver les procédures appelées, je pense pouvoir en faire quelque chose. C'est surtout le boot à partir de la base de registre qui m'intéresserait (... enfin, si tu veux bien le communiquer )

    Que stockes tu dans ton fichier ini :

    Ton chemin de base data et celui des icônes ? c'est tout ?
    Mon fichier .ini contient plein d'autres éléments
    Outre les répertoires de stockage (back-end, icones, douments attachés, photos), il contient une section utilisée pour le rafraichissement du back-end, une section application contenant les emplacement des programmes externes (webcam, convertisseur pdf ...), une section réseau contenant les login/mdp des serveurs, une section autre contenant divers paramétrages, etc .
    Je crois que pour les icônes, tu devrais chercher un moyen de les stocker dans la base
    Eh non ! Ca ne peut pas marcher dans le cas où tes icônes sont chargées dans un contrôle de type image placé dans un formulaire tabulaire, où je dois charger dynamiquement mes icone en fonction de l'item du menu.
    Pourquoi je fais ça ? ça me permet d'utiliser la barre de menu comme un ruban. En plus ça limite la taille de la base, et permet une maintenance facilitée des ressources.

  7. #7
    Membre expérimenté
    Avatar de mumen
    Homme Profil pro
    Développement à façon multisecteur.
    Inscrit en
    Mars 2004
    Messages
    566
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Développement à façon multisecteur.

    Informations forums :
    Inscription : Mars 2004
    Messages : 566
    Points : 1 381
    Points
    1 381
    Par défaut
    Ok pour le code, je fais suivre le registre.

    Sinon, en règle générale, je déteste avoir des trucs hors de ma base de données, c'est pour ça que je te questionne sur ton ini. Je suppose que je mettrai tout ça dans une table paramètres. Mais bon comme on dit chez moi "Chacun y fait à s'mod" !

  8. #8
    Membre expérimenté
    Avatar de mumen
    Homme Profil pro
    Développement à façon multisecteur.
    Inscrit en
    Mars 2004
    Messages
    566
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Développement à façon multisecteur.

    Informations forums :
    Inscription : Mars 2004
    Messages : 566
    Points : 1 381
    Points
    1 381
    Par défaut
    Pour la manipulation des registres je suis passé au moins par quatre méthodes différentes glanées ici et la sur le net. Voici ma dernière source en date. Elle remonte à... cette semaine. Elle a l'avantage de ne pas faire appel à l'API Windows, de permettre l'énumération et d'être hyper simple à implémenter. Je ne connais pas grand chose aux APIs, mais ce truc là, 'winmgmts' semble marcher sur toutes les machines tant qu'on ne touche pas aux descripteurs de sécurité (vois le lien dans le code)... Evidemment je touche du bois.

    Attention, ce n'est pas une référence, tu verras des 'Stop' concernant le dépistage. Mais c'est fonctionnel. Au moins, si tu veux creuser mon code de localisation de base de données, tu verras mon interfaçage.

    Concernant la variable TopKey, j'ai le projet de l'enlever et de remplacer ça par les abréviations 'HKCU', 'HKLM', etc... Ça simplifierait.

    Je n'ai implémenté que ce dont j'avais besoin. Je n'ai besoin d'avoir accès qu'aux valeurs. Pour avoir accès aux clés, il te faudra le développer. En fait à chaque fois que j'écris le mot Registre dans un nom de procédure, il faut comprendre ValeurRegistre et développer l’équivalent ClefRegistre

    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
    '
    ' http://msdn.microsoft.com/en-us/library/aa393664(VS.85).aspx
    '
    Private Function ObjetRegistre() As Object
        Set ObjetRegistre = GetObject("winmgmts:\\.\root\default:StdRegProv")
    End Function
     
    Public Function LireRegistre(TopKey As Long, SubKey As String, ValueName As String) As Variant
        Dim varValeur As Variant
        With ObjetRegistre
            .GetStringValue TopKey, SubKey, ValueName, varValeur
        End With
        LireRegistre = varValeur
    End Function
     
    Public Function ExisteRegistre(TopKey As Long, SubKey As String, ValueName As String) As Boolean
        ExisteRegistre = Not IsNull(LireRegistre(TopKey, SubKey, ValueName))
    End Function
     
    Public Function EffaceRegistre(TopKey As Long, SubKey As String, ValueName As String)
        With ObjetRegistre
            .DeleteValue TopKey, SubKey, ValueName
        End With
    End Function
     
    Public Sub EcrireRegistre(TopKey As Long, SubKey As String, ValueName As String, prmvarValeur As Variant)
        Dim var
        With ObjetRegistre
            var = .CreateKey(TopKey, SubKey)
            If var <> 0 Then
                Stop
            End If
            var = .SetStringValue(TopKey, SubKey & "\", ValueName, prmvarValeur)
            If var <> 0 Then
                Stop
            End If
        End With
    End Sub
     
    Public Function EnumèreRegistre(ByVal lTopKey As Long, sSubKey As String) As Collection
        Dim varSousClés         As Variant
        Dim varClé              As Variant
     
        Set EnumèreRegistre = New Collection
     
        With ObjetRegistre
            .EnumKey lTopKey, sSubKey, varSousClés
        End With
     
        If Not IsNull(varSousClés) Then
            For Each varClé In varSousClés
                EnumèreRegistre.Add (varClé)
            Next
        End If
    End Function
    Concernant ces histoires de droits et de redirections automatiques, c'est bizarre. En fonction des modes d'appel au registre que j'ai testé dans le temps et des versions de Windows, j'ai eu des écritures de clés dans le registre intermédiaire WowXXXX (Windows on Windows), dans un autre registre planqué loin de tout et même aussi là ou je le voulais.

    Avec cette méthode, j'écris là ou ça doit écrire, mais j'ai du changer ma TopKey de HKLM à HKCU parce que j'avais une interdiction... Je ne maîtrise rien de ce côté là et, en l'absence de source compréhensible, je vais faire copmme d'habitude : tester en vrai... chez mes clients... Pas cool, je sais.

  9. #9
    Membre expérimenté
    Avatar de mumen
    Homme Profil pro
    Développement à façon multisecteur.
    Inscrit en
    Mars 2004
    Messages
    566
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Développement à façon multisecteur.

    Informations forums :
    Inscription : Mars 2004
    Messages : 566
    Points : 1 381
    Points
    1 381
    Par défaut
    Le milieu du code, c'est si tu le motive et si tu es motivé.

    Il y a des générations de modifications ponctuelles et opportunistes. Ce n'est pas très lisible, des procédures appellent des procédures en s'enchaînant, j'ai du mal moi même à m'y retrouver. J'ai déjà commencé à clarifier un peu mes nommages mais si je veux te le fournir, je dois bosser un peu quand même.

    Dis moi, on verra demain !

    Bonsoir

    PS: J'oubliais une précision pour la TopKey et l'utilisation des procédures !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ? LireRegistre(rga_TopKey, Rga_Racine & "MaClef", "MaValeur")
    Lira la valeur 'MaValeur' dans la clef de registre 'HKEY_CURRENT_USER\SOFTWARE\NakeData\MaClef\'

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Public Function rga_TopKey() As Long
        Const HKEY_CURRENT_USER = &H80000001
        Const HKEY_LOCAL_MACHINE = &H80000002
     
        rga_TopKey = HKEY_CURRENT_USER
     
    End Function
     
    Function Rga_Racine() As String
        Rga_Racine = "SOFTWARE\NakeData\"
    End Function

  10. #10
    Membre éclairé Avatar de dumas.blr
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2010
    Messages
    598
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2010
    Messages : 598
    Points : 879
    Points
    879
    Par défaut
    SUPER !!!

    Pas de problème, il faut bien que les ch'tis se reposent ...

  11. #11
    Invité
    Invité(e)
    Par défaut
    Bonjour

    Peut-être en plus simple en utilisant la fonction Environ qui te permettra de connaitre l'user du PC :

    A partir du résultat tu fais un test pour prendre le bon fichier Ini (en alimentant une variable au lieu d'une constante).

    Philippe

  12. #12
    Membre expérimenté
    Avatar de mumen
    Homme Profil pro
    Développement à façon multisecteur.
    Inscrit en
    Mars 2004
    Messages
    566
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Développement à façon multisecteur.

    Informations forums :
    Inscription : Mars 2004
    Messages : 566
    Points : 1 381
    Points
    1 381
    Par défaut
    Salut Jean Yves

    Avant de te balancer du code, il faut que tu saches ou tu vas ! Je te fais un descriptif vu de l'extérieur de ma technique de référencement des attaches. Attention, c'est touffu.

    Comme je te l'avais indiqué, je gère les attaches en fonction de la base locale qui appelle la base data.

    Voici un extrait de ma base de registre qui montre bien ce qui se passe :



    Nous sommes dans HKCU\Software\Nakedata\

    • La première clef visible est le chemin plus le nom complet de la base locale dont les antislashs ont été transformés en slashs.
    • Ensuite, comme on peut attacher plusieurs bases data sur une même base locale, il y a la clef Databases\.
    • Vient ensuite la clef tirée du nom canonique de la base data, ici Gestion_Data\. Cette clef comporte la valeur de connexion par défaut actuelle : Connection (à droite). C'est cette valeur qui est obtenue de l'utilisateur par la boîte de dialogue fichiers.
    • Les trois clefs qui sont liées à la clef précédente représentent l'historique des connections qui indique ici, que j'ai une autre fois connecté une copie de la base Gestion_Data.mdb qui était sur mon bureau et une autre sur un serveur. Si je demande une reconnexion ou que la connexion est perdue, c'est cette liste qui servira à proposer un choix de connexions valides.


    • Enfin, on voit que la base locale du début est aussi connectée à une autre base data, la base Système_Data, qui est commune à toutes les applications en développement. Cette base est supposée être dans le répertoire parent de l'application (ainsi que la bibliothèque), ce qui permet d'essayer de la connecter automatiquement.


    La vue globale qui suit montre plusieurs choses.
    • J'avance bien dans mon travail sur le RunTime puisque mon application (recopiée from scratch et entièrement en code) depuis Access 97 sur Access 2010 est en mesure de se connecter sur la même base de données Gestion_Data. Tous les formulaires s'ouvrent et fonctionnent pour le moment à 100%. Si une marche, alors virtuellement toutes les autres marcheront (toutes ne sont pas là, loin s'en faut). Avec ça je vais pouvoir distribuer du RunTime à gogo. I am api, a-p-i !!!

    • Les autres entrées de niveau 'bases locales' montrent des noms de clients et le nom de leur application. On voit que je suis client de moi même pour la gestion (Anima). On voit que le générateur des applications (Analyste) est un client du système comme les autres, d'ailleurs il se génère aussi.






    D'autres choses viennent se greffer naturellement sur le registre ainsi utilisé :

    • La clef de niveau 'bases locales' me sert à conserver le dernier utilisateur et la date de login, ainsi que certaines propriétés de la base.

    • De même, la clef NakeData\ comporte un identifiant unique pour le PC (ici pour le couple PC+User Windows, HKCU oblige). Cet identifiant permet de rapatrier systématiquement les infos du PC dans la base data. Oui, c'est du luxe.



    Alors... T'en veux ?
    Images attachées Images attachées   

  13. #13
    Expert éminent sénior
    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 : 46
    Localisation : France, Ille et Vilaine (Bretagne)

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

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

    Je reprends la demande initiale qui consistait à charger une variable global au démarrage. Sans changer complétement ton code. Pour moi la solution la plus simple est de tester l'existence du fichier local et de charger en fonction.

    Si fichier locale existe => chargement de la variable avec locale.
    Si non => chargement de la variable normale.

    Comment tester l'existence d'un fichier ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Function TestExiste(strChemin As String) As Boolean
     
        If Dir(strChemin) = "" Then
            TestExiste = False
        Else
            TestExiste = True
        End If
     
    End Function
    il suffit d'ajouter la fonction de test.

    @++

  14. #14
    Membre éclairé Avatar de dumas.blr
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2010
    Messages
    598
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2010
    Messages : 598
    Points : 879
    Points
    879
    Par défaut
    Salut Mathieu,

    Ça me parait vraiment intéressant comme principe, surtout pour mémoriser les dernière connexions. Ça me permettrait de gérer les sauvegardes automatiques que je fais lors de la fermeture de l'appli.
    Par contre, j'ai un peu de mal à imaginer comment on peut centraliser ça sur un serveur, d'autant plus que là, mon back-end est sut un NAS ... donc sans OS Windows; ce qui signifie que la base de registre doit être dupliquée sur chaque poste client.
    Ça me parait donc parfait lorsqu'on est dans un processus de développement , car la bascule sur le bon back-end et sur les bons paramètres est automatique

    Toutefois, n'y a-t'il pas un problème si, lorsque tu déploie une appli, certains postes n'ont pas l'autorisation du Regedit, alors que d'autres l'ont ? Est-ce que le non-profil admin local autorise quand même un insert/MAJ dans les HKCU ?
    Enfin, comment initialises-tu l'entrée dans la base de registre ? par un script .bat ou dans un module boot que tu déploie dans chaqeu appli et qui s'exécute au démarrage à chaque fois ?


    Donc ... j'en veux bien ... Et pas seulement pour moi

    Je pense même que cela mériterait une publication dans un tuto qui mériterait parfaitement sa place. Qu'en penses-tu ?

  15. #15
    Invité
    Invité(e)
    Par défaut
    Bonjour

    J'ai l'impression que vous voulez utiliser une enclume pour enfoncer un clou.

    La solution de Dolphy35 ou la mienne sont simples à mettre en oeuvre, pourquoi ne pas les tester ?

    Philippe

  16. #16
    Membre éclairé Avatar de dumas.blr
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2010
    Messages
    598
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2010
    Messages : 598
    Points : 879
    Points
    879
    Par défaut
    Bonjour Philippe,

    Je suis bien conscient que cette solution est très sophistiquée, mais le sujet proposée par Mathieu dépasse largement le périmètre initial, et m'intéresse pour d'autres problématiques.

    D'ailleurs, je pense que cette implémentation mérite d'être partagée auprès de l'ensemble des membres du forum, et devrait faire l'objet d'un tutoriel à lui tout seul; c'est d'ailleurs ce que j'avais suggéré. Qu'en penses-tu ?

    En effet, la problématique de test/intégration/distribution des applications est un sujet qui peut intéresser un nombre important de développeurs, qu'ils soient professionnels ou amateurs éclairés. Si ce topic, qui serait dans la continuité de l'optique de donner un aspect professionnel à nos applications, peut conduire à proposer un élément supplémentaire dans une boite à outil, alors le but de partager nos expériences passées et d'aider les autres (chose que je retrouve parfaitement dans ce forum), est atteint.

    Fais nous part de tes réflexions et à bientôt

  17. #17
    Membre éclairé Avatar de dumas.blr
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2010
    Messages
    598
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2010
    Messages : 598
    Points : 879
    Points
    879
    Par défaut
    Bonjour Philippe et Dolphy35,

    Pour répondre à vos topic précédents, J'ai développé, en attendant, un biais simple, qui reprend partiellement vos suggestions.

    Le principe :
    Dans le dossier de l'application, je place un fichier que je nomme Boot.ini par ex.
    Ce boot contient une entrée CONFIG, qui me précise le fichier de configuration susceptible de prendre la place du fichier config.ini
    A l'ouverture de l'application, je teste l'existence du fichier boot.ini. Si celui-ci est absent, alors c'est le config.ini qui est chargé. De même si le fichier de config précisé dans le boot.ini est absent, alors c'est encore le config.ini qui est chargé.

    Le test Environ("UserName") est intéressant dans le cas ou l'on souhaite tester son application sur plusieurs PC, mais est plus compliqué à mettre en oeuvre,si l'on souhaite tester, sur le même PC l'application (à moins de créer une session dédiée), ce qui arrive quand on va chez l'utilisateur avec son PC et que l'on peut se connecter à son serveur, et qu'on est chez soi et que la config du client n'est pas disponible. Dans ce cas, le plus pratique est d'avoir une copie locale du back-end.

  18. #18
    Membre expérimenté
    Avatar de mumen
    Homme Profil pro
    Développement à façon multisecteur.
    Inscrit en
    Mars 2004
    Messages
    566
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Développement à façon multisecteur.

    Informations forums :
    Inscription : Mars 2004
    Messages : 566
    Points : 1 381
    Points
    1 381
    Par défaut
    Bonjour !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    J'ai l'impression que vous voulez utiliser une enclume pour enfoncer un clou.
    Oui, c'est bien ce qu'il me semble .

    • Néanmoins, j'ai envie d'aller jusqu'au bout de ce que j'ai commencé et Jean Yves aussi. Dites moi SVP si ce sujet doit trouver un autre place plus cohérente dans les forums, si je le termine ici ou même en privé !

    • Pourquoi pas en faire un module propre et un tuto ? nous dit Jean Yves. J'en suis tellement proche, que pourquoi pas, j'y ai pensé. Je dois même dire que pour une pour une fois que j'arrive à isoler dans mes codes quelque chose d'utile, de sans doute original et suffisamment universalisable, l'idée me plait assez, même s'il y a du boulot et je n'ai pas d'expérience en la matière de création de tutoriel.
      A ce point de la réflexion, une question s'impose : comment savoir sir un tel projet à des chances de servir à d'autres ?

    Voila l'état des choses pour moi. Voulez vous bien me donner votre avis sur ces deux questions ?

  19. #19
    Expert éminent sénior
    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 : 46
    Localisation : France, Ille et Vilaine (Bretagne)

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

    Informations forums :
    Inscription : Octobre 2004
    Messages : 4 373
    Points : 11 218
    Points
    11 218
    Par défaut
    Citation Envoyé par MathieuT Voir le message
    • Néanmoins, j'ai envie d'aller jusqu'au bout de ce que j'ai commencé et Jean Yves aussi. Dites moi SVP si ce sujet doit trouver un autre place plus cohérente dans les forums, si je le termine ici ou même en privé !
    Rien ne t’empêche d'aller jusqu'au bout. On a juste voulu recentrer par rapport à l question d'origine afin d'aider ceux qui veulent une solution simple. Mais si JY veux aller plus loin dans la solution, libre à lui et à toi
    Par contre en public, car en privé cela n'aide pas les autres

    Citation Envoyé par MathieuT Voir le message
    • Pourquoi pas en faire un module propre et un tuto ? nous dit Jean Yves. J'en suis tellement proche, que pourquoi pas, j'y ai pensé. Je dois même dire que pour une pour une fois que j'arrive à isoler dans mes codes quelque chose d'utile, de sans doute original et suffisamment universalisable, l'idée me plait assez, même s'il y a du boulot et je n'ai pas d'expérience en la matière de création de tutoriel.
      A ce point de la réflexion, une question s'impose : comment savoir sir un tel projet à des chances de servir à d'autres ?

    Voila l'état des choses pour moi. Voulez vous bien me donner votre avis sur ces deux questions ?
    Présente une maquette à l'équipe de rédaction
    http://office.developpez.com/equipe/

    @++

  20. #20
    Membre expérimenté
    Avatar de mumen
    Homme Profil pro
    Développement à façon multisecteur.
    Inscrit en
    Mars 2004
    Messages
    566
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Développement à façon multisecteur.

    Informations forums :
    Inscription : Mars 2004
    Messages : 566
    Points : 1 381
    Points
    1 381
    Par défaut
    Je voudrais faire le point avec Jean Yves

    Ça me permettrait de gérer les sauvegardes automatiques que je fais lors de la fermeture de l'appli.
    Je ne suis pas certain que l'outil assimile cette possibilité.

    Par contre, j'ai un peu de mal à imaginer comment on peut centraliser ça sur un serveur
    Non, ce n'est pas centralisé, je ne l'ai pas expliqué correctement, c'est la base de registre du poste, sur chaque poste. Si tu vois autant de clef d'applications sur mon poste, c'est que j'ai montré quelque chose de trop détaille, j'ai dessus des tas d'applications en développement et j'ai été trop disert dans mon explication. C'es moi qui suis touffu , pas la fonctionnalité ! La réponse pour un cas comme tu veux le résoudre correspond au premier extrait affiché, mais sans la base supplémentaire Système_Data. Disons qu'avec le recul, je l'expliquerais autrement !

    Toutefois, n'y a-t'il pas un problème si, lorsque tu déploie une appli, certains postes n'ont pas l'autorisation du Regedit, alors que d'autres l'ont ? Est-ce que le non-profil admin local autorise quand même un insert/MAJ dans les HKCU ?
    C'est la bonne question. Je dois encore trouver cette réponse.

    Enfin, comment initialises-tu l'entrée dans la base de registre ? par un script .bat ou dans un module boot que tu déploie dans chaque appli et qui s'exécute au démarrage à chaque fois ?
    Dans le module déclenché en VBA à l'autoexec, tu demandes la chaîne de connexion au LocaliseDatabase(...). Avec cette chaîne, tu vas ensuite vérifier ou changer tes attaches comme tu fais habituellement ou bien tu vas la passer à un OpenDatabase.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    VérifierAttaches LocaliseDatabase( CurrentDb.Name, "Gestion_Data")
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Dim db as DAO.Database
    Set db= OpenDatabase( LocaliseDatabase( CurrentDb.Name, "Gestion_Data"))
    La procédure :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Public Function LocaliseDatabase( NomCompletDeLaBaseLocale as String, NomCanoniqueDeLaBaseData as String) as String
    Est à priori le principal point public de branchement pour faire tout ce que je t'ai décrit. Il faut y ajouter une procédure pour l'initialisation de la base data lancé une seule fois par base data qui y inscrit une propriété "NomCanonique=xyz", et une autre procédure pour le changement manuel de connexion qui présente le menu par énumération. C'est tout je crois.

    Voila. En plus d'aider efficacement dans les situations mouvantes de développement (ta problématique initiale, le clou !) cela facilite le déploiement des postes, le déplacement possible du chemin de la base centrale et cela fiabilise la connexion à une base centrale adéquate par un utilisateur novice.

    Tu es bien sur que cela correspond à un besoin réel et qu'une solution plus simple telles que vues ici ne couvrirait pas aussi correctement ?

Discussions similaires

  1. [Débutant] Problème fichier.ini au lancement de l'application
    Par FranckM57 dans le forum VB.NET
    Réponses: 8
    Dernier message: 10/03/2015, 21h47
  2. Réponses: 6
    Dernier message: 20/01/2015, 09h09
  3. Réponses: 8
    Dernier message: 26/08/2006, 01h22
  4. Réponses: 7
    Dernier message: 10/07/2006, 17h33
  5. Réponses: 9
    Dernier message: 04/05/2006, 17h33

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