pause-café
destinée aux informaticiens sur plateforme IBM i.
Pause-café #39
V5R40 ...
Quelques nouvelles de la version 5.4 (prévue pour début 2006) avec dans la foulée, une conférence technique (pour l'Europe, en Italie) annoncée en Février 2006.
-
Une nouvelle machine virtuelle Java (basée sur PASE)
-> Voyez le document iSeries application development directions (fichier PDF, modifié en septembre 2005) ,
particulièrement la page 9 qui explique la nouvelle JVM et plus encore... -
SQL en format libre dans le RPG en format libre, support du XML en natif et Move Corresponding
-
Gestion de la base de données et des index simplifiée ( performances )
-
Nouvelle gestion des sous systèmes (nous allons revoir quelques fondamentaux)
-
Nouveautés sécurité et détection d'intrusions
-
Nouveau support des applications SNA sur IP
-
Nouvel assistant pour l'administration WEB et la gestion des performances du serveur Apache.
-
des avancées I5/OS allant vers plus de disponibilité.
-
Nouveautés CL :
-
Possibilité de faire sous programmes
- SUBR/ENDSUBR
- CALLSUBSR
- RTNSUBR
-
Support des pointeurs pour une utilisation plus simple de certaines API.
- DCL &PTR TYPE(*PTR)
- Fonctions %ADDRESS(nom-variable) qui renseigne un pointeur
- et %OFFSET(pointeur)
pour incrémenter/decrémenter un pointeur
Gestion des Sous-systèmes.
|
Gestion des sous-systèmes |
|
|
WRKSYSSTS vous montre les POOLS mémoire (utilisés par les sous-systèmes)
|
|
Gestion des Dates
Comparatifs des ordres de manipulation de dates
- On ne peut utiliser l'arithmétique temporelle qu'avec des
dates, des heures, des horodatages
- Les dates
- Type DATE sous SQL, type L avec SDD
- comprises entre 1er Janvier de l'AN 1 et 31 Décembre 9999
- le format n'est qu'un critère d'affichage et est un
paramètre SQL (strsql), ODBC, JDBC, etc..
=> Toujours *ISO par défaut ! - *ISO -> 'yyyy-mm-dd'
- *EUR -> dd.mm.yyyy'
- *DMY-> 'dd/mm/yy' (entre 1940 et 2039)
- Constantes : au format par défaut.
- en SQL (fonction du paramétrage)
'yyyy-mm-dd', par exemple select * from PAUSECAFE where datepause = '2006-01-17' - en RPG (fonction de DATFMT en spécif H, sinon *ISO)
encadrer la constante de D' ' (D'yyyy-mm-dd') , par exemple
D wdate S INZ(D'2006-01-17')
- Les heures
- Type TIME sous SQL, type T avec SDD
- comprises entre 0 heures (00:00:00) et Minuit (24:00:00)
- le format le plus simple est *HMS (hh:mm:ss)
- le format par défaut est *ISO (hh.mm.ss)
- Constantes
- en SQL, au format par défaut entre quotes 'hh.mm.ss'
- en RPG (TIMFMT en spécif H), encadré de T' '
- Horodatage
- Type TIMESTAMP sous SQL, type Z sous SDD
- Contient Date + Heure avec une précision de 6 décimales après la seconde
- format *ISO -> 'yyyy-mm-dd-hh.mm.ss.cccccc'
- Constantes
- en SQL, au format par dfaut entre quotes
- en RPG , encadré de Z'
- Valeur
NULLE
Ce n'est pas spécifique aux dates, mais c'est souvent lié (on préfère assigner la valeur nulle à date de départ qu'une date fictive) - ALWNULL avec SDD
- par défaut avec SQL (not null pour l'interdir)
- en programmation :
- RPG : Indiquez ALWNULL(*USRCTL) en spécif H et utiliser la fonction %NULLIND()
- SQL : indiquez :variable:indic pour chaque variable recue lors d'un select
indic est binaire sur 5 chiffres et contient : - 0 : la variable associée à :indic a un contenu significatif
- -1 : la variable contient la valeur nulle
- -2 : SQL a assigné
la valeur nulle suite à une erreur de mappage.
- les calculs peuvent se faire sous la forme
- date + durée = date
- date - durée = date
- date - date = durée
- heure + durée = heure
- etc ..
- les durées peuvent être exprimées de manière explicite avec
- une valeur numérique entière n et :
- Pour SQL
n YEARS n MONTHS n DAYS n HOURS n MINUTES n SECONDS - Exemple :
select * from commandes where datliv = datcde + 2 MONTHS + 10 DAYS - Pour RPG
%YEARS(n) %MONTHS(n) %DAYS(n) %HOURS(n) %MINUTES(n) %SECONDS(n) - Exemple : /free
datliv = datcde + %MONTHS(2) + %DAYS(10);
/end-free - Pour SQL
- en SQL les durées résultat (datcde - datliv) seront
toujours exprimées sous la forme AAAAMMJJ,
où :
-
AAAA représente le nombre d'années MM le nombre de mois JJ le nombre de jours - Ainsi, si SQL affiche 812, il faut comprendre 8 mois, 12 jours
- 40301 signifie 4 ans , 03 mois, 01 jour (attention SQL risque d'afficher 40.301)
-
- en RPG les durées résultat (datcde - datliv) sont
exprimées en une seule unitée,
indiquée en argument de la fonction %DIFF
- Exemple : /free
ecartenjours = %DIFF(datcde : datliv : *DAYS);
/end-free
Fonctions liées aux dates
SQL | Retourne | Exemple SQL | RPG | Exemple RPG |
DATE(x) X doit être une chaîne au format SQL en cours |
une date | DATE( |
%DATE(x:*FMT) | wdate =%DATE( datchar:*DMY) ; |
DAY(D) DAYOFMONTH(D) |
la partie jour de D | DAY(DATCDE) |
%SUBDT(d:*D) | jj = %SUBDT( DATCDE:*D) ; |
MONTH(D) | la partie mois de D |
|
%SUBDT(d:*M) | mm = %SUBDT( %date():*M) ; |
YEAR(D) | la partie année de D | YEAR(current date -
DATCDE) |
%SUBDT(d:*Y) | mm = %SUBDT( DATCE:*Y) ; |
DAYOFYEAR(D) | le n° de jour dans l'année (julien) | DAYOFYEAR(datdep) |
||
DAYOFWEEK(D) | le N° de jour dans la semaine (1 = Dimanche, 2=Lundi, ...) |
DAYOFWEEK(ENTRELE) |
||
DAYOFWEEK_ISO(D) | retourne
le N° de jour dans la semaine (1 = Lundi) |
DAYOFWEEK_ISO(ENTRELE) |
||
DAYNAME(d) | retourne le nom du jour de d (Lundi, Mardi, ...) | DAYNAME(datcde) |
||
MONTHNAME(d) * | retourne le nom du mois de d (Janvier, Février, ...) | MONTHNAME(datcde) |
||
EXTRACT(day from d) | Extrait la partie jour de D (aussi Month et Year) | EXTRACT(MONTH from datcde) |
cf %SUBDT( ) | |
DAYS(D) | retourne le nbr de jours depuis 0001-01-01 | DAYS(datcde)- DAYS(datliv) |
jours = %DIFF( |
|
QUARTER(D) | retourne le n° du trimestre(1-4) | QUARTER(DATEFIN) |
||
WEEK(D) | retourne le n° de semaine (Attention le 1er Janvier est semaine 1) |
WHERE |
||
WEEK_ISO(D) | retourne
le n° de semaine (la semaine 1 est celle qui possède un JEUDI dans l'année.) |
WHERE |
||
CURDATE() | retourne la date en cours, comme CURRENT DATE | WHERE |
%DATE() | if datcde > %date(); |
CURTIME() | retourne l'heure en cours, comme CURRENT TIME | %TIME() | ||
NOW() | retourne le timestamp en cours | %TIMESTP() | ||
JULIAN_DAYS(d) | retourne le nbr de jours qui sépare une date du 1er Janv. 4712 av JC. | JULIAN_DAYS(datcde) |
||
Test de la validité d'une zone caractère ou numérique contenant une date. | TEST(DE) | TEST(DE) datchar; if %error ; ..... endif; |
Fonctions liées aux heures
Fonction(x) | Retourne | Exemple | RPG |
TIME(T) | une heure | TIME( |
%TIME() |
HOUR(T) |
retourne la partie heure de T | HOUR(Pointage) |
%SUBDT(T:*H) |
MINUTE(D) | retourne la partie minute de T |
|
%SUBDT(T:*Mn) |
SECOND(T) | Retourne la partie secondes de T | %SUBDT(T:*S) | |
EXTRACT(hour from t) | la partie heure de T (aussi MINUTE et SECOND) | EXTRACT(SECOND from pointage) |
|
Test de la validité d'une zone caractère ou numérique contenant une heure | TEST(TE) |
Fonctions liées aux Timestamp
Fonction(x) | Retourne | Exemple | RPG | ||||||||||
TIMESTAMP(T) | un timestamp (date - heure - microsecondes) | TIMESTAMP(' |
%TIMESTP() | ||||||||||
TIMESTAMP (D T) |
un timestamp (microsecondes à 0) | TIMESTAMP(datcde
heure) |
|||||||||||
TIMESTAMP_ISO(x) |
un timestamp
à partir de x Si x est une date, l'heure est à 00:00:00 Si x est une heure, la date est à aujourd'hui. |
TIMESTAMP_ISO(heure_pointage) |
|||||||||||
TIMESTAMPDIFF (c 'DIFFERENCE') |
C indique l'unité de
mesure de l'écart que vous souhaitez obtenir
'DIFFERENCE' est la
représentation caractères [ CHAR(22) ] |
TIMLESTAMPDIFF(32 , |
|||||||||||
MIDNIGHT_SECONDS | retourne le nbr de secondes qui sépare un timestamp de minuit | MIDNIGHT_SECONDS(pointage) |
* calcul de la fin de mois
|
* calcul du N° de semaine
|
dsemaine PR 2P 0 /free // si date recue < au lundi ==> premier lundi,année précédente // nombre de semaine entières |
Dates ET DSPF
Les mots-clé DATFMT [éventuellement DATSEP] sont admis sur les écrans (depuis la V4R2)
A LA SAISIE :
- les séparateurs ne sont PAS obligatoires !
- les zéros [à gauche] non plus
pour le 1er Février 2006 on admet avec DATFMT(*DMY) : 01/02/06
010206
10206
1/2/06
- on admet aussi DATFMT(*JOB) qui affiche (et accepte) une date au
format du job en cours(*DMY en France), mais transmet TOUJOURS en *ISO
Enfin, un nouveau mot-clé MAPVAL est implémenté afin d'établir des conversions
entre valeur affichée et valeur transmise au pgm.
MAPVAL( (valeur-pgm1 valeur-écran1)
(valeur-pgm2 valeur-écran2) ...) jusqu'à 100 correspondances
avec comme valeurs particulières :
*BLANK on affiche que des blancs
*CUR valeur en cours (date en cours ou heure en cours)
exemple : MAPVAL(('01/01/40' *BLANK))
si le pgm contient 01/01/40 j'affiche des blancs
ET si l'utilisateur entre des blancs j'envoi 01/01/40
DERNIERE MINUTE ! La PTF SI20165 contenue dans le dernier cumul de ptf (5298) modifie la structure interne des zones TIMESTAMP et ce faisant modifie le niveau de format des fichiers les contenant. Il vous faut donc,
La PTF SI21275 remplace la PTF en question et corrigerait le problème (à vérifier). |
Copyright © 1995,2006 VOLUBIS