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é #14
Mars 1998
Quelques nouveautés systèmes en V4R10 : l'OS/400 est dépendant du n° de série de la machine et n'est valable que sur cette machine. il faut donc maintenant indiquer une clé de licence pour 5769SS1 dispo 5050, par WRKLICINF : .......................................................................... : 1=Ajouter clé de licence 2=Modifier 5=Détail 6=Imprimer dét : : 8=Gérer détenteurs licences ... : : : : Terme : : Opt Produit licence Dispo Description : : 5769SS1 V4R1M0 5050 OS/400 : : 5769SS1 V4 5102 OS/400 - PSF : : : :........................................................................: puis passer l'option 1, Ajouter clé de licence (LAC en langage IBM)
Ajouter info clé de licence (ADDLICKEY) Indiquez vos choix, puis appuyez sur ENTREE. Entrée clé de licence . . . . . > *PROMPT *PROMPT, *LICKEYFILE, *TAP Identificateur du produit . . . > 5769SS1 Identificateur Terme de la licence . . . . . . > V4R1M0 Vx, VxRy, VxRyMz Dispositif . . . . . . . . . . . > 5050 5001-9999 Numéro de série du système . . . > 44R7480 Numéro, *LOCAL, *REMOTE, * Groupe de processeur . . . . . . *ANY Valeur alpha, *ANY Clé de licence: Caractères 1 - 6 . . . . . . . Valeur alpha Caractères 7 - 12 . . . . . . Valeur alpha Caractères 13 - 18 . . . . . . Valeur alpha Limite d'utilisation . . . . . . 1 0-999999, *NOMAX ___________________________________________________________________________ Faute de quoi vous verrez apparaitre le message : Limite d'utilisation 0 dépassée. Délai de grâce expire dans 64 jours, le 11/05/98.
nouvelles commandes liées à TCP/IP
pour la NS CFGTCPBP Configure BOOTP
CFGBPA Change BOOTP attributs
WRKBPTBL Work with BOOTP Table
° BOOTP permet d'attribuer une adresse IP à un HOST
en fonction de son adresse MAC
CHGTFTPA Change TFTP attributs
° TFTP permet des transferts de fichier sans SIGNON
pour le routage
CHGTCPRT Configure RouteD
CHGRTDA Change Routed attributs
WRKRTDCFG Work with RouteD Config.
° Il s'agit du protocole RIP
Nouveautés autours du passe-système.
la fonction passe-système ne lance plus un job (dans QCMN) par écran
distant, mais utilise maintenant une philosophie serveur, en démarrant
des jobs à l'avance, un job pouvant s'occuper de plusieurs sessions.
les jobs sont donc maintenant dans QSYSWRK
.......................................................................
: Opt S-syst/trav Utilisat Type % UC Fonction Etat :
: QNFSNLMD QSECOFR BCH 0,0 SELW :
: QNFSNSMD QSECOFR BCH 0,0 SELW :
: QNFSRPCD QSECOFR BCH 0,0 SELW :
: QNPSERVD QUSER BCH 0,0 SELW :
: > QPASVRP QSYS BCH 0,0 PGM-QPASVRP DEQW :
: > QPASVRS QSYS BCH 0,0 PGM-QPASVRS TIMW :
: > QPASVRS QSYS BCH 0,0 PGM-QPASVRS TIMW :
: > QPASVRS QSYS BCH 0,0 PGM-QPASVRS TIMW :
: > QPASVRS QSYS BCH 0,0 PGM-QPASVRS TIMW :
:.....................................................................:
il sont démarré automatiquement par le démarrage de QSYSWRK.
la valeur système QPASTHRSVR indique le nombre de jobs à démarrer
l'OS est installé avec *CALC
les commandes ENDCMNSVR
et STRCMNSVR permettent l'arrêt et le lancement.
commandes diverses :
DSPTM pour voir les marques déposées autour de l'OS
CRTVLDL liste de validation pour le serveur WEB
DLTVLDL
APIs :
QSYCHGDS pour modifier les mots de passe DST
QTARDINF pour obtenir des informations sur une bande/bandothèque
IPL.
l'IPL est plus court, et cela au détriment d'un certain nombre de tâches
qui ne sont plus réalisées pendant ce dernier.
nous avons donc deux nouvelles commandes autour des paramètres d'IPL :
Modifier les attributs d'IPL (CHGIPLA) et DSPIPLA
Type de redémarrage . . . . . . *SYS *SAME, *SYS, *FULL
Position verrou . . . . . . . . *NORMAL *SAME, *NORMAL, *AUTO...
Diagnostic matériel . . . . . . *MIN *SAME, *MIN, *ALL
Comprimer tables de travaux . . *NONE *SAME, *NONE, *NORMAL...
Vérifier les tables de travaux *ABNORMAL *SAME, *ABNORMAL, *ALL
Rétablir répertoire produit . . *NONE *SAME, *NONE, *NORMAL...
Mise à blanc files de travaux . *NO *SAME, *YES, *NO
Mise à blanc files de sortie . . *NO *SAME, *YES, *NO
Mise à blanc hist trav incompl *NO *SAME, *YES, *NO
Démarrer éditeurs imprimante . . *YES *SAME, *YES, *NO
Démarrer à l'état restreint . . *NO *SAME, *YES, *NO
Vous venez de voir les valeurs par défaut qui vont toutes vers moins de
contrôles.
la commandes RCLLIB permet de compresser la taille d'une bibliothèque
(ce qui devait être fait avant pendant l'IPL)
la commande DSPJOBTBL permet de voir l'état de la tables système des
jobs actifs , afin de savoir si une compression de cette table
est souhaitable :
Tables de travaux S44R74
09/03/98 15:20:
Structures de travail permanentes: Structures de travail temporaires
Initiales . . . : 30 Initiales . . . : 20
Supplémentaires : 10 Supplémentaires : 10
Disponibles . . : 4
----------------------Postes---------------------
Table Taille Total Disponibles Utilisés Autre
1 951040 920 3 917 0
Chaque job actif occupe une position (une place) dans cette table.
la valeur initiale est données par QTOTJOB
la valeur d'incrément par QADLTOTJ
Si le système arrive au bout de la place réservée il est obliger d'allouer
une extension, ce qui est une opération coûteuse en ressources.
Si au contraire votre tables est bien trop large, le temps d'IPL en est
augmenté d'autant.
si c'est la cas le paramètre CPRJOBTBL(*ALL) permet la compression
de la table pendant IPL
le paramétre CHKJOBTBL indique lui s'il faut vérifier cette table système.
la valeur *ABNORMAL indique qu'il ne faut le faire que suite à un arrêt
anormal de la machine.
PTF.
Avec la V4R1 la manière d'appliquer des PTFs Microcode a été modifiée.
jusqu'en V3R7, il fallait lancer un IPL à partir de la zone machine A
pour appliquer les PTFs microcode différées, puis à partir de la
zone machine B pour appliquer les autres PTF.
cela n'est plus vrai, l'IPL en A n'a plus lieu ce qui réduit les temps.
ce qui implique :
° les PTF microcode sont appliqués maintenant lors d'un IPL anormal
° si après un IPL à partir de la zone machine A, vous supprimer des PTF,
le retrait est immédiat.(avant il fallait un nouvel IPL)
° la sélection de PTF microcode pour application différée suite à un IPL
en zone machine B prend plus de temps.
Imprimantes LAN (ASCII)
Pour utiliser une imprimante réseau (ou imprimante LAN) de type ASCII,
il faut :
soit une imprimante (ou un boitier) implémentant le protocole LEXMARK
soit une imprimante IP implémentant le protocole LPD.
___________________________________________________________________________
Pour une imprimante non IP, il faut un attachement
via un adaptateur LAN type 4033 IBM
ou type MarKNET XLe
ou un carte interne MarkNet XL (INA = Internal Network Adaptator)
comme une 4039 IBM
Exemple : Create Device Desc (Printer) (CRTDEVPRT) Type choices, press Enter. Device description . . . . . . . > PRT4039 Name Device class . . . . . . . . . . > *LAN *LCL, *RMT, *VRT, *SNPT, Device type . . . . . . . . . . > 3812 3287, 3812, 4019, 4201... Device model . . . . . . . . . . > 1 0, 1, 2, 3, 4, 10, 13, 20 Switched line list . . . . . . . > ETHERNET Name + for more values LAN remote adapter address . . . > 420000000000 000000000001-FFFFFFFFFFFE Adapter type . . . . . . . . . . > *INTERNAL *INTERNAL, *EXTERNAL Emulated twinaxial device . . . > 3812 3812, 5219, 5224, 5256 Font: Identifier . . . . . . . . . . 3, 5, 11, 12, 13, 18, 19. Point size . . . . . . . . . . *NONE 000.1-999.9, *NONE Manufacturer type and model . . > *IBM4039HP On utilise le SSAP 12 pour une carte interne (INA) et les 12, 16 et 1A pour un boitier MarkNET XLe.
LPR (Line Printer Requester)
Pour utiliser une imprimante IP, il faut :
Un boitier ou un attachement LAN à votre imprimante (imprimante réseau)
Un PC tournant sur Windows NT ou un Unix Micro
(sous NT choisir panneau de configuration /réseau /onglet-services,
et ajouter le service "Serveur d'impression TCP/IP")
Il faut alors utiliser la fonction OUTQ remote par:
!-- il s'agit du nom PC
v
CRTOUTQ OUTQ(TCP) RMTSYS('130.1.1.1') RMTPRTQ(LASERJET) CNNTYPE(*IP)
DESTTYPE(*OTHER) MFRTYPMDL(*HP5)
^------- ici indiquer le type d'imprimante.
Un éditeur remote est automatiquement démarré et envoi les spools
dès qu'ils sont "ready" dans la file d'attente.
Gestion de tous les fichiers spoule Indiquez vos options, puis appuyez sur ENTREE. 1=Envoyer 2=Modifier 3=Suspendre 4=Supprimer 5=Afficher 6=Libér 7=Messages 8=Attributs 9=Gérer l'état d'impression Unité ou Total Pg en Opt Fichier Utilisat file Référence Etat pages cours QSYSPRT AF400CM PRTNT SND 1 ^ | | ############### # en cours # # d'envoi # ############### Paramètres pour les options 1, 2, 3 ou commande ===> F3=Exit F10=Vue 3 F11=Vue 2 F12=Annuler F22=Imprimantes F24=Autres touches
NetWorkStation
Vous pouvez aussi attacher une imprimante à une NetworkStation
Il faut alors configurer l'imprimante de la manière suivante :
CRTDEVPRT DEVD(PRTNS2) DEVCLS(*LAN) TYPE(3812) MODEL(1) LANATTACH(*IP)
PORT(6464) FONT(11) PARITY(*NONE) STOPBITS(1) TRANSFORM(*YES)
MFRTYPMDL(*HP4) RMTLOCNAME('192.1.1.1') SYSDRVPGM(*NETSTNDRV)
l'OUTQ est crée en même temps que l'imprimante qui est considérée
comme locale.
--------ATTENTION-----------------------------------------------------
Avec une OUTQ remote (cas de LPR) le paramètre PAGERANGE est ignoré
et la totalité du SPOOL est transmis au système distant, avec une
imprimante locale (cas de la NS), ce paramètre est bien sur considéré.
Et enfin nouveauté de la version 4.10, il est possible de définir une
imprimante IP par la commande CRTDEVPRT si celle-ci supporte le
langage PJL de chez HP (JETDIrect).
TCP/IP est utilisé pour l'envoi du spool en lui-même
PJL pour le dialogue de retour d'informations et d'administration en général
vous retrouverez donc : -les messages "fin de papier", ...
-les paramètres comme PAGERANGE()
[ ATTENTION CELA NE FONCTIONNE QU'A PARTIR DE LA HP5 ! ]
CRTDEVPRT DEVD(PRTHP) DEVCLS(*LAN) TYPE(3812) MODEL(1) LANATTACH(*IP)
PORT(9100) FONT(11) PARITY(*NONE) STOPBITS(1) TRANSFORM(*YES)
MFRTYPMDL(*HP4) RMTLOCNAME('192.1.1.1') SYSDRVPGM(*HPPJLDRV)
pour une IBM compatible HP indiquer PORT(2051) SYSDRVPGM(*IBMPJLDRV)
Dans tous les cas vous utilisez la fonction HOST PRINT TRANSFORM
qui transforme vos spools SCS ET AFPDS (PAGSEG / OVERLAY) en ASCII.
les formats en sortie peuvent être divers (le PCL5 d'HP particulièrement)
les seules limites aujourd'hui sont :
pas de support pour les commandes graphiques GOCA
pas de support pour le code barre " Royal Mail bar code"
pas de support pour le paramètre MULTIUP
pas de support pour le paramètre COR (réduction)
pas de support pour USRDFNCHR
la pramètre FIDELITY est ignoré
NSF est maintenant disponible sur AS/400 :
Il s'agit d'un standard du monde UNIX offrant des fonctionnalités
proches des dossiers partagés.
Cela fonctionne sur IP
l'AS/400 est serveur NFS et Client NFS
Avec le serveur NFS vous indfiquez dans un fichier "export"
de la directory "/etc", les répertoires partageables
Puis vous lancez la commande STRNFSSVR *ALL
cela déclenche des jobs de type serveur (dans QSYSWRK)
et vos clients NFS peuvent voir les répertoires AS/400 par mount
Plus intéressante (plus novatrice) semble être la fonction cliente : elle permet en effet de voir des répertoires d'une machine ° UNIX ° Windows NT/95 etc .. à travers l'arborescence IFS (copie, suppression, etc ...) sous Windows NT/95 vous trouverez des produits sur le WEB (freeware, shareware et versions de démo) sous UNIX c'est en règle générale natif. il vous faut installer le produit et paramétrer le fichier export. par exemple c:/ #autorise la totalité du disque c: c:/ 10.3.100.100 #autorise c: mais uniquement le # client à l'adresse 10.3.100.100 c:/doc #autorise de répertoire doc seul.
du coté AS/400, il faut créer un répertoire, par exemple :
MKDIR DIR('/NFS')
puis associé ce répertoire à un serveur NFS par MOUNT.
MOUNT TYPE(*NFS)
MFS(10.3.100.101:/c) le "répertoire c" à l'adresse 10.3.100.101
MNTOVRDIR(/NFS) alias local
OPTIONS('rw,rsize=1024,wsize=1024')
rw = indique un access en lecture/écriture
rzise = taille du buffer en lecture
wzise = taille du buffer en écriture
voila, c'est tout !
Gestion des liens d'objet Répertoire . . . . : / Indiquez vos options, puis appuyez sur ENTREE. 3=Copier 4=Enlever 5=Niveau suivant 7=Rebaptiser 8=Afficher attributs 11=Modifier répertoire en cours... Opt Lien objet Type Attribut Texte 5 NFS DIR QCA400 DIR QDLS DIR QFileSvr.400 DIR QFPNWSSTG DIR QIBM DIR QISAPTF DIR QLANSrv DIR QOpenSys DIR A suivre... Paramètres ou commande ===> F3=Exit F4=Invite F5=Réafficher F9=Rappel F12=Annuler F17=A partir de F22=Zone complète F23=Autres options
Gestion des liens d'objet Répertoire . . . . : /NFS Indiquez vos options, puis appuyez sur ENTREE. 3=Copier 4=Enlever 5=Niveau suivant 7=Rebaptiser 8=Afficher attributs 11=Modifier répertoire en cours... Opt Lien objet Type Attribut Texte boot.ini STMF formation.POL STMF .................................. formation.POL.LOG STMF : : mpssetup.log STMF : Nous voyons ici le disque : notes DIR : dur d'un serveur NT. : notes.rip STMF : : nscpic.log STMF : : ntldr STMF :................................: pagefile.sys STMF # A suivre... Paramètres ou commande ===> F3=Exit F4=Invite F5=Réafficher F9=Rappel F12=Annuler F17=A partir de F22=Zone complète F23=Autres options
Gestion des liens d'objet Répertoire . . . . : /NFS Indiquez vos options, puis appuyez sur ENTREE. 3=Copier 4=Enlever 5=Niveau suivant 7=Rebaptiser 8=Afficher attributs 11=Modifier répertoire en cours... Opt Lien objet Type Attribut Texte 5 technet DIR ACROREAD DIR .................................. AUTOEXEC.BAT STMF : : BOOKS DIR : on navigue parfaitement : BOOT.BAK STMF : dans l'arborescence : Cafe DIR : : CDROM DIR : : CONFIG.SYS STMF :................................: COREL DIR A suivre... Paramètres ou commande ===> F3=Exit F4=Invite F5=Réafficher F9=Rappel F12=Annuler F17=A partir de F22=Zone complète F23=Autres options
Gestion des liens d'objet Répertoire . . . . : /NFS/technet Indiquez vos options, puis appuyez sur ENTREE. 3=Copier 4=Enlever 5=Niveau suivant 7=Rebaptiser 8=Afficher attributs 11=Modifier répertoire en cours... Opt Lien objet Type Attribut Texte setup DIR tnet9700.flt STMF .................................. tnet9700.hst STMF : : tnet9700.srs STMF : les copies se font par CPY : INFOVIEW.EXE STMF : : MSCREATE.DIR STMF : les sauvegardes ne sont pas : TECHNET.ICO STMF : supportées. : TNET9700.AUX STMF :................................: Fin Paramètres ou commande ===> F3=Exit F4=Invite F5=Réafficher F9=Rappel F12=Annuler F17=A partir de F22=Zone complète F23=Autres options
DATES
rappel : RPG-IV reconnait les variables de type date
et la conversion est assurée par MOVE,MOVEL :
le facteur 1 permet alors de préciser le format de l'élément
numérique ou caractère.
un des formats *DMY,*YMD*MDY|*ISO,*EUR*,*USA plus *CYMD ou *JOBRUN
la version 4.2 va apporter *LONGJULL
Exemple :
DNUMDAT S 7 0 INZ(0950715)
DWDATISO S D DATFMT(*ISO)
C *CYMD move numdat wdatiso
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 (ou format du job) 14 ==> HHMMSSAAAAMMJJ ( idem ) date ==> date en cours heure ==> l'heure en cours horodatage ==> l'horloge système
il est enfin possible de stocker une zone au format date dans un fichier physique (type L) et de transformer cette zone en numérique étendu dans les logiques. fichier articlP1 A R ARTIF1 A CODE 6 0 A DATCRT L DATFMT(*EUR) puis, ARTICL2 A R ARTIF2 PFILE(ARTICLF1) A CODE A DATCRT S DATFMT(*YMD) le mot-clé DATFMT sera considéré lors d'une copie du fichier logique vers un autre fichier (plutôt que le format du job comme en V3R7)
la gestion des triggers change en V3R70
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 modifiable par
le trigger.
RAPPEL, un trigger recoit un buffer contenant :
- des informations système
- la version AVANT de l'enregistrement
- la version APRES.
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.
Exemple :
soit un ficheir article avec le buffer suivant
| codearticle | libellé | prix |
| | | |
le trigger recoit un paramètre
infos système | code |libellé |prix | code |libellé |prix |
| | Dep1 | Dep2 | | |
! ! ^ ^
!-----!----! !
! !
!--------------------------!
dep1 indique le déplacement pour aller à la version avant du buffer
dep2 " " " " " " après du buffer
le paramètre ALWREPCHG fait que si le trigger modifie la version après
c'est cette version de l'enregistrement qui est stockée dans la base.
imaginons maintenant de rajouter dans le fichier article une zone EURO
(repenser à la nouveauté CHGPF qui permet de modifier un fichier ONLINE)
Puis recompilons tous les programmes utilisant le fichier article.
si nous n'avons pas modifié le source de ces programmes la zone EURO n'est
JAMAIS renseignée.
Ajoutons maintenant un trigger BEFORE/UPDATE, BEFORE/INSERT qui calcule
automiquement le prix en EURO fonction du prix en fancs.
Vous avez l'EURO dans vos fichiers, reste à modifier les programmes devant
afficher cette information.
techniquement cela ce fait de la manière suivante : on va en RPG déclarer une DS externe(avec le fichier article) basée sur un pointeur. il s'agit en fait d'un découpage théorique qui n'a pas d'existence tant que le pointeur n'a pas de valeur. Dparam ds D filler 48 D dep2 10I 0 Dptr S * Darticle e ds based(ptr) EXTNAME(articlp1) * puis nous recevons le paramètre standard C *entry plist C parm param C parm lgparam c eval ptr = %addr(param) + dep2 c eval euro = prix * coeff * n'oublions pas le C seton lr
exemple plus complet avec 1/ gestion de la valeur nulle 3/ renseignement de la date de création 2/ test du prix et envoi de l'erreur si < à 0. A R DB2NULLF A CODART 6 A LIBART 25 ALWNULL A DATCRT L DATFMT(*EUR) A PRIX 7 2 EDTCDE(4) en ce qui concerne les valeurs nulles, la fonction %NULLIND() n'est pas admise car il ne s'agit pas d'un fichier déclaré (au sens ou il n'y a pas de spécif F) le systeème génére donc un variable de travail avec un octet par zone dans le fichier. (supportant la val. nulle ou pas, peu importe) chaque octet contient '0' si la variable est significative '1' si la variable est nulle.
*=========== définition des paramètres recus =========================
Dptr s *
Ddata DS based(ptr)
D fichier 10
D biblio 10
D membre 10
D evenement 1
D moment 1
D niv_verrou 1
D filler1 3
D ccsid 9B 0
D filler2 8
* enregistrement avant, déplacement et longueur
D dep_enrav 9B 0
D lg_enrav 9B 0
* description des zones nulles avant (déplacement et longueur)
* il y a un octet par zone dans l'enregistrement
* contenant 0 (la zone est significative)
* 1 (elle est nulle)
D dep_desav 9B 0
D lg_desav 9B 0
* enregistrement après (idem)
D dep_enrap 9B 0
D lg_enrap 9B 0
* zones nulles
D dep_desap 9B 0
D lg_desap 9B 0
D filler3 16
D variable 9900A
Dparam S 9999
Dlgparam S 9B 0
Ddep S 9B 0
Dprtap s *
Denregap E DS EXTNAME(db2nullpf) PREFIX(ap)
D based(ptrap)
dprtnap s *
dnullap ds based(ptrnap)
D codart_nap 1
D libart_nap 1
D datcrt_nap 1
D prix_nap 1
*=========== variables pour API envoi de messages ===================
D ERRDS DS
D LGDS 1 4B 0 INZ(16)
D LGERR 5 8B 0
D MSGID 9 15
D RESERVE 16 16
D MSGFL DS
D MSGF 10 INZ('QCPFMSG')
D MSGL 10 INZ('*LIBL')
D ID S 7 INZ('CPF9898')
D MSGTXT S 50 INZ('prix invalide (doit être >0)')
D LENTXT S 9B 0 INZ(50)
D MSGTYP S 10
D PGMQ S 10 INZ('*PGMBDY')
D STACK S 9B 0
D KEY S 9B 0
*=========== DEBUT DU PROGRAMME ======================================
C *entry plist
C parm param
C parm lgparam
*
* mise en place du paramètre reçu C eval ptr = %addr(param) * * mise en place du buffer après * C if dep_enrap <> 0 C eval ptrap = ptr + dep_enrap C endif C if dep_desap <> 0 C eval ptrnap = ptr + dep_desap C endif * si libart est à blanc alors ==> valeur nulle c if aplibart = *blank c eval libart_nap = '1' c endif * vérification du prix (doit être positif) C if apprix <= 0 C exsr env_msg C endif * mettre date du jour dans DATCRT c time datcrt C return
* C env_msg begsr * * envoi d'un message diagnostic au pgm applicatif * * pour expliquer les raisons de l'erreur (cela laisse une trace) * * C CALL 'QMHSNDPM' C PARM 'CPF9898' ID 7 C PARM MSGFL C PARM MSGTXT C PARM LENTXT C PARM '*DIAG' MSGTYP C PARM PGMQ C PARM 2 STACK C PARM KEY C PARM ERRDS * * envoi d'un message escape( erreur) au système * * c'est lui qui annule l'action base de données
C CALL 'QMHSNDPM'
C PARM 'CPF9898' ID 7
C PARM MSGFL
C PARM MSGTXT
C PARM LENTXT
C PARM '*ESCAPE' MSGTYP
C PARM PGMQ
C PARM 1 STACK
C PARM KEY
C PARM ERRDS
C endsr
Version
vvv vvv 444 RRRRRRRRRRRR 222222222222
vvv vvv 444 RRRRRRRRRRRRR 222 222
vvv vvv 444 RRR RRR 222
vvv vvv 444 RRR RRR 222
vvv vvv 44444444444444 -- RRR RRR 222
vvv vvv 44444444444444 -- RRRRRRRRRRRRR 222
vvv vvv 444 444 RRRRRRRRRRRR 222
vvv vvv 444 RRR RRR 222
vvvvv 444 RRR RRRR 22222222222222
444
de l'OS/400 ...
D'abord deux grandes annonces (marketing ?) A/ DOMINO sur l'AS/400 - c'est le serveur domino UNIX transporté sur l'AS/400 grace à sa compatibilité de plus en plus grande (5 % de réécriture seulement) - cela apporte à l'OS le multithreading ° on supporte plusieurs serveurs en parallèle. ° on parle de 10.000 utilisateurs maxi. B/ JAVA sur l'AS/400 - machine virtuelle JAVA complète intégrée à l'OS. - exécution en mode interpréte (JVM) ou compilé ((Class transformer) - support de RMI (Remote Method Invocation) et de remote AWT (AWT sont les classes qui gèrent l'interface graphique)
- JAVA toolbox for OS/400
JAVA Toolbox for OS/400 est un ensemble de classes qui permettent :
° une transformation des écrans 5250 (DDS) en classes AWT
° un accès aux programmes sur l'AS/400
° DTAQ/Data area
° fichiers IFS
° fichiers base de données via JDBC/SQL
° fichiers BD en mode ligne à ligne
° imprimantes AS/400
° des classes de conversion de types (packé vers integer, ...)
- cette boite à outils est intégrée à
+ Visual Age for JAVA (version entreprise)
+ JBUILDER de BORLAND (équivalent à DELPHI mais en JAVA)
divers OS/400 :
nouvelles commandes
CRTLINPPP, CHGLINPPP PPP sur TCP/IP
CRTNWIATM, CHGNWIATM protocole ATM
CHGDDMTCPA, CHGDHCPA, CHGTCPDMN (cf TCP/IP)
quelques commandes bizarres
STRDSKRGZ / ENDDSKRGZ (réorganisation des disques)
ANZUSROBJ (analyse des objets utilisateur)
STRQSH (démarrer le shell-interpreteur)
versions supportés (previous release)
V4R1M0
V3R7M0
V3R2M0
DB2/400 ATTENTION, C'est parti !!!!!!!!!!!!!!!!!! ° Remote journaling vous pouvez journaliser vos fichiers avec un récepteur distant. ° DRDA et DDM sur TCP/IP (uniquement en One phase COMMIT) il y a donc une nouvelle commande CHGTCPDDMA AUTOSTART(*YES|*NO) PWDRQD(*YES|*NO) ° nouvelles fonctions CAST : conversion, CAST( expression AS nouveau-type) exemple SELECT CAST(CODART AS CHAR) CAST(SALAIRE AS INTEGER) ...
CASE : condition à la réalisation d'une expression Exemples : SELECT MATRICULE, NOM, CASE SUBSTR(SERVICE, 1, 3) WHEN 'INF' THEN 'INFORMATIQUE' WHEN 'PER' THEN 'PERSONNEL' WHEN 'PRO' THEN 'PRODUCTION' WHEN 'COM' THEN 'COMMERCIAL' ELSE 'Divers ....' END FROM personnel WHERE ... SELECT CODART, LIBART, PRIX, CASE WHEN PRIX < 0 THEN 'prix négatif' WHEN CODART = 1557 THEN 'pas de prix' ELSE 'prix normal' END FROM ... WHERE ...
SELECT * FROM COMMANDES WHERE (CASE WHEN PRIXMOYEN = 0 THEN PRIXTARIF * QTE ELSE PRIXMOYEN * QTE) > 10000 le test peut être IS NULL / IS NOT NULL la valeur retournée (THEN|ELSE) peut être le mot réservé NULL (THEN NULL) Sécurité à la colonne : GRANT SELECT , UPDATE(numtel,email) ON TABLE personnel TO richard; les droits ne sont accordés que via SQL mais peuvent être visualisés par DSPOBJAUT, EDTOBJAUT.
Contraintes d'entité :
il s'agit de définir les valeurs pouvant être placées dans une colonne
par exemple :
CONSTRAINT service_valide CHECK(service IN (10, 20, 30, 40))
ce qui peut être indiqué par la commande :
ADDPFCST
ADDPFCST FILE(personnel) TYPE(*CHKCST) CST(salairecst)
CHKCST('salaire< 1000000 AND prime<= salaire')
ou par SQL
ALTER TABLE personnel ADD CONSTRAINT salairecst
CHECK (salaire < 1000000 AND prime<= salary)
procédures cataloguées écrites en PL/SQL CREATE PROCEDURE proclib/proc1 (IN p_empno CHAR(10), IN new_level INT, OUT retcode int) language SQL proc1: BEGIN DECLARE var_level INT; DECLARE EXIT HANDLER FOR SQLEXCEPTION set retcode = sqlcode; SELECT level FROM employee INTO var_level WHERE empno = p_empno; IF new_level > var_level THEN UPDATE employee SET level = new_level, salary = salary + salary * .15 WHERE empno = p_empno; END IF; END
la structure générale d'une procédure devient : dans un CREATE PROCEDURE (qui lui n'est pas nouveau) BEGIN ATOMIC|NOT ATOMIC ATOMIC indique que si un ordre génère une erreur, un ROLLBACK doit être exécuté. DECLARE nom-variable type-variable (voir les types SQL) ou bien, déclaration d'une reprise face à erreur : DECLARE [CONTINUE] HANDLER FOR SQLSTATE VALUE 'codesql' ; [EXIT ] SQLEXECPTION [UNDO ] SQLWARNING NOT FOUND (corps de la procédure) END;
les nouveaux ordres SQL constituant le corps sont : SET variable = expression; CASE (idem CASE dans un select) WHEN condition THEN instruction-SQL-1; WHEN condition THEN instruction-SQL-2; ... END CASE WHILE condition instruction-sql; END WHILE IF condition THEN instruction-SQL1 ELSEIF condition2 THEN instruction-SQL2; ELSE instruction-SQL3; END IF
exemple : BEGIN DECLARE nouveau_salaire DECIMAL(9, 2); DECLARE var_matricule CHAR(6) DEFAULT '001757' SELECT salaire INTO nouveau_salaire FROM personnel WHERE matricule = var_matricule; IF code = 1 THEN SET nouveau_salaire = nouveau-salaire * 1,1; ELSEIF code = 2 THEN SET nouveau_salaire = nouveau-salaire * 1,05; END IF UPDATE personnel SET salaire = nouveau_salaire WHERE matricule = var_matricule END;
FOR nom_variables AS nom_curseur CURSOR FOR SELECT ........ DO instructions devant être réalisées pour chaque ligne du curseur. END FOR; LOOP instructions à réaliser plusieurs fois END LOOP LOOP provoque une boucle infinie, vous devez sortir avec LEAVE LOOP FETCH C1 INTO ..... IF SQLCODE <> 0 THEN LEAVE; ... traitement ... END LOOP; CLOSE C1;
ET on annonce la compatibilité complète de DB2/400 avec UDB support des BLOBs (Binary large OBjects) ==> images, etc ... support des types de variables définis par l'utilisateur " des fonctions définies par l'utilisateur Opération navigator a été amélioré afin de mieux intégrer l'accès à DB2/400 il va supporter les fonctions définies par un tiers (via API) il va permettre de plus en plus d'administration en client/serveur TCP/IP NetworkStation / Firewall Ultimedia System Facility (USF) gestion de la fonction journal Domino, ...
Pendant que l'on parle de TCP/IP, quelques nouveautés pêle-mêle : +----------------------------------------------------------------------+ | ° DHCP | attribution dynamique d'adresses IP | +----------------------------------------------------------------------+ | ° DNS | centralisation de la correspondance | | | nom/adresse ip (plus de fichier HOSTS) | +----------------------------------------------------------------------+ | ° RIP2 | routage dynamique | +----------------------------------------------------------------------+ | ° PPP | TCP/IP point à point sur réseau commuté | +----------------------------------------------------------------------+ | ° NUMERIS | support de numéris en direct via PPP | +----------------------------------------------------------------------+ | ° TCP/IP sur ATM | nouveauté de la V4R2 (plus de 50 Mbs) | +----------------------------------------------------------------------+ | ° TCP/IP / Twinax | avec les cartes 5250 EXPRESS | | | (au fait, le 5250 a été "boosté" à 2Mbs) | +----------------------------------------------------------------------+ | ° TELNET | nom d'écran significatif | | | support de l'intrégrateur (STRPCO, STRPCCMD) | | | saut de l'écran de SIGNON possible | +----------------------------------------------------------------------+
Dans la foulée, Client Access V3R1M3
Support des noms d'écran TELNET (Client Access en IP)
sessions imprimantes en IP
nouveau routeur NETSOFT 3.0 en SNA
transferts de fichiers
barre de menu avec options ouvrir/sauvegarder
nouveau format HTML en sortie
possibilité d'ajouter une bibliothèque à *LIBL
le transfert de fichier est l'option appellée depuis PC5250
INSTALLATION
mémorisation de la saisie pour répéter une installation
en mode silencieux (avec un fichie réponse)
choix de la fréquence pour le contrôle de version
Accès à la base de données le projet "lightning" devient "AS/400 SDK for Active/X and OLE DB" il s'agit de classes permettant l'accès à DB2/400 de manière plus légère et plus universelle que ODBC. (Microsoft propose un produit identique dans SNA server) Le run-time est intégré à Client Access, les outils de developpement sont encore en béta-test (récupérables sur le WEB) on trouve entre-autre un assistant (Wizzard) pour Visual BAsic. ODBC on peut maintenant demander à faire du cache avec les PACKAGE SQL. (ils sont stockés sur le disque dur et non plus sur l'AS/400) ODBC pour NT devient multi-utilisateurs, ce qui peut éviter une config. sur chaque client (si vous avez un serveur NT)
NT justement, nouvel FSIOP (ou IPCS) pour WINDOWS NT.
Il vous faut un IPCS particulier (Pentium 200),
avec une entrée souris/clavier, une sortie VGA.
il faut installer un soft OS/400 d'intégration avec NT (7 KF)
le FSIOP peut utiliser ensuite les disques, CD et bandes de l'AS.
vous achetez un NT 4.0 chez votre revendeur et vous installez à partir
de la console.
Voisinage réseau (ou NETSERVER), permettant l'installation de Client Access.
l'OS/400 implémente le protocole SMB qui est utilisé par NT/WARP.
(vous installez un micro sous 95/NT et un AS/400 sur le même LAN et
SANS SOFT supplémentaire, vos micros voient l'AS/400)
Vous indiquerez via Operation Navigator, les bibliothèques et les OUTQ
que vous souhaitez partager.
SDD et Dates.
le langage SDD va (enfin) admettre les dates (type L) sur les DSPF/PRTF
les mots-clés DATFMT / DATSEP sont acceptés bien sur.
SDD apporte en plus un nouveau mot-clé complémentaire MAPVAL
qui permet d'établir des correspondances entre :
(valeur dans le programme / valeur à l'écran)
(jusqu'à 100 correspondances)
exemple :
A R FORMAT
A DATSUP L DATFMT(*DMY) DATSEP('/')
A MAPVAL(('01/01/40' *BLANK))
lors d'un affichage si la zone contient '01/01/40' on affiche des blancs,
et si l'utilisateur entre des blancs on envoi '01/01/40' au programme.
Pour finir, RPG-IV :
° support des variables à longueur variable (VARLEN en SDD)
° variables utilisateur de type indicateur (N) et possibilité d'associer
votre propre DS à un écran avec le mot-clé INDARA.
° nouvelles fonctions pour tester le résultat d'une entrée/sortie fichier
° options de compilation pouvant être indiquées sur la spécif H pluôt
que sur la commande de compil. (pour utiliser l'option 14 de PDM)
° nouvelles fonctions de traitement de chaînes de caractères
° le mot-clé OVERLAY peut faire référence à une DS
° le format *CYMD est modifié, la valeur de "C" pouvant être 2 pour 21xx
3 pour 22xx
...
9 pour 28xx
Nouveaux mots-clés en spécif H + ACTGRP définition du groupe d'activation + DFTACTGRP appartenance(ou non) au groupe d'activation/défaut + ALWNULL support(ou non) des valeurs nulles + BNDDIR référence à un répertoire de liage indiquant la liste des programmes de service utilisés. + INDENT indentation du source + SRTSEQ séquence de tri + LANGID code langage ... bref tous les paramètres de la commande de compil. (sauf DBGVIEW qui n'est pas indiqué dans la documentation)
Spécif F INDDS(nom d'une DS constituée de variables de type N)
Spécif D VARYING
définition d'une variable à longueur variable
Spécif C nouvelles fonctions
%CHAR(date|heure|horodatage, expression)
conversion au format caractère
%REPLACE(c1:c2[:p[:lg]])
remplace par c1 la chaîne de caractère commencant
à la position (p) dans c2 sur (lg) caractères.
exemple eval x = %scan('4':var1) [var1 = 'AS/400']
eval var2 = %replace('5':var1:x:1) [var2 = 'AS/500']
ou directement eval var2 = %replace('5':var1:%scan('4':var1):1)
%OPEN(fichier) retourne '1' si le fichier est ouvert
%EOF(fichier) retourne '1' si on est en fin de fichier
%STATUS(fichier) retourne 0 si la dernière entrée/sortie
est normale, sinon retourne le status.
%ERROR et extension (E) , vous pouvez sur tous les ordres
acceptant un indicateur d'erreur (<<)
indiquer une extension (E) et tester
(if %error) ensuite.
%EQUAL retourne 1 si le dernier SETLL ou le
dernier LOOKUP a trouvé l'égalité.
%FOUND retourne 1 si le dernier SETLL, SETGT,
DELETE, CHAIN a trouvé un enregistrement
ou si le dernier CHECK, CHECKR, SCAN
a trouvé la chaîne de caractère.
Exemples : vous remarquerez que les indicateurs ne sont pas indiqués sur
la ligne de l'opération d'entrée/sortie, ils sont devenus facultatifs.
1.
C code chain ARTICLE
C IF %FOUND
C ....
C ....
C ENDIF
2.
C code chain ARTICLE
C code chain ENTETCDE
C IF NOT %FOUND(ARTICLE) AND %FOUND(ENTETCDE)
C ....
C ....
C ENDIF
toutes ces fonctions vont vers la limitation des 99 indicateurs
ET LES TARIFS ? (ne sont indiqués que les migrations V3 -> V4) sachant que si vous avez recu un modèle en V4R1, PW1, RG1 sont en V3R7 | P05 | P10 | P20 | P30 | P40 | |-----------|-----------|------------|-----------|----------| | | | | | | 5769SS1 | 5 550 | 14 700 | 29 400 | 73 500 | 294 000 | | | | | | | |-----------|-----------|------------|-----------|----------| | | | | | | 5769RG1 | 4 000 | 8 000 | 24 000 | 47 950 | 71 900 | | | | | | | |-----------|-----------|------------|-----------|----------| | | | | | | 5769PW1 | 4 000 | 10 000 | 26 150 | 50 250 | 74 450 | | | | | | | |-----------|-----------|------------|-----------|----------| Client Access(XW1) est à 412 F par utilisateur.