mars
2011
Bonjour,
J’étais confronté ces derniers temps à appeler un programme COBOL sous AS400 à partir d’une application Java. La démarche que je vous cite est extraite à partir de ce lien (il utilise RPG au lieu de COBOL, mais le principe est le même …) :
Il faut tout d’abord créer son programme COBOL sous AS400 : Je l’ai nommé TESTJAVA dont le code est :
PROGRAM-ID. TESTJAVA.
*
AUTHOR. Faisel.
ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
SOURCE-COMPUTER. IBM-AS400.
OBJECT-COMPUTER. IBM-AS400.
SPECIAL-NAMES.
*
INPUT-OUTPUT SECTION.
**********************
FILE-CONTROL.
**************
** -------------------------------------------
** ---------- DATA DIVISION ----------
** -------------------------------------------
DATA DIVISION.
FILE SECTION.
** --------------------------------------------
** ---------- WORKING STORAGE ----------
** --------------------------------------------
** ----------------------------------- -----
** - LINKAGE --> R E C E P T I O N - -----
** ----------------------------------- -----
LINKAGE SECTION.
*****************
01 NAME PIC X(100).
01 REP PIC X(100).
** ======================================================
** --------------- PROCEDURE DIVISION ---------------
** ======================================================
PROCEDURE DIVISION USING NAME REP.
DEBUT-PROGRAMME.
*****************
*
STRING "HELLO " DELIMITED BY SIZE
NAME DELIMITED BY SPACE
INTO REP.
*
FIN-PROGRAMME.
***************
EXIT PROGRAM.
Ce programme COBOL permet tout simplement de recevoir un paramètre en input qui s’appelle NAME, le concatène avec HELLO et retourne une variable en output.
Ainsi, si j’appelle ce PGM sous AS400 via CALL TESTJAVA PARM(‘JauB’) alors j’aurai en sortie : HELLO JauB.
Une fois notre programme COBOL compilé et testé alors on passe à la 2ème étape : création d’un fichier spécial le PCML. Ce fichier peut être construit manuellement (mais j’ai lu aussi qu’il peut être créé avec des outils à partir de la description du programme, en utilisant WDSc : WebSphere Development Client Studio for iSeries).
Le fichier PCML a une structure comme celle là :
<program name="program" path="/QSYS.lib/MYBIB.lib/TESTJAVA.PGM">
<data name="myname" type="char" length="100"
usage="input"/>
<data name="myrep" type="char" length="100"
usage="output"/>
</program>
</pcml>
On peut remarquer que dans ce fichier (qui sera utilisé par notre classe Java) on fait référence au chemin exact de notre programme COBOL sur AS400 : ici le chemin complet de notre programme COBOL est : /QSYS.lib/MYBIB.lib/TESTJAVA.PGM (ne pas oublier l’extension PGM)
Ce fichier contient aussi la description des variables en input (entrée) : myname avec le bon type (char). Et contient aussi la déclaration d’une 2ème variable myrep (output) qui stockera le retour de notre programme COBOL.
Une fois le fichier créé, il doit être sauvegardé et mis à la racine du dossier src de notre application Java, sinon vous aurez comme message d’erreur au runtime : Exception received: [java.util.MissingResourceException] PCML document source ‘ExamplePcml’ cannot be found.
Après la création de notre projet java, on doit télécharger les différentes bibliothèques de JTOpen à partir d’ici. Dé-zipper l’archive
, mettre les différents JAR dans le CLASSPATH de notre application Java.
Maintenant on peut créer notre classe qui appellera notre programme COBOL
:
import com.ibm.as400.data.ProgramCallDocument;
import com.ibm.as400.data.PcmlException;
import com.ibm.as400.access.AS400;
import com.ibm.as400.access.AS400Message;
import java.math.BigDecimal;
// Example class to call an COBOL program to add two numbers and return the sum
public class CallCOBOLPGMAS400 {
public CallCOBOLPGMAS400() {
}
public static void main(String argv[])
{
// Create and instantiate an AS/400 Object
// If you do not enter a user id or password, you will be prompted for each
// AS400 sys = new AS400("url of iSeries", "user id", "password");
System.out.println("Connecting to iSeries...");
//AS400 sys = new AS400();
AS400 sys = new AS400("Adresse IP de votre iSeries", "VotreLogin", "VotreMotDePasse");
// Create Data Objects
ProgramCallDocument pcml; // com.ibm.as400.data.ProgramCallDocument
String myresponse; // COBOLprogram variable
boolean rc = false; // Return code for program call
String msgId, msgText; // Messages returned from AS/400
try
{
// Instantiate the Objects (assign the variables)
pcml = new ProgramCallDocument(sys, "ExamplePcml");
pcml.setValue("program.myname", new String("JauB"));
//pcml.setValue("program.myrep", new String(""));
// Debug statement...Use to view outbound and inbound parms if you need it
//com.ibm.as400.data.PcmlMessageLog.setTraceEnabled(true);
// Call the Program
System.out.println("Calling the program...");
rc = pcml.callProgram("program");
// If return code is false, get messages from the iSeries
if(rc == false)
{
// Retrieve list of AS/400 messages
AS400Message[] msgs = pcml.getMessageList("program");
// Loop through all messages and write them to standard output
for (int m = 0; m < msgs.length; m++)
{
msgId = msgs[m].getID();
msgText = msgs[m].getText();
System.out.println(" " + msgId + " - " + msgText);
}
System.out.println("Call to PROGRAM failed. See messages listed above");
System.exit(0);
}
// Return code was true, call to PROGRAM succeeded - woo-hoo!
else
{
// Process the returned Data
myresponse = (String) pcml.getValue("program.myrep");
System.out.println("Reponse ..." + myresponse);
}
}
catch (PcmlException e)
{
System.out.println(e.getLocalizedMessage());
e.printStackTrace();
System.out.println("Call to PROGRAM failed");
System.exit(0);
}
// Disconnect from AS/400
sys.disconnectAllServices();
}
}
Voilà, j’espère que ce topic vous a été utile.
SALUT,
j’ai besoin du meme programme et j’ai suivi votre programme ,
est ce que vous pourriez bien m’aider à surmonter les erreurs que j’ai renceontré