Pause-Café Volubis

pause-café

rendez-vous technique
Pause-Café est une réunion technique
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.


début