13 septembre 2006

Ma variable date change-t-elle toute seule de valeur !!!

Le W-Langage dispose d'un type "date" qui permet de manipuler très facilement les dates, chose fréquente dans un programme. Par exemple, il permet de facilement connaître la date 7 jours en arrière, sans avoir de calcul à faire pour connaître le mois, ou l'année. Exemple :

DateMoins7 est une Date = DateSys()
DateMoins7..Jour -= 7

Info
(DateMoins7)


Si les calculs sont aisés avec ce type, il faut être concentré lors de son affectation, car il peut provoquer un changement inopiné de valeur, tant que son principe n'a pas été bien assimilé. Par exemple, on tente d'affecter le 31 janvier 2006 à une variable date avec ce code :

MaDate est une Date
MaDate..Jour = 31

MaDate..Mois = 1

MaDate..Année = 2006

Info
(MaDate)


Contre toute attente, la date ne sera pas le 31/1/2006, mais le 30/1/2006. La date a changé toute seule !

Voici l'explication, qu'il faut donc garder dans un coin de tête pour bien profiter des avantages de ce type.

L'affectation de MaDate avec ..Jour = 31 ne fait pas d'affecter le jour. Il y a une affectation automatique du mois et de l'année, avec le mois en cours, et l'année en cours. Ainsi l'affectation de MaDate avec ..Jour = 31, revient à affecter la variable avec le 31/9/2006. Mais il n'y a que 30 jours en septembre, et le type date corrige automatiquement l'affectation. On a donc à ce moment là le 30/9/2006 dans la variable MaDate. L'affectation suivante ..Mois = 1 ne fait que remplacer dans la date le mois de septembre, par le mois de janvier. On a donc le 30 janvier 2006 dans la date, et non pas le 31 comme l'on pouvait s'y attendre.

J'espère que cette explication sera utile à quelques développeurs !

3 commentaires:

Anonyme a dit…

ERREUR!!!
Le code proposé donne bien le résultat escompté soit le 31/01/2006.
Par contre si on code
ma date est une date=datesys()
date..jour=31
date..mois=1
date..année=2006
le résultat est effectivement (et de façon logique) 30/01/2006

Anonyme a dit…

Stupéfiant !!

Je n'ai pas encore rencontré ce cas de figure mais j'aurais pu cherché pendant des heures.

Merci beaucoup de ces calrifications.

Jean-Pierre Bloch
GIE Monsieur Store

Elian Lacroix a dit…

M.Lagousse j'observe pourtant le contraire. Si avec le code :
Madate est une Date
Madate..Jour=31
Madate..Mois=1
Madate..Année=2006
Trace(Madate) vous avez le 31, et non pas le 30, c'est que la variable Madate est déjà déclarée, et initialisée. Notez que j'utilise la version interne 100062e de WINDEV 10.