Solution : intégrer la fonctionnalité de création automatique de DSN dans vos base de données.
Comment :
- Créer le DSN
Étape 2: Ajouter les constantes nécessaires.
1. Constante avec le nom de la BD :
Const nom_base_donnees = "ma_base"
2. Constantes techniques du serveur
Const nom_serveur = "nom_du_serveur_postgresql" 'ou IP !
Const port_serveur = "5432" 'Valeur par défaut
3. Constante du nom du DSN qui sera créé.
Const nom_dsn = "nom_du_dsn_odbc"
Const chaine_connexion_ODBC = _
"Description=" & nom_dsn & vbCr & _
"DATABASE=" & nom_base_donnees & vbCr & _
"SERVER=" & nom_serveur & vbCr & _
"PORT=" & port_serveur
5. Constante avec le nom du pilote OBDC PostgreSQL.
Vu que la version 32bits d'office n'utilise pas le même pilote que la version 64bits, nous devons en tenir compte
#If Win64 Then
Const nom_pilote_odbc = "PostgreSQL Unicode(x64)"
#Else
Const nom_pilote_odbc = "PostgreSQL Unicode"
#End If
Public Sub CreerLeDSNPostgreSQL()
Dim modeSilencieux
modeSilencieux = true
DBEngine.RegisterDatabase nom_dsn , _
nom_pilote_odbc, _
modeSilencieux , _
chaine_connexion_ODBC
End Sub
Étape 3 : planifier l'exécution de la méthode CreerLeDSNPostgreSQL à l'ouverture de la BD.
Solution la plus simple, ajouter une macro dont la première étape est ExécuterCode avec le paramètre CreerLeDSNPostgreSQL().
Cette macro doit être enregistrée sous le nom AutoExec.
Parfait !
Mais maintenant, il faut s'assurer que toutes les tables liées soient bien connectées à ce nouveau DSN
- Remplacer les informations de connexion de toutes les tables liées
Étape 1 : ajouter les autres constantes
Pour une raison mystique, la chaine d'une connexion d'une table est différente d'une chaine de connexion utilisée pour la création d'un ODBC... nous devons donc redéfinir une constante pour la nouvelle chaine.
Attention, cette constante doit être ajoutée avant la méthode CreerLeDSNPostgreSQL.
Const chaine_connexion_table = "ODBC" & _
";DSN=" & nom_dsn & _
";DATABASE=" & nom_base_donnees & _
";SERVER=" & nom_serveur & _
";PORT=" & port_serveur & ";" & _
"MaxVarcharSize=255;TextAsLongVarchar=0;" 'voir Access et 'Text'
Étape 2 : Ajouter les méthodes suivantes dans votre module
Public Sub MettreDSNAjourDansTablesLiees()
Dim indiceTable As Integer
For indiceTable = 0 To CurrentDb.TableDefs.Count - 1
If Not EstUneTableSysteme(CurrentDb.TableDefs(indiceTable).Name) Then
MettreChaineConnexionAJour CurrentDb.TableDefs(indiceTable)
End If
Next
End Sub
Private Sub MettreChaineConnexionAJour(objetTableDefinition As Variant)
Dim chaineConnexion As String
chaineConnexion = objetTableDefinition.Connect
If ChaineRepresenteTableLieeODBC(chaineConnexion) Then
chaineConnexion = chaine_connexion_table
objetTableDefinition.Connect = chaineConnexion
objetTableDefinition.RefreshLink
End If
End Sub
Private Function ChaineRepresenteTableLieeODBC(chaineConnexion As String)
ChaineRepresenteTableLieeODBC = (Left(chaineConnexion, 4) = "ODBC")
End Function
Private Function EstUneTableSysteme(nomTable As Variant)
EstUneTableSysteme = (Left(nomTable, 4) = "MSys") Or InStr(nomTable, "~") <> 0
End Function
Étape 3 : ajouter une étape ExécuterCode avec le paramètre MettreDSNAjourDansTablesLiees dans la macro AutoExec.