RPG .NET: chiamare programmi RPG IBM i in C# con NTi

Vi mostrerò come sia facile richiamare un programma RPG esistente su IBM i con NTi. Questo approccio consente di modernizzare e integrare i sistemi legacy in ambienti moderni come .NET, preservando la qualità dei servizi e delle applicazioni esistenti.

immagine illustrativa dell'articolo “RPG .NET: chiamare programmi RPG IBM i in C# con NTi”

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:

Tabella clienti Blazor con ID, azienda e nomi

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.

File spool IBM i con strutture SQL

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}");
    }
}

Console .NET che mostra il risultato RPG

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