Vous développez sur quel OS ?
CPF,
OS/400,
i5/OS
i for Business
Hum, @ suivre...
dt9 & dt10
// Deux fonctions qui permettent de transformer une pseudo date en vraie date.
// Dans DB2 LUW une fonction, qui utilise alors le “SQL inline”, ne peut utiliser de Handler, c'est la raison pour laquelle DT10 appelle la procédure DT10A, qui elle, a accès à toutes les instructions SQL PL.
// Les choses sont plus simples sur AS400 où une telle gymnastique n'est pas nécessaire...
Bravo le i !
values dt9(991124)#
values dt9(19991225)#
values dt10('1987-12-25')#
values dt10(dt9(19980513))#
values dt10(dt9(380722))#
values dt10(dt9(701133))#
****************************
create function dt9
-- une pseudo date 6 ou 8 numérique amj ou samj
(zn dec(8, 0))
-- une pseudo date alpha formatée iso avec séparateur
-- (qui peut être vérifiée
-- et transformée en vrai date par dt10)
returns varchar(10)
language sql
a010: begin atomic
declare za char(8);
declare aan decimal(4, 0);
declare aa char(4);
declare mm char(2);
declare jj char(2);
-- l'année
set aan = zn/10000;
-- s'il s'agit d'une date sur 6, complément 19 ou 20.
if aan <= 99 then
if aan > 40 then
set aan=aan+1900;
else
set aan=aan+2000;
end if;
end if;
set aa = digits(aan);
--dans une zone alpha pour extraction
set za = digits(zn);
-- le mois
set mm = substr(za, 5, 2);
-- le jour
set jj = substr(za, 7, 2);
-- assemblage final
return aa concat '-' concat mm concat '-' concat jj;
end #
****************************
create function dt10
-- une pseudo date alpha avec séparateur
(za10 varchar(10))
-- une vraie date, ou null si la date passée est incorrecte.
returns date
aa: begin atomic
declare madate date;
call dt10a(za10, madate);
return madate;
end #
create procedure dt10a(in za10 varchar(10), out madate date)
reads sql data
language sql
a010: begin
declare errw int default 0;
declare continue handler for sqlexception set errw=1;
set madate = cast(za10 as date);
if errw =0 then return;
else
set madate = null;
return errw;
end if;
end #
Java où ?
Une alternative à Java EE 5 : Essential Java
Why are we not using Java EE 5?
Date
select current date from sysibm.sysdummy1;
select current date + 65 day from sysibm.sysdummy1;
select cast('2007-02-26' as date) + 2 year - 3 month + 29 day
as toto from sysibm.sysdummy1 ;
select date('2007-01-31') + 1 month as toto from sysibm.sysdummy1 ;
/* génère un avertissement sqlstate 01506, vous devinez pourquoi ? */
select date('2007-12-30') - date('2005-12-31') from sysibm.sysdummy1;
/* Le résultat, numérique, est de la forme aaaammjj.
Ici, 1 année, 11 mois et 30 jours */
select day(current date) from sysibm.sysdummy1;
/* Le jour */
select dayname(current date) from sysibm.sysdummy1;
/* le jour en clair */
select month(current date) from sysibm.sysdummy1;
/* Le mois */
select year(current date) from sysibm.sysdummy1;
/* L'année */
select days(current date) from sysibm.sysdummy1;
/* Le nombre de jour depuis le 01/01/001 */
select days(current date) - days('2000-01-01') from sysibm.sysdummy1;
/* Combien de jour depuis l'an 2000 ? */
Acrostiche
Je ne saurais nommer celle qui sait me plaire.
Un fat peut se vanter, un amant doit se taire.
La pudeur qu'alarmait l'impétueux désir
Inventa sagement le voile du mystère
Et l'amour étonné connut le vrai plaisir.
// On ne connait pas, semble-t-il, l'auteur de ces vers...
mdy2yymd
// SQL PSM (Persistent Stored Modules) ou SQL PL (Procedural Language) ou SPL
// Certains fichiers systèmes AS/400 gérent les dates à l'aide de 2 champs,
// La fonction SQL ci-dessous les rend un peu plus pratique - pour le tri - et lisible...
drop function mdy2yymd £
create function mdy2yymd (
cent varchar(1) ,
mdy varchar(6) )
returns char(8)
a1: begin atomic
declare yy char ( 2 ) ;
declare yymd char ( 8 ) ;
if cent='0' then
set yy ='19';
elseif cent='1' then
set yy ='20';
end if;
set yymd = yy ||
substr ( mdy , 5 , 2 ) ||
substr ( mdy , 1 , 2 ) ||
substr ( mdy , 3 , 2 ) ;
return yymd ;
end £
select mdy2yymd('0', '123198') date from sysibm.sysdummy1 £
Voici un lien vers la doc "IBM i"
Et un vers "DB2 LUW"
Attn, concernants notamment les "control statements", il existe des différences souvent étranges entre les 2 systèmes... Par exemple, sur AS/400, la fonction ci-dessus peut être écrite avec un
case
when cent='0' then set yy ='19';
when cent='1' then set yy ='20';
end case;
alors que cette instruction de test n'est pas possible dans une fonction sur DB2 LUW... Bravo le "i" !
Vieil Hareng Saur
J'en sortirai du camp, mais quel que soit mon sort,
J'aurai montré du moins comme un vieillard en sort !
Adolphe Dumas, Le Camp des Croisés
Kakemphaton
"Je suis romaine, hélas, puisque mon époux l'est."
Corneille, Horace, 1°ed., 1641
Envie
Le talent, ça n'existe pas. Le talent c'est d'avoir l'envie de faire quelque chose, et je crois que l'envie de réaliser un rêve, c'est le talent.
Et tout le restant, c'est de la sueur, c'est de la transpiration, c'est de la discipline.
Je suis sûr de ça.
L'art, moi, je n'sais pas ce que c'est, les artistes, je connais pas."
Jacques Brel
Evénement
"Il faut prendre l'événement par la main avant d'être pris par lui à la gorge"
W. Churchill
Ongle
Avec son ongle, Hans grava une injonction glorieuse sur le mur :
"Braver toutes les forces contraires"
Le Droit Chemin ; Munich, Hiver 43
Pascal Lesur
Cobol écran
Il existe mainte façon de coder un programme interactif en Cobol 400...
Ici, parti-pris a été de déclarer les zones du fichier écran (dds) en both, éventuellement limitées par dspatr(pr) et chginpdft, de manière à n'utiliser qu'un seul buffer (le i bien sûr !).
N'oublions pas indara.
Le lecteur audacieux enrichira sa réflection en comparant ce source avec celui-ci !
ID DIVISION.
PROGRAM-ID. ZFIC045.
* saisie 2
* date
* zones en B
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT ecranfm ASSIGN TO WORKSTATION-zfic045fm-si
ORGANIZATION TRANSACTION.
SELECT zfic010p ASSIGN TO DATABASE-zfic010p
RECORD KEY EXTERNALLY-DESCRIBED-KEY
ORGANIZATION INDEXED
ACCESS random.
DATA DIVISION.
FILE SECTION.
FD zfic010p.
01 zfic010p01.
COPY DDS-ALL-FORMATS OF zfic010p.
FD ecranfm.
01 ecran pic x(1920).
WORKING-STORAGE SECTION.
01 lesindics.
02 tc pic 1 occurs 99 indic 1.
01 ecranw1-es.
copy dds-ecranw1-i of zfic045fm.
01 ecranw2-es.
copy dds-ecranw2-i of zfic045fm.
77 identw2 pic x(5).
77 trtw pic x(10).
PROCEDURE DIVISION.
debut.
open i-o ecranfm
open i-o zfic010p
write ecran Fond 1°affichage.
format is "ECRAN01" indic are tc.
initialize ecranw1-i
move "ecranw1" to trtw. 1°écran
boucle.
perform with test after until trtw = "fin" Boucle générale
if trtw = "ecranw1"
write ecran from ecranw1-i
format is "ECRANW1" indic are tc Fenetre ou l'on saisi
read ecranfm into ecranw1-i la clé du fichier.
format is "ECRANW1" indic are tc
if tc(03) = b"1" or tc(12) = b"1"
move "fin" to trtw Fin.
go to boucle
end-if
move " " to messw
if identw of ecranw1-i = 0
move b"1" to tc(51) Ctrl saisie
go to boucle
end-if
move identw of ecranw1-i to ident of zfic010p01 Chain du
read zfic010p with no lock fichier
invalid key
move b"1" to tc(21) non trouvé
initialize zfic010f
move 20010101 to zd1 of zfic010f
move 20020202 to zd2 of zfic010f
not invalid key
move b"0" to tc(21) trouvé
end-read
move corr zfic010f to ecranw2-i
move identw of ecranw1-i to ident of ecranw2-i
move b"0" to tc(89) Témoin touché
move "ecranw2" to trtw Ecran suivant
end-if
if trtw = "ecranw2"
write ecran from ecranw2-i
format is "ECRANW2" indic are tc Fenetre de saisie
read ecranfm into ecranw2-i
format is "ECRANW2" indic are tc
if tc(03) = b"1"
move "fin" to trtw Fin.
go to boucle
end-if
if tc(12) = b"1"
move "ecranw1" to trtw Retour.
go to boucle
end-if
if tc(88) = b"1" Change
move b"1" to tc(89) Touché
end-if
if tc(23) = b"1" Suppression
write ecran
format is "ECRCONF" indic are tc Fenetre de
read ecranfm confirmation
format is "ECRCONF" indic are tc
if not (tc(03) = b"1" or tc(12) = b"1") Si "entrée"
move "maj" to trtw Suppression
else
continue
end-if
go to boucle
end-if
if za1 of ecranw2-i = " "
move b"1" to tc(51) Ctrl saisie
go to boucle
end-if
if za2 of ecranw2-i = " "
move b"1" to tc(52) Ctrl saisie
go to boucle
end-if
if tc(88) = b"1" Réaffichage si
go to boucle change
end-if
if tc(89) = b"1"
move "maj" to trtw Maj
else
move "ecranw1" to trtw Retour 1° écran
move 0 to identw of ecranw1-i
end-if
end-if
if trtw = "maj"
move corr ecranw2-i to zfic010f
if tc(23) = b"1"
delete zfic010p Suppression
invalid key
move "Opération NON effectuée !" to messw Situation
move "ecranw1" to trtw inatendue !
go to boucle Retour 1°écran
not invalid key
move "supprimé" to messw(7 : )
end-delete
else
if tc(21) = b"1"
write zfic010p01 Création
invalid key
move "Opération NON effectuée !" to messw Situation
move "ecranw1" to trtw inatendue !
go to boucle Retour 1°écran
not invalid key
move "créé" to messw(7 :)
end-write
else
rewrite zfic010p01 Mise à jour
invalid key
move "Opération NON effectuée !" to messw Situation
move "ecranw1" to trtw inatendue !
go to boucle Retour 1°écran
not invalid key
move "modifié" to messw(7 : )
end-rewrite
end-if
end-if
move ident of zfic010f to identw2
move identw2 to messw(1 : 5)
move "ecranw1" to trtw Retour 1° écran
move 0 to identw of ecranw1-i
end-if
end-perform Boucle générale
goback. Fin
Risque
Il ne faut pas oublier que le System 38 qui est à l’origine de l’OS/400 a été financé dans les années 80 sur un budget supplémentaire car le laboratoire Rochester voulait placer le management d’ IBM devant le fait accompli.
Comme l’écrivait Frank Soltis dans son livre à ce sujet :
« il est plus efficace de prendre le risque d’être réprimandé après coup que de demander en vain».
Donc l’OS/400 est né de la compétence d’une équipe de visionnaires, du génie de Frank Soltis et de l’audace d’un laboratoire isolé dans des champs de maïs du Minnesota.
Extrait d'une lettre de www.repeglio.com merci à Jean Mikhaleff ;-))
Voyage à l'intérieur de l'AS/400 (as400)
- Voyage À L'intérieur De L'as/400 (As400)
- Très Bon Etat
- Soltis, Frank
- Un "Collector", en Français, 1996, par Frank G. Soltis, l'un des pères de l'IBM System/38, AS/400, iSeries, System i, maintenant Power... La genèse de ce magnifique système. Ce n'est pas un manuel...
- Voir ma boutique
Retrouvez Voyage À L'intérieur De L'as/400 (As400) dans la rubrique Livres sur PriceMinister
Plus d'info sur www.attn.fr
L'inverse ?
Réné Char disait qu'il faut penser en stratège et agir en primitif.
Et si c'était l'inverse ?
/image%2F1025633%2F20151122%2Fob_b0e74c_pam007i.png)



