Bonjour,
Je travaille sur une base ou les noms des tables /champs sont succeptibles de changer. Mais pour l'instant, je fais mes requetes avec les noms actuels en dur dans le code.
"SELECT monChamp FROM maTable"
Si "monChamp" devient "monChamP", le code plante. Je souhaite donc creer des variables globales a initialiser au demarrage. Ma question est comment automatiser cette tache, car je ne veux pas creer 250 noms de champs a la main.
La solution adoptee pour l'instant passe par un tableau de "structures" (d'ailleurs, existent t elles en VBA) qui au chargement, me renvoie les noms des tables/Champs. Un exemple d'utilisation (Voir le code complet a la fin du post)
"SELECT " & l_DBTableDefinition_AllDef(4).i_String_Field_Name(0) & " FROM " & l_DBTableDefinition_AllDef(4).i_String_Table_Name
Mais cette solution ne me convient pas, car je travaille avec des indices : si j'ajoute une table a la base, il me faudra changer tous les indices dans tout le code...
Avez-vous resolu cette difficulte ?
Code de la structure et de la fonction d'initialisation
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
| '"Structure" definisant une table
'Contient son nom
'le nom de ces champs
'leur type
Public Type DBTableDefinition
i_String_Table_Name As String
i_String_Field_Name() As String
i_Long_Field_Type() As Long
End Type
'Fonction initialisant un tableau de "structure", chacune des cellules contenent les infos d'une table
Public Function Create_DB_Fields_String()
Dim l_Integer_NbFields As Integer
Dim l_Integer_NbTable As Integer
Dim l_Integer_TableLoop As Integer
Dim l_Integer_FieldsLoop As Integer
Dim l_Byte_NbSystemTable As Byte
Dim l_Database_db As DAO.Database
Dim l_Recordset_Bargain_File As DAO.Recordset
Dim l_Database_TableDef As DAO.TableDef
Dim l_Database_Fields As DAO.Field
Dim l_DBTableDefinition_AllDef() As DBTableDefinition
Set l_Database_db = CurrentDb
l_Byte_NbSystemTable = 6 'Le nombres de tables system
With l_Database_db
l_Integer_NbTable = .TableDefs.Count - l_Byte_NbSystemTable 'recupere le nombre de tables creees
ReDim l_DBTableDefinition_AllDef(l_Integer_NbTable)
For l_Integer_TableLoop = 0 To l_Integer_NbTable - 1
'on donne le nom de la table
l_DBTableDefinition_AllDef(l_Integer_TableLoop).i_String_Table_Name = .TableDefs(l_Integer_TableLoop + l_Byte_NbSystemTable).Name
'compte le nombre de champ dans la table
l_Integer_NbFields = .TableDefs(l_Integer_TableLoop + l_Byte_NbSystemTable).Fields.Count
ReDim l_DBTableDefinition_AllDef(l_Integer_TableLoop).i_String_Field_Name(l_Integer_NbFields - 1)
ReDim l_DBTableDefinition_AllDef(l_Integer_TableLoop).i_Long_Field_Type(l_Integer_NbFields - 1)
'donne le nom et le type de chaque champ
For l_Integer_FieldsLoop = 0 To l_Integer_NbFields - 1
l_DBTableDefinition_AllDef(l_Integer_TableLoop).i_String_Field_Name(l_Integer_FieldsLoop) = .TableDefs(l_Integer_TableLoop + l_Byte_NbSystemTable).Fields(l_Integer_FieldsLoop).Name
l_DBTableDefinition_AllDef(l_Integer_TableLoop).i_Long_Field_Type(l_Integer_FieldsLoop) = .TableDefs(l_Integer_TableLoop + l_Byte_NbSystemTable).Fields(l_Integer_FieldsLoop).Type
Next
Next l_Integer_TableLoop
MsgBox (l_Integer_NbTable)
End With
End Function |
Partager