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

Janvier 2015

V7R20 et TR1

 

  • Améliorations de la 7.2 apportées par PTF

  • TR1 (certaines fonctions sont communes à la TR9 de la 7.1)

IBM continue sur la lancée de la version 7.1 en matière de livraison des nouveautés au fil de l'eau.

Cette dernière a vu des améliorations livrées sous forme de TR, tous les six mois.

      La TR1 de la 7.2 coïncide avec la TR9 de la 7.1

  • DB2 i


    • de nouvelles fonctions, basées sur les expressions régulières

      • Toutes ces fonctions sont basées sur le projet ICU et sont arrivées en TR1 (version 7.2) et TR9 (version 7.1)

        ICU doit donc être installé sur votre système, les PTF aussi.



      Il s'agit de rechercher si une chaîne de caractère ressemble à un modèle (un peu comme LIKE, mais en plus puissant)

      >>-REGEXP_xxxx--(--origine--,--'modèle recherché'---------------->

      >--+----------+--+-----------+--)----------------------------->
         '-,--début-' '-,--option-'    
      • la variable origine doit être un champ de type Chaîne, numérique ou date-time convertible en UTF-16 (Unicode).

          donc pas de BINARY ou de FOR BIT DATA, de 32 K Maxi.


      • Modèle :

        • tout caractère est recherché tel quel

        • Quelques méta-caractères utilisables dans une expression régulière

      \w tout caractère alpha ou numérique (pouvant constituer un mot)
      \W tout sauf caractère alpha ou numérique
      \d un chiffre
      \D tout sauf un chiffre
      \s caractère espace
      \S tout sauf un espace
      [modèle] tout caractère respectant le modèle
      (suite) regroupement (voir exemple après les opérateurs logiques)
       . tout caractère
      ^ début de ligne
      $ fin de ligne
      \ déspécialise le caractère suivant (\. pour chercher un point)
      \N caractère Unicode du nom indiqué (voir unicode.org)
      \u caractère Unicode de la valeur héxa indiquée (voir unicode.org)
      \U tout sauf le caractère unicode indiqué
      \p{propriété Unicode}

      (voir
      Unicode Categories
      )

      \p{L} -> une lettre
      \p{N} -> un chiffre
      \p{P} -> une ponctuation
      \p{Z} -> un espace
      \p{M} -> Mark (accents latins[^¨..], umlauts allemand, etc)
      \p{S}  -> un symbole mathématique

      \P{propriété Unicode}

      \P{L} -> tout sauf une lettre
      \P{N} -> tout sauf un chiffre
      \P{P} -> tout sauf une ponctuation
      \P{Z} -> tout sauf un espace
      \P{M} -> tout sauf Mark
      \P{S}  -> tout sauf un symbole mathématique



      Quelques exemples de modèles

      [abc] un a ou un b ou un c
      [^abc] tout sauf a, b et c
      [C-M]

      toute lettre comprise entre C et M

      [a-z] une minuscule
      [A-Z] une majuscule
      [0-9] un chiffre
      [a-zA-Z0-9] une minuscule ou une majuscule ou un chiffre
      [a-z][A-Z][0-9] une minuscule ou une majuscule ou un chiffre

         

        Opérateurs logiques (extrait)

       | ou    (a|b -> a ou b)
      * 0 à n fois l'expression précédente
      +

      1 à n fois l'expression précédente

      ? 0 ou 1 fois l'expression précédente
      {n} n fois exactement l'expression précédente
      {n,} n fois ou plus l'expression précédente
      {n,m} entre n et m fois l'expression précédente
      *? 0 fois ou plus, le moins de fois possible
      +? 1 fois ou plus, le moins de fois possible
      ?? 0 ou 1 fois, 0 de préférence


      les parenthèses servent à regrouper des caractères ou des méta-caractères, particulièrement pour les opérateurs logiques

      abc|def       signifie a,b,(c ou d), e, f
      (abc)|(def)  signifie abc ou def

      abc+      est vrai pour abc, abcc, abccc, abccccccc
      (abc)+   est vrai pour abc, abcabc, abcabcabc, etc...

      par exemple, cette expression


      (\w+\.)+((org)|(com)|(gouv)|(fr))


      permet de rechercher un suite de caractères alphanumériques \w+ , suivie d'un point \. , cette série étant présente éventuellement plusieurs fois (\w+\.)+
      puis soit org, soit com, soit gouv, soit fr : (org)|(com)|(gouv)|(fr)


         Pour découvrir pas à pas, je vous conseille Openclassroom (les exemples sont en PHP, mais c'est transposable)

      • position de début (entier, compris entre 1 et la longueur de la zone)


      • options proposées
      c case sensitif
      i case insensitif
      x espaces ignorés
      n fin de ligne matérialisé par .
      m multi-ligne

      pour cette dernière option, par défaut ^ indique le début de la zone d'origine et $ la fin, sauf option m ou ^ indique le début de chaque ligne et $ la fin de chaque ligne.

      une fin de ligne étant matérialisée par le couple "CR+LF" ou un point (.) si option n


      • REGEXP_LIKE, s'utilise comme un LIKE mais avec la puissance des expressions régulières

        Chateau ou Château ?







        Bouscassé ou Bouscasé ou Bouscacé, bref : un ou plus du couple (S ou C)






        vous pouvez ajouter l'option i, pour être insensible à la casse





        Un n° de tel doit avoir au moins 2 chiffres-1 caractère-2 chiffres-1 caractère-2 chiffres-1 cararactère-2 chiffres

         liste des téléphones qui ne respectent pas cette règle





        Un n° de tel doit avoir 2 chiffres-1 espace-2 chiffres-1 espace-2 chiffres-1 espace-2 chiffres

         liste des téléphones qui ne respectent pas cette règle




        liste des téléphones contenant une lettre






      • REGEXP_COUNT, compte le nbr de fois ou une expression régulière est vraie

        au moins 2 fois château






      • REGEXP_INSTR, retourne la position de la chaîne respectant l'expression régulière






      • REGEXP_SUBSTR, retourne la chaîne respectant l'expression régulière






      • REGEXP_REPLACE, remplace (ou enlève) la chaîne correspondant à une expression régulière





     

    Toutes ces fonctions peuvent, bien sûr, être utilisées directement dans les programmes SQLRPG, SQLRPGLE (ou Cobol)





    • PIPE

      nouvelle instruction du SQL PSM offrant une alternative aux fonctions tables pour retourner une ligne à la fois

      Contrairement aux fonctions tables écrites en RPG qui retournent une ligne à chaque appel,
        les fonctions tables écrites en PL/SQL devaient retourner le résultat d'un Select SQL



      Désormais vous pouvez ajouter de la logique à cela


      Résultat



    • les messages SQL contenant un nom de variable afficheront désormais, les noms longs de ces dernières plutôt que les noms système

      • SQL0190 Attributs de la colonne &3 de &1 dans &2 incompatibles.
      • SQL0196 La colonne &3 de &1 dans &2 ne peut pas être supprimée.
      • SQL0404 La valeur destinée à la colonne ou la variable &1 est trop longue.
      • SQL0406 Erreur de conversion pendant l'affectation d'une valeur à &2.
      • SQL0407 Valeurs indéfinies non admises dans la colonne ou la variable &5.
      • SQL0415 Opérandes d'opération de définition, de constructeur de tableau ou de VALUES non compatibles.




        la variable d'environnement QIBM_SQL_COL_SYS_NAME, si elle existe niveau *SYS, permet un fonctionnement comme avant


    • l'API QUSRJOBI permet de retrouver certaines informations système dans le format JOBI0900 (7.2 uniquement)

      192 C0 BINARY(4) Offset to client accounting string -> registre CLIENT_ACCSTR
      196 C4 BINARY(4) Length of client accounting string
      200 C8 BINARY(4) Offset to client application name -> registre CLIENT_APPLNAME
      204 CC BINARY(4) Length to client application name
      208 D0 BINARY(4) Offset to client program identifier -> registre CLIENT_PROGRAMMID
      212 D4 BINARY(4) Length to client program identifier
      216 D8 BINARY(4) Offset to client user identifier -> registre CLIENT_USERID
      220 DC BINARY(4) Length of client user identifier
      224 E0 BINARY(4) Offset to client workstation name -> registre CLIENT_WORKSTNNAME
      228 E4 BINARY(4) Length of client workstation name

      264 108 CHAR(1) Client IP address for Server job type (1 : IPV4, 2 IPV6)
      265 109 CHAR(45) Client IP address for Server job (adresse IP)
      388 184 BINARY(4) Client port number (port IP)
      392 188 BINARY(4) Offset to client host name
      396 18C BINARY(4) Length of client host name


    • deux nouvelles variables globales (7.2 uniquement)
      • JOB_NAME retourne les coordonnées du job en cours


      • SERVER_MODE_JOB_NAME retourne les coordonnées du job serveur
          (quand la requête est exécutée en mode serveur : QSQSRVR)


    • SQL as a service, nouveaux services

      • vue SYSTOOLS.GROUP_PTF_CURRENCY

        Affiche vos groupes PTF, va chercher les niveaux actuel sur le Net (HTTPGETBLOB + XMLTABLE)
        pour vous indiquer si vous êtes à jour.


      • fonction table JOBLOG_INFO, retourne l'historique d'un travail


      • vue LIBRARY_LIST_INFO, retourne *LIBL du travail en cours


      • vue REPLY_LIST_INFO retourne la liste de réponse système


      • vue JOURNAL_INFO retourne la liste des journaux et leurs attributs


    • de nouvelles procédures stockées afin de gérer le cache des plans d'accès

      • après DUMP_PLAN_CACHE et DUMP_PLAN_CACHE_TOPn qui créent des images du cache des plans d'accès

      • QSYS2/IMPORT_PC_SNAPSHOT , importe une image dans la liste des images affichées par System i Navigator
      • QSYS2/REMOVE_PC_SNAPSHOT , supprime une image du cache des plans d'accès
      • QSYS2/IMPORT_PC_EVENT_MONITOR , créé un moniteur d'événement sur le cache des plans d'accès
      • QSYS2/REMOVE_PC_EVENT_MONITOR , supprime un moniteur d'événement sur le cache des plans d'accès

        Avant ces quatre opérations ne pouvaient être que manuelles (via System i Navigator)


    • RUNSQL propose les mêmes options de sortie que RUNSQLSTM

      • OPTION *NOLIST | *LIST
      • PRTFILE QSYSPRT ou un nom
      • SECLVLTXT *NO | *YES


    • LOCK TABLE admet maintenant un nom d'ALIAS afin de verrouiller un membre d'un fichier multi-membre.


    • CREATE OR REPLACE sur les masques et les permissions RCAC (7.2 uniquement)

    • System limits, phase 3 (7.2 uniquement)

      • un mécanisme était proposé depuis la V7 (TR6 puis TR8)

        Il s'agissait de définir des seuils d'alerte par fonction système pouvant présenter un risque de surcharge
         
          A ces fonctions pouvant présenter une limite, on va associer :

        • un Seuil.(la première fois que le seuil est dépassé on le signale)
        • un Incrément (quand un incrément, par rapport au seuil précédent est ensuite dépassé, on le signale également)

              les dépassements de seuils sont notifiés dans un fichier système : SYSLIMTBL, un trigger peut être posé sur ce dernier.

        les fonctions en version 7.1

        • Système
          • nbr maxi de jobs
        • ASP
          • nbr maxi de spool par ASP
        • Objets
          • nbr maxi de membres
        • Travaux
          • nbr maxi de lignes verrouillées
          • nbr maxi de ligne dans une transaction
        • base de données
          • nbr maxi de lignes dans un membre
          • nbr maxi de lignes actives
          • nbr maxi de lignes supprimées
          • nbr maxi de lignes en excédent (notion d'incrément)
          • nbr maxi de variables à taille variable (sont gérés comme des extensions)
          • nbr maxi d'index autours d'une table
        • journal
          • taille maxi d'un récepteur
          • nbr maxi d'objets attachés à un journal
          • plus grand n° de séquence d'un journal
        • système de fichiers
          • nbr maxi d'objets attachés à une bibliothèque


      • les apports de la 7.2/TR1 à la catégorie système de fichiers
        • nbr maxi de fichiers IFS attachés à un répertoire
        • nbr maxi de répertoires attachés à un répertoire
        • nbr maxi d'objets IFS attachés à l'ASP *SYSBAS
        • nbr maxi d'objets IFS attachés à un ASP utilisateur
        • nbr maxi de documents attachés à un folder (QDLS)
        • nbr maxi de documents attachés à l'ASP *SYSBAS
        • nbr maxi de documents attachés à un ASP utilisateur
        • taille maxi d'un fichier de l'IFS
        • taille maxi d'un document (QDLS)


          Chaque seuil est identifié par un ID (LIMIT_ID) , tous les nouveaux sont dans la plage 18402 / 18410

          il suffit de faire référence à SIZING_ID dans SQL_SIZING pour avoir un libellé


          la vue SYSLIMITS fait la jointure pour vous.

    • DEBUG SQL amélioré

      Un programme ou une fonction écrite en PL/SQL, génère du C avant d'être compilé.

      Le debug, avant, était réalisé au niveau du langage C

      • le mode PAS à PAS devenait compliqué (une instruction SQL peut générer plus de 10 lignes en C)
      • les variables n'étaient visibles que si vous aviez indiqué un LABEL dans le code.


    ce n'est plus le cas , exemple avec la fonction suivante (extrait)


    Lançons le DEBUG






    Mettons un point d'arrêt

    Les variables sont visibles même sans LABEL (en fait un label SQLP_L2 a été ajouté)
    ici, le curseur est immobile sur code

    un simple F11 passe à l'instruction SQL suivante


    Pour profiter de ces nouveautés en mode graphique, il faut installer la SI53809, coté client

    Ces nouveaux modes de fonctionnement sont aussi vrai sous STRDBG (mode caractère) en 7.1 et 7.2
    et vous pouvez demander à voir une variable, tout label confondu, par EVAL %%CODE

    • l'attribut KEEP IN MEMORY, qui n'était avant valable que par CHGPF/CHGLF, est maintenant accessible via SQL
      sur CREATE TABLE, ALTER TABLE, CREATE INDEX, CREATE VIEW

      il est aussi accessible depuis l'interface graphique (Si53809 obligatoire coté client)

      (résidant en mémoire)

    • Autres améliorations à System i Navigator



      nouvelle colonne "date de création" sur la liste des index (aussi dans le catalogue SQL : SYSINDEXES, SYSINDEXSTATS)


      moniteur de perf. SQL


      deux nouveautés concernant le démarrage d'un moniteur de performances SQL
      • on peut filtrer sur plusieurs nom d'utilisateur (jusqu'à 10)
      • on peut stocker ou pas, les valeurs des variables dans le fichier résultat.

        Ce dernier point correspond au nouveau paramètre HOSTVAR sur STRDBMON :

        • *BASIC, comme avant les données sont stocks dans un ligne spécifique (QQRID = 3010)
        • *CONDENSED, les données sont stockées dans la ligne d'initialisation de la requête (QQDBCLOB1 quand QQRID = 1000)
        • *SECURED, les données ne sont pas stockées


    Visual Explain permet de descendre au niveau détail dans le cas d'une fonction utilisateur


 

  • Web

    • nouveaux scripts savewebserviceServeur.sh et restorewebserviceServeur.sh
    • nouveaux scripts savewebservices.sh et restorewebservices.sh
    • ce dernier peut être utilisé pour migrer un web service du serveur LWI(1.5) à celui basé sur liberty profile (2.6)





    • Le serveur de web services, dernière version (2.6) avec SF99713 level 5, (également avec SF99368 level 31, en version 7.1)
      permet de créer des web services REST



      Choisissez le pgm ou le pgm de service (comme avant)


      Indiquez l'URL permettant de le reconnaître
      • /chemin/{variable} dans le cas d'une transmission de paramètre dans le PATH (PATH_PARAM)
        (vous pouvez alors précisez : et une expression régulière devant être vraie, ici que des chiffres)

      • /chemin, dans tous les autres cas


        ici l'URL sera /web/services/W_RECAP/recap/prod/1 pour le producteur 1

    Les paramètres sont reconnus grâce à PGMINFO(*PCML : *MODULE) , indiquez le sens d'utilisation

    SI55531 (7.2) et SI55340 (7.1) apportent l'option *DCLCASE permettant de demander le respect de la casse quant aux noms dans le PCML


    Ensuite précisez

    • la méthode (GET | POST)
    • la manière de renseigner les paramètres en entrée
      • *QUERY_PARAM
        les paramètres sont transmis dans l'URL sous la forme ?param1=valeur1&param2=valeur2

      • *PATH_PARAM
        les paramètres sont transmis dans l'URL sous la forme /chemin/valeur, l'URL vue plus haut /chemin{param1} définie le nom du paramètre

      • *FORM_PARAM
        les paramètres sont transmis dans un formulaire contenant une zone de formulaire nommé param1 <input name="param1" type="text">

      • *COOKIE_PARAM
        les paramètres sont transmis sous forme de cookies (param1=valeur1)

      • *HEADER_PARAM
        les paramètres sont transmis dans l'entête HTTP sous la forme param1=valeur1

      • *MATRIX_PARAM
        les paramètres sont transmis dans l'URL sous la forme ;param1=valeur1;param2=valeur2


      • dans tous les cas, Indiquez à quel paramètre RPG correspond param1 (ici noprod)




      Indiquez le profil

      la liste de bibliothèques


      les informations d'entête HTTP à transporter, puis vous arrivez sur l'écran final






      Quelques tests

      *PATH_PARAM (celui déployé ci-dessus)



      *QUERY_PARAM

      nouveau service

      paramètre en entrée




      Format de sortie JSON



    • IBM propose via un nouveau produit, l'intégration de projets Open source : 5733OPS
      • Aujourd'hui Node.JS
      • demain, sans doute, PYTHON
      • ...

    Le produit peut être téléchargé depuis le site ESS

    il s'installe par :

    • RSTLICPGM 5733OPS OPTION(*BASE) LNG(*SAVVOL)
    • RSTLICPGM 5733OPS OPTION(1) LNG(*SAVVOL)




    Pour une découverte du langage voyez OpenClassroom

    suite à l'installation du produit, vous devez trouver ces répertoires

    pour éviter l'erreur signal 5, vous devez aussi créer la variable d'environnement QIBM_MULTI_THREADED à 'Y'

    enfin vous pouvez tester par QSH ou QP2TERM (PASE)

     

    1er essai : Hello World (en Français)

    saisissez ce code (ici par EDTF)

    lancez le depuis QSH par :

    et testez avec un navigateur

    ce serveur peut aussi être soumis par

     

    2eme essai : simple requête SQL

    saisissez ce code

    remarquez db.conn qui se fait sur le nom de DataBase (celui indiqué par WRKRDBDIRE)

    JSON.stringify transforme un objet JSON en chaîne de caractère

     

    Soumettons le et testons (ce lien doit lancer lancer la page vue plus haut)

    "As Usual", nous aurons sans doutes quelques soucis avec les caractères accentués "latin"

    vous pouvez aussi accéder aux objets IBM i par un toolkit basé sur le XMLToolKit.

  • RDI

    • RDI passe en version 9.11 (c'est un correctif, non une nouvelle version)

    • le code coverage (couverture de code) accepte maintenant les programmes interactifs

      Cela permet lors de vos tests (batch avant 9.11, interactif ensuite) de voir le taux de couverture de vos tests (% de lignes sur lesquelles vous êtes passé)

      Tout programme qui peut être débogué, peux être testé.

       

      Quand l'exécution est terminé, cliquez sur la ligne

      la seule option proposée est de lancer l'éditeur :

      • en vert les lignes sur lesquelles vous êtes passé
      • en rouge les autres


      La version 9.11 propose la même chose pour les programmes interactifs.

      Il faut retrouver la manière un peu "ancienne" de mettre une session à l'écoute de RDI, par STRRSESVR

      N'oubliez pas de préciser la liste de bibliothèques au niveau de la connexion, afin que les commandes ADDLIBLE
      soit lancées automatiquement sur la session 5250, dès la connexion.

      quand c'est fait

      Lancez l'option Couverture de code (remarquez le choix Batch/Interactif à ce niveau de version)

      ou mieux : avec invite, permettant de demander la mise à jour des fichiers de production



      voire, indiquer des options de couverture de code

      •Niveau de couverture de code

      • niveau ligne (dft) donne la liste des lignes où vous n'êtes pas passé
      • niveau procédure donne la liste des procédures non testées
      • niveau programme, donne la liste des programmes non testés

        (vous pouvez indiquez un fichier contenant la liste des programmes attendus)

      •Exécuter une couverture complète ou ajouter ce résultat à un couverture de code précédente

      •Générer, en plus du rapport standard, un rapport en HTML ou en PDF (ceci peut être demandé ensuite)

      •Ignorer ou pas les erreurs d'exécution lors du test ?

      Le pgm est lancé (au bout d'une minute ou deux), saisissez des valeurs, faites "tourner" le pgm :

      à la fin de ce dernier, vous verrez :

      Si vous cliquez sur le pgm, vous verrez le détail des lignes sur lesquelles vous êtes passé



      Remarquez la bonne intégration du free RPG

      SI vous le souhaitez vous pouvez générer un rapport détaillé, dans un deuxième temps


      (remarquez l'option de comparaison, permettant de comparer deux tests)

      Indiquez, ici, vos options :



      Résultat (ici un rapport PDF)


    • un mécanisme de partage des ressources (filtre, actions utilisateurs, modèle) est intégré à cette version

      Partage des ressources

       

      -> deux manières de partager :

      1/ export/import de la totalité de la config.

      • c'est manuel
      • vous retrouverez tout, y compris la liste de vos systèmes
      • vous mettez la sauvegarde où vous voulez (clé USB , lecteur réseau, ...)

       

      Choix des options à sauvegarder

      • Database Connections : vos connexions dans la perspective


      • Eclipse Preferences, vos préférences (couleur, taille des polices, ...)
      • RDI Editor Template, vos modèles en free RPG uniquement
      • Remote Systems Artifacts (vos connexions, vos filtres)

      détail

      localisation et nommage du fichier de sauvegarde

       

      Suite à un changement de PC, imaginons que j'ai tout perdu...

      Importation

      Importation RDI

      choix du fichier

      Choix des options à restaurer

      Attention, redémarrage obligatoire

      Et voilà :


      2/ export/import automatique

      • c'est automatique (on peux décliner, sauf quand l'administrateur a prévu de forcer)
      • cela s'effectue système par système
      • RDI détecte tout seul les différences

      Par exemple, nous créons une commande de compilation particulière

      et un modèle de code en free RPGLE

      Fichier / Exportation

      Choix des options



      choix du système cible (dans /QIBM/ProdData/Devtools/clientconfig)



      Vous remarquez qu'il est possible de changer le répertoire de sauvegarde en créant une variable d'environnement
      -> ADDENVVAR/CHGENVVAR QRDICONFIGFOLDER LEVEL(*SYS)

      N° de version et option pour forcer la mise à jour

       

       

      Ensuite, à la connexion (pas avant) RDI regarde s'il y a des nouveautés

      Oui, choix des options à importer (sauf option de forcage activée)

      et redémarrage



Copyright © 1995,2015 VOLUBIS