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 : Sélectionner tout - Visualiser dans une fenêtre à part
"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 : Sélectionner tout - Visualiser dans une fenêtre à part
"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 : Sélectionner tout - Visualiser dans une fenêtre à part
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