COBOL および PCML

COBOL プログラムの入力と出力のパラメーターを記述する、 プログラム呼び出しマークアップ言語 (PCML) ソース・ファイルを使用して、 COBOL プログラムを Java アプリケーションから呼び出すことができます。 Java アプリケーションは、PCML ソース・ファイルを参照して、 ProgramCallDocument オブジェクトを作成することによって、PCML を使用できます。 Java で PCML を使用する方法の詳細については、 http://www.ibm.com/eserver/iseries/infocenter の iSeries Information Center で、 『プログラミング』->『Java』->『IBM Toolbox for Java』->『プログラム呼び出しマークアップ言語』を参照してください。 PCML は、COBOL 形式と Java 形式間のデータ・タイプ変換を行います。

生成された PCML を受け取る IFS 出力ファイルの名前を指定するための INFOSTMF コンパイラー・パラメーターと一緒に PGMINFO(*PCML) コンパイラー・パラメーター を指定すると、ILE COBOL コンパイラーは、COBOL プログラムの PCML ソースを生成します。 PCML は、COBOL プログラムの、Procedure Division の USING と GIVING/RETURNING の句の内容、 および LINKAGE セクションの内容に基づいて、生成されます。 表 13 は、PCML での COBOL データ・タイプ に対するサポートを示しています。

表 13. COBOL データ・タイプおよび対応する PCML サポート
COBOL データ・タイプ COBOL の形式 PCML でサポート されている PCML データ・タイプ 長さ 精度 カウント
文字 X(n) はい 文字 n
A(n) はい 文字 n
X(n) OCCURS DEPENDING ON M はい 構造体 m
A(n) OCCURS DEPENDING ON m はい 構造体 m
数字 9(n) DISPLAY はい ゾーン 10 進数 n 0
S9(n-p)V9(p) DISPLAY はい ゾーン 10 進数 n p
9(n-p)V9(p)
PACKED-DECIMAL
3 を参照
はい パック 10 進数 n p
S9(n-p)V9(p)
PACKED-DECIMAL
3 を参照
はい パック 10 進数 n p
9(4) BINARY
12 を参照
はい 整数 2 16
S9(4) BINARY
12 を参照
はい 整数 2 15
9(9) BINARY
12 を参照
はい 整数 4 32
S9(9) BINARY
12 を参照
はい 整数 4 31
S9(18) BINARY
12 を参照
はい 整数 8 63
9(18) BINARY
12 を参照
サポートなし。
USAGE COMP-1 はい float 4
USAGE COMP-2 はい float 8
UCS2
N(n)
4 を参照
はい UCS-2/グラフィック n
N(n) OCCURS
DEPENDING ON m
4 を参照
はい 構造体 m
グラフィック G(n) はい UCS-2/グラフィック n
G(n) OCCURS DEPENDING ON M はい 構造体 m
指標 USAGE INDEX はい 整数 4 31
ブール 1 サポートなし。
日付 FORMAT DATE サポートなし。
時刻 FORMAT TIME サポートなし。
タイム・スタンプ FORMAT TIMESTAMP サポートなし。
ポインター USAGE POINTER サポートなし。
プロシージャー・ポインター PROCEDURE POINTER サポートなし。
注:
  1. 切り捨てを減らすには、PROCESS ステートメント で NOSTDTRUNC を指定します。BINARY データ項目を渡すときには、 必ず NOSTDTRUNC を指定する必要があります。
  2. BINARY、COMP-4、および COMPUTATIONAL-4 は同等のものであり、 同じ PCML にマップされます。
  3. PACKED-DECIMAL、COMP-3、COMPUTATIONAL-3、COMP、 および COMPUTATIONAL は同等のものであり、同じ PCML にマップされます (COMPASBIN PROCESS オプション を指定しない限り。詳しくはPROCESS ステートメントのオプションを参照)。
  4. USAGE NATIONAL を指定した場合、あるいは USAGE を指定せずに、 NATIONAL コンパイラー・オプションを指定した場合は、PIC N は国別 (UCS2) 項目に なります。それ以外の場合は、USAGE DISPLAY-1 (DBCS) が指定されたことになります。

PROCEDURE DIVISION ヘッダーの USING 句で指定するすべてのパラメーター に対して、PCML が生成されます。このヘッダーの GIVING/RETURNING 句で指定するパラメーター に対して、PCML が生成されます。GIVING/RETURNING 項目が 4 バイトのバイナリー整数 でない場合は、エラーが出ます。生成された PCML で「inputoutput」として定義 された、USING 句で指定した項目は、情報を呼び出し側プログラムに戻すために使用できます。TYPE 文節で定義されている項目は、PCML エラーを受け取ります。 呼び出しプログラム (JAVA プログラムなど) が、RETURN-CODE 特殊レジスターの内容を見るには、 PROCEDURE DIVISION ヘッダーの USING 句で、RETURN-CODE 特殊レジスターを 指定する必要があります。OCCURS DEPENDING ON (ODO) のサブジェクト・ データ項目に対して PCML が正しく生成されるためには、 ODO のオブジェクト・データ項目が linkage section で定義され、 PROCEDURE DIVISION ヘッダーの USING 句でパラメーターとして指定されていなければなりません。

名前変更または再定義された項目には PCML は生成されません。

CRTCBLMOD を使用し、サービス・プログラムを作成する場合は、ProgramCallDocument クラスの setPath(String) メソッドを使用して、Java コードでサービス・プログラムを指定してください。例を以下に示します。

	AS400 as400; 
	ProgramCallDocument pcd; 
	String path = "/QSYS.LIB/MYLIB.LIB/MYSRVPGM.SRVPGM"; 
	as400 = new AS400 (); 
	pcd = new ProgramCallDocument (as400, "myModule"); 
	pcd.setPath ("MYFUNCTION", path); 
	pcd.setValue ("MYFUNCTION.PARM1", "abc"); 
	rc = pcd.callProgram("MYFUNCTION"); 

CRTCBLMOD を使用し、サービス・プログラム以外のプログラムを作成する場合は、PCML からエントリー・ポイント属性を除去する必要があります。この属性は、サービス・プログラムを呼び出す場合にのみ必要だからです。

例:

以下に、COBOL ソース・プログラムの例、およびこのプログラムに対して生成された 対応する PCML を示します。

図 60. PCML ソース・プログラム
  
   5722WDS V5R4M0  060210 LN  IBM ILE COBOL                 TESTLIB/MYPCML           ISERIES1   06/02/15 12:09:25        ページ    2
                                     ソ ー ス
  STMT PL SEQNBR -A 1 B..+....2....+....3....+....4....+....5....+....6....+....7..IDENTFCN  S コピー名   変更日付
     1     000100 IDENTIFICATION DIVISION.
     2     000200 PROGRAM-ID.     MYPGM4.
           000300
     3     000400 DATA DIVISION.
     4     000500 WORKING-STORAGE SECTION.
     5     000600 01 RETN-VAL PIC 9(8) USAGE COMP-4.
           000700
     6     000800 LINKAGE SECTION.
     7     000900 01 PARM-LIST.
     8     001000    05 EMPL OCCURS 5 TIMES.
     9     001100      10 NAMES      PIC A(20).
    10     001200      10 ADDRESSES  PIC X(60).
    11     001300      10 PHN-NUM    PIC 9(11) DISPLAY.
    12     001400    05 NUM-1A     PIC S9(5)V9(3)  PACKED-DECIMAL.
    13     001500    05 NUM-2A     PIC 9(5)V9(3)   COMP.
    14     001600    05 TAB-NUM-3A PIC S9(5)V9(3)  COMP OCCURS 10 TIMES.
    15     001700    05 NUM-4A     PIC 9(5)V9(3)   COMP-3.
    16     001800    05 NUM-5A     PIC S9(5)V9(3)  COMP-3.
    17     001900    05 NUM-6A     PIC 9(4)        BINARY.
    18     002000    05 NUM-7A                     COMP-1.
    19     002100    05 NUM-8A                     COMP-2.
    20     002200    05 INTLNAME   PIC N(10)       NATIONAL.
           002300
           002400***************************************************************
           002500* Test PCML for arrays of basic supported types.
           002600***************************************************************
    21     002700 PROCEDURE DIVISION USING BY REFERENCE PARM-LIST
           002800     GIVING    RETN-VAL.
           002900 MAIN-LINE.
    22     003000     MOVE 1 TO RETN-VAL.
    23     003100     DISPLAY "THIS PGM TO BE CALLED BY A JAVA PGM".
    24     003200     STOP RUN.
                           * * * * *   ソ ー ス 仕 様 の 終 わ り   * * * * *
 
                      

以下に、CRTBNDCBL コマンドに、PGMINFO(*PCML) と INFOSTMF('/dirname/mypgm4.pcml') の オプションを指定してプログラムをコンパイルしたときに生成される PCML の例を示します。

<pcml version="4.0">

   <!-- COBOL program: MYPCML  -->
   <!-- created: 02/03/21 12:09:25 -->
   <!-- source: TESTLIB/QCBLLESRC(MYPCML) -->
   <programname="MYPCML" path="/QSYS.LIB/TESTLIB.LIB/MYPCML.PGM" returnvalue="integer">

      <struct name="PARM-LIST" usage="inputoutput">

         <struct name="EMPL" usage="inherit" count="5">

            <data name="NAMES" type="char" length="20" usage="inherit">
            <data name="ADDRESSES" type="char" length="60" usage="inherit">
            <data name="PHN-NUM" type="zoned" length="11" precision="0" usage="inherit">
         </struct>
         <data name="NUM-1A" type="packed" length="8" precision="3" usage="inherit">
         <data name="NUM-2A" type="packed" length="8" precision="3" usage="inherit">
         <data name="TAB-NUM-3A" type="packed" length="8" precision="3" count="10"
usage="inherit">
         <data name="NUM-4A" type="packed" length="8" precision="3" usage="inherit">
         <data name="NUM-5A" type="packed" length="8" precision="3" usage="inherit">
         <data name="NUM-6A" type="int" length="2" precision="16" usage="inherit">
         <data name="NUM-7A" type="float" length="4" usage="inherit">
         <data name="NUM-8A" type="float" length="8" usage="inherit">
         <data name="INTLNAME" type="char" length="10" chartype="twobyte" ccsid="13488" usage="inherit">
      </struct>
      <data name="RETN-VAL" type="int" length="4" precision="32" passby="value"
usage="output">
   </program></pcml>