informatixo
Messages postés129Date d'inscriptionmercredi 4 février 2004StatutMembreDernière intervention25 juillet 2012
-
21 févr. 2008 à 18:56
informatixo
Messages postés129Date d'inscriptionmercredi 4 février 2004StatutMembreDernière intervention25 juillet 2012
-
26 févr. 2008 à 21:06
Bonsoir le forum,
Je voudrais savoir s'il est possible de récupérer la valeur par défaut d'un champ Access (celle qui est paramétrée dans Access lors de la création des champs d'une table) avec un ADOTable ?
J'ai longuement cherché mais je n'ai pas trouvé. J'ai vu qu'il existait la propriété "Value", "Required" (qui correspond à l'option "Null interdit" dans Access) mais je n'ai rien sur la "valeur par défaut".
Sinon j'avais pensé à utiliser le composant serveur "TAccessApplication" mais là ça sent l'usine à gaz.
Merci d'avance pour l'aide que vous pourrez m'apporter.
informatixo
Messages postés129Date d'inscriptionmercredi 4 février 2004StatutMembreDernière intervention25 juillet 20121 26 févr. 2008 à 21:06
Bonsoir le forum,
J'ai trouvé une solution de contournement qui fonctionne mais qui n'est pas très pratique, mais bon, elle a moins le mérite de fonctionner.
Avant d'arriver à cette solution, j'ai commencé par essayer d'utiliser le composant serveur "TAccessApplication" mais j'ai rencontré des erreurs inattendues propres à Delphi 2005 sur ce genre de composant et j'ai donc du rapidement oublier cette idée.
Après quelques recherches supplémentaires, je me suis orienté vers VBA d'Access car l'utilisation de DAO permet d'accéder aux valeurs par défaut des champs.
Cette solution ne m'a pas satisfait car elle nécessitait de toujours faire suivre un module.bas dans chaque base de données Access afin de générer des fichiers ini contenant les valeurs par défaut pour pouvoir y accéder depuis Delphi.
J'en suis donc arrivé à la solution imparfaite, mais fonctionnelle, d'un script de type "VBScript" que je lance depuis Delphi grâce à la commande "ShellExecute" et qui me génère mes fichiers ini contenant les valeurs par défaut.
J'utilise cette commande avec 3 arguments, le premier avec le chemin et le nom de la base de données source, le deuxième avec le chemin et le nom de la base de données de destination et le dernier avec le chemin où doivent être stockés les fichiers ini.
Ainsi, je peux accéder aux valeurs et les contrôler depuis Delphi sans être dépendant d'un module à insérer dans chaque base de données.
J'avais peut-être espéré que "Mauricio" aurait eu une idée à ce sujet car il est performant dans les bases de données (que les autres membres ne se voient pas offensés mais c'est le seul que je connaisse dans ce domaine) quoique son dada soit plutôt le "Bde" que les composants ADO je crois.
Je vais donc donner mon script pour ceux qui rencontreront ce type de problème et qui chercherait une solution de contournement. Le voici :
If wscript.Arguments.Count = 3 Then
' Déclarations des variables et objets
Dim Access, BaseDeDonnees, Table, Champ
Dim strNomFichier, strSection, strCle, strValeur
Dim ficFso, ficFichier
Dim booErreurDetectee
MsgBox "Début de la sauvegarde des valeurs par défaut. Veuillez attendre le message de confirmation de la fin de la sauvegarde.", vbInformation + vbOKOnly, "Information sur la sauvegarde"
On Error Resume Next
' Gestion des valeurs par défaut de la base de données source.
' Permet de prendre la base de données courante comme base de données de travail.
booErreurDetectee = False
Set Access = CreateObject("Access.Application")
Access.Visible = False
Access.OpenCurrentDatabase(wscript.Arguments(0))
Access.Visible = False
Set BaseDeDonnees = Access.CurrentDb()
Access.Visible = False
If Err <> 0 then
booErreurDetectee = True
End If
' Chemin et nom du fichier ini.
strNomFichier = wscript.Arguments(2) & "ValeurParDéfautSource.ini"
' Permet de créer le fichier ini source qui va recevoir les valeurs par défaut.
Set ficFso = CreateObject("Scripting.FileSystemObject")
Set ficFichier = ficFso.CreateTextFile(strNomFichier, True)
If Err <> 0 then
booErreurDetectee = True
End If
' Cette boucle permet de parcourir toutes les tables et tous les champs de chaque table à la recherche
' d'une valeur par défaut et de l'enregistrer dans un fichier ini.
For Each Table In BaseDeDonnees.TableDefs
If Left(Table.Name, 4) <> "MSys" Then
strSection = Table.Name
ficFichier.WriteLine("[" & strSection & "]")
If Err <> 0 then
booErreurDetectee = True
End If
For Each Champ In Table.Fields
If Champ.DefaultValue <> "" Then
' Permet de récupérer et d'écrire les valeurs par défaut.
strCle = Champ.Name
strValeur = Champ.DefaultValue
ficFichier.WriteLine(strCle & "=" & strValeur)
If Err <> 0 then
booErreurDetectee = True
End If
End If
Next
' Permet de sauter une ligne.
ficFichier.WriteLine("")
End If
Next
ficFichier.Close
Access.CloseCurrentDatabase
Access.Quit
Set Access = Nothing
Set BaseDeDonnees = Nothing
Set ficFso = Nothing
Set ficFichier = Nothing
' Gestion des valeurs par défaut de la base de données destination.
' Permet de prendre la base de données courante comme base de données de travail.
Set Access = CreateObject("Access.Application")
Access.Visible = False
Access.OpenCurrentDatabase(wscript.Arguments(1))
Set BaseDeDonnees = Access.CurrentDb()
If Err <> 0 then
booErreurDetectee = True
End If
' Chemin et nom du fichier ini.
strNomFichier = wscript.Arguments(2) & "ValeurParDéfautDestination.ini"
' Permet de créer le fichier ini destination qui va recevoir les valeurs par défaut.
Set ficFso = CreateObject("Scripting.FileSystemObject")
Set ficFichier = ficFso.CreateTextFile(strNomFichier, True)
If Err <> 0 then
booErreurDetectee = True
End If
' Cette boucle permet de parcourir toutes les tables et tous les champs de chaque table à la recherche
' d'une valeur par défaut et de l'enregistrer dans un fichier ini.
For Each Table In BaseDeDonnees.TableDefs
If Left(Table.Name, 4) <> "MSys" Then
strSection = Table.Name
ficFichier.WriteLine("[" & strSection & "]")
If Err <> 0 then
booErreurDetectee = True
End If
For Each Champ In Table.Fields
If Champ.DefaultValue <> "" Then
' Permet de récupérer et d'écrire les valeurs par défaut.
strCle = Champ.Name
strValeur = Champ.DefaultValue
ficFichier.WriteLine(strCle & "=" & strValeur)
If Err <> 0 then
booErreurDetectee = True
End If
End If
Next
' Permet de sauter une ligne.
ficFichier.WriteLine("")
End If
Next
ficFichier.Close
Access.CloseCurrentDatabase
Access.Quit
Set Access = Nothing
Set BaseDeDonnees = Nothing
Set ficFso = Nothing
Set ficFichier = Nothing
' Gestion de la fin d'exécution du script lorsqu'il n'y a pas eu d'erreur.
If Not booErreurDetectee Then
' Chemin et nom du fichier ini.
strNomFichier = wscript.Arguments(2) & "EtatScript.ini"
' Permet de créer le fichier ini qui va recevoir l'état indiquant que le script est fini.
Set ficFso = CreateObject("Scripting.FileSystemObject")
Set ficFichier = ficFso.CreateTextFile(strNomFichier, True)
' Permet d'écrire les valeurs dans le fichier ini.
ficFichier.WriteLine("[Script]")
ficFichier.WriteLine("Fin=1")
MsgBox "Fin de la sauvegarde des valeurs par défaut.", vbInformation + vbOKOnly, "Information sur la sauvegarde"
Else ' Ici nous sommes dans le cas où il y a une erreur.
' Chemin et nom du fichier ini.
strNomFichier = wscript.Arguments(2) & "EtatScript.ini"
' Permet de créer le fichier ini qui va recevoir l'état indiquant que le script est fini.
Set ficFso = CreateObject("Scripting.FileSystemObject")
Set ficFichier = ficFso.CreateTextFile(strNomFichier, True)
' Permet d'écrire les valeurs dans le fichier ini.
ficFichier.WriteLine("[Script]")
ficFichier.WriteLine("Fin=0")
MsgBox "Erreur lors de la sauvegarde des valeurs par défaut.", vbCritical + vbOKOnly, "Erreur lors de la sauvegarde"
End If
ficFichier.Close
Access.CloseCurrentDatabase
Access.Quit
Set Access = Nothing
Set BaseDeDonnees = Nothing
Set ficFso = Nothing
Set ficFichier = Nothing
End if
Comme je n'ai pas encore trouvé de réponse à ma question et que ma solution ne permet que de contourner le problème, je ne mettrais pas ce post en "Résolu".
Si d'autres personnes ont une autre approche du problème, une critique ou bien un commentaire à faire, je serais content de pouvoir lire leurs points de vue. C'est toujours que plus enrichissant.