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