[VBA-A][BDD] Rendre le code souple
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.
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)
Code:
"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
Code:
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 |