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é #11

Février 1997

Fin

                                Y2K 


  Gestion de l'AN 2000.


  Quel sont les problèmes :


                -tri


                      24/12/99 classé avant 05/01/01




                - comparaison de dates entre elles




                      25/12/96  plus grand que 01/01/01




                - contrôle de saisie




                      02/01/00 est une date invalide

                    


  Répercussions :


                + les fichiers Base de données




                      numérique 7 dt 0 ? EDTCDE(Y) Possible


                      numérique 8 dt 0 ? pas d'EDIT CODE


                      format DATE ? ==> la solution, mais RPGIV


                + les écrans , les états


                      faut-il les modifier ? (pas sûr)


                + les programmes


                      routines de contrôle


                      calcul (RPGIV possède tout ce qu'il faut)

                    


 Les trois méthodes répertoriées :


     l'expensions


                  transformer vos variables en 8,0 ou en DATE


     le fenêtrage


                  fixe (on "voit" de 1940 à 2039)


                  glissant (on "voit 60 ans en arrière)


    le codage


                  après 99, 9A ?




 Quelques éléments techniques





                    

   CHGPF avec SRCFILE renseigné ou CPYF ou "ALTER TABLE" SQL 


 En début de V3R60,les conversions numérique vers date posent des problèmes
  MAIS CELA FONCTIONNE à partir de la cumulative C6_338_360.


  Nous sommes limités aux possibilités suivantes :


 tout format numérique <--> tout format numérique


  les dates avec année sur 2, sont comprises entre 1940 et 2039,
    elles sont considérée par défaut au format du job,
    elles contiennent le séparateur dans le cas du caractère.


                       <--> date au format *YMD, *DMY , *MDY
 numérique étendu
                        --> date au format *ISO, *USA, *EUR


 caractère             <--> date *YMD, *DMY, ...
(idem)                  --> date *EUR, *USA, ...


 date                  <--> date   (changement de format transparent)

                    

                     manipulation de DATES en RPGIV 


  Toute comparaison de dates entre elles,


    est cohérente indépendamment du format ! 


  La conversion est assurée par MOVE,MOVEL :


           date <-> date, etc..., changement de format transparent.
           numérique,caractère <-> Date
           numérique,caractère <-> heure
           numérique,caractère <-> horodatage


 le facteur 1 permet alors de préciser le format de l'élément
  numérique ou caractère.


 Exemple :


     DNUMDAT           S              6  0 INZ(950715)
     DWDATISO          S               D   DATFMT(*ISO)


     C       *YMD        move      numdat        wdatiso


 Le nouveau code opération TEST, permet de tester la validité.


 TEST              Date en ZR          indic (mis ON si err) en pos. <<


 Si le facteur 2 est une variable numérique ou caractère, il faudra :


 - Indiquer un format en facteur 1


 - Indiquer une option : (D), (T), (Z).


Exemple :


     C       *YMD        TEST(D)                 datchar           80


  Une date caractère doit doit être éditée ==> contenir les séparateurs.


C'est le seul moyen de gérer les dates à la saisie :


 Les DSPF (et PRTF) , ne reconnaissant pas ces formats, SDA et RLU générent
  des variables alpha. (8 ou 10, suivant le format), qu'il faut renommer.

                    


 Notion de durée :


  le code opération ADDDUR permet d'ajouter une durée à une date
                                     (le résultat est une date)


  Le code opération SUBDUR permet 1/ de soustraire une durée à une date
                                     (le résultat est une date)
                                  2/ de soustraire une date à une date
                                     (le résultat est une durée)


 Une durée est un entier numérique (constante ou variable [15 maxi])
  suivi d'un code (sépararé par :), représentant la signification :


      *YEARS    ou *Y : la durée est exprimée en nbr d'années
      *MONTHS   ou *M                            nbr de mois
      *DAYS     ou *D                            nbr de jours
      *HOURS    ou *H                            nbr d'heures
      *MINUTES  ou *MN                           nbr de minutes
      *SECONDS  ou *S                            nbr de secondes
      *MSECONDS ou *MS                           nbr de microsecondes

                    

 Exemples:


      dat2 = dat1 + 12 mois
     C       DAT1        ADDDUR    12:*M         DAT2


      dat2 = dat2 + 45 jours
     C                   eval      nbj = 45
     C                   ADDDUR    nbj:*D        DAT2


      dat2 = dat1 - 3 mois
     C       DAT1        SUBDUR    3:*M          DAT2


      nbm = nombre de mois d'écart entre dat1 et dat2
     C       DAT1        SUBDUR    DAT2          nbm:*M
ATTENTION !
   Vous ne pouvez pas tester  "IF  nbm > 3",
   le système considère qu'il y a 3 mois d'écart entre 15/07/95 et 31/10/95
   (le nombre de mois est une information qui ne tient pas compte des jours)


   Pour tester que dat2 n'est pas > de plus de 3 mois  à dat1, écrivez :
     C       DAT1        ADDDUR    3:*M          DATMAXI
     C                   IF        dat2 > datmaxi


 Une date ne peut pas être nulle


     il faut attendre %NULLIND() en V3R70 !




 Une durée peut être négative.


     Ajouter -90 jours (= soustraire 90 jours, qui l'eut cru ?)


     Le résultat d'une différence peut être négatif (si dat1 < à dat2)




 Il n'y a pas de fonction pour retrouver le dernier jour du mois
  (mais le changement de mois lors d'un ajout de jours est cohérent)




 Il est enfin possible d'extraire une partie d'une date/heure/horodatage.
 avec EXTRCT :


     C                   EXTRCT    DAT2:*M       mois

                    


              APIs ILE de manipulation DATES 


      Toutes ces APIs sont dans un programme de service :


         Elles ne sont donc utilisables qu'avec un langage ILE




=============== quelques notions =========================================


      Pour toutes ces APIs une date lilian exprime une date en nombre de
       jours depuis le 15 Octobre 1582 (jour 1, qui est le premier jour
       du calendrier Grégorien) jusqu'au 31 décembre 9999 !


      Jour 0 est donc le 14 Octobre 1582 est n'est utilisé que pour
                                             les calculs.
      jour 148887 est le 4 Juin 1990.




      toutes ces APIs utilisent la notion d'image qui est la représentation
       caractère du format de la date (une espèce de mot d'édition)
=======================================================================

!     D E F I N I T I O N   D E S   I M A G E S   D E   D A T E       !
=======================================================================
     Caractère
     d'Image        Signification               Exemple
   !------------------------------------------------------------!
   ! Y          ! année sur 1 chiffre       ! 0-                !
   ! YY         !       sur 2               ! 00-               !
   ! YYY        !       sur 3               ! 000-999           !
   ! YYYY       ! année sur 4 chiffres      ! 1582-9999         !
   !------------------------------------------------------------!
   ! MM         ! mois sur 2 chiffres       ! 01-12             !
   ! ZM         ! mois sur 1 ou 2 chiffres  ! 1-12              !
   !------------------------------------------------------------!
   ! RRRR       ! mois en notation romaine  ! I-XII (cadré à g) !
   !------------------------------------------------------------!
   ! MMM        ! mois (3 C.), en majuscules! JAN-DEC           !
   ! Mmm        ! mois (3 C.), min/MAJ      ! Jan-Déc           !
   ! MMMMMMMMMM ! mois (20 C.) en majuscules! JANVIER-DECEMBRE  !
   ! Mmmmmmmmmm ! mois (20 C.), min/MAJ     ! Janvier-Décembre  !
   ! MMMMMMMMMZ ! espaces ignorés           ! JANVIER-DECEMBRE  !
   ! Mmmmmmmmmz !  idem (min/MAJ)           ! Janvier-Décembre  !
   !------------------------------------------------------------!

   ! DD         ! jour sur 2 chiffres       ! 01-31             !
   ! ZD         ! jour sur 1 ou 2 chiffres  ! 1-31              !
   ! DDD        ! n° de jour (date julienne)! 0-365             !
   !------------------------------------------------------------!
   ! W          ! Jour de la semaine (1c.)  ! D, L, M, M, J, V,S!
   ! WWW        ! jour de la semaine (3c.)  ! DIM-SAM           !
   ! Www        ! Jour de la sem(3c.)min/MAJ! Dim-Sam           !
   ! WWWWWWWWWW ! jour de la semaine (10c.) ! DIMANCHE-SAMEDI   !
   ! Wwwwwwwwww ! Jour sur 10c.min/MAJ      ! Dimanche-Samedi   !
   ! WWWWWWWWWZ ! espaces supprimés         ! DIMANCHE-SAMEDI   !
   ! Wwwwwwwwwz ! espaces supprimés         ! Dimanche-Samedi   !
   !------------------------------------------------------------!




 Exemples d'images reconnues         ->  valeur possible


   DD/MM/YY                              13/02/97
   DD Mmmmmmmmmm YY                      13 Février    97
   WWW, ZM/ZD/YY HH:MI AP                JEU, 13/2/97 10:42 PM
   Wwwwwwwwww, DD Mmm YYYY, ZH:MI:SS     Jeudi     , 16 Fév 1997, 9:42:00
   Wwwwwwwwwz, DD Mmm YYYY, ZH:MI:SS     Jeudi, 13 Fév 1997, 9:42:00

                    


      + CEEDAYS       = conversion date vers format lilian       [CALLB(D)]


        - CHAR(?)     date en format caractère
        - CHAR(?)     image de la date       (cf le tableau en fin de cours)
        - BIN(4)      date lilian en retour
        facultatif
        - token       gestion d'erreur
                      (vrai pour toutes les APIs ILE, cf les erreurs ILE)


      + CEEDATE       =  conversion date vers format caractère   [CALLB(D)]


        - BIN(4)      date lilian
        - CHAR(?)     image de la date
        - CHAR(?)     date (format caractère) en retour


      + CEEDYWK       = calcul du n° de jour dans la semaine à partir d'une
                         date lilian  (1 = Dimanche, 2 = Lundi ...)


        - BIN(4)      date lilian
        - BIN(4)      N° de jour en retour

                    


      + CEESCEN       = fixe le siècle par défaut pour une date avec année
                         sur 2 positions.


        - BIN(4)        le siècle est fixé en indiquant l'année à laquelle
                        vous souhaitez que se fasse le changement de siècle.
                        (nbre d'années à soustraire à partir d'aujourd'hui)


                        ex: 80 (val par défaut) en 1995 indique une plage
                             temporelle de 1915 à 2014
                            50 en 1995 indique une plage de 1945 à 2044.






      + CEEOCEN       = retrouve la valeur précédente.
        - BIN(4)         valeur en retour











                    


 La modification des triggers en V3R20 / V3R70 peut être une aide :


 Un trigger recoit un buffer contenant :


 - des informations système


 - la version AVANT de l'enregistrement


 - la version APRES.


 la commande ADDPFTRG accepte un nouveau paramètre ALWREPCHG.


 lorsque ce paramètre est renseigné à oui, lors d'un ajout ou d'une
  mise à jour l'enregistrement ajouté ou remplacé est celui du buffer
  tel qu'il a été renseigné par le trigger.


 le trigger peut donc maintenant faire de la substitution de données
   et remplacer certaines informations renseignées par le programme.


 ce sont les données du trigger qui seront placées dans la base et non
   celles initialement indiquées par le programme.

 Divers en télécommunication :


 Il existe maintenant une possibilité qui permet de tester toutes les
  fonctionnalités APPC (ou TCP/IP, avec TCP over APPC d'ANYNET)


 il faut créer un contrôleur APPC par :


    CRTCTLAPPC   CTLD(LOCAL) LINKTYPE(*LOCAL)


    Puis créer DEUX unités APPC rattachées au même contrôleur.


         (elles devront être en fonction toutes les deux)




    CRTDEVAPPC DEVD(ICI) RMTLOCNAME(ICI) LCLLOCNAME(LABAS) CTL(LOCAL)
               APPN(*NO) SECURELOC(*YES) TEXT('pour aller ICI)


    CRTDEVAPPC DEVD(LABAS) RMTLOCNAME(LABAS) LCLLOCNAME(ICI) CTL(LOCAL)
               APPN(*NO) SECURELOC(*YES) TEXT('pour aller LABAS')




    DDM, passe-système, etc ..., vous pouvez tout tester en local !


 Les versions V3R20, V3R60 ammènent un certain nombre de nouveautés
  en matière de communication APPC.


 -DDM : reconnait maintenant les DTAQ et DTAARA éloignées.


        CRTDTAQ DTAQ(essai) TYPE(*DDM)  RMTDTAQ(QGPL/ESSAI)
                                        RMTLOCNAME(S44xxxxx)


   et


        CRTDTAARA DTAARA(essai) TYPE(*DDM) RMTDTAARA(QGPL/ESAI)
                                           RMTLOCNAME(S44xxxxx)




 -APING : nouvelle commande qui permet de tester l'état d'une ligne
          (équivalent au PING TCPIP)




  APING RMTLOCNAME(  ) MODE(*NETATR) RMTUSER(*NONE) RMTPWD(*NONE)


                       <-------paramètres facultatifs----------->


 -AREXEC : nouvelle commande qui permet de passer une commande sur un
            AS/400 distant sans utiliser DDM.


           la commande RUNRMTCMD offre les mêmes services, mais est
            capable de travailler par dessus IP (REXEC) ou par dessus
            SNA (AREXEC), AREXEC est dédié à SNA.




    AREXEC  CMD( ) RMTLOCNAME(  ) RMTUSER(*NONE) RMTPWD(*NONE)


                                  <--paramètres facultatifs-->


  ObjetConnect disponible en V3R10 sous forme de PRPQ (5799-FNR)


     est devenu l'option 22 de 5716SS1 (l'OS/400 en V3R60) et apporte
      des commandes permettant de faire des transferts d'objets
      sans utiliser SNADS.


     c'est un peu plus rapide, et surtout plus automatique.



                    


  SAVRSTLIB     LIB( ) RMTLOCNAME( )


  SAVRSTOBJ     OBJ( ) LIB( ) RMTLOCNAME( ) OBJTYPE(*ALL)


  SAVRSTCHG     OBJ( ) LIB( ) RMTLOCNAME( ) OBJTYPE(*ALL) REFDATE(*SAVLIB)


  SAVRSTDLO     DLO( ) RMTLOCNAME( ) FLR(*ANY)


  SAVRST        RMTLOCNAME( )   OBJ('*')           --> Pour IFS.


  et


  SAVRSTCFG     OBJ( ) RMTLOCNAME( ) OBJTYPE(*ALL)


   les types admis sont :
                         +  Les listes de configuration (*CFGL)
                         +  Les listes de connexion (*CNNL)
                         +  Les descriptions de classes de service (*COSD)
                         +  Les descriptions IPX (*IPXD)
                         +  Les descriptions de modes (*MODD)
                         +  Les descriptions NetBIOS (*NTBD)


 Il existe une nouvelle fonctionnalité intégrée par IFS


   QFileSrv.400. il s'agit d'offrir l'équivalent de la fonction dossiers
                  partagés, mais entre AS/400.


    On utilise les mêmes ressources, c'est à dire un JOB dans le
       sous-système QSERVER.


  le répertoire QFileSrv.400 dans la racine IFS représente l'ensemble
    des AS/400 connectables.




  Vous devez "monter" (comme sur UNIX) le système de fichier que vous
   voulez voir, par la commande MD (ou MKDIR : make a directory)


   MD machine.domaine.réseau : sous TCP/IP


   MD appn.système           : sous APPC/APPN.





                    


 Exemple :


 le système S44R1234 est un AS/400 auquel je suis relié par un lien
     télécom (LAN, SDLC, X25 , peu importe)


   " MD APPN.S44R1234 " (si le nom de mon réseau est APPN)




  Attention cette commande n'est pas persistante.


   c'est à dire que la référence à ce système via IFS sera perdue au
     prochain IPL.


  Maintenant,




     /QFileSrv.400/APPN.S44R1234/MICRO :


         représente le répertoire "MICRO" sur le système S44R1234



                    


TCP/IP - V3R20, V3R70 : SLIP  ou IP sur réseau commuté




 Possible avec tout modem suportant les commandes AT derrière une carte:


   2609, 2612 et 6152.(elles s'attachent à un IOP 2623 ou un MFIOP)


 1/ Création d'une ligne asynchrone


 2/ Configuration du modem


    CFGTCPPTP (Point à point) Option 11




 3/ Définition d'un profil, associant un modem,une ligne et une adresse IP
                                                               (WRKTCPPTP)
    Le profil peut-être : *ANS
                        : *DIAL (avec un script de connexion)


 4/ et STRTCPPTP

                    

 Client Access propose maintenant une nouvelle version client :


        WINDOWS 95


 Il s'agit du produit 5763XD1 en version V3R1M1 (utilisable en V3R60)




    - il apporte :


         + l'intégration à WINDOWS 95 (les dossiers partagés sont vus
              comme des unités réseau à traves l'explorer ou le voisinage
               réseau)


         + un driver ODBC 32 bits


         + la gestions des commandes entrantes


         + le support de TCP/IP


         + le routeur NETSOFT



                    


 ce produit peut utiliser les routeurs suivants :


    - un routeur 16 bits
         (celui de CAWIN 3.11 compris)


    - MSDLC de microsoft
         (livré avec WINDOWS 95 ou disponible sur FTP.MICROSOFT.COM)


    - IPX
         (lui aussi, livré avec WINDOWS 95)


    - TCP/IP (idem)


         - TCP/IP LAN
         - TCP/IP SLIP (réseau commuté)


    - SNA SERVEUR


    - le routeur NETSOFT qui est devenu LE routeur de client access



                    


 le routeur NETSOFT supporte les connexions :


     + carte LAN en 802.x  (MSDLC)


     + carte SDLC


     + liaison Asynchrone (attention carte asynchrone sur l'AS/400)


     + ANYNET (APPC sur TCP/IP)


                   - sur TCP/IP LAN
                   - sur TCP/IP SLIP


               TCP/IP étant géré par WINDOWS 95


         Client Access directement sur TCP/IP a quelques particularités :


          - les unités écrans se nomment QPADEVxxx (PC5250 simulant TELNET)
          - il n'y a pas d'émulation imprimante possible
          - ODBC et transfert de fichier sont reconnus.

                    


 et une une nouveauté :


        la gestion des commandes entrantes




 vous pouvez avec RUNRMTCDE passer une commande destinée à un PC


      depuis n'importe quel JOB :




             + un AUTRE micro


             + un terminal passif


             + un travail Batch


 Si la commande produit un résultat caractère (session DOS)
     le résultat est redirigé sur AS/400 sous forme de spool


 Si la commande produit un résultat graphique (sessions WINDOWS), il est
     affiché sur le micro.

 en TCP/IP


 Sur le micro :


 - Choisissez propriétés de Client Access dans le panneau de configuration


 - et affichez l'onglet "commande à distance"


      Vous pouver indiquer les systèmes et les utilsateurs autorisés
        à passer des commandes, et leur attribuer un mot de passe.


      Une étoile '*' dans une entrée équivaut à ne pas restreindre


      (* dans la zone système signifie, n'importe quel système)




      la notion de profil/mot de passe est purement micro, il n'y a pas
       de correspondance avec les profils AS/400.


      le progamme à activer est : CWBRXD


         et pour arreter ce service CWBRXDSD


  Quand vous passerez la commande RUNRMTCMD il faudra renseigner
    profil/mot de passe tel qu'indiqué ici.


                    Lancer une commande à distance (RUNRMTCMD)


  Indiquez vos choix, puis appuyez sur ENTREE.


  Commande . . . . . . . . . . . .   dir                                    
                                                                           
                                                                           
                                                                           
                                                                      ...
  Lieu éloigné:
    Nom ou adresse . . . . . . . .   129.1.1.3
                                                                           
                                                                           
    Type . . . . . . . . . . . . .   *IP           *SNA, *IP
  ID utilisateur éloigné . . . . .   QSECOFR       Valeur alpha, *NONE, *CUR
  Mot de passe éloigné . . . . . .   MOTDEPASSE    Valeur alpha, *NONE



                    

en APPC


 Le programme à activer est AREXECDW sur des stacks APPC (SNA SERVEUR)


                            AREXECDN sur le routeur NETSOFT


  il faut paramétrer le routeur de manière à indiquer un programme de
    transaction (TP) , qui doit être appellé pour réaliser la commande.


  le nom de la transaction doit être AREXECD


 La séquence de mise en place est la suivante :


     - choisir NETSOFT administrateur


       - sur une connexion -> bouton droit / propriétés


         - onglet "données communes"
           - bouton "propriétés avancées"


             - onglet "programme de transaction locaux" (ouf !)

                    


 là, utilisez le bouton ajout


  et renseignez :


 ######################################################################### 
 #                                                                       # 
 #   nom de profil. . . . . . . . .  AREXECD                             # 
 #                                                                       # 
 #   nom de TP  . . . . . . . . . .  AREXECD                             # 
 #                                                                       # 
 #   spécification de fichier TP. .  c:\progra-1\ibm\client-1\arexecdn   # 
 #                                                                       # 
 #   paramètres . . . . . . . . . .                                      # 
 #                                                                       # 
 #           ...........           .................                     # 
 #           :    OK   :           :  Annulation   :                     # 
 #           :.........:           :...............:                     # 
 ######################################################################### 


  en remplacant "-" par le tilde espagnol (à coté de "é")

                    


début