社内SEの徒然なる日記

COBOLで可変長ファイルを出力したい

■ 可変長ファイル

ファイル名を管理するテーブルがあるのですが、そこからデータ(ファイル名)を引っこ抜いてテキストファイルに出力したいのです。

ですが、単純に出力すると後方に空白が出来てしまいます。
[aaaa.txt   ]
[ababab.txt ]
[ccc.txt ]


※ []で囲った部分が出力範囲

COBOLで、長さが違うテキストファイル(可変長ファイル)を出力することが出来たはずなのですが、どうやるんでしたっけ?

■ 書式

COBOL文法書(NetCOBOL V10.0)で書き方を調べてみます。どうやら、ファイル記述項でRECORD句を使えば良いらしいです。
RECORD IS VARYING IN SIZE
[[FROM 整数-2] [TO 整数-3] CHARACTERS]
[DEPENDING ON データ名-1]



「データ名-1」は出力したいレコードのサイズって事でしょうが、「整数-2」と[整数-3」はなんだろうか?

何にせよ、WRITE文を発行する前に、これらに値を設定しておけば良いようですね。

■ 実験1(DEPENDING ON データ名-1)

今一つ、動作が想像しきれないので実際に動かしてみます。
まず、[整数-2] [整数-3]を指定しないで動かしてみましょう。

テキストファイルの最大サイズを5にして、「データ名-1」は「LENG-OUT」って名前にし、WORKING-STORAGEで宣言しておきます。

この値を最大値の5から一つずつ小さくしながら出力します。
       IDENTIFICATION              DIVISION.
PROGRAM-ID. TESTC999.
ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT OT01-FIL ASSIGN TO OT01FIL
ORGANIZATION LINE SEQUENTIAL.
DATA DIVISION.
FILE SECTION.
FD OT01-FIL
RECORD VARYING IN SIZE
DEPENDING ON LENG-OUT.
01 OT-REC PIC X(5).
WORKING-STORAGE SECTION.
01 WK-AREA.
10 LENG-OUT PIC 9(1) PACKED-DECIMAL.
10 WK-REC PIC X(5).
*
PROCEDURE DIVISION.
*
* 出力ファイルオープン

OPEN OUTPUT OT01-FIL.
*
* テスト用データ設定

MOVE "01234" TO WK-REC.
*
* 5BYTE

MOVE WK-REC TO OT-REC.
COMPUTE LENG-OUT = 5.
WRITE OT-REC.
* 4BYTE
MOVE WK-REC TO OT-REC.
COMPUTE LENG-OUT = 4.
WRITE OT-REC.
* 3BYTE
MOVE WK-REC TO OT-REC.
COMPUTE LENG-OUT = 3.
WRITE OT-REC.
* 2BYTE
MOVE WK-REC TO OT-REC.
COMPUTE LENG-OUT = 2.
WRITE OT-REC.
* 1BYTE
MOVE WK-REC TO OT-REC.
COMPUTE LENG-OUT = 1.
WRITE OT-REC.
* 0BYTE
MOVE WK-REC TO OT-REC.
COMPUTE LENG-OUT = 0.
WRITE OT-REC.
*
* 出力ファイルクローズ

CLOSE OT01-FIL.
*
EXIT PROGRAM.



結果はこれです。
[01234]
[0123]
[012]
[01]
[0]
[]



データ名-1(LENG-OUT)に設定したサイズになるように出力されています。しかも、0を設定すると空行を生んでくれるようです。

■ 実験2(FROM 整数-2 TO 整数-3 CHARACTERS)

今度は、[整数-2] [整数-3]を追加します。

NetCOBOLの文法書には、「整数-2には、ファイルに関連するレコードの文字位置の個数の最小値を設定します。整数-3には、ファイルに関連するレコードの文字位置の個数の最大値を指定します。」と書いています。

つまり、出力するレコードの最小サイズと最大サイズを指定できるってことですかね。なので、プログラム中で自由に値を書き換えることは出来ないようです。
       FD  OT01-FIL
RECORD VARYING IN SIZE
FROM 1 TO 5 CHARACTERS
DEPENDING ON LENG-OUT.
01 OT-REC PIC X(5).



んで、色々と値を変えて実験したのですが、結果が変わらない。

「整数-2」を3にしたら、3BYTEが最小になると思ったのですが、それ以下の値も出力されるし、これはいったいどういう事なんだろうか?

目についた違いと言えば、「整数-2」をレコード長より大きくしたり、「整数-3」をレコード長(5BYTE)より小さくしたらコンパイルでエラーになるくらい。

・・・これは、何だろうか?

■ FROM~TOについて

色々と調べた結果、FROM~TOを指定してもプログラムの動作になにも影響しないらしい事がわかりました。つまり、可変長レコードのサイズを決定するのは「DEPENDING ON」で指定した値だけって事ですね。

FROM~TOの指定は、可変長レコードのサイズを指定しているだけだそうです。

例えば、先頭10BYTEは固定で、そこから1BYTE~5BYTEの長さの可変長レコードを出力する場合、下記のように記述するようです。
       FD  OT01-FIL
RECORD VARYING IN SIZE
FROM 11 TO 15 CHARACTERS
DEPENDING ON LENG-OUT.
01 OT-REC PIC X(15).



FROM~TOの指定があることで、可変長である範囲が分かるって事ですね。まぁ、プログラムで「LENG-OUT」に範囲外の値を指定されれば、そっちが有効になる時点で意味を感じないわけですが・・・

■ 後書き

COBOLでプログラムを(綺麗に)組むと、そのソース自体が設計書と同じような意味を持ちます。システムの調査時には、「仕様書を読むよりプログラムを追った方が早い」なんて良く言われたものです。

今回のFROM~TOのように、プログラムの動作に一切影響を与えない設定が文法書にまで乗っているのは、COBOLという言語が持つ独特の特性でしょうね。


投稿記事の一覧:http://harikofu.web.fc2.com/

--- blog end ---

スポンサードリンク

PageTop

コメント


管理者にだけ表示を許可する