RPG - La manipulation des dates

03/12/2005
En RPG 3 la manipulation des dates est une galère... La simple conversion d'un format à l'autre demande des structures de données et une demi-douzaine d'instructions. Le test d'une date est aussi une affaire embêtante. Quant à calculer la date du jour suivant c'est presque une gageure !

En RPG 4 les problèmes de gestion des dates sont un plaisir à résoudre puisqu'ils ont complètement disparus. Il prend en charge tous les format de date et effectue le contrôle de validité, sans se tromper.

Les dates en RPG

Les types et format de date en RPG:
Nom Description Format Séparateurs Longueur Exemple
Année sur 2 chiffres
*MDY Mois/Jour/Année mm/dd/yy / - . , '&' 8 01/15/96
*DMY Jour/Mois/Année dd/mm/yy / - . , '&' 8 15/01/96
*YMD Année/Mois/Jour yy/mm/dd / - . , '&' 8 96/01/15
*JUL Julien yy/ddd / - . , '&' 6 96/015
*JOBRUN Définition du job ... ... 6 / 8 ...
Année sur 4 chiffres
*ISO International Standards Organization yyyy-mm-dd - 10 1996-01-15
*USA IBM USA Standard mm/dd/yyyy

/ 10 01/15/1996
*EUR IBM Standard Européen dd.mm.yyyy . 10 15.01.1996
*JIS Japanese Industrial Standard Christian Era yyyy-mm-dd - 10 1996-01-15


Les instructions de manipulation de dates : (les liens renvoient au manuel de référence RPG de la V5R2)
Operation Syntax formatée Forme libre
Addition ADDDUR (Add Duration) opérateur +
Extraction (Jour/Mois/Année...) EXTRCT (Extract date/Time/Timestamp) %SUBDT (Extract a Portion of a Date, Time, or Timestamp)
Soustraction SUBDUR (Subtract Duration) - operator or %DIFF (Difference Between Two Date, Time, or Timestamp Values)
Test TEST (Test Date/Time/Timestamp)
Année %YEARS (Number of Years)
Mois%MONTHS (Number of Months)
Jour%DAYS (Number of Days)
Heures%HOURS (Number of Hours)
Minutes%MINUTES (Number of Minutes)
Secondes%SECONDS (Number of Seconds)
Microsecondes%MSECONDS (Number of Microseconds)
Conversion%DATE (Expression : Format)
%CHAR(Date/Time : Format)
%DEC(Date/Time : Format) (V5R3)

DName+++++++++++ETDsFrom+++To/L+++IDc.Keywords+++++++++++++++++++++++++++++Comments++++++++++
D Wdte            S               D                                        Date de travail
D DteNum1         S              7P 0 INZ(1040225)
D Nbr             S             10I 0  
D DspDte          S             10A
 /free
    WDte = %date( DteNum1 : *CYMD);      // Convertie DteNum1 en format date
                                         // WDte contient la valeur "2004-02-25"
    WDte = WDte + %months(1);            // +1 mois: WDte a la valeur "2004-03-25"    	
    Nbr =  %subdt( WDte : *days);        // Nbr=25
    WDte = WDte - %days( Nbr );          // Dernier jour de février "2004-02-29" 
    DspDte = %char( WDte : *DMY/);       // DspDte a la valeur 29/02/04
    DspDte = %char( Wdte : *JOBRUN);     // Affiche la date en fonction des valeurs du travail 
 /free

Voyons un peu ce que nous apportent ces fonctions.


Affichage de la date :
Les dates sont normalement stockées en format ISO (AAAA-MM-JJ) des applications plus anciennes utilisent des formats numériques, étendue ou condensé, sur 6 ou 8 chiffres, avec des formats années mois jour.
Le problème est de convertir ce format en un format lissible par l'utilisateur selon ses habitudes régionales. Un utilisateur français aura des difficultés a comprendre '06-01-06' pour '01/06/06'. Certains ont même l'outrecuidance de demander à l'utilisateur de comprendre et de saisir 060601 pour le 1er juin 2006. Cela s'appelle se moquer de l'utilisateur!

L'opérateur *JOBRUN résoud ce problème. Si vous utilisez l'opérateur *JOBRUN dans vos conversions de date pour l'affichage ce sont les définitions de formats de date du travail qui sont utilisées pour formater la date (ou l'heure) afin de le rendre compréhensible par l'utilisateur. Sur une même machine vous pouvez alors utiliser le même programme pour un utilisateur Américain, Français ou Japonais. C'est la définition de leur travail qui devrat être adaptée a leur spécificités locales. Les paramètres DATFMT, DATSEP de leur travail devant être initialisés en fonction des leur paramètres de langue et de pays.