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 :
IDENTIFICATION DIVISION.
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à :
<pcml version="1.0">
<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
:
package jaub;
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.
Vous devez être identifié pour poster un commentaire.
Parfois, on est dans l'obligation de déboguer un programme lancé en mode batch. La procédure étant différente de celle utilisée pour déboguer un programme en interactif (un simple STRDBG suivi d'un CALL du programme en question).
Tout d'abord, votre programme (qu'on appellera désormais TESTCOBOL) doit être compilé avec l'option DBGVIEW = *Source ou *ALL ou *LIST
Cette procédure a été testé sur un programme COBOL ILE.
La démarche :
1. On va lancer notre programme TESTCOBOL en mode HOLD = YES via la commande :
SBMJOB CMD(CALL PGM(TESTCOBOL)) JOB(TESTJOB) HOLD(*YES)
2. Après exécution de cette commande, vous verrez en bas un numéro attribué au job lancé, du genre : Travail 020914/MYUSER/TESTJOB soumis à la file d'attente QS36EVOKE de QGPL. On notera quelque part ceci : 020914/MYUSER/TESTJOB
3. On lance la commande STRSRVJOB JOB(020914/MYUSER/TESTJOB)
4. On lance le débogage de notre programme comme suit : STRDBG PGM(TESTCOBOL) UPDPROD(*YES)
A présent, on ne peut pas mettre de point d'arrêt sur le source affiché, ce point sera ajouté plus tard. Si vous essayez d'ajouter un point d'arrêt à ce stade vous aurez comme message : Commande non admise quand le travail en maintenance n'est pas actif.
5. On lance la commande pour libérer le job précédemment holdé via la commande : RLSJOB JOB(020914/MYUSER/TESTJOB)). On aura le message suivant sur l'écran :
Le travail en maintenance a été libéré de la file d'attente de travaux.
Appuyez sur ENTREE pour démarrer ce travail ou sur F10 pour entrer des
commandes de débogage le concernant.
6. On tape F10 et saisissez la commande DSPMODSRC et tapez entrée.
7. On a devant nous le source de notre programme lancé en mode débogage, on peut maintenant y ajouter un point d'arrêt et faire F12.
8. On fait F3 pour revenir sur l'écran ou est affiché :
Le travail en maintenance a été libéré de la file d'attente de travaux.
Appuyez sur ENTREE pour démarrer ce travail ou sur F10 pour entrer des
commandes de débogage le concernant.
9. On appuie sur entrée, notre programme est lancé en débogage
10. Bonne lecture ![]()
Vous devez être identifié pour poster un commentaire.
Vous trouverez sur ce lien une bonne documentation pour les débutants en COBOL.
Bonne lecture
Vous devez être identifié pour poster un commentaire.
Copyright © 2000-2012 - www.developpez.com