Requête Nz(.. versus Val(Nz(..
Bonjour,
Soit une table Table_1 contenant deux champs numériques Num1 et Num2 ... mais où les Null ne sont pas interdits ! En l’occurrence, elle contient :
Num1 |
Num2 |
Null |
12 |
21 |
0 |
31 |
Null |
51 |
52 |
Et voici un bout de code VBA où on compare la première valeur à la somme des deux valeurs, en se protégeant contre les Null (qui ont un autre usage ailleurs) :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
|
Public Function Fn_Loop(sql As String)
Dim oRst As DAO.Recordset
Debug.Print "-------------------------------------------"
Debug.Print sql
Debug.Print "-------------------------------------------"
Set oRst = CurrentDb.OpenRecordset(sql)
While Not oRst.EOF
If oRst("N1") = oRst("N1p2") Then
Debug.Print oRst("N1") & " = " & oRst("N1p2")
Else
Debug.Print oRst("N1") & " <> " & oRst("N1p2")
End If
oRst.MoveNext
Wend
oRst.Close: Set oRst = Nothing
End Function
Public Function Fn_Test()
Fn_Loop "SELECT Nz([Num1],0) AS N1, Nz([Num1],0)+Nz([Num2],0) AS N1p2 FROM Table1;"
Fn_Loop "SELECT Val(Nz([Num1],0)) AS N1, Nz([Num1],0)+Nz([Num2],0) AS N1p2 FROM Table1;"
End Function |
... et Fn_Test affiche :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
|
-------------------------------------------
SELECT Nz([Num1],0) AS N1, Nz([Num1],0)+Nz([Num2],0) AS N1p2 FROM Table1;
-------------------------------------------
0 <> 12
21 <> 21
31 <> 31
0 <> 0
51 <> 103
-------------------------------------------
SELECT Val(Nz([Num1],0)) AS N1, Nz([Num1],0)+Nz([Num2],0) AS N1p2 FROM Table1;
-------------------------------------------
0 <> 12
21 = 21
31 = 31
0 = 0
51 <> 103 |
Comme vous pouvez vous en douter, j'ai été surpris par les "21 <> 21" et autres égalités non-détectées.
La raison en est que "SELECT Nz([Num1],0) AS N1 .." retourne en fait la String "0" et non une valeur numérique, alors que la deuxième partie "... Nz([Num1],0)+Nz([Num2],0) ..." retourne toujours une valeur numérique.
.. d'où la nécessité absolue du Val(Nz(.. sur la première partie.
Il est vrai que la documentation de Nz précise bien que, dans une requête, Nz retourne toujours une chaîne, et ce même si la valueifnull est 0.
Je suis le seul à m'être cassé le nez sur ce bug ou c'est une "erreur de débutant" ;-) ?
Cordialement,
Olivier