ここでは、com.microfocus.cobol.RuntimeSystem クラスに含まれる COBOL サポートを使用して、Java から手続き型 COBOL のレガシープログラムにアクセスする方法を説明します。
手続き型の COBOL プログラムは、Java プログラムや EJB から呼び出すことができます (COBOL で作成した EJB に限らず、さまざまな言語で作成した EJB から呼出し可能です)。この呼出しに使用できる各種の方法については、『Java と COBOL の連携』の章で概要を示しています。
ここで説明するのは、com.microfocus.cobol.RuntimeSystem クラスと CobolBean クラスに含まれる COBOL サポートを使用して呼出しを行う方法です。CobolBean クラスは、実際には RuntimeSystem クラスの拡張であり、一連の RuntimeSystem.cobcall*() メソッドを使用します。ここで紹介する手法は、オブジェクト COBOL と Enterprise Server を使用しないで、Java や EJB から COBOL プログラムを呼び出すときに使用します。
Java オブジェクトには JNI (java native interface) を介するか、オブジェクト COBOL の Java ドメインを使用してアクセスできます。
com.microfocus.cobol.RuntimeSystem クラスの COBOL サポートは一連の関数から構成されており、COBOL プログラムのロード、呼出し、およびキャンセルを実行できます。また、Java 配列を使用して、COBOL プログラムにパラメータを渡すことも可能です。com.microfocus.cobol.RuntimeSystem クラスの関数群が、配列からデータを取り出し、そのデータを COBOL プログラムに渡します。図 3-1 は、Java プログラムから COBOL プログラムを呼び出し、2 つのパラメータを渡す処理を示しています。
図 3-1: Java からの COBOL プログラムの呼出し
ここで説明する情報を活用するには、Java 言語に関する基本レベル以上の知識が必要になります。Java 言語の基本的な知識を得るには、Micro Focus Links のリンク先にある Sun 社の Java Web サイトが役立ちます。
環境の設定方法は、『Java と COBOL の連携』の章の『Java と COBOL の環境の設定』の節を参照してください。
Java プログラムは mfcobol.jar ファイル内の RuntimeSystem.class で定義されている関数群を使用して COBOL の入口点を呼び出します。このクラスには cobcall_returntype() という名前の一連の関数が含まれています (returntype の部分は、呼出し対象の COBOL プログラムまたは入口点によって返される値のデータ型によって変化します。たとえば、整数型を返す COBOL プログラムの呼出しには cobcall_int() を使用します)。
Java プログラムで COBOL サポートを使用するには、Java ソースファイルの先頭に次の文を記述してください。
import com.microfocus.cobol.*;
Java ランタイムシステムはマルチスレッド環境であるため、Java から呼び出す COBOL プログラムは、呼出し元の Java プログラムがマルチスレッドプログラムかどうかに関係なく、常にマルチスレッドの COBOL ランタイムシステムとリンクする必要があります。COBOL プログラムをマルチスレッドの Java プログラムから呼び出す場合には、使用中の COBOL データに他のスレッドがアクセスしてデータが壊れてしまわないように対処する必要があります。
この問題には、次の方法で対処できます。
SERIAL を使用すると、複数のスレッドによる COBOL コードへのアクセスが、COBOL ランタイムシステムによってシリアル化され、プログラムにアクセスできるスレッドが一度に 1 つのみに限定されます。これは最も安全性の高い選択肢ですが、潜在的なオーバーヘッドも最も大きくなります。この方法は、COBOL プログラムを介して共有リソース (共有プリンタなど) にアクセスする場合や、Java から呼び出した COBOL プログラムが、マルチスレッドに対応していない他の COBOL プログラムを呼び出す場合に適しています。
REENTRANT(2) を使用すると、互いに独立したユーザデータ領域と FD ファイル領域が COBOL ランタイムシステムによってスレッドごとに割り当てられ、プログラム内での競合の発生やデータ破損が防止されます。ただし、REENTRANT(2) を指定したプログラムでは、非スレッドプログラムを呼び出す場合や、他の共有リソースにアクセスする場合にはスレッドセーフティが保証されません。そのため、このような場合には SERIAL 指令を指定します。REENTRANT(2) 指令では、スレッドが直前のスレッドの終了を待たずに実行されるため、パフォーマンス面では SERIAL より優れています。
スレッド局所場所節はスレッドごとに割り当てられるため、スレッドで使用しているデータに他のスレッドがアクセスし、データが破損する事態が回避されます。この方法は効率面でも優れていますが、レガシーコードに常に使用できるとは限りません。
この方法は、スレッドローカルなデータと、スレッド間で共有するデータをユーザ側で指定できるため、効率面で非常に優れています。ただし、この方法をレガシー COBOL コードで使用するには、Java ランタイム環境とレガシープログラムを仲介する COBOL ドライバプログラムを作成する必要があります。このドライバプログラムによってレガシープログラムへのアクセスを制御します。また、2 つのスレッドが同じコードに同時にアクセスしないように、ドライバプログラムにはセマフォまたは同等の手法を使用する必要があります。
マルチスレッド環境ではプログラムが複数のスレッドによって共有されるため、COBOL プログラムのキャンセル処理は、十分に注意して実装する必要があります。キャンセル処理の手段として、CANCEL と com.microfocus.cobol.RuntimeSystem.cobcancel() メソッドのどちらを使用する場合も同様です。可能であれば、キャンセル処理はいっさい使用しないでください。
または、CobolBean インターフェイスを使用して、COBOL プログラムの作業場所節を CobolBean クラスの特定インスタンスと関連付ける方法を検討します。
COBOL プログラムをライブラリファイルにリンクしている場合や、COBOL プログラム内の入口点を公開する場合には、Java プログラムから COBOL プログラムを呼び出す前に、プログラム自体やライブラリファイルをロードする必要があります。runtime.class の runtime.cobload() メソッドを使用してロードします。たとえば、次のように mycbl 内のプログラムをロードします。
{ if (RuntimeSystem.cobload("mycbl") != 0) System.out.println("Could not load library\n") ; else System.out.println("Library loaded successfully\n") ; }
必要なライブラリやプログラムをロードした後 (詳細は前項を参照)、Java アプリケーションで cobcall_ メソッドを使用して COBOL プログラムを呼び出します。cobcall_ は RuntimeSystem.class に含まれるメソッドで、すべて静的メソッドとして定義されているため、事前に RuntimeSystem.class をインスタンス化する必要はありません。cobcall_ メソッドには 2 つまたは 3 つの引数を指定します (3 番目の引数は省略可能)。
引数の指定方法 1
COBOL プログラムの手続き部見出しの USING に指定する順序で格納します。デフォルトでは、パラメータは参照渡し (BY REFERENCE) されます。
引数の指定方法 2
パラメータの Java と COBOL 間の変換の詳細は、『Java データ型』の章を参照してください。『Java プログラムの作成』の節で前述したように cobcall_ メソッド関数にはいくつかの種類があり、COBOL プログラムや入口点の戻り値のデータ型に応じて、対応する Java データ型の名前を持つ関数を使用します。たとえば、COBOL プログラムが符号付き整数型 (pic s9(9) comp-5 など) の値を返す場合には、この値は Java のデータ型では int 型に相当するため、この COBOL プログラムの呼出しには cobcall_int メソッドを使用します。デフォルトでは、すべてのパラメータは参照渡しされます。
コピーファイル javatypes.cpy には、Java のデータ型に対応する一連の COBOL データ形式が定義されています。Java プログラムとのパラメータのやり取りに使用する COBOL データ項目は、このファイル内で定義されているデータ形式を使用して宣言することが推奨されます。これらのデータ形式を使用すると、他の COBOL プラットフォームとの互換性を維持できます。
cobcall_ の各メソッドの完全なリストは、 Java Classes for Run-time Support を参照してください。
ここでは、Java プログラムから COBOL プログラムを呼び出す 2 つの短いコード例を示します。最初の例は次の処理を実行します。
簡単な COBOL の副プログラム、legacy.cbl を示します。
working-storage section. copy "javatypes.cpy". 01 wsResult jint. linkage section. 01 wsOperand1 jint.*> この型は javatypes.cpy で定義済み 01 wsOperand2 jint. 01 wsOperation pic x. procedure division using wsOperand1 wsOperand2 wsOperation. evaluate wsOperation when "a" add wsOperand1 to wsOperand2 giving wsResult when "s" subtract wsOperand1 from wsOperand2 giving wsResult end-evaluate exit program returning wsResult.
次に、この副プログラムを呼び出す Java プログラムを示します。
import com.microfocus.cobol.* ; class SimpleCall { public static void main(String argv[]) throws Exception { int i = RuntimeSystem.cobcall_int("legacy", new ParameterList() .add((int)4 .add((int)7 .add((byte)'a')); System.out.println(i) ; } }
2 つ目の例では、複数の異なる USAGE 句に相当する配列を使用して COBOL プログラムへデータを渡す方法を示します。使用されている cobcall() メソッドは値を戻しませんが、最初のパラメータとしてオブジェクトを渡し、COBOL プログラムから同じオブジェクト型を返すことができます。次の SimpleCall2 は、最初のパラメータを参照で、2 番目のパラメータを値で、3 番目のパラメータを内容 (by content) で、それぞれ渡します。
import com.microfocus.cobol.* ; class SimpleCall2 { public static void main(String argv[]) throws Exception { RuntimeSystem.cobcall(null, "usages", new ParameterList() .add((int)1, RuntimeSystem.BY_REFERENCE) .add((int)2, RuntimeSystem.BY_VALUE) .add((int)3, RuntimeSystem.BY_CONTENT)); } }
ここでの例は前項の例に似ていますが、COBOL プログラムから返される値を使用して、Java オブジェクト内のデータメンバの 1 つの値を変更しています。
thread-local-storage section. copy "javatypes.cpy". linkage section. 01 wsOperand1 jint. 01 wsOperand2 jint. 01 wsOperation pic x. 01 wsResult jint. procedure division using wsOperand1 wsOperand2 wsOperation wsResult. evaluate wsOperation when "a" add wsOperand1 to wsOperand2 when "s" subtract wsOperand1 from wsOperand2 end-evaluate exit program returning wsResult
この Java クラス SimpleCall2 は、legacy2.cbl が legacy2.ext というライブラリファイルに組み込まれていることを前提としています。このサブルーチンが別のライブラリファイルに組み込まれている場合には、legacy2 を呼び出す前に RuntimeSystem.cobload() メソッドを使用して、そのライブラリファイルをロードする必要があります。
import com.microfocus.cobol.* ; class SimpleCall2 { Integer simpleInteger1; Integer simpleInteger2; Integer simpleResult; public SimpleCall2(int a, int b) { simpleInteger1 = new Integer(a); simpleInteger2 = new Integer(b); simpleResult = new Integer(0); } public String toString() { return new String( "simple1Integer1 = "+simpleInteger1+"\n" + "simple1Integer2 = "+simpleInteger2+"\n" + "simpleResult = "+simpleResult); } public static void main(String argv[]) throws Exception { SimpleCall2 firstDemo = new SimpleCall2(4,7); Object theParams[] = { firstDemo.simpleInteger1, firstDemo.simpleInteger2, new Byte((byte) 'a'), firstDemo.simpleResult } System.out.println("Before call\n"+firstDemo) ; int i = RuntimeSystem.cobcall_int("legacy2",theParams); System.out.println("After call\n"+firstDemo) ; } }
com.microfocus.cobol.CobolBean クラスを使用すると、COBOL プログラムをスレッドセーフになるように書き直したり、Java アプリケーションからパラメータを取り込むように書き直したりすることなく、CobolBean のインスタンスを COBOL プログラムの記憶域節のインスタンスに関連付けることができます。
たとえば、次の COBOL プログラムは、複数の Java クラスから cobcall() で呼び出されると、同じデータを共有します。
$set intlevel"4" data-context working-storage section. 01 address-rec pic x(30). linkage section. 01 lnk-address-rec pic x(30). procedure division. goback. entry "setAddressBook" using lnk-address-rec. move lnk-address-rec to address-rec exit program returning 0. entry "getAddressBook" using lnk-address-rec. move address-rec to lnk-address-rec exit program returning 0.
com.microfocus.cobol.CobolBean を拡張する Java クラスを作成すると、cobcall() のインスタンス (data-context) バージョンを利用できます。CobolBean.cobcall() で呼び出す COBOL プログラムは、RE-ENTRANT(1/2)、SERIAL などのスレッド化指令ではなく、常に DATA-CONTEXT 指令を使用してコンパイルする必要があります。DATA-CONTEXT 指令を指定すると、COBOL ランタイムシステムが CobolBean.cobcall() から使用されるときに、常に新しい COBOL 作業場所節が割り当てられます。
次の例では、COBOL プログラムの共有データ bean1.getAddress() が bean2.getAddress() と等しければ、通常は問題が発生しますが、Java プログラムが CobolBean の cobcall() を使用しているため、COBOL 作業場所節が CobolBean と関連付けられます。
import com.microfocus.cobol.*; import com.microfocus.cobol.lang.*; public class MyBean extends com.microfocus.cobol.CobolBean { private StringBuffer address = new StringBuffer(30); public MyBean() throws Exception { super(); super.cobload("addbook"); } public String getAddress() throws Exception { Pointer addressPointer = new Pointer(this.address.toString(),30); super.cobcall("getAddressBook", new ParameterList().add(addressPointer)); this.address.setLength(0); this.address.append(addressPointer.toString()); return address.toString(); } public void setAddress(String address) throws Exception { super.cobcall("setAddressBook", new ParameterList().add(new Pointer(address,30))); } public static void main(String[] args) throws Exception { MyBean bean1 =new MyBean(); bean1.setAddress("Mr A"); MyBean bean2 =new MyBean(); bean2.setAddress("Mr B"); System.out.println("bean1.getAddress="+ bean1.getAddress()); System.out.println("bean2.getAddress="+ bean2.getAddress()); } }
メモリリークを防ぐため、Java オブジェクトがガーベッジコレクタによって破棄される前に、Java からロードした COBOL プログラムをすべてキャンセルする必要があります。Java オブジェクトの Finalize メソッドから、次の呼出しを使用します。
RuntimeSystem.cobcancel("program")
program は、RuntimeSystem.cobload() 呼出しでロードされる COBOL プログラムの名前です。次に Java プログラム内の Finalize メソッドの例を示します。
private void Finalize() { try { RuntimeSystem.cobcancel("demoFinalizers"); System.out.println("demoFinalizers - 終了"); } catch(Exception e) { System.out.println( "終了中のエラー : "+e.getMessage()); } }
警告:
Java プログラムから COBOL に文字列を渡すときには、Java の String クラスまたは StringBuffer クラスを使用します。この処理では、次のどれかの手法を使用できます。
Java の文字列を COBOL に渡す際に常に問題になるのが文字列長です。COBOL では、文字列は常に固定長になるからです。COBOL プログラムで定義済みの固定長フィールドに変更を加えるには、そのインスタンスを Pointer クラスの新しいインスタンスでラップする必要があります。Pointer クラスは com.microfocus.cobol.lang package で定義されています。
PIC X(20) データ項目を定義している COBOL プログラムの例を次に示します。
showbytes.cbl: working-storage section. linkage section. 01 lnk-string pic x(20). procedure division using lnk-string. display "lnk-string = " lnk-string. move "Hello from COBOL - 1" to lnk-string. exit program returning 0.
対応する Java のコードは次のようになります。
showbytes.java: import com.microfocus.cobol.RuntimeSystem; import com.microfocus.cobol.lang.Pointer; import com.microfocus.cobol.lang.ParameterList; public class showbytes { public static void main(String[] args) throws Exception { String myString = new String("Hello to COBOL"); Pointer ptr2String = new Pointer(myString, 20); RuntimeSystem.cobcall("showbytes", new ParameterList().add(ptr2String)); myString = ptr2String.toString(); System.out.println(myString = ["+myString+"]"); } }
COBOL プログラムでは Java から渡された文字列を変更することはできませんが、StringBuffer の内容は変更可能です。文字列操作を容易にするため、javatypes.cpy で MF-JSTRING 型が定義されています。定義の内容は次のとおりです。
01 mf-jstring is typedef. 03 len jint. 03 capacity jint. 03 ptr2string pointer.
len フィールドは文字列の長さ、capacity フィールドはバッファのサイズをそれぞれ指定します。String の場合には、capacity フィールドの値は常に 0 です。ptr2tring フィールドは、実際の文字列の先頭アドレスへのポインタです。StringBuffer の場合は、既存のバッファを変更できるほか、新しいバッファを割り当てて、その先頭アドレスを指すように ptr2string を指定できます。
次の COBOL プログラムは、Java から渡された String と StringBuffer を連結し、結果を StringBuffer に格納して返します。
program-id. StringAdd. thread-local-storage section. copy "javatypes.cpy". 01 lsNewPtr pointer. 01 lsSize jint. *> この型は javatypes.cpy で定義済み 01 i jint. 01 lsStatus jint. 01 lsBigBuffer pic x(1024). linkage section. 01 lnkJString mf-jstring. 01 lnkJStringBuffer mf-jstring. 01 lnkString pic x(256). 01 lnkStringbuffer pic x(256). procedure division using lnkJString lnkJStringBuffer. set address of lnkStringBuffer to ptr2string of lnkJStringBuffer set address of lnkString to ptr2string of lnkJString *> lnkJStringBuffer が Java StringBuffer であることを確認します。 if capacity of lnkJStringBuffer > 0 add len of lnkJString to len of lnkJStringBuffer giving lsSize *> 連結バッファがオーバーフローしないことを確認します。 if lsSize < 1024 move len of lnkJString to i move lnkString(1:i) to lsBigBuffer add 1 to i move lnkStringBuffer to lsBigBuffer(i:lsSize) set ptr2string of lnkJStringBuffer to address of lsBigBuffer move lsSize to len of lnkJStringBuffer end-if end-if
次の Java クラス StringsToCobol は、文字列 "fred" および "ginger" を StringAdd に渡し、結果を表示します。
import mfcobol.*; public class StringsToCobol { public static void main(String[] args) throws Exception { StringBuffer sb1 = new StringBuffer("ginger") ; Object theParams[] = {"fred" , sb1} ; RuntimeSystem.cobcall_int("stringadd", theParams) ; System.out.println(sb1) ; } }
CobolNational Java クラスを使用すると、UTF-16 文字列を生成して COBOL の PIC N(...) usage is national フィールドに渡すことができます。
たとえば、次の COBOL プログラム (hellonat) は文字列 "Hello From Java" を受け取り、PIC N(40) USAGE IS NATIONAL として定義したデータ項目に格納します。
$set unicode(portable) working-storage section. linkage section. 01 lnk-natstring pic n(40) usage is national. procedure division using lnk-natstring. display "Java から COBOL に渡ってきた文字列 [" lnk-natstring "]" move "Hello From Java" to lnk-natstring exit program returning 0.
文字列 "Hello From Java" を COBOL プログラム hellonat に渡す Java コードは次のとおりです。
CobolNational cobnat = new CobolNational("Hello From Java", 40); RuntimeSystem.cobcall("hellonat", new ParameterList().add(cobnat)); System.out.println(cobnat.toString());
com.microfocus.cobol.lang で定義されている CustomRecord インターフェイスを使用すると、cobCall() や cobrcall() で呼び出したレガシー COBOL プログラムに集団項目を渡すことができます。
CustomRecord インターフェイスの定義を次に示します。
package com.microfocus.cobol.lang; public interface CustomRecord { public Object[] getParameters(); public void setParameters(Object[] parms); }
$COBDIR/demo/java/cobol/RecordDemo では、データ項目 customerDetails が次のように定義されています。
01 customerDetails. 03 customerName pic x(30). 03 customerAddress pic x(30). 03 customerRef pic 9(6).
Java による CustomRecord インターフェイスの実装例を次に示します。
import com.microfocus.cobol.lang.*; import java.text.*; public class RecordData implements com.microfocus.cobol.lang.CustomRecord { private String customerName; private StringBuffer customerAddress; private int customerRef; RecordData(String name, String address, int ref) { customerName = name; customerAddress = new StringBuffer(address); customerRef = ref; } public String getCustomerName() { return this.customerName; } public String getCustomerAddress() { return this.customerAddress.toString(); } public int getCustomerRef() { return this.customerRef; } public Object[] getParameters() { String strCustomerRef = Integer.toString(this.customerRef); while(strCustomerRef.length() < 6) { strCustomerRef = "0"+strCustomerRef; } customerAddress.setLength(30); /* 必ず正しい長さを指定してください。 */ customerAddress.ensureCapacity(30); return new ParameterList() .add(new Pointer(this.customerName,30)) .add(this.customerAddress) .add(strCustomerRef.getBytes()) .getArguments(); } public void setParameters(Object[] parms) { Pointer ptr = (Pointer)parms[0]; this.customerName = ptr.toString(); this.customerAddress = (StringBuffer)parms[1]; byte[] byteCustomerRef = (byte[])parms[2]; this.customerRef = Integer.parseInt(new String(byteCustomerRef)); } public String toString() { return "Customer Name : "+this.customerName+"\n"+ "Customer Address : "+this.customerAddress+"\n"+ "Customer Ref : "+this.customerRef; } }
Java プログラム内では、次のようなコードで COBOL プログラムを呼び出します。
cobcall("RecordDemo",new ParameterList().add( new RecordData(myname, myaddress, myref)));
『Java データ型』の章の『ParameterList() によるパラメータの追加』の節も参照してください。
JNI は、Java のオブジェクトとクラスを、Java 以外の言語で作成したプログラムで利用するためのインターフェイスです。com.microfocus.cobol.RuntimeSystem クラス内の cobcall() メソッドを使用して、呼出し対象の COBOL プログラムに JNI ポインタを渡します。JNI ポインタとは、Java 以外のコードから Java ランタイムシステムへのアクセスを可能にする Java 関数群のテーブルを指すポインタです。
COBOL で JNI を容易に利用できるようにするため、javatypes.cpy でデータ型 JNINativeInterface が定義されています。JNINativeInterface は、JNI Java 関数群を指す一連の手続きポインタで構成される集団項目です。COBOL での JNI の用途としては、COBOL プログラムからの Java 例外のスローなどがあります。
COBOL プログラムから Java にアクセスする手段としては、ドメインサポートも使用できます (『オブジェクト COBOL からの Java の呼出し』の章を参照)。
JNI の関数を使用して例外をスローする COBOL プログラムの例を次に示します。
identification division. program-id. "except". special-names. ********************************************** * JNI 呼出しに使用する呼出し規約をここで * 指定します。Win32 システムの場合は 74 を * 指定します (stdcall の呼出し規約に対応 * しています)。 ********************************************** $if UNIX defined call-convention 0 is javaapi. $else call-convention 74 is javaapi. $end local-storage section. copy "javatypes.cpy". 01 JavaException pointer. 01 ExceptionClass pointer. linkage section. 01 JEnv pointer. 01 jobject pointer. 01 lnk-JNINativeInterface JNINativeInterface. * 最初のパラメータ (JEnv) は、JNI 関数テーブルへのポインタ * です。JNI 関数呼出しでは常に、このポインタを最初の * パラメータとして参照渡しする必要があります。 procedure division using by reference JEnv. * JEnv で渡されたポインタを JNINativeInterface * 構造体の先頭アドレスにマップして、JNI 関数 * の呼出しを可能にします。 set address of lnk-JNINativeInterface to JEnv * 例外クラスへの参照を取得します。 call javaapi FindClass using by reference JEnv by reference z"java/lang/IllegalArgumentException" returning ExceptionClass end-call * 例外クラスが見つからない場合は、そのまま終了します。 if ExceptionClass = NULL exit program end-if * 新しい例外をスローします。 call javaapi ThrowNew using by reference JEnv by value ExceptionClass by reference z"Thrown from COBOL code" end-call exit program .
次に呼出し側の Java プログラムを示します。
import com.microfocus.cobol.*; class testexcept { public static void main(String argv[]) throws Exception { try { /* JNIEnv で渡すため、最後の引数は true に設定します。 */ RuntimeSystem.cobcall(null,"throwex",null,null,true); } catch(Exception e) { System.out.println( "PASS - 例外キャッチ ("+ e + ")"); } } }
本 COBOL 開発システムには、Java からの手続き型 COBOL 呼出しのさまざまな側面を示すサンプルプログラムが付属しています。サンプルプログラムは、製品のインストール先の $COBDIR/demo/java/cobol/ ディレクトリにあります。これらのディレクトリ内の各ファイルは、いずれもサンプル関連ファイルであり、readme.txt ファイルに詳細情報が記載されています。
サンプルプログラムを格納している各ディレクトリと、格納されているサンプルの機能の概要を次に示します。
ディレクトリ名 | 概要 |
---|---|
arrays | COBOL で Java 配列を読み取ります。COBOL で Java 配列を更新します。 |
pi | pi を計算します。数値を文字列として Java に返します。 |
primtypes | Java の原始データ型を COBOL に渡します。Java の原始データ型を COBOL で更新します。 |
record | 簡単な COBOL Java オブジェクトを作成します。DataType インターフェイスを実装する Java オブジェクト から COBOL プログラムにデータを渡し、構造体に格納します。パラメータを参照で (BY REFERENCE) 渡します。 |
Copyright © 2006 Micro Focus (IP) Ltd. All rights reserved.