> Tech > Calculs avec des champs potentiellement nuls

Calculs avec des champs potentiellement nuls

Tech - Par Renaud ROSSET - Publié le 24 juin 2010
email

S'il est prévu d'effectuer des calculs sur les dates, il vaut mieux vérifier l'indicateur null. Mathématiquement parlant, les dates nulles contiennent 01/01/0001, ce qui risque de ne pas produire les résultats escomptés. Ainsi, la ligne de code suivante calcule le nombre de jours entre une date de début (STRDAT) et

Calculs avec des champs potentiellement nuls

une date de fin
(ENDDAT), en plaçant le résultat dans un champ appelé DIFF :

C ENDDAT SubDur STRDAT DIFF:*Days

Tout va bien jusqu’à  ce que ENDDAT contienne une date nulle, auquel cas DIFF aboutit
à  un grand nombre négatif. Par exemple, si on utilise une valeur STRDAT au 4 septembre
1998 et une valeur ENDDAT nulle, la différence (DIFF) sera de -729635. La situation
ressemble à  celle de la division, dans laquelle il faut d’abord vérifier si le
diviseur est égal à  zéro et agir en conséquence.

La figure 8a présente un exemple qui, en cas de date nulle, met DIFF à  zéro. Bien
que cette solution fonctionne, elle est techniquement incorrecte et sert à  illustrer
la différence entre zéro et null. Nous disons qu’une date de fin nulle produit
une différence de 0 jours mais, en réalité, nous admettons que nous ne pouvons
pas donner une différence, ne connaissant pas encore la date de fin. Quand les
dates de début et de fin sont identiques, nous prenons la partie Else de l’instruction
If, effectuons le calcul mathématique… et aboutissons à  une différence de 0
jour. Dans ce cas, zéro prend sa signification exacte : il n’y a pas de différence
entre les dates de début et de fin.

Cette méthode risque d’entraîner des problèmes si l’on utilise le champ DIFF pour
prendre des décisions ultérieurement. Si par exemple on recherche des contrats
ouverts en testant une valeur zéro dans DIFF, on obtient le résultat souhaité,
mais aussi d’éventuels contrats terminés le jour même de leur démarrage. Selon
l’application, cela peut poser ou non un problème mais montre bien qu’il faut
s’efforcer de prévoir toutes les futures utilisations des données.
La bonne solution consiste à  permettre à  DIFF de contenir des valeurs nulles,
en ajoutant le mot clé ALWNULL à  la définition DDS du champ et en rendant sa valeur
nulle au lieu de 0 quand ENDDAT est null. Cette solution crée une correspondance
de un à  un entre le champ DIFF et une situation de gestion réelle : un DIFF null
signe un contrat ouvert, tandis qu’un DIFF à  0 signe un contrat fermé (… et
bref). La figure 8b contient le code à  cet effet.

Téléchargez cette ressource

Préparer l’entreprise aux technologies interconnectées

Préparer l’entreprise aux technologies interconnectées

Avec la « quatrième révolution industrielle », les environnements hyperconnectés entraînent de nouveaux risques en matière de sécurité. Découvrez, dans ce guide Kaspersky, comment faire face à cette nouvelle ère de vulnérabilité.

Tech - Par Renaud ROSSET - Publié le 24 juin 2010