Hier, je faisais mon petit tour habituel sur les forums de PCSoft® et je suis tombé sur une question intéressante. La personne voulait savoir si une date était dans la période de Noël mais sans tenir compte de l'année.

Vous pouvez lire le thread en question ici.

La réponse la plus courante a été de de recalculer à chaque fois les bornes de début et de fin en fonction de la date passée en paramètre.

Mais si on souhaite ignorer l'année, pourquoi s'embêter avec ?

Voici une petite fonction qui permet de résoudre ce problème :

PROCEDURE EstDansPériodeSansAnnée(Date est une Date, BorneDébut est une chaîne, BorneFin est une chaîne)

PériodeSurDeuxAnnées est un booléen = BorneDébut > BorneFin 

SI PériodeSurDeuxAnnées ALORS
    RENVOYER PAS (BorneFin < DateVersChaîne(Date, "MMJJ") < BorneDébut)
SINON
    RENVOYER BorneDébut <= DateVersChaîne(Date, "MMJJ") <= BorneFin
FIN   

Les dates au format AAAAMMJJ sont intéressantes parce qu'on peut savoir si une date est supérieure à une autre juste en comparant les chaines à ce format. Ce qui induit que l'on peut aussi comparer la partie MMJJ pour savoir si une date est dans une période ou pas.

Mais dans la question sur le forum, il y a un piège, c'est que la période est à cheval sur deux années. Et ça complique un peu le code. Si la date n'est pas à cheval sur une année, on peut directement comparer la partie MMJJ de la date avec les bornes début et fin.

Mais si elle est à cheval sur les deux années, il faut vérifier si la date est dans la période non-voulue (qui elle est forcément sur la même année). Si elle est dans la période non-voulue, alors elle n'est pas dans la période demandée.

Et en bonus, une petite closure :

PROCEDURE ClosureEstDansPériodeSansAnnée(LOCAL BorneDébut est une chaîne, LOCAL BorneFin est une chaîne)
p est une Procédure = iEstDansPériodeSansAnnée

    PROCEDURE INTERNE iEstDansPériodeSansAnnée(Date est une Date)
        RENVOYER EstDansPériodeSansAnnée(Date, BorneDébut, BorneFin)
    FIN

RENVOYER p

Et pour l'utiliser :

EstDansPériodeNoel est une Procédure = yDate.ClosureEstDansPériodeSansAnnée("1201", "0115")
SI EstDansPériodeNoel(MaDate) ALORS
    ....
FIN         

Voilà, cela pourra peut-être vous servir pour les fêtes de fin d'année.

Merci pour votre lecture.

Je vous souhaite une bonne journée !

Jonathan Laurent

Read more posts about this author.

Comments