Introduction
Les programmes RPG sur IBM i restent au cœur de nombreux systèmes de gestion d’entreprise et constituent une base solide et fiable pour les opérations critiques. Face aux pressions pour moderniser et faire évoluer leurs infrastructures, de nombreuses entreprises ont tenté de remplacer ce patrimoine et beaucoup de ces projets se sont heurtés à des obstacles majeurs: complexité de la tâche, vaste volume de code non documenté, et surtout une dette technique importante. Ces efforts se sont le plus souvent soldés par des applications isopérimètre, sans réelle avancée, ou par des projets d’intégration d’ERP coûteux et incertains.
NTi offre une solution idéale pour préserver et valoriser ce patrimoine en intégrant les programmes RPG existants dans des environnements modernes comme .NET. En quelque ligne de code, il est possible de faire collaborer le RPG avec C#, permettant ainsi une évolution douce vers des technologies plus modernes, tout en conservant ce qui a fait ses preuves.
Le Scénario: Mettre à jour un nom dans la base de données NORTHWIND
Nous allons voir comment appeler depuis .NET, un programme RPG existant qui met à jour un nom de client dans la base de donnée NORTHWIND depuis une application console C#.
C’est un exemple très simple où nous saisirons l’ID du client et le nouveau nom à ajouter en tant que paramètre d’entrée. Ces informations seront ensuite utilisées par le programme RPG pour mettre à jour le nom du client dans la base de données.
J’ai déjà une application qui affiche sous forme de tableau les enregistrements de la table CUSTOMER dans NORTHWIND.
Pour le moment le champs "nom" lié à l'ID "ALFKI" est vide:
Etape 1: Vérifier les paramètres attendus par le programme RPG
En premier lieu, on vérifie les paramètres attendus par le programme en effectuant une prise de DUMP lors de son exécution.
Le DUMP indique que deux paramètres sont requis.
Etape 2: Etablir la connexion NTi
Côté C#, j’ouvre un projet console dans lequel je crée un objet de type NTiConnection qui nous permettra d'interagir avec notre IBM i depuis notre application.
string conn = "server=***.***.**.**;user=***************; Password=******************************;";
var _conn = new NTiConnection(conn);
_conn.Open();
Console.WriteLine("Connexion établie");
Etape 3: Déclaration des paramètres
Le programme RPG PGMCUST01 attend deux paramètres (vu à l’étape 1).
- L’ID du client : 5 positions de caractère.
- Le nouveau nom : 30 positions de caractère.
Nous préparons ces paramètres en créant une liste d’objets de type NTIProgramParameter.
Nous récupérons d’abord l’ID du client et le nouveau prénom via la console, puis nous les ajoutons à la liste de paramètres qui sera transmise au programme RPG.
Console.WriteLine($"Entrez l'ID du client");
var customerId = Console.ReadLine();
Console.WriteLine($"Entrer le nouveau nom:");
var newName = Console.ReadLine();
var parms = new List<NTiProgramParameter>()
{
new NTiProgramParameter(customerId, 5),
new NTiProgramParameter(newName, 30 )
};
Etape 4: Préparer l’environnement d'exécution et appeler le programme RPG
Au préalable, initialiser la bibliothèque courante, ici la bibliothèque “NORTHWIND”, par la commande CHGCURLIB NORTHWIND.
_conn.ExecuteClCommand("CHGCURLIB NORTHWIND");
💡Remarque : Si les bibliothèques nécessaires à l'exécution du programme ont été définies sur l’IBM i dans la gestion du profil utilisé pour la connexion, les commandes “CHGCURLIB” et “ADDLIBLE” ne sont pas obligatoires.
Une fois les paramètres définis, nous appelons le programme PGMCUST01 en utilisant NTi.
_conn.CallProgram("NORTHWIND", "PGMCUST01", parms);
💡Remarque : On aurait pu éviter de préciser la bibliothèque d'exécution “NORTHWIND”, et remplacer par “*LIBL” ou “*CURLIB”.
Ici NTi se différencie des autres produits, dans le sens ou la session ouverte dans le code C# est comparable à celle d’un écran 5250.
Etape 5: Validation des résultats
Après avoir exécuté le programme, le champ correspondant dans la base de données NORTHWIND est mis à jour avec le nouveau nom saisi. Nous pouvons vérifier visuellement le résultat dans la console, et les changements en direct sur une application front:
using Aumerial.Data.Nti;
class Program
{
static void Main()
{
// Connexion
string conn = "server=*********;user=********; Password=*************;";
var _conn = new NTiConnection(conn);
_conn.Open();
Console.WriteLine("Connexion établie");
Console.WriteLine($"Entrez l'ID du client");
var customerId = Console.ReadLine();
Console.WriteLine($"Entrer le nouveau nom:");
var newName = Console.ReadLine();
var parms = new List<NTiProgramParameter>()
{
new NTiProgramParameter(customerId, 5),
new NTiProgramParameter(newName, 30 )
};
_conn.ExecuteClCommand("CHGCURLIB NORTHWIND");
_conn.CallProgram("NORTHWIND", "PGMCUST01", parms);
string result = parms[1].GetString();
Console.WriteLine($"nom du client: {result}");
}
}
En résumé
Il est possible de conserver des applicatifs legacy bien rodés et éprouvés, qui constituent l’identité et le savoir-faire unique de votre cœur de métier, tout en les intégrant dans un environnement informatique moderne.
Cette approche hybride offre le meilleur des deux mondes: la fiabilité et la robustesse des systèmes IBM i combinées à la flexibilité et la scalabilité des technologies modernes comme .NET. Il devient possible d'exécuter des programmes RPG tel qu’on l’a appelé ici depuis des environnements conteneurisés, comme Docker ou Red Hat OpenShift, et utilisable dans tout type d'applicatifs .NET.
L’exemple présenté ici est simple, mais il offre un aperçu du potentiel de NTi pour créer de la valeur autour des ressources issues de ce back office métier, garantissant ainsi que ce qui fonctionne aujourd'hui chez vous continuera de le faire demain, avec toute l’efficacité que vous attendez.
N'hésitez pas à nous contacter pour essayer NTi !
Quentin Destrade