Bonjour,
J'en ai vraiment marre de l'incapacité de WinDev à gérer le NULL correctement.
Pour l'instant, le problème est qu'on ne peut pas écrire proprement/simplement du code laissant à l'utilisateur la possibilité de distinguer "0" de "rien".
Après, il faudra aussi vérifier comment se comporte WinDev avec les opérateurs arithmétiques etc.
Voici 4 bugs illustrés par un projet de test joint à ce message : WinDevEtNull.zip
1. Comparer 2 variants dont l'un est Null :
2. Comparaison d'un variant à Null, selon qu'il est dans une expression, renvoyé par une fonction, ou immédiat :
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 vVar1 est Variant = Null vVar2 est Variant = 0 Trace("vVar1 est Variant = Null") Trace("vVar2 est Variant = 0") Trace("----") SI vVar1 <> vVar2 ALORS Trace("SI vVar1 <> vVar2 : Oui") SINON Trace("SI vVar1 <> vVar2 : Non") FIN SI vVar1 = vVar2 ALORS // On passera bien là ! Trace("SI vVar1 = vVar2 : Oui") SINON Trace("SI vVar1 = vVar2 : Non") FIN SI (vVar1 <> vVar2) ALORS // On ne passera pas là Trace("SI (vVar1 <> vVar2) : Oui") SINON Trace("SI (vVar1 <> vVar2) : Non") FIN SI (vVar1 = vVar2) ALORS // On passera là Trace("SI (vVar1 = vVar2) : Oui") SINON Trace("SI (vVar1 = vVar2) : Non") FIN
3. Les rubriques d'analyse qui ne permettent pas d'écrire un code simple, et obligent inutilement à tester la propriété ..Null :
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 vVar est Variant = 0 Trace("vVar est Variant = 0") SI vVar = Null ALORS Trace("BUG : vVar = Null") SINON Trace("OK : vVar <> Null") FIN SI (vVar) = Null ALORS Trace("BUG : (vVar) = Null") SINON Trace("OK : (vVar) <> Null") FIN SI pRenvoieVariant(0) = Null ALORS Trace("BUG : pRenvoieVariant(0) = Null") SINON Trace("OK : pRenvoieVariant(0) <> Null") FIN
4. "Null si vide" dans une colonne de table et affectation par programmation :
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 vVar est Variant HRAZ(TableTest) HAjoute(TableTest) Trace("TableTest.ColTest = Null") SI TableTest.ColTest = 0 ALORS Trace("SI TableTest.ColTest = 0 : Oui") SINON Trace("SI TableTest.ColTest = 0 : Non") FIN SI TableTest.ColTest = 1 ALORS Trace("SI TableTest.ColTest = 1 : Oui") SINON Trace("SI TableTest.ColTest = 1 : Non") FIN vVar = TableTest.ColTest Trace("vVar = TableTest.ColTest") Trace("vVar = " + pNullableVersChaîne(vVar))
NB. La première partie de cet exemple est corrigée en WD19, car si on affecte Null ça affiche bien une chaîne vide. Mais la suite reste vraie : on peut se débrouiller pour avoir une chaîne vide à l'affichage et un zéro en valeur. (pas très grave, mais PC Soft ne fait jamais les choses à fond, c'est dommage)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 TableAjouteLigne(TABLE_Test, Null) COL_Test[1] = Null Trace("COL_Test[1] = Null") Trace("Valeur affichée : """ + COL_Test[1]..ValeurAffichée + """") Trace("Valeur mémorisée : " + pNullableVersChaîne(COL_Test[1]..Valeur)) COL_Test[1] = "" Trace("-----") Trace("COL_Test[1] = """"") Trace("Valeur affichée : """ + COL_Test[1]..ValeurAffichée + """") Trace("Valeur mémorisée : " + pNullableVersChaîne(COL_Test[1]..Valeur))
Si ça vous pose problème autant qu'à moi, merci d'envoyer une requête au support technique.
Si, en revanche, vous pensez qu'il y a une explication logique à ce comportement, merci de me l'expliquer.
Je pense qu'il suffit de montrer ça lors du choix d'un outil de développement pour éliminer WinDev immédiatement. Ca le décrédibilise, et le ferait passer pour un outil d'amateurs. C'est comme la conversion de Date vers DateHeure... ça fait peur.
Partager