pause-café
rendez-vous technique
Pause-Café est une réunion technique
destinée aux informaticiens sur plateforme IBM i.
destinée aux informaticiens sur plateforme IBM i.
Elle a lieu 3 à 4 fois par an : en Bretagne et sur internet.
Pause-café #11
Février 1997
Y2K
Gestion de l'AN 2000.
Quel sont les problèmes :
-tri
24/12/99 classé avant 05/01/01
- comparaison de dates entre elles
25/12/96 plus grand que 01/01/01
- contrôle de saisie
02/01/00 est une date invalide
Répercussions :
+ les fichiers Base de données
numérique 7 dt 0 ? EDTCDE(Y) Possible
numérique 8 dt 0 ? pas d'EDIT CODE
format DATE ? ==> la solution, mais RPGIV
+ les écrans , les états
faut-il les modifier ? (pas sûr)
+ les programmes
routines de contrôle
calcul (RPGIV possède tout ce qu'il faut)
Les trois méthodes répertoriées :
l'expensions
transformer vos variables en 8,0 ou en DATE
le fenêtrage
fixe (on "voit" de 1940 à 2039)
glissant (on "voit 60 ans en arrière)
le codage
après 99, 9A ?
Quelques éléments techniques
CHGPF avec SRCFILE renseigné ou CPYF ou "ALTER TABLE" SQL
En début de V3R60,les conversions numérique vers date posent des problèmes
MAIS CELA FONCTIONNE à partir de la cumulative C6_338_360.
Nous sommes limités aux possibilités suivantes :
tout format numérique <--> tout format numérique
les dates avec année sur 2, sont comprises entre 1940 et 2039,
elles sont considérée par défaut au format du job,
elles contiennent le séparateur dans le cas du caractère.
<--> date au format *YMD, *DMY , *MDY
numérique étendu
--> date au format *ISO, *USA, *EUR
caractère <--> date *YMD, *DMY, ...
(idem) --> date *EUR, *USA, ...
date <--> date (changement de format transparent)
manipulation de DATES en RPGIV Toute comparaison de dates 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. Exemple : DNUMDAT S 6 0 INZ(950715) DWDATISO S D DATFMT(*ISO) C *YMD move numdat wdatiso
Le nouveau code opération TEST, permet de tester la validité.
TEST Date en ZR indic (mis ON si err) en pos. <<
Si le facteur 2 est une variable numérique ou caractère, il faudra :
- Indiquer un format en facteur 1
- Indiquer une option : (D), (T), (Z).
Exemple :
C *YMD TEST(D) datchar 80
Une date caractère doit doit être éditée ==> contenir les séparateurs.
C'est le seul moyen de gérer les dates à la saisie :
Les DSPF (et PRTF) , ne reconnaissant pas ces formats, SDA et RLU générent
des variables alpha. (8 ou 10, suivant le format), qu'il faut 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 DATMAXI C IF dat2 > datmaxi
Une date ne peut pas être nulle
il faut attendre %NULLIND() en V3R70 !
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)
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
APIs ILE de manipulation DATES Toutes ces APIs sont dans un programme de service : Elles ne sont donc utilisables qu'avec un langage ILE =============== quelques notions ========================================= Pour toutes ces APIs une date lilian exprime une date en nombre de jours depuis le 15 Octobre 1582 (jour 1, qui est le premier jour du calendrier Grégorien) jusqu'au 31 décembre 9999 ! Jour 0 est donc le 14 Octobre 1582 est n'est utilisé que pour les calculs. jour 148887 est le 4 Juin 1990. toutes ces APIs utilisent la notion d'image qui est la représentation caractère du format de la date (une espèce de mot d'édition) =======================================================================
! D E F I N I T I O N D E S I M A G E S D E D A T E ! ======================================================================= Caractère d'Image Signification Exemple !------------------------------------------------------------! ! Y ! année sur 1 chiffre ! 0- ! ! YY ! sur 2 ! 00- ! ! YYY ! sur 3 ! 000-999 ! ! YYYY ! année sur 4 chiffres ! 1582-9999 ! !------------------------------------------------------------! ! MM ! mois sur 2 chiffres ! 01-12 ! ! ZM ! mois sur 1 ou 2 chiffres ! 1-12 ! !------------------------------------------------------------! ! RRRR ! mois en notation romaine ! I-XII (cadré à g) ! !------------------------------------------------------------! ! MMM ! mois (3 C.), en majuscules! JAN-DEC ! ! Mmm ! mois (3 C.), min/MAJ ! Jan-Déc ! ! MMMMMMMMMM ! mois (20 C.) en majuscules! JANVIER-DECEMBRE ! ! Mmmmmmmmmm ! mois (20 C.), min/MAJ ! Janvier-Décembre ! ! MMMMMMMMMZ ! espaces ignorés ! JANVIER-DECEMBRE ! ! Mmmmmmmmmz ! idem (min/MAJ) ! Janvier-Décembre ! !------------------------------------------------------------!
! DD ! jour sur 2 chiffres ! 01-31 !
! ZD ! jour sur 1 ou 2 chiffres ! 1-31 !
! DDD ! n° de jour (date julienne)! 0-365 !
!------------------------------------------------------------!
! W ! Jour de la semaine (1c.) ! D, L, M, M, J, V,S!
! WWW ! jour de la semaine (3c.) ! DIM-SAM !
! Www ! Jour de la sem(3c.)min/MAJ! Dim-Sam !
! WWWWWWWWWW ! jour de la semaine (10c.) ! DIMANCHE-SAMEDI !
! Wwwwwwwwww ! Jour sur 10c.min/MAJ ! Dimanche-Samedi !
! WWWWWWWWWZ ! espaces supprimés ! DIMANCHE-SAMEDI !
! Wwwwwwwwwz ! espaces supprimés ! Dimanche-Samedi !
!------------------------------------------------------------!
Exemples d'images reconnues -> valeur possible
DD/MM/YY 13/02/97
DD Mmmmmmmmmm YY 13 Février 97
WWW, ZM/ZD/YY HH:MI AP JEU, 13/2/97 10:42 PM
Wwwwwwwwww, DD Mmm YYYY, ZH:MI:SS Jeudi , 16 Fév 1997, 9:42:00
Wwwwwwwwwz, DD Mmm YYYY, ZH:MI:SS Jeudi, 13 Fév 1997, 9:42:00
+ CEEDAYS = conversion date vers format lilian [CALLB(D)]
- CHAR(?) date en format caractère
- CHAR(?) image de la date (cf le tableau en fin de cours)
- BIN(4) date lilian en retour
facultatif
- token gestion d'erreur
(vrai pour toutes les APIs ILE, cf les erreurs ILE)
+ CEEDATE = conversion date vers format caractère [CALLB(D)]
- BIN(4) date lilian
- CHAR(?) image de la date
- CHAR(?) date (format caractère) en retour
+ CEEDYWK = calcul du n° de jour dans la semaine à partir d'une
date lilian (1 = Dimanche, 2 = Lundi ...)
- BIN(4) date lilian
- BIN(4) N° de jour en retour
+ CEESCEN = fixe le siècle par défaut pour une date avec année
sur 2 positions.
- BIN(4) le siècle est fixé en indiquant l'année à laquelle
vous souhaitez que se fasse le changement de siècle.
(nbre d'années à soustraire à partir d'aujourd'hui)
ex: 80 (val par défaut) en 1995 indique une plage
temporelle de 1915 à 2014
50 en 1995 indique une plage de 1945 à 2044.
+ CEEOCEN = retrouve la valeur précédente.
- BIN(4) valeur en retour
La modification des triggers en V3R20 / V3R70 peut être une aide : Un trigger recoit un buffer contenant : - des informations système - la version AVANT de l'enregistrement - la version APRES. la commande ADDPFTRG accepte un nouveau paramètre ALWREPCHG. lorsque ce paramètre est renseigné à oui, lors d'un ajout ou d'une mise à jour l'enregistrement ajouté ou remplacé est celui du buffer tel qu'il a été renseigné par le trigger. le trigger peut donc maintenant faire de la substitution de données et remplacer certaines informations renseignées par le programme. ce sont les données du trigger qui seront placées dans la base et non celles initialement indiquées par le programme.
Divers en télécommunication :
Il existe maintenant une possibilité qui permet de tester toutes les
fonctionnalités APPC (ou TCP/IP, avec TCP over APPC d'ANYNET)
il faut créer un contrôleur APPC par :
CRTCTLAPPC CTLD(LOCAL) LINKTYPE(*LOCAL)
Puis créer DEUX unités APPC rattachées au même contrôleur.
(elles devront être en fonction toutes les deux)
CRTDEVAPPC DEVD(ICI) RMTLOCNAME(ICI) LCLLOCNAME(LABAS) CTL(LOCAL)
APPN(*NO) SECURELOC(*YES) TEXT('pour aller ICI)
CRTDEVAPPC DEVD(LABAS) RMTLOCNAME(LABAS) LCLLOCNAME(ICI) CTL(LOCAL)
APPN(*NO) SECURELOC(*YES) TEXT('pour aller LABAS')
DDM, passe-système, etc ..., vous pouvez tout tester en local !
Les versions V3R20, V3R60 ammènent un certain nombre de nouveautés en matière de communication APPC. -DDM : reconnait maintenant les DTAQ et DTAARA éloignées. CRTDTAQ DTAQ(essai) TYPE(*DDM) RMTDTAQ(QGPL/ESSAI) RMTLOCNAME(S44xxxxx) et CRTDTAARA DTAARA(essai) TYPE(*DDM) RMTDTAARA(QGPL/ESAI) RMTLOCNAME(S44xxxxx) -APING : nouvelle commande qui permet de tester l'état d'une ligne (équivalent au PING TCPIP) APING RMTLOCNAME( ) MODE(*NETATR) RMTUSER(*NONE) RMTPWD(*NONE) <-------paramètres facultatifs----------->
-AREXEC : nouvelle commande qui permet de passer une commande sur un
AS/400 distant sans utiliser DDM.
la commande RUNRMTCMD offre les mêmes services, mais est
capable de travailler par dessus IP (REXEC) ou par dessus
SNA (AREXEC), AREXEC est dédié à SNA.
AREXEC CMD( ) RMTLOCNAME( ) RMTUSER(*NONE) RMTPWD(*NONE)
<--paramètres facultatifs-->
ObjetConnect disponible en V3R10 sous forme de PRPQ (5799-FNR)
est devenu l'option 22 de 5716SS1 (l'OS/400 en V3R60) et apporte
des commandes permettant de faire des transferts d'objets
sans utiliser SNADS.
c'est un peu plus rapide, et surtout plus automatique.
SAVRSTLIB LIB( ) RMTLOCNAME( )
SAVRSTOBJ OBJ( ) LIB( ) RMTLOCNAME( ) OBJTYPE(*ALL)
SAVRSTCHG OBJ( ) LIB( ) RMTLOCNAME( ) OBJTYPE(*ALL) REFDATE(*SAVLIB)
SAVRSTDLO DLO( ) RMTLOCNAME( ) FLR(*ANY)
SAVRST RMTLOCNAME( ) OBJ('*') --> Pour IFS.
et
SAVRSTCFG OBJ( ) RMTLOCNAME( ) OBJTYPE(*ALL)
les types admis sont :
+ Les listes de configuration (*CFGL)
+ Les listes de connexion (*CNNL)
+ Les descriptions de classes de service (*COSD)
+ Les descriptions IPX (*IPXD)
+ Les descriptions de modes (*MODD)
+ Les descriptions NetBIOS (*NTBD)
Il existe une nouvelle fonctionnalité intégrée par IFS
QFileSrv.400. il s'agit d'offrir l'équivalent de la fonction dossiers
partagés, mais entre AS/400.
On utilise les mêmes ressources, c'est à dire un JOB dans le
sous-système QSERVER.
le répertoire QFileSrv.400 dans la racine IFS représente l'ensemble
des AS/400 connectables.
Vous devez "monter" (comme sur UNIX) le système de fichier que vous
voulez voir, par la commande MD (ou MKDIR : make a directory)
MD machine.domaine.réseau : sous TCP/IP
MD appn.système : sous APPC/APPN.
Exemple :
le système S44R1234 est un AS/400 auquel je suis relié par un lien
télécom (LAN, SDLC, X25 , peu importe)
" MD APPN.S44R1234 " (si le nom de mon réseau est APPN)
Attention cette commande n'est pas persistante.
c'est à dire que la référence à ce système via IFS sera perdue au
prochain IPL.
Maintenant,
/QFileSrv.400/APPN.S44R1234/MICRO :
représente le répertoire "MICRO" sur le système S44R1234
TCP/IP - V3R20, V3R70 : SLIP ou IP sur réseau commuté
Possible avec tout modem suportant les commandes AT derrière une carte:
2609, 2612 et 6152.(elles s'attachent à un IOP 2623 ou un MFIOP)
1/ Création d'une ligne asynchrone
2/ Configuration du modem
CFGTCPPTP (Point à point) Option 11
3/ Définition d'un profil, associant un modem,une ligne et une adresse IP
(WRKTCPPTP)
Le profil peut-être : *ANS
: *DIAL (avec un script de connexion)
4/ et STRTCPPTP
Client Access propose maintenant une nouvelle version client :
WINDOWS 95
Il s'agit du produit 5763XD1 en version V3R1M1 (utilisable en V3R60)
- il apporte :
+ l'intégration à WINDOWS 95 (les dossiers partagés sont vus
comme des unités réseau à traves l'explorer ou le voisinage
réseau)
+ un driver ODBC 32 bits
+ la gestions des commandes entrantes
+ le support de TCP/IP
+ le routeur NETSOFT
ce produit peut utiliser les routeurs suivants :
- un routeur 16 bits
(celui de CAWIN 3.11 compris)
- MSDLC de microsoft
(livré avec WINDOWS 95 ou disponible sur FTP.MICROSOFT.COM)
- IPX
(lui aussi, livré avec WINDOWS 95)
- TCP/IP (idem)
- TCP/IP LAN
- TCP/IP SLIP (réseau commuté)
- SNA SERVEUR
- le routeur NETSOFT qui est devenu LE routeur de client access
le routeur NETSOFT supporte les connexions :
+ carte LAN en 802.x (MSDLC)
+ carte SDLC
+ liaison Asynchrone (attention carte asynchrone sur l'AS/400)
+ ANYNET (APPC sur TCP/IP)
- sur TCP/IP LAN
- sur TCP/IP SLIP
TCP/IP étant géré par WINDOWS 95
Client Access directement sur TCP/IP a quelques particularités :
- les unités écrans se nomment QPADEVxxx (PC5250 simulant TELNET)
- il n'y a pas d'émulation imprimante possible
- ODBC et transfert de fichier sont reconnus.
et une une nouveauté : la gestion des commandes entrantes vous pouvez avec RUNRMTCDE passer une commande destinée à un PC depuis n'importe quel JOB : + un AUTRE micro + un terminal passif + un travail Batch Si la commande produit un résultat caractère (session DOS) le résultat est redirigé sur AS/400 sous forme de spool Si la commande produit un résultat graphique (sessions WINDOWS), il est affiché sur le micro.
en TCP/IP Sur le micro : - Choisissez propriétés de Client Access dans le panneau de configuration - et affichez l'onglet "commande à distance" Vous pouver indiquer les systèmes et les utilsateurs autorisés à passer des commandes, et leur attribuer un mot de passe. Une étoile '*' dans une entrée équivaut à ne pas restreindre (* dans la zone système signifie, n'importe quel système) la notion de profil/mot de passe est purement micro, il n'y a pas de correspondance avec les profils AS/400. le progamme à activer est : CWBRXD et pour arreter ce service CWBRXDSD
Quand vous passerez la commande RUNRMTCMD il faudra renseigner
profil/mot de passe tel qu'indiqué ici.
Lancer une commande à distance (RUNRMTCMD)
Indiquez vos choix, puis appuyez sur ENTREE.
Commande . . . . . . . . . . . . dir
...
Lieu éloigné:
Nom ou adresse . . . . . . . . 129.1.1.3
Type . . . . . . . . . . . . . *IP *SNA, *IP
ID utilisateur éloigné . . . . . QSECOFR Valeur alpha, *NONE, *CUR
Mot de passe éloigné . . . . . . MOTDEPASSE Valeur alpha, *NONE
en APPC
Le programme à activer est AREXECDW sur des stacks APPC (SNA SERVEUR)
AREXECDN sur le routeur NETSOFT
il faut paramétrer le routeur de manière à indiquer un programme de
transaction (TP) , qui doit être appellé pour réaliser la commande.
le nom de la transaction doit être AREXECD
La séquence de mise en place est la suivante :
- choisir NETSOFT administrateur
- sur une connexion -> bouton droit / propriétés
- onglet "données communes"
- bouton "propriétés avancées"
- onglet "programme de transaction locaux" (ouf !)
là, utilisez le bouton ajout
et renseignez :
#########################################################################
# #
# nom de profil. . . . . . . . . AREXECD #
# #
# nom de TP . . . . . . . . . . AREXECD #
# #
# spécification de fichier TP. . c:\progra-1\ibm\client-1\arexecdn #
# #
# paramètres . . . . . . . . . . #
# #
# ........... ................. #
# : OK : : Annulation : #
# :.........: :...............: #
#########################################################################
en remplacant "-" par le tilde espagnol (à coté de "é")