Gérer des paramètres d’application
Votre application Access doit généralement stocker des paramètres pour son fonctionnement : coordonnées de l’entreprise, options diverses. Il y a plein de manières de gérer ces paramètres, pourquoi ne pas utiliser une table ?
Le principe
L’idée consiste à créer une table qui stockera tous les paramètres de l’application, comme dans l’exemple ci-dessous.
Quelques remarques :
- Il s’agit d’une table de paramètres bruts. L’idée est qu’elle soit très évolutive (on doit pouvoir rajouter facilement des paramètres, sans modifier l’application). D’où le fait que je n’ai pas créé de champs
Nom Entreprise
,Adresse
,CP
, etc. mais plutôt des lignes. Dans une « vraie table » des entreprises, j’aurais créé des champs, bien sûr. - En résumé : la table n’aura que 2 champs, quel que soit le nombre de paramètres.
- J’ai nommé certains paramètres avec un « . » comme
Entreprise.Nom
. Il s’agit juste d’une convention pour organiser les paramètres. On pourrait aussi créer une colonneCatégorie
, mais je ne souhaite pas alourdir le modèle à ce stade.
Le code
La table peut être manipulée manuellement, comme n’importe quelle table Access. Mais il sera plus pratique de gérer son accès au travers de quelques fonctions ou procédures VBA. De cette manière, la table deviendra transparente pour l’application elle-même. Recopiez tout le code qui suit, dans un module standard de votre base de données :
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 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 |
Option Explicit Option Compare Database ' --- ' CONSTANTES ' --- ' Public Const PARAM_TABLE As String = "tbl Paramètres" Public Const PARAM_NAME As String = "Nom Paramètre" Public Const PARAM_VALUE As String = "Valeur Paramètre" ' --- ' CREATION DE LA TABLE DES PARAMETRES ' --- ' Sub CreateParamTable() Dim strTable As String Dim strSQL As String ' Vérifier si la table de paramètres existe On Error Resume Next strTable = CurrentDb.TableDefs(PARAM_TABLE).Name If Err = 0 Then Exit Sub If MsgBox("La table de paramètres n'existe pas." & vbCrLf _ & "Souhaitez-vous la créer ?", _ vbQuestion + vbYesNo + vbDefaultButton2) = vbNo Then Exit Sub End If On Error GoTo CreateTableErr strSQL = StringFormat( _ "CREATE TABLE [{0}] (" _ & "[{1}] TEXT(100) PRIMARY KEY," _ & "[{2}] TEXT(255))", _ PARAM_TABLE, PARAM_NAME, PARAM_VALUE) CurrentDb.Execute strSQL Access.Application.RefreshDatabaseWindow MsgBox "Table créée.", vbInformation Exit Sub CreateTableErr: MsgBox "Erreur : " & Err.Number & vbCrLf & Err.Description, _ vbExclamation Exit Sub End Sub ' --- ' ECRITURE D'UN PARAMETRE ' --- ' Sub SetParam( _ ByVal strParamKey As String, _ ByVal varValue As Variant) ' Ouverture de la table On Error GoTo SetParamErr Dim rst As DAO.Recordset Set rst = CurrentDb.OpenRecordset(PARAM_TABLE, dbOpenDynaset) ' Recherche du paramètre (s'il existe) rst.FindFirst StringFormat("[{0}] = '{1}'", PARAM_NAME, strParamKey) If rst.NoMatch Then rst.AddNew Else rst.Edit End If ' Ecriture du paramètre et de sa valeur rst(PARAM_NAME) = UCase(strParamKey) rst(PARAM_VALUE) = Nz(varValue, "") rst.Update rst.Close Set rst = Nothing Exit Sub SetParamErr: MsgBox "Erreur : " & Err.Number & vbCrLf & Err.Description, _ vbExclamation Exit Sub End Sub ' --- ' LECTURE D'UN PARAMETRE ' --- ' Function GetParam( _ ByVal strParamKey As String, _ Optional ByVal varDefault As Variant = "") _ As Variant ' Valeur du paramètre On Error GoTo GetParamErr GetParam = Nz(DLookup( _ "[" & PARAM_VALUE & "]", _ PARAM_TABLE, _ "[" & PARAM_NAME & "] = '" & UCase(strParamKey) & "'"), _ varDefault) Exit Function GetParamErr: MsgBox "Erreur : " & Err.Number & vbCrLf & Err.Description, _ vbExclamation Exit Function End Function ' --- ' SUPPRESSION D'UN PARAMETRE ' --- ' Sub DelParam(ByVal strParamKey As String) On Error GoTo DelParamErr CurrentDb.Execute StringFormat( _ "DELETE * FROM [{0}] WHERE [{1}] = '{2}'", _ PARAM_TABLE, _ PARAM_NAME, _ UCase(strParamKey)) Exit Sub DelParamErr: MsgBox "Erreur : " & Err.Number & vbCrLf & Err.Description, _ vbExclamation Exit Sub End Sub |
Explications
Le code VBA contient 4 fonctions ou procédures :
CreateParamTable
Cette procédure vérifie si la table de paramètres existe, et propose de la créer sinon. Le plus simple est donc d’appeler ce bloc de code une fois, et la table sera prête. Si le nom de la table ou de ses champs ne vous conviennent pas (vous êtes exigeant, dites !), vous pouvez modifier les constantes en début de module.SetParam
Cette procédure ajoute un nouveau paramètre dans la table, ou met à jour un paramètre existant.GetParam
Cette fonction lit un paramètre dans la table. Vous devez lui fournir le nom du paramètre, et optionnellement une valeur par défaut. Si le paramètre existe, sa valeur est récupérée ; sinon, c’est la valeur par défaut qui est renvoyée. Lorsque la valeur par défaut est omise, c’est une chaîne vide qui fait office de valeur par défaut.DelParam
Cette procédure supprime un paramètre de la table.
Exemples
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
' Initialiser la table de paramètres CreateParamTable ' Stocker 3 paramètres SetParam "Entreprise.Nom", "Tartempion SA" SetParam "Entreprise.CP", "75000" SetParam "TVA par défaut", 0.196 ' Extraire le nom d'entreprise Dim strNom As String strNom = GetParam("Entreprise.Nom") MsgBox "Entreprise : " & strNom ' Extraire le taux de TVA, ' avec une valeur par défaut de .055 Dim dblTVA As Double dblTVA = GetParam("TVA par défaut", 0.055) MsgBox "TVA : " & dblTVA ' Supprimer le code postal DelParam "Entreprise.CP" |
La fonction GetParam()
peut également être utilisée dans une requête, un formulaire ou un état. Par exemple, dans une zone de texte, en pied d’état, vous pouvez écrire :
1 |
=GetParam("Entreprise.Nom") |
Pour que tout fonctionne…
Le code VBA qui précède utilise d’autres bouts de code déjà postés sur le blog. Pensez donc à :
- Récupérer la fonction StringFormat().
- Activer la bibliothèque DAOdans le menu Outils / Références de VBE.
mel > Il faudrait que la fermeture du 1er formulaire déclenche quelque chose comme :
Merci, le premier formulaire se lance au demarrage pour la saisie des infos de la societe et apres un formulaire (menu general) se lance et desormais ce menu se lance au demarrage ?
mel > Euh.. Est-ce que tu peux préciser ? La partie « formulaire qui se lancera au lancement » n’est pas claire 😉
Merci, j’ai creer un formulaire sur cette table, je voudrais que se lance au demarrage de la base et apres saisie une autre formulaire qui se lancera desormais au lancement. Comment faire? Merci
david > De rien ! 🙂
Merci Hervé !
david > Il s’agit de la fonction
StringFormat()
mais pasStingFormat()
(le « r » manque). Attention : il ne s’agit pas d’une fonction « native » Access, il faut que tu la reprennes sur cette page du site.Bonjour Hervé,
Merci pour la réponse ! Désolé du retard :=) j’ai complétement oublié que j’avais posé une question!
Mais j’avais entré un paramètre différent dans la table (faute de frappe).
Donc, résolu !
Par contre la compilation provoque une erreur au niveau de StingFormat. Le message est « Sub or function not defined ».
Je suis sur Access2010 et W7 PRO 64BIT.
Si tu as une explication je suis preneur. Merci beaucoup.
david
david > S’il s’agit de modifier la légende des boutons à l’aide de paramètres, ça devrait marcher (testé sur Access 2013 notamment).
If
?staff_ctrl
est de quel type ?bonjour,
c’est une bonne idée que cette table de paramètres.
par contre la fonction GetParam()ne fonctionne pas sur les boutons.
voici mon code:
Private Sub bt_ctrl_Click()
On Error GoTo Err_bt_ctrl_Click
If Me.[staff_ctrl] = « non » Then
Me.staff_ctrl = ctl_no
Me.bt_ctrl.Caption = GetParam(« nom_btn_a », « aaa »)
Me.lbl_ctrl_n.Visible = True
Me.lbl_ctrl_y.Visible = False
Else
Me.[staff_ctrl] = « oui »
Me.bt_ctrl.Caption = GetParam(« nom_btn_b », « bbb »)
Me.lbl_ctrl_n.Visible = False
Me.lbl_ctrl_y.Visible = True
End If
Exit_bt_ctrl_Click:
Exit Sub
Err_bt_ctrl_Click:
MsgBox Err.Description
Resume Exit_bt_ctrl_Click
End Sub
le code est bien enregisté dans un module et les noms de paramètres (nom_btn_a et b)sont bien créés dans la table parametres.
merci pour vos lumières.