Notation à point et valeurs indéfinies

Je reviens avec la notation à point et les valeurs indéfinies (en lien avec la lecture du blog DON’T BE AFRAID OF UNDEFINED VALUES).

Je peux écrire sans problème :

C_TEXT ($tvaleur)

$tvaleur:=$monobjet.obj1.obj2.obj3.maPropriete

Je n’aurai pas d’erreur que les différents objets concernés soit définis ou pas. Super !

Par contre, si mon objet de départ est un champ objet d’une entity :

$tvaleur:=$monEntity.monChampObj.obj2.obj3.maPropriete

Là ça coince et j’ai une erreur si le champ n’est pas défini.

Du coup, plusieurs solutions semblent fonctionner :

C_OBJECT ($omonChamp)

If ($monEntity.monChampObj# Null )

$omonChamp:=$monEntity.monChampObj

End if

ou :

$omonChamp:= OB Get ($monEntity;"monChampObj";Is object)

A partir de là, je n’ai plus de problème quand j’écris :

$tvaleur:=$omonChamp.obj2.obj3.maPropriete

La notation à point, c’est génial et ça allège vraiment le code mais si on est obligé d’empiler les tests Si # Null, ça devient vite lourd. Vous gérez ça comment, ça serait quoi la best practice ?

Je ne suis déjà pas d’accord avec ta première assertion :grimacing:
Tu n’as pas d’erreur, cela dépend ce que tu fais avec ta notation objet.
Pour ma part, j’ai pris l’habitude de “Typer” mon résultat attendu en encadrant ma notation objet avec les commandes Bool(), Chaine(), Num(), etc… au moins je me preserve d’une mauvaise initialisation.

J’ai pas testé avec un champ objet d’une entity.

1 Like

Juste pour rappel: on en avait déjà discuté aussi ici :wink:

Ah si, je maintiens, pas d’erreur dans ce cas et c’est vraiment pratique. Une vraie avancée. Pour t’en convaincre, lis ou relis l’article du blog, c’est très clair.
(et par contre, je n’ai pas compris “ça dépend ce que tu fais avec ta notation objet”)

C’est bien pour ça que je dis que je “reviens" :wink:

Dans le code que tu donnes peut-être, mais simplement dans un code un tout petit peu plus complexe ça ne fonctionne déjà plus. :confused:

ex:

Si (Non($OBParam.ParamBooleen))

Je ne suis pas sûr de cela !
La solution générale est d’utiliser string() ou num() ou boo() pour être sûr que les null soient transformés en valeurs par défaut : “” ou 0 ou false.

Ok, ça marche en effet.

Messieurs, je vous invite à lire le blog :wink: (et je crois que j’avais vu passer des posts de Thomas Maul à ce sujet sur l’ancien forum).

3 cas :

  • pas d’erreur si on englobe l’expression dans String, Num, etc… Ce qui a conduit à la création de Bool.

  • pas d’erreur si l’expression est affectée à une variable typée (mon exemple ci-dessus)

  • pas d’erreur si l’expression est utilisée dans les conditions et boucles (If, While…). Mais attention ça ne marche pas pour If(Not(xxx)), ce dont je parlais dans le fil évoqué par Manuel.