, IBM i en 2026 : la pénurie de compétences, une réalité désormais impossible à ignorer

En 2026, un fait majeur ressort du IBM i Marketplace Survey : la pénurie de compétences IBM i devient la préoccupation n°1, devant la cybersécurité, pour la première fois en presque dix ans.

Les départs à la retraite s’accélèrent, les équipes se réduisent, les projets se complexifient… et le renouvellement est insuffisant. Pourtant, tout n’est pas sombre : l’écosystème évolue, de nouvelles approches émergent, et certains pays — comme la France — disposent d’atouts uniques pour former rapidement.


Un départ massif des experts… et un vivier insuffisant pour les remplacer

La démographie joue contre les organisations : une large majorité des spécialistes IBM i ont plus de 50 ans, beaucoup étant déjà partis ou proches de la retraite. Pendant ce temps, le monde académique continue d’ignorer RPG et IBM i.

Résultat :

  • une perte d’expertise métier cumulée,
  • des applications critiques peu documentées,
  • et un risque croissant de dépendance à un ou deux profils clés.

Cette situation explique pourquoi 69 % des entreprises déclarent la compétence IBM i comme souci majeur.


La France dispose pourtant d’un avantage rare pour former rapidement

Sans trop appuyer le trait, il faut reconnaître un point souvent méconnu : la France bénéficie d’un écosystème particulièrement performant pour former rapidement de nouveaux talents. Nous profitons en effet d’un ensemble de dispositifs privés et publics qui, fait notable, savent travailler en synergie.

Les POEI, organisées depuis plus de dix ans sous de multiples formats, en sont une illustration concrète : elles permettent de financer une formation ciblée avant embauche pour répondre à un besoin métier précis. S’y ajoutent un foisonnement d’initiatives autour de l’alternance, ainsi qu’une offre de formation professionnelle soutenue par les OPCO, qui facilite la montée en compétences sur des technologies spécifiques.

Cet ensemble de mécanismes donne aux entreprises la possibilité de former un candidat avant embauche afin de combler un écart de compétences — une approche parfaitement alignée avec les réalités IBM i, où l’on privilégie depuis longtemps la montée en compétences plutôt que la quête du “profil idéal introuvable”.

On observe toutefois une absence notable de formations institutionnelles (lycées professionnels, BUT, universités, écoles d’informatique) portant sur IBM i ou RPG. Cela limite naturellement la visibilité du domaine auprès des jeunes.

Cela ne règle pas tout, mais c’est un avantage concret pour les organisations françaises qui souhaitent attirer et intégrer de nouveaux talents dans l’écosystème IBM i.


Quand l’IA ralentit l’entrée des jeunes dans l’IT… y compris sur IBM i

Un autre phénomène joue en arrière‑plan en 2026 : l’IA fait baisser les embauches juniors dans l’ensemble du secteur IT.

Selon Korn Ferry, 37 % des entreprises prévoient de remplacer des postes d’entrée de carrière par l’IA. Gartner observe la même tendance : les entreprises recourent davantage à l’IA pour les tâches “low value”, ce qui réduit mécaniquement les opportunités d’entrée des jeunes diplômés.

Sans dramatiser, cela signifie que :

  • le renouvellement naturel des compétences pourrait ralentir,
  • les experts actuels deviennent encore plus stratégiques,
  • et il sera mécaniquement plus difficile de les remplacer lorsqu’ils partiront.

Pour IBM i, déjà confronté à un déficit de nouveaux talents, cet effet secondaire de l’IA mérite d’être surveillé.


Mais où sont les “centaines” ou “milliers” de postes IBM i dont on parle ?

La question revient souvent, et elle est légitime : si les besoins sont si énormes, pourquoi ne voit‑on pas une avalanche d’offres d’emploi IBM i ?

Quelques éléments de réponse — sans exagération :

1. Un besoin réel mais très fragmenté

Les organisations IBM i fonctionnent souvent avec de petites équipes (3–5 personnes), un modèle stable depuis des années selon la Marketplace Survey.
Elles recrutent surtout au fil des départs, pas par vagues massives.

2. Un marché qui “tient” avec ce qu’il a

Les entreprises retardent les modernisations, réorganisent en interne, externalisent ponctuellement ou repoussent le recrutement.
Le marché de l’emploi IBM i montre d’ailleurs une embauche lente, malgré la hausse des salaires, comme observé dans les analyses emploi de 2024–2025.

3. Une demande qui change de nature

Les entreprises ne cherchent plus seulement des “développeurs RPG”, mais des profils capables de :

  • faire du Git,
  • moderniser le code,
  • exposer des API,
  • intégrer des outils open source ou cloud.

La demande existe, mais elle est hybride, moins visible, et souvent absorbée par de la prestation.

4. Une partie du besoin est transférée vers des MSP ou vers le cloud

Le survey 2026 montre une montée du cloud et des providers de services, utilisés pour déporter une partie des responsabilités (maintenance, HA/DR, sécurité).
Cela réduit mécaniquement le volume d’offres en direct.


Conclusion : un vrai défi… mais aussi une fenêtre d’opportunité

L’écosystème IBM i fait face à une équation complexe :

  • Une pénurie de compétences reconnue et mesurée (69 % des organisations).
  • Une dynamique mondiale où l’IA réduit les postes juniors, freinant l’arrivée des nouveaux talents.
  • Une demande réelle mais diffuse, structurée par du remplacement plutôt que du recrutement massif.

Pour autant, les solutions existent :

  • programmes de formation internes,
  • mentorat et documentation,
  • modernisation technique,
  • et, en France, un atout concret avec la POEI qui permet d’intégrer et de former des jeunes profils rapidement.

La plateforme IBM i reste robuste, moderne et stratégique. Désormais, l’enjeu est clair : organiser le renouvellement des compétences plutôt que l’attendre.

Nous avons bien d’autres thèmes à prendre en compte, comme une communauté active et engagée, mais nous en reparlerons !

Enumération typée

Depuis décembre 2025, le compilateur RPG permet la déclaration d’une énumération typée, ainsi que de variables de même type que l’énumération.

Prérequis

Avoir les PTFs :

7.5:

  • ILE RPG compiler: 5770WDS SJ08375

7.6:

  • ILE RPG compiler: 5770WDS SJ08384
  • ILE RPG compiler, TGTRLS(V7R5M0): 5770WDS SJ08394

Syntaxe

Par exemple :

Il faut indiquer le type précis de l’énumération, ici CHAR(3). Les valeurs des constantes énumérées doivent correspondre au type.

DFT indique une valeur par défaut : 1 et 1 seule, facultatif.

Il est impossible de définir une énumération comme une autre énumération :

Par contre, vous pouvez définir des variables comme une énumération typée :

Quelques règles

  • une valeur par défaut supportée par énumération
  • initialisation des variables ou zone de DS par une valeur de l’énumération :
    • dcl-s myCall1 like(CALL_TYPE) inz(CALL_TYPE.DISPLAY) : OK
    • dcl-s myCall2 like(CALL_TYPE) inz('DSP') : Erreur, même si la valeur existe dans l’énumération
  • si inz est indiqué sans valeur, la valeur par défaut de l’énumération est utilisée
  • de même pour l’affectation d’une nouvelle valeur, doit se faire via l’énumération, quelque soit le type de valeur :
    • myCall1 = CALL_TYPE.UPDATE : OK
    • myCall1 = 'UPD' oumyCall1 = ('U' + 'PD') : Erreur
  • Les fonctions %hival et %loval fonctionnent
  • Contrairement à*hival et*loval

En tant que tableau ou liste

Il est possible d’utiliser une énumération partout où un tableau est utilisable, sauf avec :

  • SORTA
  • %elem
  • %lookup
  • %subarr

Par exemple en tant que liste :

Domaine de validité

Seules les valeur de l’énumération sont utilisables, toute autre valeur provoque une erreur de compilation.

Toutefois, il est possible de contourner ce fonctionnement.

Pour les variables de type numérique, les calculs sont autorisés :

En passant avec un pointeur :

En paramètre de procédure

Cela permet d’indiquer explicitement les valeurs autorisés pour les paramètres définis comme une énumération :

  • la valeur de retour est définie parlike(ERROR) et ne pourra avoir que les valeurs définies
  • le paramètre p_callType est défini parlike(CALL_TYPE) pour lequel les valeurs sont également définies

C’est beaucoup plus pertinent qu’un commentaire, le compilateur effetuant le contrôle.

Précompilateur SQL

Les valeurs énumérées sont reconnues en tant que constantes, et les variables définies depuis une énumération sont utilisables :

Par contre, l’affectation d’une valeur non énumérée est possible :

L’utilisation en tant que liste de valeurs dans un IN SQL n’est pas supportée :

option de compilation CCSID(*EXACT)

Si votre énumération est définie en CHAR ou VARCHAR et contient des valeurs non définies par des constantes hexadécimales, c’est à dire la plupart des cas, vous devez indiquer ctl-opt ccsid(*exact).

C’est une obligation afin que le compilateur ne fasse pas de supposition incorrecte sur le CCSID des littéraux pour comparaison avec les variables de vos programmes. Aucune conversion implicite n’est effectuée et cela évote les incohérences que l’on peut avoir, particulièrement avec des fichiers source dans l’IFS, généralement encodés en UTF-8.

Références

https://www.ibm.com/docs/en/i/7.6.0?topic=enumerations-typed

https://www.ibm.com/support/pages/rpg-cafe

https://ibm.biz/rpgcafe_fall_2025_fld_like_enum

https://www.ibm.com/docs/en/i/7.6.0?topic=keyword-ccsidexact

En novembre 2025, IBM a fait évoluer IWS de la version 2.6 à la version 3.0

Outre le passage à Jakarta EE au lieu de Java EE, la principale nouveauté concerne l’intégration de d’open api.

Création d’une instance

La version de l’instance est affichée :

Open api

Une fois l’instance créée, vous avez désormais accès à l’interface open api :

http[s]://instance:port/openapi/ui

L’interface présente l’ensemble des services déployés dans le serveur, avec les routes (opérations).

Vous avez également la possibilité de tester les services en direct :

L’outil affiche les syntaxes curl correspondantes !

Evidemment, seuls les services REST sont affichés dans l’interface openapi.

Vous pouvez personnaliser certains attributs openapi via la commande setWebServicesServerProperties et un fichier de configuration à fournir.

Migration des instances

Toutjours par script shell (dans /QIBM/ProdData/OS/WebServices/bin), vous pouvez migrer vos instances IWS 2.6 en 3.0 :

updateWebServicesServer.sh -server instance -version *CURRENT

Lors de l’opération :

  • Les serveur est migré en 3.0
  • Les services sont convertis

en cas d’erreur, vous pouvez lancer la conversion de services par updateWebServices.sh.

Dans nos différents tests, nous n’avons pas observé de modification de comportement des services migrés.

Par contre, nous observons, pour l’instant, des erreurs de conversion pour les services SOAP.

Voir la documentation : https://www.ibm.com/support/pages/node/7248102

Si vous êtes utilisateur de SSO (Single Sign On) sur l’IBM i, alors vous utilisez l’EIM (Enterprise Identity Mapping).

Pour rappel (en très simplifié), le SSO vous permet de propager votre authentification Windows jusqu’à l’IBM i de sorte que n’avez pas besoin de saisir votre profil/mot de passe : une association entre vos comptes Windows et IBM i est réalisée et prise en compte automatiquement.

Pour gérer ces associations, vous pouvez utiliser IBM Navigator for i :

A partir de là vous avez accès à toute la gestion de l’annuaire (nécessite une authentification).

Bien entendu, ces fonctions sont critiques d’un point de vue de la sécurité : une modification de la configuration peut empêcher toute connexion, ou au contraire permettre une connexion avec un profil IBM i élevé !

IBM a donc délivré une nouvelle fonction d’usage QIBM_NAV_SECURITY_EIM (EIM related security) à cet effet : limiter l’accès aux fonctions EIM via Navigator for i.

La valeur par défaut est *ALLOWED pour tous -> vous devriez la passer à *DENIED !

Dès lors, si vous tentez d’accéder aux fonctions EIM, vous obtenez :

Plus de détails sur les Group PTF :

https://www.ibm.com/support/pages/node/6520030#Q22025

https://www.ibm.com/support/pages/node/6485853

Vous voulez automatiser la gestion de votre SSO pour l’IBM i, contactez nous : https://www.gaia.fr/produits/

Si vous avez assisté à l’événement Securiti 2025 organisé par i.gayte.it, nous avions présenté une fonctionnalité SQL permettant de limiter l’accès aux informations du plan cache SQL.

Vous trouverez par ailleurs le replay de l’événement ici : Sécurit.i 2025 : Replays – I.Gayte.it

En effet, ce dernier contient de nombreuses informations nécessaires à l’adaptation du moteur SQL. Mais il contient aussi les données utilisées dans vos requêtes : constantes littérales, valeurs de comparaisons …

Bien entendu, certaines valeurs sont à protéger, y compris des utilisateurs ayant les droits de consulter le plan cache.

SYSPROC.SET_COLUMN_ATTRIBUTE

Cette procédure permet de cacher les informations pour certaines colonnes de certaines tables : https://www.ibm.com/docs/en/i/7.6.0?topic=services-set-column-attribute-procedure

Pour ceci :

L’attribut est visible dans le catalogue DB2 : QSYS2.SYSCOLUMNS2, colonne SECURE => 0 ou 1

Désormais, lorsque vous accédez au cache :

Cela fonctionne, mais à moitié !

Correctif

IBM a publié un correctif : https://www.ibm.com/support/pages/security-bulletin-ibm-i-affected-obtaining-information-without-proper-authority-cve-2025-36371

Toutes les versions depuis la 7.2 sont touchées : mettez à jour !

Merci à l’équipe du lab de Rochester qui a résolu ce problème rapidement. Il semble toutefois que personne ne l’avait remonté préalablement !

Désormais on obtient bien :

L’IBM i propose de nombreuses fonctionnalités sous-utilisées, n’hésitez pas à nous faire part de vos questions.

Vous avez assisté, ou non, à la Power Week coorganisée par IBM France et Common France :

Gaia-Volubis a été très heureux de participer à cette édition, riche en annonces. Avant de reprendre une vie normale, de retourner à notre quotidien, voici le retour de nos speakers !

Damien

C’est toujours un moment particulier pour nous dans notre calendrier, et cette année n’aura pas dérogée aux autres : beaucoup de participants, d’échanges que ce soit avec des clients ou des IBMers, quelques dépannages en direct ! 3 jours intenses.

Merci aux participants à nos sessions et à leurs retours. Il est toujours appréciables de savoir que nos choix de sujets correspondent à des attentes des participants à l’évènement.
Prochain évènement de masse : le Common Europe à Lyon en juin 2026…

Florian

Trois jours intenses et passionnants pour cette édition de la Power Week 2025 !

Au-delà du programme officiel, ce sont surtout les échanges directs avec nos clients, partenaires, IBMers et l’ensemble des participants qui ont marqué l’événement. Ces discussions spontanées, souvent en marge des sessions, sont celles qui font grandir notre réseau, ouvrent des perspectives et apportent des idées concrètes pour aller plus loin.

J’ai également pu présenter COMMON France et toutes les actions que nous avons menées cette année, notamment la Battle Dev que j’ai eu le plaisir de coorganiser avec Philippe Bourgeois et Jérôme Clément. J’espère que nous pourrons organiser une 4ᵉ édition l’année prochaine !

Merci à tous d’être venus !

Julien

Merci à toutes et à tous pour ces trois journées intenses à la Power Week 2025 !

J’ai particulièrement apprécié la qualité des échanges avec nos clients, partenaires et IBMers. Ces moments informels, toujours très enrichissants, sont essentiels pour nourrir notre réseau et nos perspectives.

J’ai également été heureux de présenter deux sessions orientées sécurité et bonnes pratiques sur IBM i, des sujets au cœur des préoccupations de nombreux clients. Merci pour votre participation et vos questions !

L’événement a une nouvelle fois confirmé sa convivialité, et la troisième édition de la Battle Dev a été remarquablement organisée.

Ravi de vous avoir retrouvés en nombre, et déjà impatient de vous revoir au Common Europe à Lyon en juin 2026 !

Betty

Ces trois jours au cœur de la communauté IBM étaient d’une richesse incroyable.

Ils m’ont permis d’avoir une vue plus globale et plus synthétique de la puissance, des possibilités et de l’avenir du power et de ses applications.

Mais le futur s’écrit aussi avec la jeune génération de  programmeurs, et la présence des participants à la pépinière de cette année m’a permis de voir que la relève était assurée grâce à ces formations.

J’ai eu l’occasion de faire une première présentation qui concernait la modernisation via SQL, et je n’ai aucun doute que les équipes hybrides qui se construisent actuellement avec des jeunes et des personnes plus expérimentées sauront trouver des méthodes de travail permettant d’aller vers cette modernisation, nécessaire, et souhaitée.

Eric

3 jours intenses de rencontres, des visages connus et des nouveaux venus. 3 jours de sessions intéressantes. Toutes les personnes rassemblées ont en commun un grand intérêt, voire même une passion pour leur système favori. Une communauté IBMi toujours aussi active.

J’ai pu cette année présenter la session « Modernisation avec SQL : comment Intégrer l’existant », avec BETTY et LUCAS. Notre première session. Ce fut intense à préparer, et à présenter.

Les outils open source ont suscité mon intérêt cette année. La présentation de BOB a été très instructive, bien qu’il reste de nombreuses questions encore sans réponse.

Merci à tous pour votre énergie et votre participation!

Pierre Louis

C’est avec plaisir que comme chaque année, on retrouve la communauté IBMi, cette année pour la première fois les gens du monde Power nous ont rejoint.

On a pu assister à des présentations techniques intéressantes, beaucoup était basées sur l’IA, comme BOB , dont la présentation a été très prometteuse …

Pour ma part j’ai trouvé très intéressant le produit MANZAN qui permet de supervisé votre IBMi et qui a l’air simple et efficace.

Cette année, j’ai présenté 2 sessions en duo avec Gautier Dumas, sur le chemin de modernisation et avec Florian Gradot sur, comment donner une seconde vie à vos application 5250, merci a eux de m’avoir supporté, ce fut une expérience intéressante.

J’ai pu échangé sur des thèmes différents, avec des clients et des partenaires, ce qui est toujours enrichissant.

Merci à IBM et à Common pour cette organisation, merci à ceux qui sont venus, et l’année prochaine !

Nathanaël

3 jours très intenses pour ma part, mais très enrichissants !

Les meilleurs moments : ceux que l’on ne peut pas mettre en photo 😉

J’ai particulièrement apprécié de pouvoir échanger de façon libre et informelle avec nos clients, partenaires, IBMers et de façon plus globale toutes les personnes présentes. C’est important, c’est la construction d’un réseau, un réseau qui apporte des perspectives, des solutions.

Donc merci à vous d’être venu, nombreux, y compris dans non sessions, de poser des questions. C’est ce qui nous donne l’énergie pour les mois à venir jusqu’au prochain grand rassemblement !

Retrouvez toutes les informations

👉 Consultez le programme complet ici avec les supports de présentation https://powerweek2025.sched.com/

👉 Les sessions de Gaia-Volubis téléchargement

Vers le prochain grand rendez-vous : Common Europe Congress à Lyon

La Power Week est aussi une étape vers un autre événement majeur : le Common Europe Congress, qui se tiendra à Lyon du 14 au 17 juin prochain. Ce congrès réunira la communauté IBM i européenne autour de conférences, ateliers, et moments conviviaux. Une occasion unique de faire rayonner notre territoire et notre expertise.

C’est la première fois en France depuis 1997, une autre ère !

Common Europe – A pan-European IT Community of IBM based solutions

, , , , , , , Power Week 2025 : 3 jours pour se connecter, apprendre et faire rayonner la communauté IBM i

Cela n’a pas pu vous échapper, la semaine prochaine c’est (déjà) la Power Week, événement gratuit coorganisé par IBM France et Common France :

Durant ces 3 jours dédiés au Power Systems, au stockage, au Power11, à l’IA, à l’IBM i, AIX, Linux, la modernisation … retrouvez l’ensemble des speakers, des partenaires et des clients qui font la force de notre plateforme.

Un programme riche (et international)

Pendant trois jours, les participants auront accès à des sessions animées par les meilleurs experts, venus de France, d’Allemagne, des États-Unis … Parmi eux, des IBM Champions, reconnus pour leur expertise et leur engagement auprès de la communauté, partageront leurs connaissances sur des sujets variés : modernisation, sécurité, SQL, DevOps, IA, cloud hybride, et bien plus encore.

👉 Consultez le programme complet ici https://powerweek2025.sched.com/

Un événement gratuit, ouvert à tous

La Power Week est 100 % gratuite et ouverte à tous les professionnels de l’IBM i : développeurs, architectes, DSI, chefs de projet, consultants… C’est une opportunité rare de bénéficier de contenus de qualité sans contrainte logistique ni financière.

La force de la communauté

Au-delà des conférences, la Power Week est un lieu de rencontre et d’échange. Elle permet de :

  • Réseauter avec d’autres professionnels confrontés aux mêmes enjeux
  • Confronter les points de vue, partager des bonnes pratiques
  • Découvrir les clubs utilisateurs comme Common France, qui jouent un rôle dans l’animation de la communauté en France, mais aussi au niveau Européen.

Ces moments d’échange sont essentiels pour faire évoluer les pratiques, identifier des solutions concrètes, et tisser des liens durables.

Vers le prochain grand rendez-vous : Common Europe Congress à Lyon

La Power Week est aussi une étape vers un autre événement majeur : le Common Europe Congress, qui se tiendra à Lyon du 14 au 17 juin prochain. Ce congrès réunira la communauté IBM i européenne autour de conférences, ateliers, et moments conviviaux. Une occasion unique de faire rayonner notre territoire et notre expertise.

C’est la première fois en France depuis 1997, une autre ère !

Gaia et Volubis

Retrouvez toutes les informations sur Common France : https://commonfrance.fr/

Les speakers de Gaia et Volubis sont très heureux de participer à cette célébration : échange, partage, connaissance.

En tant que sociétés liées à la formation, il est dans notre ADN de participer à ces initiatives, comme nous le faisons depuis longtemps : les Universités IBM i depuis 2011, Pause Café en physique ou en ligne, articles de blogs …

N’hésitez pas à solliciter nos speakers sur place !

, Produits sous licence : IBM simplifie !

Dans la suite logique des annonces de la disponibilité de l’IBM i en mode abonnement pour les Power9 et Power10, IBM continue le déplacement des licences de l’offre perpétuelle à l’offre abonnement. Tout le détail ici https://www.ibm.com/docs/en/announcements/i-operating-system-now-offers-subscription-licensing-all-software-tiers-power9-power10-processors.

Bien entendu cela favorise la capacité à proposer des offres Cloud !

De ce point de vue c’est une opportunité importante dans la modernisation des infrastructures, et surtout la perspective d’avoir à terme un parc (plus) à jour.

D’autres raisons peuvent être sous-jacentes : la capacité à planifier et prédire un chiffre d’affaire par exemple. Du côté du client cela impacté également les budgets IT (amortissement vs consommation). Laissons cela de côté pour l’instant.

Comment

En synthèse, IBM travaille sur la proposition d’un abonnement IBM i + SWMA (maintenance logicielle). Le parti-pris est une équivalence de budget à 4 ans.

Cf https://www.itjungle.com/2023/09/18/the-subscription-pricing-for-the-ibm-i-stack-so-far/

Ainsi, si vous conservez vos machines 4 ans ou moins : pas de budget supplémentaire. Si vous conservez vos systèmes plus longtemps, le coût augmente. De même, il deviendra difficile de conserver des systèmes hors maintenance (mais quel intérêt ?).

D’un autre côté, IBM rend gratuit un grand nombre de produits sous licence : pour les clients les utilisant c’est également une source d’économie. Pour les autres, c’est l’opportunité de disposer de fonctions supplémentaires.

Logiciels sous licence désormais inclus avec la licence IBM i

  • Administration Runtime Expert, also called Application Runtime Expert (5733-ARE)
  • CICS Transaction Server (5770-DFH)
  • HTTP Server (5770-DG1)
  • Facsimile Support for i (5798-FAX)
  • Developer Kit for Java (5770-JV1)
  • Managed System Services (5770-MG1)
  • Network Authentication Enablement (5770-NAE)
  • System Manager (5770-SM1)
  • TCP/IP Connectivity Utilities (5770-TC1)
  • Transform Services (5770-TS1)
  • Universal Manageability Enablement (5770-UME)

Logiciels sous licence gratuit (à commander à part)

  • Web Enablement: includes selected versions of WebSphere Application Server (5733-WE3, 5722-WE2)
  • Cryptographic Device Manager (5733-CY3)
  • OmniFind Text Search Server for DB2 for I (5733-OMF)

Logiciels sous licence payants

  • BRMS (5770-BR1)
  • Rational Development Studio (5770-WDS)
  • PowerHA SystemMirror for i (5770-HAS)
  • Cloud Storage Solutions (5733-ICC)
  • Db2 Mirror (5770-DBM)
  • Rational Developer for i
  • ARCAD Observer for IBM i (5733-AO1)
  • ARCAD RPG Converter for IBM i (5733-AC1)
  • IBM i Modernization Engine for Lifecycle Integration (“Merlin” via Passport Advantage)
  • IBM i Optional Features: Db2 Data Mirroring – Opt 48

Retrouver les détails chez IBM : https://www.ibm.com/docs/en/announcements/continues-simplify-i-portfolio-licensed-software-withdrawal-selected-i-lpps-i-optional-features?region=EMEA

Cas de DB2 Web Query

Une nouvelle plus surprenant : fin de la commercialisation de DB2 Web Query depuis le 10 octobre 2023 ! Cf https://www.ibm.com/docs/en/announcements/db2-webquery-eom

Alors même qu’une nouvelle version est disponible depuis fin 2022 : https://www.ibm.com/docs/en/announcements/db2-web-query-i-24

DB2 Web Query a en réalité été initialement développé par Information Builders sous le nom WebFOCUS. En 2020, il a été racheté par TIBCO (https://www.tibco.com/press-releases/2021/tibco-completes-acquisition-information-builders). Il semble donc que la relation commerciale entre IBM et TIBCO ne permette plus cette participation.

Malheureusement, ce sont les utilisateurs de DB2 Web Query qui en pâtissent, IBM ne proposant pas de produit aux fonctionnalités équivalentes.

Ce sera également un manque aux possibilités de l’IBM i : DB2 Web Query est la solution de BI, d’exploitation des données métier. Or les plus fortes valeurs ajoutées de l’IBM i sont aujourd’hui sa base de donnée DB2 et la capacité à traiter des workload business.

Même si le nombre d’utilisateurs de DB2 Web Query était limitée, c’est assurément une mauvaise nouvelle.

Sécurisez vos services IBM i ! Nous ne le répéterons jamais suffisamment : vous devez crypter les accès au telnet 5250, au serveur de base de données etc … Bref partout où transitent aussi bien vos profils/mots de passe que vos informations métier.

Nous prenons ici l’exemple de telnet, le plus visuel.

Pour crypter vos connexions telnet : https://www.ibm.com/docs/en/i/7.5?topic=server-assigning-certificate-telnet

En synthèse :

  1. Importer ou créer un certificat dans DCM (Digital Certificate Manager)
  2. Associer ce certificat aux services à sécuriser : TELNET ici mais aussi CENTRAL, SIGNON, DATABASE …
  3. Ne pas oublier de permettre la connexion sécurisée à telnet :
Permettre l'accès non sécurisé et sécurisé (ports 23 et 992) :
CHGTELNA ALWSSL(*YES) 

Permettre l'accès sécurisé uniquement (port 992 uniquement) :
CHGTELNA ALWSSL(*ONLY)

Dès lors vous pouvez vous connecter avec ACS en mode sécurisé. Soit en indiquant au niveau de la configuration dans l’émulateur 5250 (menu Communication puis Configuration) :

Soit au niveau de la connexion système dans sa globalité :

A la prochaine connexion vous obtenez :

Mais comment ces certificats sont-ils gérés par ACS ?

Principe d’un certificat, chaîne de certification

Un certificat est une clé de cryptage permettant de chiffrer les données entre un serveur et un client.

La question est de savoir comment faire confiance à un certificat (celui de votre banque par exemple ?).

Un certificat est lui-même signé, c’est à dire validé, par une autorité de certification à laquelle nous faisons confiance.

Exemple avec les informations issues d’un navigateur :

Le navigateur fait confiance à www.volubis.fr car le certificat est lui-même signé par « Gandi Standard SSL CA 2 » et « USERTrust RSA Certification Authority » qui sont eux connus du navigateur :

D’autres critères entrent en compte comme la durée de validité par exemple

Pour un certificat non reconnu par votre navigateur, vous avez :

Validation par Access Client Solutions

ACS va utiliser la même mécanique : si l’autorité de certification est connue de ACS, alors le certificat est validé.

Si l’autorité n’est pas connue : demande à l’utilisateur de valider ou non l’accès.

Access Client Solutions utilise plusieurs magasins de certificats pour stocker les autorités :

  • le magasin lié à votre JVM qui exécute ACS
  • un magasin propre à ACS en complément

Magasin lié à la JVM

Pour trouver la JVM utilisée par ACS :

Java utilise par défaut un magasin de certificats JAVA_HOME\lib\security\cacerts. Ce magasin est protégé par un mot de passe (défaut = changeit)

Remarque :

Cette configuration par défaut peut être modifiée par fichier de configuration ou arguments de démarrage de la JVM.

Ou outil de gestion des certificats est fourni avec votre JVM : keytool (cf https://docs.oracle.com/javase/8/docs/technotes/tools/unix/keytool.html)

Exemple :

Nous retrouvons bien notre autorité primaire « USERTrust RSA Certification Authority » :

Magasins liés à ACS

Par défaut, chaque utilisateur d’ACS dispose de son propre magasin de certificat (complémentaire à celui de l’environnement Java ci-dessus).

Dans les préférences vous retrouvez l’emplacement des configurations :

Access Client Solutions dispose également d’un outil de gestion des certificats pour son propre magasin uniquement : menu « Outils » puis « Gestion des clés » :

Cela vous permet d’importer, supprimer, voir vos certificats.

Remarque :

Cette configuration par défaut peut être modifiée par fichier de configuration AcsConfig.properties : permet d’indiquer l’emplacement du magasin de certificats.

Cas d’un certificat « internet »

Si vous avez acheté votre certificat auprès d’un organisme certificateur (Gandi pour nous, mais aussi OVH, Sectigo … Let’s encrypt gratuit), Access Client Solutions ne devrait rien vous demander et accepter directement le certificat : les autorités présentes dans le magasin associé à votre JVM permettent la validation.

Vous pouvez rencontrer des problèmes avec d’anciennes installations de Java non mises à jour : les nouvelles autorités de certification ne seront pas présentes. Bien sûr cela n’arrive jamais.

Cas d’un certificat « local »

Pour un certificat que vous avez généré sur votre IBM i, ou autre plateforme dans votre SI, si vous disposez de vos propres autorités de certification internes (fréquent dans les sociétés de grande taille) : Access Client Solutions ne dispose pas des autorités permettant la validation !

Remarque :

Si vos équipes de déploiement des postes client livrent les autorités de certification dans le magasin de la JVM, vous revenez dans le cas précédent.

A la première connexion, vous avez ce message :

Non : vous refusez la connexion

Oui : l’autorité de certification est ajoutée au magasin de certificats d’ACS.

Après avoir répondu « Oui » :

Aucun message affiché lors des prochaines connexions.

Changement de certificat

Comment faire en sorte que la sécurisation de vos services ou un changement de certificat soit transparent pour vos utilisateurs ?

Nous savons que demander à des centaines d’utilisateurs de répondre « Oui » peut générer un support très important aux équipes et être anxiogène.

Mise en place

Au-delà du certificat, il faut procéder aux changements de configurations : au niveau de la définition du système et/ou de la session 5250.

Pour le certificat, plusieurs solutions :

  1. Vous disposez d’un poste modèle sur lequel vous avez installé ACS, et importez manuellement l’autorité de certification. Il vous suffit alors de déployer le fichier cacerts de ACS sur les différents postes.

Ce dernier est ici : "C:\Users\{USER}\Documents\IBM\iAccessClient\Private\{USER}\cacerts"

  1. Dans le fichier de configuration AcsConfig.properties : vous pouvez indiquer un fichier cacerts mutualisé sur un lecteur réseau par exemple :

  1. Injection du certificat en mode commande

ACS dispose de commande, avec option silencieuse :

/PLUGIN=certdl => demande à downloader l’autorité de certification et l’importer dans le magasin

/SYSTEM=nom système configuré => depuis le système en question

A intégrer dans vos outils de déploiement pour exécution sur chaque poste client ! Le certificat est ensuite visible dans le menu « Outils » puis « Gestion des clés ».

Renouvellement

  1. Le certificat est issu de la même autorité de certification que le précédent : rien à faire ! C’est l’autorité qui est stockée, pas le certificat lui-même
  2. Le certificat est issu d’une autre autorité (autre fournisseur, autorité précédente périmée ou invalidée) : il faut injecter l’autorité dans le magasin de certificat (cf Mise en place)

En synthèse : pas de difficulté, plusieurs solutions en fonction de votre organisation et outillage !

N’oubliez pas de renouveler vos certificats avant la date d’expiration …

Je n’ai pas voulu mettre optimisation dans le titre de l’article, c’est pourtant bien ce qui nous est souvent demandé.
Avant de chercher à optimiser les requêtes, il est utile de vérifier que quelques bonnes pratiques de base sont respectées dans l’écriture de la requête !

Dans le cas traité, on s’intéresse particulièrement à plusieurs éléments :

  • critères de jointure
  • critères de sélection
  • critères de groupage
    Objectif recherché : que tous ces critères soient exprimés, si possible, sans calcul !
    Une zone calculée ne peut être prise en charge via un index par l’optimiseur … nous allons donc réécrire tout ce qui a été écrit d’une façon « humaine » !

Exemple

La requête utilisée dans cet article est un extrait d’un requête réelle, pour laquelle les noms de tables et colonnes ont été modifiées …

Critère de jointure

Ce point n’impacte que peu les performances, car le moteur SQL réécrit la requête pour nous, mais apporte plus de lisibilité.
On évite ce genre de syntaxe (produit cartésien) :

SELECT …
FROM ADHENT,
     ADHDET
WHERE (ADHENT.GJCMP = ADHDET.GACMP#
              AND ADHENT.GJGL# = ADHDET.GAGL#A
              AND ADHDET.GAACCD = '1')
          AND ((ADHDET.GATYPE IN (
                      'EX',
                      'IN'
                  ))

Pour exprimer sur la jointure les critères :

select ADHENT.*
from ADHENT
join ADHDET ON (ADHENT.GJCMP = ADHDET.GACMP#
AND ADHENT.GJGL# = ADHDET.GAGL#A
AND ADHDET.GAACCD = '1')
WHERE (ADHDET.GATYPE IN (
'EX',
'IN'
)) ;

Critères de sélection

Requête de départ :

select ADHENT.*
from ADHENT
join ADHDET ON (ADHENT.GJCMP = ADHDET.GACMP#
AND ADHENT.GJGL# = ADHDET.GAGL#A
AND ADHDET.GAACCD = '1')
WHERE ADHDET.GATYPE IN ( 'EX', 'IN' )
AND (ADHENT.GJACMO <> 13)
AND ADHENT.GJCMP IN ('10')
AND CASE
WHEN ADHENT.GJJLDT = 0 THEN '01/01/9999'
ELSE DATE( SUBSTR(ADHENT.GJJLDT, 5, 2) || '/' ||
SUBSTR(ADHENT.GJJLDT, 7, 2) || '/' ||
SUBSTR(ADHENT.GJJLDT, 1, 4))
END BETWEEN '2016-01-01' AND '2017-12-31'
AND SUBSTR(ADHENT.GJGL#, 1, 6) BETWEEN '615540' AND '615540'
AND CASE
WHEN TRIM(ADHENT.GJLTG#) = '' THEN 'N'
ELSE 'Y'
END = 'N'

Il est possible de remplacer toutes les valeurs calculées et de les inverser !

   AND CASE
         WHEN ADHENT.GJJLDT = 0 THEN '01/01/9999'
         ELSE DATE( SUBSTR(ADHENT.GJJLDT, 5, 2) || '/' ||
                    SUBSTR(ADHENT.GJJLDT, 7, 2) || '/' ||
                    SUBSTR(ADHENT.GJJLDT, 1, 4))
       END BETWEEN '2016-01-01' AND '2017-12-31'

Devient  :

AND ADHENT.GJJLDT between int(date('2016-01-01')) AND int(date('2017-12-31'))

Sélection sur code :

   AND SUBSTR(ADHENT.GJGL#, 1, 6) BETWEEN '615540' AND '615540'

Devient :

AND ADHENT.GJGL# BETWEEN '615540' ||'0000000000' AND '615540' || '9999999999'

Sélection sur code :

   AND CASE
         WHEN TRIM(ADHENT.GJLTG#) = '' THEN 'N'
         ELSE 'Y'
       END = 'N'

Devient :

AND ADHENT.GJLTG# = ''

Ce dernier exemple illustre bien la capacité du cerveau humain à raisonner et non pas à exprimer des critères techniques !

Critères de groupage (et mise en forme)

Le groupage est souvent effectué en dernier, c’est-à-dire après l’ensemble des jointures. Vous êtes alors contraints d’ajouter un nombre important de colonnes dans le groupage, colonnes faisant l’objet de mise en forme pour un affichage adapté à l’utilisateur, et donc sur des zones calculées !
Nous proposons l’inverse :

  • d’abord on calcule les données, nécessitant groupage
  • ensuite on va chercher, par des jointures, des éléments complémentaires et on met en forme (calcul) les valeurs
    Pour cela les CTE (Common Table Expressions) nous sont d’un grand secours.

Par exemple :

with tmp as (
   SELECT ADHENT.GJCMP,
          ADHENT.GJGL#,
          ADHENT.GJJLTP,
          ADHENT.GJJLCD, 
          ADHENT.GJJLNO,
          ADHENT.GJINV#, 
          ADHENT.GJDESC,
          ADHENT.GJJLDT,
          ADHENT.GJMVM#,
          ADHENT.GJTYPE,
          ADHENT.GJLTG#,
          ADHENT.GJLTGD,
          SUM(ADHENT.GJAMT$) as somme1,
          SUM( CASE
                 WHEN ADHENT.GJAMT$ > 0.00 THEN ADHENT.GJAMT$
               END) as somme2,
          SUM(
               CASE
                 WHEN ADHENT.GJAMT$ < 0.00 THEN (-1 * ADHENT.GJAMT$)
               END) as somme3
   from ADHENT
   join ADHDET ON ...
   WHERE ...
   GROUP BY ADHENT.GJCMP,
            ADHENT.GJGL#,
            ADHENT.GJJLTP,
            ADHENT.GJJLCD,
            ADHENT.GJJLNO,
            ADHENT.GJINV#,
            ADHENT.GJDESC,
            ADHENT.GJJLDT,
            ADHENT.GJMVM#,
            ADHENT.GJTYPE,
            ADHENT.GJLTG#,
            ADHENT.GJLTGD )

select tmp.GJCMP,
        SUBSTR(tmp.GJGL#, 7, 4),
        SUBSTR(tmp.GJGL#, 1, 6),
        tmp.GJJLTP,
        tmp.GJJLCD || '-' || RIGHT(CONCAT('00000000', TRIM(CHAR(tmp.GJJLNO))), 8),
        tmp.GJJLNO,
        TRIM(tmp.GJINV#),
        tmp.GJDESC,
        CASE WHEN tmp.GJJLDT = 0 THEN '01/01/9999'
             ELSE DATE( SUBSTR(tmp.GJJLDT, 5, 2) || '/' ||
                        SUBSTR(tmp.GJJLDT, 7, 2) || '/' ||
                        SUBSTR(tmp.GJJLDT, 1, 4))
        END,
        tmp.GJMVM#,
        TRIM(tmp.GJTYPE),
        tmp.GJLTG#,
        tmp.GJGL#,
        ADHCMP1.ZLARGN,                 
        TRIM(ADHCMP2.ZRNAME),           
        CASE WHEN tmp.GJLTGD = 0 THEN '01/01/9999'
             ELSE DATE( SUBSTR(tmp.GJLTGD, 5, 2) || '/' ||
                        SUBSTR(tmp.GJLTGD, 7, 2) || '/' ||
                        SUBSTR(tmp.GJLTGD, 1, 4))
        END,
        somme1,
        somme2,
        somme3
 from tmp 
   LEFT OUTER JOIN ADHCMP1 ON ADHCMP1.ZLCMP  = tmp.GJCMP
                           AND ADHCMP1.ZLLOC  = SUBSTR(tmp.GJGL#, 7, 4)
   LEFT OUTER JOIN ADHCMP2 ON ADHCMP1.ZLCMP  = ADHCMP2.ZRCMP
                           AND ADHCMP1.ZLIRGN = ADHCMP2.ZRRGN ;

Avec ces quelques règles, simples dans leur principe, vous vous assurez que le moteur SQL pourra utiliser pleinement vos index. Cela ne signifie pas qu’il ne sera pas nécessaire d’optimiser par la suite.

Pour finir le cas concret évoqué ici :
– 4 fichiers dans la jointures :
– 500 Millions , 1 Million, 1.000 et 70 enreg
– 4.600 enreg en retour

Requête d’origine : 2 min 40 s (ce qui est déjà très bien, avec un scan de table sur le plus gros fichier).
Après réécriture : 40 ms

Bien sûr, les index nécessaires étaient déjà en place pour atteindre ce niveau de temps de réponse.

Encore une fois, SQL est le meilleur moyen d’accéder à la donnée, aussi complexe soit elle.

Par le meilleur, j’entends :

  • le plus simple : écrire un programme RPG/COBOL équivalent demanderait une quantité de code importante (et donc probabilité de bug)
  • le plus efficace (40 ms) : à condition que l’on donne à SQL les moyens d’être efficace

En conclusion : travailler d’abord sur la donnée, occupez vous ensuite de la mise en forme !