I programmi RPG su IBM i rimangono il cuore di molti sistemi di gestione aziendale, fornendo una base solida e affidabile per le operazioni mission-critical. Di fronte alle pressioni per modernizzare ed evolvere le proprie infrastrutture, molte aziende hanno tentato di sostituire questa eredità, e molti di questi progetti si sono scontrati con ostacoli importanti: la complessità del compito, un vasto volume di codice non documentato e soprattutto un debito tecnico significativo. Il più delle volte, questi sforzi si sono risolti in applicazioni isoperimetriche, senza alcun progresso reale, o in progetti di integrazione ERP costosi e incerti.
NTi offre una soluzione ideale per preservare e valorizzare questo patrimonio, integrando i programmi RPG esistenti in ambienti moderni come .NET. Con poche righe di codice, è possibile far funzionare l'RPG con C#, consentendo un'agevole evoluzione verso tecnologie più moderne, pur conservando ciò che si è dimostrato valido.
Scenario: aggiornamento di un nome nel database NORTHWIND
Vedremo come richiamare da .NET un programma RPG esistente che aggiorna il nome di un cliente nel database NORTHWIND da un'applicazione console C#.
Si tratta di un esempio molto semplice in cui inseriremo l'ID del cliente e il nuovo nome da aggiungere come parametri di input. Queste informazioni saranno poi utilizzate dal programma RPG per aggiornare il nome del cliente nel database.
Ho già un'applicazione che visualizza i record della tabella CUSTOMER in NORTHWIND sotto forma di tabella. Al momento il campo "nome" collegato all'ID "ALFKI" è vuoto:
Passo 1: Controllo dei parametri attesi dal programma RPG
Per prima cosa, si verificano i parametri attesi dal programma eseguendo un DUMP al momento dell'esecuzione.
Il DUMP indica che sono necessari due parametri.
Passo 2: stabilire la connessione NTi
Sul lato C#, apro un progetto console in cui creo un oggetto di tipo NTiConnection che ci permetterà di interagire con l'IBM i dalla nostra applicazione.
string conn = "server=***.***.**.**;user=***************; Password=******************************;";
var _conn = new NTiConnection(conn);
_conn.Open();
Console.WriteLine("Connessione stabilita");
Passo 3: Dichiarazione dei parametri
Il programma RPG PGMCUST01 si aspetta due parametri (visti al punto 1).
- ID cliente: 5 posizioni di carattere.
- Il nuovo nome: 30 posizioni di carattere.
Prepariamo questi parametri creando un elenco di oggetti di tipo NTIProgramParameter.
Prima recuperiamo l'ID del cliente e il nuovo nome tramite la console, poi li aggiungiamo all'elenco dei parametri che verranno passati al programma RPG.
Console.WriteLine($"Inserire l'ID del cliente: ");
var customerId = Console.ReadLine();
Console.WriteLine($"Inserire il nuovo nome::");
var newName = Console.ReadLine();
var parms = new List()
{
new NTiProgramParameter(customerId, 5),
new NTiProgramParameter(newName, 30 )
};
Passo 4: Preparare l'ambiente di runtime e chiamare il programma RPG
Per prima cosa, inizializzare la libreria corrente, in questo caso la libreria "NORTHWIND", utilizzando il comando CHGCURLIB NORTHWIND.
_conn.ExecuteClCommand("CHGCURLIB NORTHWIND");
💡Nota: Se le librerie necessarie all'esecuzione del programma sono state definite sull'IBM i nella gestione del profilo utilizzato per la connessione, i comandi "CHGCURLIB" e "ADDLIBLE" non sono obbligatori.
Una volta definiti i parametri, chiamiamo il programma PGMCUST01 utilizzando NTi.
_conn.CallProgram("NORTHWIND", "PGMCUST01", parms);
💡Nota: Avremmo potuto evitare di specificare la libreria di esecuzione "NORTHWIND" e sostituirla con "*LIBL" o "*CURLIB".
In questo caso NTi si differenzia da altri prodotti, in quanto la sessione aperta nel codice C# è paragonabile a quella di uno schermo 5250.
Passo 5: Convalida dei risultati
Dopo aver eseguito il programma, il campo corrispondente nel database NORTHWIND viene aggiornato con il nuovo nome inserito. Possiamo controllare visivamente il risultato nella console e le modifiche vengono visualizzate in un'applicazione front-end:
using Aumerial.Data.Nti;
class Program
{
static void Main()
{
// Connessione
string conn = "server=*********;user=********; Password=*************;";
var _conn = new NTiConnection(conn);
_conn.Open();
Console.WriteLine("Connessione stabilita");
Console.WriteLine($"Inserire l'ID del cliente:");
var customerId = Console.ReadLine();
Console.WriteLine($"Inserire il nuovo nome:");
var newName = Console.ReadLine();
var parms = new List()
{
new NTiProgramParameter(customerId, 5),
new NTiProgramParameter(newName, 30 )
};
_conn.ExecuteClCommand("CHGCURLIB NORTHWIND");
_conn.CallProgram("NORTHWIND", "PGMCUST01", parms);
string result = parms[1].GetString();
Console.WriteLine($"nome del cliente: {result}");
}
}
In breve
È possibile mantenere le applicazioni legacy collaudate che costituiscono l'identità e l'esperienza unica del vostro core business, integrandole al contempo in un ambiente IT moderno.
Questo approccio ibrido offre il meglio dei due mondi: l'affidabilità e la robustezza dei sistemi IBM i combinata con la flessibilità e la scalabilità delle moderne tecnologie come .NET. I programmi RPG, come li chiamiamo qui, possono essere eseguiti da ambienti containerizzati, come Docker o Red Hat OpenShift, e utilizzati in tutti i tipi di applicazioni .NET.
L'esempio qui presentato è semplice, ma offre un assaggio del potenziale di NTi nel creare valore attorno alle risorse generate da questo back office aziendale, garantendo che ciò che funziona per voi oggi continuerà a farlo domani, con tutta l'efficienza che vi aspettate.
Non esitate a contattarci per provare NTi!
Quentin Destrade