RPG-IV reconnait les variables date/heure depuis la V3R10. SDD RPG IV type de donnée : | L = date | D | | T = heure | T | | Z = timestamp (horodatage)| Z | les dates peuvent avoir un des formats suivants : format lg présentation séparateur *YMD 8 40/01/01 à 39/12/31 au choix '.' '/' '-' '&'=blanc *DMY 8 01/01/40 à 31/12/39 - idem - *MDY 8 01/01/40 à 12/31/39 - idem - *JUL 6 40/001 à 39/365 - idem - ou un format normalisé : *ISO 10 yyyy-mm-dd (format par dft) imposé '-' *USA 10 mm/dd/yyyy " '/' *EUR 10 dd.mm.yyyy " '.' *JIS 10 yyyy-mm-dd " '-' (standard de l'industrie japonaise) |
Un variable de type heure accepte les formats suivants : format lg présentation séparateur *HMS 8 00:00:00 à 24:00:00 au choix '.' '/' '-' '&'=blanc *ISO 8 00.00.00 à 24.00.00 imposé '.' *USA 8 00:00 AM à 12:00 AM imposé ':' *EUR 8 00.00.00 à 24.00.00 imposé '.' *JIS 8 00:00:00 à 24:00:00 imposé ':' Les variables horodatage n'ont qu'un seul format : yyyy-mm-dd-hh.mm.ss.uuuuuu <--date--><-heure-><micro- secondes> ces variables date sont stockées physiquement(format interne) sous la forme: - date = 4 octets - heure = 3 octets ce qui permet toutes formes - horodatage = 10 octets de comparaisons. mais nous les voyons TOUJOURS (DSPPFM,DSPFFD, déclaration RPG IV) sous le format externe "date éditée" (en clair, avec les séparateurs) |
Ces paramètres peuvent être indiqués : sur une spécif I niveau zone 31-34 = format 35 = séparateur quand la position 36 (type), contient D,T ou Z. sur une spécif O niveau zone 53-80 = format[séparateur] Pour un fichier externe ces infos sont reprises de la définition SDD. Sinon, le système recherche: ! sur la définition (spécif I, O ou D) ! sur la spécif F (mot-clé DATFMT,TIMFMT) ! sur la spécif H ( - idem - ) V *ISO par défaut. Les mots-clés DATFMT, TIMFMT ont la syntaxe suivante: DATFMT(format[séparateur]) TIMFMT(format[séparateur]) [séparateur] n'est admis que pour les formats ayant un séparateur au choix. exemples : DATFMT(*EUR) - DATFMT(*DMY/) - TIMFMT(*ISO) |
Ne pas confondre DATFMT = format des variables date par défaut et DATEDIT = format de UDATE et *DATE. Toute constante peut être précédée de T' ', D' ', Z' ' . Exemple : DWDATE S D DATFMT(*DMY/) puis v--------------------[format specif H] C move D'15/07/95' wdate ou DWDATISO S D DATFMT(*ISO) D INZ(D'1995-07-15') ou encore Ddsdate DS D cejour D DATFMT(*ISO) INZ D an 4 0OVERLAY(cejour) D mois 2 0OVERLAY(cejour:6) D jour 2 0OVERLAY(cejour:9) C move *YEAR an C move *MONTH mois C move *DAY jour |
manipulation : Toute comparaison de dates entre elles, heures entre elles est cohérente indépendamment du format ! La conversion est assurée par MOVE,MOVEL : date <-> date, etc..., changement de format transparent. numérique,caractère <-> Date numérique,caractère <-> heure numérique,caractère <-> horodatage le facteur 1 permet alors de préciser le format de l'élément numérique ou caractère. (*ISO, *EUR , *YMD , *DMY etc... plus *CYMD ou *JOBRUN) Exemple : DNUMDAT S 8 0 INZ(19950715) DWDATEUR S D DATFMT(*EUR) C *ISO move numdat wdateur |
Pour les variables alpha il est possible d'indiquer le séparateur dans le format en facteur 1 : *fmtX avec fmt pour le format et X pour le séparateur & pour un espace 0 pour indiquer l'absence de séparateur *ymd/ indique une variable alpha de 8 c contenant AA/MM/JJ *ymd. " " " " " AA.MM.JJ *ymd& " " " " " AA MM JJ *ymd0 " " " " de 6 c " AAMMJJ le code opération TIME est modifié : TIME avec une zone résultat de 12 ==> HHMMSSAAMMJJ 14 ==> HHMMSSAAAAMMJJ date ==> date en cours heure ==> l'heure en cours horodatage ==> l'horloge système |
Le nouveau code opération TEST, permet de tester la validité. TEST(D|T|Z) - la zone résultat est une variable numérique ou charactère - il faut indiquer un format en facteur 1 (comme le MOVE) - et soit un indicateur (pos <<), soit (E) et tester: if %error. Exemple : C *YMD TEST(D E) datchar rappel : Une date caractère doit doit être éditée =contenir les séparateurs ---------------------------------------------------------------------------- C'était , jusqu'en V4R20, le seul moyen de gérer les dates à la saisie. Les DSPF (et PRTF) , ne reconnaissant pas ces formats, SDA et RLU géraient des variables alpha.(8 ou 10, suivant le format), qu'il fallait renommer. |
Notion de durée : le code opération ADDDUR permet d'ajouter une durée à une date (le résultat est une date) Le code opération SUBDUR permet 1/ de soustraire une durée à une date (le résultat est une date) 2/ de soustraire une date à une date (le résultat est une durée) Une durée est un entier numérique (constante ou variable [15 maxi]) suivi d'un code (sépararé par :), représentant la signification : *YEARS ou *Y : la durée est exprimée en nbr d'années *MONTHS ou *M nbr de mois *DAYS ou *D nbr de jours *HOURS ou *H nbr d'heures *MINUTES ou *MN nbr de minutes *SECONDS ou *S nbr de secondes *MSECONDS ou *MS nbr de microsecondes |
Exemples: dat2 = dat1 + 12 mois C DAT1 ADDDUR 12:*M DAT2 dat2 = dat2 + 45 jours C eval nbj = 45 C ADDDUR nbj:*D DAT2 dat2 = dat1 - 3 mois C DAT1 SUBDUR 3:*M DAT2 nbm = nombre de mois d'écart entre dat1 et dat2 C DAT1 SUBDUR DAT2 nbm:*M ATTENTION ! Vous ne pouvez pas tester "IF nbm > 3", le système considère qu'il y a 3 mois d'écart entre 15/07/95 et 31/10/95 (le nombre de mois est une information qui ne tient pas compte des jours) Pour tester que dat2 n'est pas > de plus de 3 mois à dat1, écrivez : C DAT1 ADDDUR 3:*M WDATE C IF dat2 > wdate |
Il est possible de calculer l'écart (la durée) entre : une date et un horodatage une heure et un horodatage Une durée peut être négative. Ajouter -90 jours (= soustraire 90 jours, qui l'eut cru ?) Le résultat d'une différence peut être négatif (si dat1 < à dat2) Ajouter un nombre de jours va impacter la partie mois (et peut-être année) Ajouter un nombre de mois va peut-être modifier l'année, en aucun cas le jour. ( sauf fin de mois : 31/01 + 1 mois = 28/02 ou 29/02 ) Modifier la partie heure d'un horodatage, peut impacter la partie date. Il n'y a pas de fonction pour retrouver le dernier jour du mois (mais le changement de mois lors d'un ajout de jours est cohérent) |
Il est enfin possible d'extraire une partie d'une date/heure/horodatage. avec EXTRCT : C EXTRCT DAT2:*M mois Le facteur 2 contient la variable date/heure suivi du code indiquant la partie à extraire (séparé par :) (ici mois contient le n° de mois de DAT2) la variable résultat peut être numérique ou caractère. |