Come richiamare un programma AS400 da Java o Access

E’ possibile richiamare un qualsiasi programma AS400 da una connessione JDBC utilizzando lo statement SQL CALL. Questo non solo dal Toolbox for Java, ma, teoricamente, da una qualsiasi connessione ODBC/JDBC.
Se non si devono ricevere dei parametri di ritorno dal programma, non è necessario creare anticipatamente una definizione di Stored procedure, altrimenti occorre prima definire la procedura con lo statement SQL CREATE PROCEDURE.

Vediamo ora un esempio di chiamata a programma senza restituzione parametri. Ecco il programma chiamato, in questo caso scritto in CL:

        PGM        PARM(&FILE &LIB)
        DCL        VAR(&FILE) TYPE(*CHAR) LEN(10)
        DCL        VAR(&LIB) TYPE(*CHAR) LEN(10)
        CPYF       FROMFILE(&LIB/&FILE) TOFILE(QSYSPRT)
        ENDPGM

E questo è un frammento del programma Java chiamante:

 try {
  Class.forName("com.ibm.as400.access.AS400JDBCDriver");
  Connection c = DriverManager.getConnection(
             "jdbc:as400://myAS400;user=PIPPO;password=X");
   Statement s = c.createStatement();
   s.execute("CALL MYLIB.MYPGM ('NOMEFILE  ', 'NOMELIB   ')");
 } catch (Exception e) {}

E la versione Access:

 CurrentDb.Connect = "ODBC;DSN=NomeDSN"
 CurrentDb.Execute "CALL MYLIB.MYPGM ('NOMEFILE  ', 'NOMELIB   ')", dbSQLPassThrough

Fate attenzione agli spazi nei parametri stringa: devono riempire la capacità della variabile (nell'esempio 10 caratteri).

Vediamo ora un esempio di chiamata a programma con restituzione parametri. Questo potrebbe essere il programma CL chiamato:

       PGM        PARM(&INGR &USC)
       DCL        VAR(&INGR) TYPE(*CHAR) LEN(10)
       DCL        VAR(&USC)  TYPE(*CHAR) LEN(2)
       CHGVAR     VAR(&USC) VALUE('KO')
       IF         COND(&INGR *EQ 'FRANCO') THEN(CHGVAR +
                  VAR(&USC) VALUE('OK'))
       ENDPGM

Come dicevamo, perché sia possibile ricevere dei valori di ritorno da un programma, occorre prima invocare uno statement SQL per creare un oggetto SQL Procedure ad esso associato. Tale invocazone può avvenire in qualsiasi modo, ad esempio su AS400 tramite STRSQL, oppure da ODBC/JDBC.
Nel nostro caso avremo:

CREATE PROCEDURE MYLIB.MYPGM2(IN INGR CHAR (10 ), OUT USC CHAR (2 )) LANGUAGE CL
NOT DETERMINISTIC CONTAINS SQL EXTERNAL PARAMETER STYLE GENERAL

Vediamo come richiamare tale programma da Java:

 try {
  Class.forName("com.ibm.as400.access.AS400JDBCDriver");
  Connection c = DriverManager.getConnection(
             "jdbc:as400://AS400;user=PIPPO;password=X");
  CallableStatement cs = c.prepareCall("CALL MYLIB.MYPGM2 (?, ?)");
  cs.registerOutParameter(2, Types.CHAR);
  cs.setString(1, "FRANCO");
  cs.executeUpdate();
  System.out.println("Risultato: " + cs.getObject(2));
 } catch (Exception e) {}

Lo stesso si potrebbe fare in Access Basic (o in VBA) nel modo seguente:

Sub Prova()
Dim wsODBC As Workspace
Dim connODBC As Connection
Dim QDirect As QueryDef
Dim StrSQL As String 

    Set wsODBC = CreateWorkspace("AreaLavoroODBC", "", "", dbUseODBC)
    wsODBC.DefaultCursorDriver = dbUseClientBatchCursor
    Set connODBC = wsODBC.OpenConnection("ConnODBC", , False, "ODBC;DSN=NomeDSN") 

    StrSQL = "CALL MYLIB.MYPGM2 (?, ?)"
    Set QDirect = connODBC.CreateQueryDef("", StrSQL) 

    QDirect.Parameters(0) = "FRANCO"
    QDirect.Execute 

    MsgBox QDirect.Parameters(1) 

End Sub

Lascia un commento