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.