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

Juin 2015

Évolutions IBM i et stratégie

 

  • les technology refresh 2 (7.2) et 10 (7.1) viennent d'être annoncées

    Ces PTF sont planifiées tous les 6 mois (entre deux versions) la TR3 est déjà "dans les tuyaux"


    source Scott Forstie sur MCpressOnline


    Et dans le même temps Steve Will, nous parle déjà de "IBM i Next" et, parce qu'ils ne pourrons pas tout mettre dedans, "Next +1"





    nous parlant alors d'un support allant jusqu'en 2026 !

    Source : Le blog de Steve Will


  • Mais, pour mettre tout cela en perspective, regardons un peu dans le rétroviseur....

  • Amélioration DB2

Déjà, quels sont les avantages de SQL pour la création de tables (vs PF) ?

  • plus de types de données disponibles

    • Dates/Heures et valeur nulle sont intégrés au SQL de base
    • BLOB /CLOB (champs images, PDF, JSON en TR2)
      • OmniFind sait indexer de tels champs
    • DATALINK
      • champs de type URL avec possibilité de contrôle de l'existence du fichier dans l'IFS.
    • NCHAR
    • DECFLOAT
    • ROWID
    • zones auto-incrémentées (AS IDENTITY)
    • SEQUENCES
    • attribut HIDDEN
      • cette colonne est cachée par défaut (SELECT * FROM ... ne la montre pas)
    • attribut AS ROW CHANGE TIMESTAMP
      • ce TIMESTAMP contient automatiquement date/heure de dernière modification.
    • XML
  • Intégrité référentielle, directement définie avec la table (syntaxe SQL)

    • les contraintes sont définies dans le même source, le même langage
    CREATE TABLE clients
    (nocli dec(6 , 0) primary key ,
    raisoc char(25) ) ;
    CREATE TABLE commandes
    ( nocde dec(8 , 0) PRIMARY KEY,
    nocli dec(6 , 0) REFERENCES clients,
    datcde DATE, datliv DATE,
    check (datliv > datcde + 1 day) ) ;

  • noms plus longs
    • 30 c. pour les noms de zone
    • 128c pour les noms de table
      CREATE TABLE clients
      (numero_client for nocli dec(6 , 0) primary key ,
      raison_sociale for raisoc char(25) ) ;

  • FIELDPROC pour crypter les données
  • TRIGGER à la colonne
  • lectures plus rapides

  • Historiquement, journalisation automatique. Désormais nous pouvons aussi utiliser STRJRNLIB

  • Possibilité d'utiliser des outils de modélisation

  • 7.2, RCAC

    Droits à la colonne
    CREATE [or REPLACE] MASK tel_MASK ON bdvin1/producteurs
     FOR COLUMN pr_tel RETURN
      CASE
        WHEN SESSION_USER = 'QSECOFR'                                          
                                                   THEN PR_TEL
        WHEN SESSION_USER = 'CM'
                                                   THEN left(pr_tel , 3) concat 'XXXXXXXXXXXXX'
        ELSE NULL
    END
    ENABLE

    Droits à la ligne

    CREATE [or REPLACE] PERMISSION VINS_ROW_ACCESS ON bdvin1/vins
    FOR ROWS
     WHERE
         SESSION_USER <> 'CM'
             OR (SESSION_USER = 'CM'
                      and (appel_code <> 13 or appel_code IS NULL)
                   )
    ENFORCED FOR ALL ACCESS
    ENABLE

              on indique ce qui peut être vu (une affirmation, donc)

  • 7.2 TR2
    • CREATE OR REPLACE TABLE ...
      simplification des scripts de mise en place, de déploiement



      Cette instruction fonctionne sur un fichier physique (DDS) existant, facilitant la transition d'un monde à l'autre.

      D'ailleurs la Génération d'instruction SQL sous System i navigator, le propose sous forme d'option



Quels sont les avantages de SQL pour la création d'index (vs LF)

  • Choix du type (b-arbre ou EVI)
    • Index EVI pour le BI
    • ces derniers peuvent contenir des fonctions d'agrégation (Count, SUM, ...)

  • Pages de 64 K
    • Ces index à larges pages sont plus efficaces lors de manipulation de volumes
    • les index créés par SDD ont des pages de 8k plus efficaces pour recherche une donnée unitaire (CHAIN en RPG)
  • Depuis la V6, les index peuvent avoir
    • une clé composée
      • CREATE INDEX clienti5 ON CLIENTS ( UPPER(raisoc) ) ; 
  • une sélection
      • CREATE INDEX clienti6 ON CLIENTS ( nocli ) 
        where raisoc <> ' ' and nocli > 1 ;
  • un format particulier
      • CREATE INDEX clienti8 ON TEST/CLIENTS ( nocli )  
        RCDFMT clientf8 add raisoc ; -- en plus de la clé


Quels sont les avantages de SQL pour la création de vue (vs LF)

  • Beaucoup plus de puissance
    • une vue peut avoir une jointure interne et les autres externes gauche
    • une vue peut retourner des données agrégées (GROUP BY, GROUP BY ROLLUP)
    • une vue peut avoir une sélection utilisant toute la puissance du WHERE SQL (CASE par exemple)
    • une vue peut utiliser une fonction "maison" c.a.d une UDF
      • CREATE VIEW clientv8 AS   
        (select nocli, raisoc, dispo(nocli)
        from clients) ;
  • une vue peut utiliser une UDTF (fonction retournant une table à partir de données non BdeD)
      • CREATE VIEW lesfacturesPDF AS   
        (select * FROM TABLE (litrepertoire('/PDF') as PDF);
  • Attention, les vues ne sont pas indexées
    • C'est un problème pour remplacer un LF par une vue sur une spécif F RPG
      (mais revoyez les nouvelles possibilités des index SQL)
    • Ce n'est pas un problème lors d'un accès SQL, c'est le moteur qui trouve tout seul le meilleur chemin

Avancées syntaxique SQL (voyez aussi notre mémo)

  • WITH admet UNION et ORDER BY, permettant des requêtes récursives

    • (Requête récursive)
       WITH temp (composant, compose, quantite)                       
      as (select L.composant, L.compose, L.quantite
      from liens L where composant = 'voiture'
      UNION ALL
      select fils.composant , fils.compose, fils.quantite
      from temp AS Pere join liens AS Fils
      on pere.compose=Fils.composant
      )
      SELECT * FROM TEMP


EN version 7 utilisez plutôt cette syntaxe

    • (Requête récursive
      ou hiérarchique V7)
      SELECT chef, matricule, nom
         FROM personnel
      START WITH chef = ‘Mr le Directeur’
       CONNECT BY PRIOR matricule =chef


      options liées :
      ORDER SIBLINGS BY nom
      Tri les lignes ayant le même parent
      CONNECT BY NOCYCLE PRIOR
      évite l'arrêt en erreur lors d'une boucle infinie
      (la ligne qui provoque la boucle est affichée une deuxième fois)
      CONNECT_BY_ISCYCLE
      retourne 1 si la ligne en cours aurait provoqué une boucle
      CONNECT_BY_ISLEAF
      retourne 1 si la ligne en cours n'a pas d'enfant
      LEVEL
      indique le niveau dans la hiérarchie pour cette ligne
      CONNECT_BY_ROOT
      indique l'élément racine (le parent d'origine) pour cette ligne
      SYS_CONNECT_BY_PATH(
       <élément> 
      , <séparateur>)
      retourne le chemin complet (suite de <élément> séparés par <séparateur>)
      par exemple :
       SELECT SYS_CONNECT_BY_PATH(trim(chef), '/') AS chemin
          retourne sous forme de CLOB : /Mr le Directeur
                                       /Mr le Directeur/Michelle
                                       /Mr le Directeur/Michelle/Françoise
                                       /Mr le Directeur/Michelle/Françoise/Yves
                   



  • Fonctions dites "OLAP"

    • ROW_NUMBER() 

      numérote les lignes sur un critère de tri

      select ROW_NUMBER() over (order by prix), codart, libart from articles
      [order by autre-chose]

      RANK() 

      attribue un rang à chaque ligne
      (en gérant les ex-aequo, par exemple 1-1-3-4-4-4-7)

      select RANK() over (order by prix), codart, libart from articles
      DENSE_RANK() 

      attribue un rang consécutif
      (par exemple 1-1-2-3-3-3-4)

      select DENSE_RANK() over (order by prix), codart, libart from articles
      V6 : évolution GROUP BY

      soit le SELECT basique suivant -->

      SELECT SOC, DEP, Count(*) .../...     GROUP BY soc, Dep
      SOC DEP Count(*)
      01 22 15
      01 44 20
      02 22 5
      02 44 10
      ROLLUP 

      affiche 1 total par groupe puis des ruptures de niveau supérieur

      SELECT SOC, DEP, Count(*) ... GROUP BY ROLLUP (soc, Dep)
      SOC DEP Count(*)
      01 22 15
      01 44 20
      01 - 35
      02 22 5
      02 44 10
      02 - 15
      - - 50


  • Instruction MERGE
    • MERGE

      MERGE INTO cible C
       USING (SELECT source1 , source2 FROM source) S
         ON (C.zonecle  = S.zonecle)
        WHEN MATCHED THEN
           UPDATE SET cible2 = source2
        WHEN NOT MATCHED THEN
           INSERT (cible1, cible2) VALUES(source1, source2)


  • instruction TRUNCATE (7.2)
    • équivalent à CLRPFM


  • V7 : intégration du XML (voir Pause Café 56)

  • le XML peut être stocké, il est vérifié lors du stockage
  • on peut associer un schéma XSD à un champ XML
  • un fichier de l'IFS peut être lu par GET_XML_FILE pour produire du XML
  • un flux http peut être reçu (HTTPxxxCLOB) pour produire du XML
  • de nombreuses fonctions permettent de "fabriquer" du XML (XMLROW, XMLAGG)
  • on peut "parser" du XML en SQL et présenter les data sous forme relationnelle (XMLTABLE)
  • un champs XML peut être indexé (ainsi que les champs Texte et BLOB) par Omnifind, permettant :
    • un recherche poussée (XPath)
    • avec de bons temps de réponse

  • Exemple, le code
    SELECT *   FROM XMLTABLE('$result/rss/channel/item'
    PASSING XMLPARSE( DOCUMENT
    SYSTOOLS.HTTPGETBLOB('http://www.redbooks.ibm.com/rss/iseries.xml','')
    ) as "result"
    COLUMNS
    title VARCHAR(128) PATH 'title',
    description VARCHAR(1024) PATH 'description',
    link VARCHAR(255) PATH 'link',
    pubDate VARCHAR(20) PATH 'substring(pubDate, 1, 16)'
    ) AS RESULT;

    permet de lire les un flux RSS de manière structurée :


TR1

  • de nouvelles fonctions, basées sur les expressions régulières (voir Pause-Café 69)


TR2

  • Intégration du format JSON (dans des champs BLOB)
    • via les API Java
      • création de collections (table à un seul champ BLOB)
    • en mode commande
    • en SQL
      • fonction d'exportation BSON2JSON

  • deux nouvelles fonctions (gestion des UUID)
    • VARBINARY_FORMAT
    • VARCHAR_FORMAT_BINARY

  • CREATE OR REPLACE TABLE ...
    • ON REPLACE

      PRESERVE ALL ROWS
      conservation de toutes les lignes, y compris sur une table partitionnée

      PRESERVE ROWS
      si une plage (pour un table partitionnée) est enlevée, les lignes correspondantes disparaissent

      DELETE ROWS
      aucune ligne n'est conservée.

DB2 for I Service

  • SQL est devenu le langage de choix pour IBM afin d'accéder aux informations Système (SQL as a service)

    •SF99702 level 5 arrive en même temps que la TR2
    •SF99701 level 34 arrive en même temps que la TR10

RPG

  • Le langage est devenu très puissant (voir la liste des instructions et des fonctions intégrées)
    • DS à occurrences
      • on peut rechercher par %LOOKUP
      • on peut trier par SORTA( A | D)
    • DS dans des DS
    • intégration du XML (XML-INTO)

  • le langage est devenu lisible (y compris par un jeune développeur), bien intégré à RDI

    Free-Form RPG (voir les pause-Café 65 et 66)



    Exemple avec du SQL embarqué (utilisation des expressions régulières)



  • Modulaire
    • une fonction (au sens ILE) peut aisément devenir une fonction SQL (UDF)
    • un programme avec des paramètres en entrée (même CL et GAP III) peut facilement devenir
      • une procédure stockées, appelée via ODBC/ JDBC /DB2connect (PHP)
      • un service Web (SOAP ou REST)

  • Inter opérable
    • API LDAP/EIM (pour ceux qui font du SSO)
    • API IFS pour traiter directement des fichiers ou des répertoires
    • Sockets IP pour dialoguer avec des équipements
    • JNI, le projet JDBCR4 permet de se connecter aux principales bases de données (MYSQL, MSSQL, Oracle, ...)

  • TR2, quelques modifications
  • RPG n'est pas le seul à avoir évolué, regarder le CL :

    • V5R30 :
      • Variables binaires
        DCL VAR(&CPT) TYPE(*INT)
      • support de fichiers multiples (jusqu'à 5)
        DCLF FILE(ECRAN1) OPNID(ECRAN)
      • Structuration du code
        • DOWHILE COND( même test que sur un IF)
        • DOUNTIL COND( même test que sur un IF)
        • DOFOR VAR(&cpt) FROM(1) TO(22) BY(3)
        • SELECT
            WHEN COND( ) THEN( )
            WHEN COND( ) THEN()
            OTHERWISE CMD( )
          ENDSELECT
    • V5R40
      • Pointeurs
        DCL VAR(&pointeur) TYPE(*PTR)
      • Sous programmes
        CALLSUBR SUBR(TEST)

        SUBR SUBR(TEST)
              .../...
        ENDSUBR
    • V7
      • nombreuses nouvelles fonctions intégrées
        %TRIM,%CHECK,%SCAN
        %CHAR,%DEC,%INT
        %LOWER,%UPPER,%LEN,%SIZE


Réseau

  • de nombreux produits ont fait leur apparition :
    • Samba (enfin documenté) vs Netserver
    • 5733SC1
      • OpenSSL
      • SSH /SFTP
        • lancez STRTCPSVR *SSHD
        • connectez vous avec Putty ou WINSCP .....
  • Sous PASE vous pouvez aussi installer plein de choses... à la main.
    • WGET par exemple
  • SNDSMTPEMM permet d'envoyer des mails (CPYSPLF génère du PDF)


Web

  • le serveur livré est Apache 2.4, serveur d'application intégré Liberty
  • on peut installer Tomcat, WAS (version complète)
  • TR2 : intégration de Java 8

  • Il n'a jamais été aussi simple d'exposer en tant que web service un pgm RPG.
    • à l'origine SOAP

  • Le serveur de web services, dernière version (2.6) permet de créer des web services REST



    Format de sortie XML


    Format de sortie JSON


  • TR2, ce produit est amélioré
    • il est plus simple d'indiquer le nombre d'occurrences retournées
    • il est possible d'indiquer le format retourné (ce n'est plus limité à XML/JSON)
    • il devrait être possible (fin juin) de placer une structure à occurrences variables dans une structure



  • IBM propose via un nouveau produit, l'intégration de projets Open source : 5733OPS
    • Node.JS (modifié en TR2 pour intégrer une techno. FastCGI, comme PHP)
    • TR 2 : PYTHON avec tous les connecteurs pour DB2.

  • Vous avez donc le choix aujourd'hui
    • Java
    • CGI (CGIDEV2 en RPG), CGI en Python
    • NetData (et oui, toujours là)
    • PHP (voyez la dernière version de Zend avec Z-RAY)
    • Ruby On rails
    • Node.JS

  • Bien sur vous pouvez aussi externaliser le serveur web/serveur d'application
    • sur un serveur Linux externe
    • sur une partition Linux (vous avez, pour certains, un ou deux processeurs disponibles)
    • sur un serveur Windows

    • Pour cela tous les connecteurs ci-dessous sont disponibles :
      • JDBC (java)
      • ODBC/Windows
      • ODBC/Linux
      • OleDB
      • .Net
      • DB2Connect (PHP)

    • Ils permettent aussi d'envisager une architecture client serveur

    • et bien sûr, les Web services (IBM i : serveur et client)

Nos outils aussi évoluent

RDI

  • RSE (LE "plug-in" pour travailler avec des applications traditionnelles IBM i),


    l'éditeur est bourré de trucs & astuces, comme par exemple : (Ctrl Maj+O)


    un debugger vous est proposé


    proposant une fonctionnalité très innovante : le point d'entrée de service



    Dès qu'un programme (ici DSPLIBL dans PROC_TST) est lancé par un utilisateur donné (CM sur l'image), le debug démarre !


  • Aujourd'hui, RDI est 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

    vous pouvez lancer l'éditeur :

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


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

Query vs DB2 Web Query

les dernières versions de DB2 Web QUERY, proposent

Client Access


LE produit stratégique c'est ACS (5733XJ1 , version Java), il évolue en TR2 (V1R1M4)

La version WEB (XH2) intègre une version pour mobiles


Tout en ayant été déclaré stabilisé en version 7.1, System i navigator continue d'intégrer les nouveautés DB2


Particulièrement tout ce qui est surveillance des performances SQL

En V5R40

  1. Le centre de santé affiche des informations sur vos bases en % des maximas DB2
    C'est lui qui permet de voir graphiquement le contenu de QSYS2.SYSLIMTBL
  2. Les moniteurs SQL proposent des sélections (bibliothèque, tables, durée) au lancement et à l'affichage
    • en TR2, DATABASE_MONITOR_INFO() donne la liste des moniteurs
  3. Consultation du cache des plans d'accès avec le même affichage que les moniteurs
    • Ce dernier suggérant les index manquant en temps réel (assistant de gestion des index)
  4. La liste des index indique quand un index a été utilisé, même implicitement pour la dernière fois

En V6R10

• Moniteurs

Sur un affichage récapitulatif, à l'affichage des instructions (Analyse, puis clic droit sur une ligne / instructions),
   l'option fichier propose, maintenant, une sauvegarde de la liste des instructions SQL


Sur le même affichage, vous pouvez maintenant, placer la requête SQL dans le gestionnaire de script avec les valeurs des variables, ou les marqueurs SQL (?)
     

Enfin, vous pouvez comparer deux moniteurs

 

TR2, vous pouvez demander un récapitulatif :

  • par Travail
  • par Nom de travail
  • un récapitulatif par Table


• Cache des plans d'accès

- la taille peut être ajustée par CALL QQQOOOCACH PARM('R:1024')
ou par iSeries Navigator (Mémoire cache de plan SQL/propriétés)

Les possibilités d'affichage sur une instruction ont été étendues :

- l'affichage des instructions les plus longues est limité aux 500 premières
- vous pouvez demandez la liste des travaux utilisant actuellement cette instruction
-  et la liste des utilisateurs ayant utilisé cette instruction (historique de l'utilisateur)

Vous pouviez déjà en V5R40 sauvegarder le cache sous forme d'images instantanées :

par l'interface graphique sous Images instantanées de mémoire cache de plan SQL
par la procédure cataloguée DUMP_PLAN_CACHE , qui en V6 est automatiquement enregistrée au même endroit.

Quand le cache est plein il est automatiquement épuré, en V6 il est possible de placer un moniteur sur cet événement afin de le sauvegarder en fichier avant

• Gestion des index

l'assistant de gestion d'index (qui affiche les index suggérés, globalement, pour une bibliothèque ou pour une table) a été amélioré :

- Affichage de l'instruction SQL est nouveau en V6

- ainsi que l'accès direct aux instructions qui ont provoqué cette suggestion (dans le cache)

- l'assistant affiche aussi le nombre de fois ou un index a été suggéré et, s'il a été créé automatiquement (MTI), le nombre de fois ou il a été utilisé

Ce compteur peut-être réinitialisé pour la table, par le menu contextuel suivant :

Les procédures fournies à titre d'exemple dans SYSTOOLS, permettent d'automatiser des traitements

  • ACT_ON_INDEX_ADVICE, création d'index suggérés (sur critères)
  • HARVEST_INDEX_ADVICE, génération des instructions de création d'index dans un membre source
  • REMOVE_INDEXES, suppression (sur critères) des index inutiles


TR2 : la nouvelle procédure CLEAR_PLAN_CACHE permet d'éviter un IPL sur les machines de test.


Comme vous le voyez, les possibilités d'analyse de l'activité Base de Données sont immenses !

 D'ou la question posée à Mike CAIN, nous faut-il un DBA ?

Could you explain why a company must point someone as DBE?
– There is so much science and art in the are of information management these day, someone must be responsible for understanding the subject, and applying the techniques to get the most value out of data. This is no longer an optional thing. The world runs on data, and you need to be good at.
http://db2fori.blogspot.com/2012/11/db2-for-i-database-engineer-description.html
Source : Common Sweden

Bon, et qu'est-ce qu'on fait ?

 

Ci-dessous quelques éléments de réflexion :

 

  1. le pire serait de ne rien faire !

  2. Nous allons avoir de nouveaux besoins (web , mobiles, etc....)

  3. Nous allons avoir de nouveaux collaborateurs (forcement !)



    Je vous propose d'analyser le problème selon cinq axes :
  • L'interface
  • La base de données
  • le code
  • les outils
  • l'architecture

 

L'interface (5250)

 

  • Autant les terminaux peuvent être utiles dans certains cas, autant on ne peut pas considérer le 5250 comme une interface d'avenir ;-)

  • revoir l'interface avec des outils plus ou moins automatiques, est un bon moyen :
    • de redorer le blason de l'IBM i (voire de faire croire qu'il a disparu)
    • d'avoir du temps pour le fond (ce qui suit)

La base de données.

 

  • Pour nous cela est clair, à partir de maintenant, il faut concevoir la base en SQL (pour les nouveaux fichiers) et penser "data centric", c'est à dire faire faire à DB2 tout ce qu'il sait faire, ca fait ça de moins dans les programmes, ca fait de moins comme aller/retour si nous pensons web/mobiles.

 

  • faut-il revoir l'existant ?
    • des outils vous le proposent
    • A la main, c'est possible (pour la partie structure c'est automatisable)
      • trigger, pourquoi pas, quand ça ce justifie.
      • intégrité référentielle, attention aux traitements existants !
    • est-ce la priorité, si vous êtes contingenté par le temps ? (c'est souvent une litote)

Le code (RPG particulièrement)

 

  • Pour nous cela est clair, à partir de maintenant, il faut écrire vos programmes en free-form RPG
    • plus lisible (si ! si !)
    • plus facile d'intégrer les jeunes
    • plus facile d'évoluer, de basculer vers d'autres langages

 

  • faut-il revoir l'existant ?
    • des outils vous le proposent
    • A la main, c'est compliqué (CVTRPGSRC ne fait pas vraiment le boulot !)
      • mais apprendre le GAP III (ou II) au moins de 30 ans, est-ce raisonnable ?

 


Les outils

 

  • On imagine pas se passer du mode commandes, mais vous n'imaginez pas comme nos jeunes stagiaires sont rassurés quand ils découvrent System i Navigator !

 

  • Pourquoi ce faire du mal volontairement (essayez Linux sans interface...)
    • de toutes façons, il y a pleins de fonctionnalités qui ne sont valides que dans ce monde là
      • surveillance des performances base de données
      • surveillance des performances systèmes avec PDI sous Navigator for i.
      • gestion centralisée (notre prochain cours en ligne)
      • configuration des principaux serveurs IP (DHCP, DNS, Netserver, FTP, ...)

    • et puis essayez RDI, passé les 15 premiers jours, vous ne reviendrez pas en arrière
      • colorisation syntaxique
      • gestion des boucles
      • complétion de code (ctrl+espace)
      • fenêtre structure
      • gestion des erreurs de compilation
      • Degug !

 

Architecture

 

  • Les millions de lignes écrite ces 25 (30 ?) dernières années représentent une valeur,voire une fortune !


Ce qui est confirmé par le "vice-président de la force de vente " Power i" (Alex Gogh)

"We have an opportunity in Power i that we've never had," Gogh said. "I've been around Power i for all of my 32 years in IBM. . . This is our moment in Power i and this is our opportunity and here's why."

So what, exactly, is that opportunity? The way Gogh sees it, the investments that IBM i customers have made in their core applications and systems makes them well-positioned to take their businesses to the next level, and to start benefiting from the explosion of new capabilities that can be found in the world of (brace yourself) cloud, mobile, social, and analytics.

source ItJungle, mai 2015

  • Je pense qu'aujourd'hui il faut avoir deux acronymes à l'esprit MVC , SOA

 

  • MVC



    Le pgm qui constitue la donnée (qui fait la liste, qui valorise la données, etc...) n'est PAS le programme qui affiche !
    Le pgm qui écrit/met à jour la donnée, est autonome, unique !



  • SOA


    un programme=un service / un service(un besoin)=un programme

         les autres concepts sont un peu plus compliqués à matérialiser, surtout sur des langages procéduraux.


      Tout programme, peut ainsi devenir :
    • une fonction SQL utilisable dans tous les contextes
    • une procédure stockées pour ODBC/JDBC
    • un service web (Couplages externes "lâches") qui respectent le mieux l'architecture SOA


Il est ainsi possible d'envisager l'urbanisation du Système d'information

Il s'agit de mettre en place un Plan d'urbanisme en s"appuyant sur une cartographie fonctionnelle du SI et un découpage en entités autonomes, de description de plus en plus fine (source Wikipedia) :

  • les zones,
  • les quartiers,
  • les îlots,
  • et enfin les blocs fonctionnels ou encore les briques


L'urbanisation répond à deux règles de bases  :

  • Une application doit appartenir -à terme- à un et un seul bloc.
  • Les dépendances doivent respecter les notions de Cohérence Forte / Couplage Faible
    • entre les applications,
    • au sein d'une application : entre les différents modules,
    • au sein d'un module : entre les différents composants, d'où l'extrême modularité

cette démarche peut se mettre en œuvre :

    • de manière opportuniste : à l’occasion d’un projet de développement, de refonte ou de maintenance,
    • de manière plus volontariste : dans le cadre d’un chantier d’urbanisation.

 

Exemple

Il parait assez simple d'imaginer un programme réalisant (de manière autonome) la mise à jour d'un fichier

  • réception de l'enregistrement en tant que paramètre
  • d'un code erreur à retourner

  • si les contrôles ne positionnent pas de code erreur => mise à jour



    Ce pgm sera invoqué comme ceci :


Regardons plutôt un programme de constitution d'une liste de données valorisées.


Soit un programme (sans doute avec une partie du code hérité d'un ancien traitement)

Qui retourne des informations concernant les 15 producteurs qui suivent (SETGT) celui passé en paramètre


Ce pgm a trois paramètres en entrée

  1. Pr_Code pour le positionnement dans le fichier producteur
  2. NbProd pour retourner le nombre de producteurs réellement lus
  3. Retour une DS à 15 occurrences (pas forcément toutes chargées)    

Ce programme peut facilement être transformé en Web service (ici SOAP)




Testons

ou bien, avec les derniers niveaux de PTF, en web service REST




et voilà

Donc lancé, depuis une simple URL


voire, utilisé en SQL (fonction HTTPGETBLOB + XMLTABLE)


Ou si vous le préférez, transformé en Procédure stockée (on ajoute une interface pour gérer le RESULT SET SQL)



Et il devient utilisable directement, via JDBC/ODBC


Enfin, le monde 5250 n'est pas oublié pour autant

soi le DSPF suivant (avec sous fichier)

 SFLMODE retourne dans ETAT :

  • '1' quand l'affichage est tronqué
  • '0' quand l'affichage est multi-ligne


ET le PGM RPG

déclarations

boucle principale

Sous programme de chargement d'une page


On ne charge que 14 lignes par page (SFLPAG)

     Remarquez la gestion de l'indicateur 31, qui teste s'il y a 15 lignes (au moins encore une ligne = ROLLUP autorisé)

Résultat



Notons aussi l'apparition d'un produit dans le même esprit : OpenLegacy

Voyez l'article dans ITJungle http://www.itjungle.com/tfh/tfh060115-story03.html

Il s'agit d'un produit Open Source (il y a une version payante avec support) qui possède des connecteurs



Dont un connecteur "Telnet", fournissant des API pour exposer en tant que services REST des applications existantes (IBM i et Z/OS)



Le produit est livré sous forme de Plug-In pour Eclipse et tourne ensuite sous Apache/Tomcat.


 

Copyright © 1995,2015 VOLUBIS