J'ai une boucle For Each dans une procédure pour sauvegarder des données d'un formulaire dans une base de données. Je remarque qu'il y a une persistance des données dans les variables à l'intérieur de la boucle à chaque itération. J'ai testé en initialisant quelques variables de type String à String.Empty mais alors, les enregistrement précédents sont également mis à cette valeur. Chaque itération étant une ligne de données, chacune d'entre-elle est ajouté dans un DataSet qui ensuite envoyé dans une autre procédure pour enregistrement.

Ce que je trouve bizarre c'est cette persistance des variables, c'est la première fois que je vois ça dans une boucle.

Voici le code de la boucle en question:
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
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
        Dim _form As New data.dsSaisieAnalyses
...
        'Remplissage de la table AN du dataset avec les données du formulaire
        For Each _item As DataGridItem In dgAnalyses.Items
            'Déclarations des variables qui concernent les reésultats d'analyses.
            Dim cde_rem, conf, param, rt, val, vrai, man, mfra, fron, un, sl, Num, _lib, dteAP As String
            Dim inf_lq As String = String.Empty '* Ajouté par moi
            Dim val_saisie As String = String.Empty '* Ajouté par moi
            Dim sq As String = String.Empty '* Ajouté par moi
            Dim _dtea As Date
            Dim _slq As Nullable(Of Decimal) = Nothing
 
            val = CType(_item.FindControl("txtVal"), TextBox).Text
 
            'Si une valeur est saisie,elle est enregistrée
            If val <> String.Empty Then
                param = CType(_item.FindControl("hdPARAM"), HtmlInputHidden).Value 'paramètre analysé
 
 '* Ajouté par moi
                '* Déterminer la valeur à enregistrer. Si la valeur saisie est inférieure à la LQ (colonne SQ)
                '* on enregistre la valeur de la LQ dans la colonne VAL et la valeur saisie dans la colonne VAL_SAISIE
                sq = CType(_item.FindControl("lblSL"), Label).Text
 
                If Convert.ToDecimal(val) < Convert.ToDecimal(sq) Then
                    inf_lq = "< " & sq
                    val_saisie = val
                    val = sq
                Else
                    inf_lq = String.Empty
                    val_saisie = String.Empty
                End If
                '*****
'************************************
 
                'Paramétrage de la date
                dteAP = CType(_item.FindControl("txtDte"), TextBox).Text
                Try
                    If dteAP = String.Empty Then
                        _dtea = DteA
                    Else
                        Dim _d As Date = Date.Parse(dteAP)
                        If Session("mode") = "NouvelleSaisie" Then
                            _dtea = _d
                        Else
                            If _data.Prvt(0).DTEA <> DteA Then
                                If _data.Prvt(0).DTEA = dteAP Then
                                    _dtea = Date.Parse(DteA)
                                Else
                                    _dtea = _d
                                End If
                            Else
                                If _d <> DteA Then
                                    _dtea = Date.Parse(dteAP)
                                Else
                                    _dtea = DteA
                                End If
                            End If
                        End If
                    End If
                Catch ex As Exception
                    dvMSG.InnerHtml = dteAP & " n'est pas une date valide!"
                    r = False
                    Return r
                End Try
                'recherche de la reference interne de travail pour determiner les normes utilisées
 
                rt = CType(_item.FindControl("lstNrm"), DropDownList).SelectedValue 'référence interne
                Dim _cnfl As DataRow() = CType(Cache("config"), data.dsConfigLabo).CNFL.Select("rf='" & rt & "'")
 
                'recherche des données de configuration du paramètre
                Dim _cnflp As DataRow() = CType(Cache("config"), data.dsConfigLabo).CNFLP.Select("param=" & param & " and tpe=" & tan)
 
                Num = _cnflp(0)("numdb") 'identifiant du paramètre
 
 
                If Session("mode") = "ModificationAnalyse" Or Session("mode") = "Validation" Then
                    'Déterminer le code remarque et le seuil de quantification
                    If Not IsDBNull(_cnflp(0)("sl")) Then 'le seuil existe dans la configuration
                        If IsDBNull(_data.An.Select("PARAM=" & param)(0)("VAL")) Then 'cas de l'ajout d'un résultat en mode modifications (seuil)
                            sl = _cnflp(0)("sl")
                            _slq = _cnflp(0)("sl")
                            If val <> String.Empty Then
                                If CType(val, Decimal) < CType(sl, Decimal) Then
                                    cde_rem = 10
                                Else
                                    cde_rem = 1
                                End If
                            Else
                                cde_rem = 1
                            End If
                        Else
                            If IsDBNull(_data.An.Select("PARAM=" & param)(0)("SLQ")) Then 'Cas des paramètres sans seuil
                                cde_rem = 1
                                sl = 0
                                _slq = 0
                            Else 'Reprise des infos sans modifications
                                _slq = _data.An.Select("PARAM=" & param)(0)("SLQ")
                                cde_rem = _data.An.Select("PARAM=" & param)(0)("CDE_REM")
                                sl = _data.An.Select("PARAM=" & param)(0)("SLQ")
                            End If
                        End If
                    Else 'Cas des paramètres sans seuil
                        cde_rem = 1
                        sl = 0
                        _slq = 0
                    End If
                    un = _data.An.Select("PARAM=" & param)(0)("UN")
                    If IsDBNull(_data.An.Select("PARAM=" & param)(0)("RT")) Then 'cas de l'ajout d'un résultat en mode modifications (methodes)
                        fron = _cnfl(0)("fra")
                        man = _cnfl(0)("man")
                        mfra = _cnfl(0)("mfra")
                    Else
                        If rt <> _data.An.Select("PARAM=" & param)(0)("RT") Then 'Cas de modifications de la référence de travail
                            If _cnfl.Length = 0 Then ' pas de valeur
                                fron = 22 ' 43
                                man = 0 ' 3
                                mfra = 0 ' 3
                            Else 'assignation des nouvelles valeurs
                                fron = _cnfl(0)("fra")
                                man = _cnfl(0)("man")
                                mfra = _cnfl(0)("mfra")
                            End If
                        Else 'Reprise des infos sans modifications
                            fron = _data.An.Select("PARAM=" & param)(0)("FRON")
                            man = _data.An.Select("PARAM=" & param)(0)("MET_AN")
                            mfra = _data.An.Select("PARAM=" & param)(0)("MET_FR")
                        End If
                    End If
                    Try
                        vrai = _data.An.Select("param=" & param)(0)("vrai")
                    Catch ex As IndexOutOfRangeException
                        vrai = 3
                    Catch ex As InvalidCastException
                        vrai = 3
                    End Try
                    Try
                        conf = _data.An.Select("param=" & param)(0)("conf")
                    Catch ex As IndexOutOfRangeException
                        conf = 4
                    Catch ex As InvalidCastException
                        conf = 4
                    End Try
                Else 'Cas mode ajout
                    un = _cnflp(0)("un") ' unité de mesure
                    vrai = 3
                    conf = 4
                    ANCV = 0
                    ANVV = 0
                    If _cnfl.Length = 0 Then
                        fron = 22 ' 43
                        man = 0 ' 3
                        mfra = 0 ' 3
                    Else
                        fron = _cnfl(0)("fra")
                        man = _cnfl(0)("man")
                        mfra = _cnfl(0)("mfra")
                    End If
                    'Déterminer le code remarque et le seuil de quantification
                    If Not IsDBNull(_cnflp(0)("sl")) Then
                        sl = _cnflp(0)("sl")
                        _slq = _cnflp(0)("sl")
                        If val <> String.Empty Then
                            If CType(val, Decimal) < CType(sl, Decimal) Then
                                cde_rem = 10
                            Else
                                cde_rem = 1
                            End If
                        Else
                            cde_rem = 1
                        End If
                    Else
                        cde_rem = 1
                        sl = 0
                        _slq = 0
                    End If
                End If
 
                'libellé du paramètre( à retourner en cas de message d'erreur).
                _lib = CType(_item.FindControl("lblLIB"), Label).Text
 
                'Remplissage de l'enregistrement dans le dataset
                Dim _an As data.dsSaisieAnalyses.AnRow = _form.An.NewAnRow
                With _an
                    .SITU = 2
                    .DTEA = _dtea
                    .RESP = Analyste(AnV, AnC, param)
                    .CONF = conf
                    .DTE_P = Dte
                    .FIN = Finalite
                    .FRON = fron
                    .HRE_P = Hre
                    .LABO = Labo
                    .MET_AN = man
                    .MET_FR = mfra
                    .NUM = Num
                    .PARAM = param
                    .PMO = PMO
                    .PROD = Org
                    .RT = rt
                    .SL = sl
                    .UN = un
                    .VAL = val
                    .VRAI = vrai
                    ._LIB = _lib
                    ._STEP = Ouv
                    .CDE_REM = cde_rem
                    .INF_LQ = inf_lq '* Ajouté par moi
                    .VAL_SAISIE = val_saisie '* Ajouté par moi
                    If _slq.HasValue Then
                        .SLQ = _slq
                    Else
                        .SetSLQNull()
                    End If
                End With
                _form.An.AddAnRow(_an)
            End If
        Next
Est-ce quelqu'un aurait une explication ?

Le truc, c'est que cette procédure est utilisée depuis longtemps et sans problème, ce qui me paraît bizarre. Le code a été fait par un de mes prédécesseur dans je ne maîtrise pas complètement Moi, j'ai juste ajouté deux colonnes supplémentaires dans la table sur la base de données et donc, je rajoute l'enregistrement de ces deux nouvelles données.

J'ai mis le commentaire '* Ajouté par moi pour les parties que j'ai rajoutées.