COBOL2002 Cosminexus連携機能ガイド

[目次][用語][索引][前へ][次へ]

2.2.4 可変長データについて

Cosminexus連携機能で使用できる可変長データは,「OCCURS DEPENDING ON」で指定できる可変長とは異なります。

データの形式は次のようになります。

[図データ]

「長さ」:後続する「バイト配列データ」のデータ長(長さエリアは含まない)

COBOL UAPでは,次のような形式です。

 01  VARDATAS.
  02  VARDATALEN   PIC  S9(9)  USAGE COMP.
  02  VARDATAITEM  PIC  X(nn). 
 
nn:データ長を指定します
 

COBOL UAPの引数の記述は,次の2とおりあります。

<この項の構成>
(1) 01および77レベルのアドレスデータ項目を使用した可変長データの指定
(2) 01および77レベルの英数字項目を使用した可変長データの指定

(1) 01および77レベルのアドレスデータ項目を使用した可変長データの指定

<指定例>

01    VARDATA  USAGE ADDRESS.
 

COBOL UAPには,上記データの先頭アドレスが渡されるので,BY VALUE指定で引数を受け取ります。

PROCEDURE DIVISION USING BY VALUE VARDATA.
 

受け取ったデータは「アドレス」なので,内容を参照するために「アドレス名にアドレスを設定して参照する」ことになります。

 :
 WORKING-STORAGE SECTION.
  01  VARDATAS  ADDRESSED BY VARDATAS-ADDR.
   02  VARDATASLEN  PIC S9(9)  USAGE COMP.
   02  VARDATASITEM  PIC  X(10000).
 :
 LINKAGE SECTION.
  01  VARDATA  USAGE ADDRESS.
 PROCEDURE DIVISION  USING BY VALUE VARDATA.
     COMPUTE VARDATAS-ADDR=VARDATA.
     IF VARDATASLEN=ZERO THEN
       :

(2) 01および77レベルの英数字項目を使用した可変長データの指定

<指定例>

 01    VARDATA  PIC X(nn).         nn:データ長を指定します
 01    VARDATAS  REDEFINES VARDATA.
  02   VARDATASLEN  PIC S9(9)  USAGE COMP.
  02   VARDATASITEM PIC X(10000).
 

ただし,このままでは「英数字項目」として扱うため,「Bean生成ウィザード」でデータ属性を「可変長データ(byte[])」を指定する必要があります。再定義項目は,COBOL UAPでだけ使用できます。引数は BY REFERENCE で受け取ります。

PROCEDURE DIVISION USING BY REFERENCE VARDATA.
 

受け取ったデータは再定義項目で参照してください。

 :
LINKAGE SECTION.
  01  VARDATA   PIC  X(10000).
  01  VARDATAS  REDEFINES VARDATA..
   02  VARDATASLEN  PIC S9(9)  USAGE COMP.
   02  VARDATASITEM  PIC  X(10000).
 PROCEDURE DIVISION  USING BY REFERENCE VARDATA.
     IF VARDATASLEN=ZERO THEN
       :

上記二つの指定方法の違いは,「可変長データの最大長をあらかじめ指定するかどうか」です。最大長がCOBOLプログラムで記述できる最大領域長を超える可能性がある場合は「アドレスデータ項目」を使用してください。最大長がCOBOLプログラムで記述できる最大領域長を超えない場合は「英数字項目」で指定することもできます。

可変長データに対するJavaプログラムでの操作は次のようになります。

setter
    setVardata(byte[] data, int len)
getter
    getVardata()
 

setterでは,データ自身をバイト配列データで指定します。このデータは,文字列データのような「文字コード変換」は行わない点に注意してください。また,データ長をlenで指定します。

getterでは,byte配列が取得されます。byte配列の長さはlengthプロパティで取得できます。

詳細の指定は,以降の章を参照してください。