Nous n'avons jamais assez de fonctions toutes prêtes pour écrire nos programmes !
Le RPG/400 (aka RPG III) est d'une pauvreté aujourd'hui affligeante, mais, bien heureusement, le RPG IV nous en a apporté bon nombre qui nous simplifient bien le travail, sans compter la possibilité de faire les nôtres.
Cependant certaines nous seraient bien utiles !
Qui n'a jamais eu besoin du numéro de semaine d'une date, ou du n°/nom du jour de la semaine, du nom du mois, d'un nombre aléatoire, etc ... ?
Ceux qui connaissent SQL savent qu'il contient de nombreuses fonctions très utiles.
Ainsi, récupérer le n° de semaine d'une date de la base de données et facile :
SELECT MADATE,
WEEK_ISO(MADATE) FROM MATABLE
Une astuce simple consiste à utiliser cette possibilité dans les programmes à partir d'une table "bidon", c'est à dire ne servant qu'à ça et dont le contenu (sans aucun intérêt) se résume surtout à une seule ligne (=enregistrement).
Il n'est même pas nécessaire de créer cette table, IBM l'a fait pour nous : SYSIBM/SYSDUMY1
Ainsi dans un programme RPG (3 ou 4) nous pouvons faire :
C/EXEC SQL SELECT WEEK_ISO(:MADATE) INTO :WEEK FROM SYSIBM/SYSDUMMY1
C/END-EXEC
Ce code va nous renvoyer dans la variable RPG WEEK (numérique) le numéro de la semaine ([ur=http://fr.wikipedia.org/wiki/Semaine_1l]au standard ISO[/url]) à partir de la date contenue dans la vairable RPG MADATE. En RPG 3 cette date est une chaine alphanumérique, au format de date indiqué dans la commande de compilation, au format *ISO (YYYY-MM-DD) ou celui indiqué par une instruction SQL : SET OPTION DATFMT = ...). En RPG 4 la date peut être également une chaine, mais aussi, bien sûr, une zone date.
C'est aussi simple que cela, en deux lignes, nous utilisons la fonction SQL.
Mais on peut faire mieux, en évitant de déclencher les mécanismes d'accès à la DB par le SELECT, à l'aide de linstuction d'affection SET de SQL.
Notre instruction devient donc :
C/EXEC SQL SET :WEEK = WEEK_ISO(:MADATE)
C/END-EXEC
Un exemple complet en RPG III :
I DS
I 1 30WEEK
I 1 3 WEEKA
I 4 13 NOM
* 2009-01-26 = LUNDI 26 JANVIER 2009, SEMAINE 5
C MOVEL'2009-01-'WDATE 10
C MOVE '26' WDATE
C/EXEC SQL SET :WEEK = WEEK_ISO(:WDATE)
C/END-EXEC
C WEEKA DSPLY
C/EXEC SQL SET :NOM = DAYNAME(:WDATE)
C/END-EXEC
C NOM DSPLY
C/EXEC SQL SET :NOM = MONTHNAME(:WDATE)
C/END-EXEC
C NOM DSPLY
C SETON LR
Vous trouverez la référence des fonctions scalaires SQL (V5R4) ici :
http://publib.boulder.ibm.com/infocenter/iseries/v5r4/index.jsp?topic=/db2/rbafzmstch2func.htmAmusez vous bien !
