Salut la francophonie. Étant Québécois, je le dis d'entrée: ALLEZ LES BLEUS TABARNAK!
J'ai fait une routine Sub DAO_Resultats(). Son but: prendre des enregistrements de la table tblTRI, et selon un filtre de sélection(string TampDie), faire des sommations de valeurs de champs et des calculs subséquents. Les résultats sont ensuite transposés dans les enregistrements de la table tblRES, selon le même filtre. S'il s'agit d'un nouvel enregistrement, et bien ça fait la mise à jour. La routine se situe dans un module de la base de données Gravimétrique.
PS. La référence Microsoft DAO 3.6 Object Library est activée.
Voici le code avec commentaires:
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
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143 Option Compare Database Option Explicit Sub DAO_Resultats() 'Initialisation recordset et Tables Dim db As DAO.Database Dim rstTri As DAO.Recordset Dim rstDie As DAO.Recordset Dim rstRes As DAO.Recordset 'Déclaration variables Dim DenomFlowreel As Integer: Dim DenomGPI As Integer: Dim DenomVprod As Integer Dim Incr As Integer Dim SommeP As Single: Dim SommeRCP As Single: Dim SommeS2 As Single: Dim SommeGPI As Single Dim SommeVprod As Single: Dim SommeFlowreel As Single: Dim SommeVprod As Single Dim IndiceMasse As Single: Dim IndiceVitesse As Single: Dim strDie As String Dim TampDie(1 To 7) As String: Dim TampDieFlow(1 To 4) As String: 'Assignation base de données == courante Set db = CurrentDb() On Error Resume Next 'Assignation recordset aux tables de bdd Gravimétrique Set rstTri = db.OpenRecordset("tblTRI", dbOpenDynaset) Set rstDie = db.OpenRecordset("tblDIE") Set rstRes = db.OpenRecordset("tblRES") DenomFlowreel = 0 DenomGPI = 0 DenomVprod = 0 SommeRCP = 0 SommeP = 0 SommeS2 = 0 SommeGPI = 0 SommeVprod = 0 rstTri.MoveFirst 'Boucle de parcours de tblTRI pour sommations While Not rstTri.EOF rstRes.MoveFirst rstDie.MoveFirst 'reconnaissance bon Die pour entrer valeurs TampDie = rstTri(5).Value strDie = "([tblTRI].[Die] LIKE 'TampDie')" 'Boucle de sommation des valeurs du premier enregistrement de TblTRI et semblables selon Die rstTri.FindFirst strDie While Not rstTri.NoMatch SommeRCP = rstTri(6).Value + SommeRCP SommeP = rstTri(7).Value + SommeP SommeS2 = rstTri(8).Value + SommeS2 SommeGPI = rstTri(9).Value + SommeGPI SommeVprod = rstTri(12).Value + SommeVprod DenomGPI = DenomGPI + 1 DenomVprod = DenomVprod + 1 'Extraire 4 premiers caractères de TampDie pour calculer Flowreel 'Certains enreg. TampDie peuvent avoir la forme suivante: 7077_G 'la table tblDIE(enreg. sans doublons) ne contient que les 4 premiers carac: 7077 'Les enreg. avec G ont SommeFlowReel comme attribut For Incr = 1 To 4 TampDieFlow(Incr) = TampDie(Incr) Next Incr Select Case TampDieFlow Case TampDieFlow <> rstDie(1).Value: rstDie.MoveNext Case TampDieFlow = rstDie(1).Value: If Mid(TampDie, 6, 1) = "G" Then SommeFlowreel = rstTri(13).Value * rstDie(5).Value * 454 / 60 DenomFlowreel = DenomFlowreel + 1 End If End Select rstTri.FindNext strDie Wend 'Recherche dans tblRES pour l'enregistrement correspondant et faire mise à jour Select Case TampDie Case TampDie <> rstRes(3).Value: rstRes.MoveNext Else rstRes.Edit rstRes(4).Value = SommeRCP / SommeP rstRes(5).Value = SommeS2 / SommeP rstRes(6).Value = SommeGPI / DenomGPI rstRes(10).Value = rstRes(6).Value / rstDie(4).Value If SommeFlowreel = 0 Then rstRes(7).Value = SommeVprod / DenomVprod Else rstRes(7).Value = SommeFlowreel / DenomFlowreel End If End Select 'Ajout d'enregistrement si pas de correspondance If rstRes.EOF = True Then rstRes.AddNew rstRes("Die") = TampDie rstRes("RCP/P") = SommeRCP / SommeP rstRes("S2/P") = SommeS2 / SommeP rstRes("GPI") = SommeGPI / DenomGPI rstRes("IndiceMasse") = rstRes("GPI") / rstDie(4).Value If SommeFlowreel = 0 Then rstRes("Vitesse") = SommeVprod / DenomVprod Else rstRes("Vitesse") = SommeFlowreel / DenomFlowreel End If rstRes.Update End If Wend ' Fermeture et libération des objets rstTri.Close rstDie.Close rstRes.Close Set rstTri = Nothing Set rstDie = Nothing Set rstRes = Nothing Set db = Nothing End Sub
Questions:
1 - Je fais ma première compilation, voici le message affiché:
'Erreur de compilation: Déclaration existante dans la portée en cours'
Pourquoi?
2- Je suis un codeur débutant en VB. Est-ce que la structure de mon code est correcte? Si non, quels ajustements y apporter pour le corriger ou mieux, l'améliorer?
À DONF!!! Au Québec, c'est: À planche!
Partager