ファイルの各種情報をファイルに出力したい

1:ファイルの各種情報をファイルに出力したい
ろろけい 04/28 12:15
みなさま、いつもお世話になっております。
また質問させてください。

題名の通りなのですが、#MAPで下記のように指定して得られる情報を、
プリンタではなく、ファイルに出力することは可能でしょうか?

ACTION; ACT=FILE
VOLUME NAME; VOL=
DEVICE; DEV=MSD000
OWNER NAME; NAM=
PRINT DEVICE; PRD=PRN999
DETAIL PRINT MODE; DPM=NO
COMPANY ID; CID=
SELECT FILE NAME; FIL=!
MAP MODE; MOD=FILE

やりたいことは、オフコン上のファイル情報を、Excel等で管理したいのです。

何らかの形でシーケンシャルファイル等にできれば、#NFCNVでWindows側に持っていき、
あとはどうにでも料理できるので便利だな、と思っているのです。

または、COBOLのプログラミングでファイル情報を取得する方法があれば、
そっちのほうがさらに自由度があるので嬉しいのですけど、無理ですかね…。

どなたか参考情報をお持ちでしたら、ご紹介していただけると幸いです。

よろしくお願いいたします。

2:Re: ファイルの各種情報をファイルに出力したい
回転の達人 04/28 12:40
1. SYS@FDFをSEQファイル(256バイト)にコピーすれば、簡単に見れます。 但し、レイアウトは公開されてないでしょうから、ダンプファイルと#MAPリストを比較すればほぼ分かります。 元がISファイルなので、キー部分が最初あたりにありますが、その後、同じレイアウトになりますので、わかります。 ファイルIDでソートすれば、OKです。

2.コボルで参照するには、システムサブルーチンがありますが、これも一般にはリリースされてないので、使用できませんが、もっている販売店もあると思います。 余談ですが、弊社もCOBOL74の時のシステムサブルーチンは社内にあって、ずーと昔、更新プログラムで更新前にSYS@FDFを読んで、空き容量をチェックし、事前にオーバーフローするかどうかチェックした事があります。

3:Re: ファイルの各種情報をファイルに出力したい
ろろけい 04/28 13:36
回転の達人さん

ありがとうございますー!

こんなに早く返信があって嬉しいですし、
まさに欲しい情報でしたので、嬉しさ倍増です!

そうでしたか。
ファイル情報はここに入っているのですね。

ただ、まずはレイアウトの解析が必要ですね。
それがうまくいけば、今後はとても楽になります。

システムサブルーチンも、非公開とは言え存在するのですね。
あると便利だろうなとは思いますが、入手できるかどうか。

とにかく、一歩前に進むことができました。
本当にありがとうございました。


4:Re: ファイルの各種情報をファイルに出力したい
温泉好きのうさぎ 04/28 22:29
SYS@FDFのレイアウトは、「データ管理説明書」に詳しく書かれています。
第2章 ボリューム形式とラベル
2.1.3 ファイルディレクトリファイル
を参照してください。

なお、SYS@FDFは索引順編成ファイルではなく、相対編成ファイルです。
ファイルの構造は、前半にあるファイル名をキーとしたキーレコードの部分と、後半にあるデータレコードの部分に分かれています。

FDFを参照するためのCOBOLのシステムサブルーチンは、説明書に記載が無いだけで、CU自体はSYS@CULに存在しているかもしれません。"SYS@5A" というメンバがあるかどうかさがしてみてください。


5:Re: ファイルの各種情報をファイルに出力したい
回転の達人 04/29 22:15
 温泉好きのウサギ様、間違いを訂正してくれてありがとうございます。 昔の事を思い出して誤りを書いてしまいました。

6:Re: ファイルの各種情報をファイルに出力したい
ろろけい 05/09 14:31
温泉好きのうさぎさん、回転の達人さん

10連休をいただいていたことがバレバレな、遅い返事ですみません(^^;


さらに詳しい情報、ありがとうございました。

マニュアル、確認しました。

実は、SYS@FDF(のコピー)の中身をみて、最初ぜんぜん見当がつかず、
その後、どうやら項目によっては16進数らしい、
というところまではわかってきたのですが、
その後どうしたものか、悩んでいました。
このマニュアルの存在を知ったことで、さらに一歩前進です!

が、残念ながら、私のところのSYS@CULには、SYS@5Aは、ありませんでした(>_<)。

ですが、このマニュアルを元にレコードレイアウトを作れば、
なんとか思うような処理に持っていけそうな気がしてきました。

今回もまた、助かりました。
ありがとうございました!

7:Re: ファイルの各種情報をファイルに出力したい
ろろけい 05/09 17:18
すみません。

できると思ったけど、まだできてません…。

続けてお聞きしたいのですが。

16進で格納されている項目は、COBOLソース上、どう書けばよいのでしょうか?

たとえばSYS@FDFの「有効レコード数」の項目。
43桁目から6バイトが 
00 00 00 00 1D 3E
となっている場合、このファイルを#MAPで見ると、10進で7486と表示されますよね。

これを、COBOLで実現させたいわけです。

仮にこの部分だけを取り出すためのレコードレイアウト(256バイト/Rec)を作るとして、
その場合、下記のような感じでよいかと思ったのですが、
アンダーバーの部分に書くべき数値やキーワードが、わからないのです。

FD FDF-FILE
(中略)
01 FDF-REC.
  02 FILLER PIC X(42).
  02 RECCNT PIC 9(__) USAGE __________.
  02 FILLER PIC X(208).

そもそも、上記の考え方であっているのかどうかも、あまり自信がないのですが…(>_<)

どうかもう少しお付き合いいただけると幸いです。

よろしくお願いいたします。


8:Re: ファイルの各種情報をファイルに出力したい
温泉好きのうさぎ 05/10 01:04
2バイトの2進数項目は、COMP-1
4バイトの2進数項目は、COMP-2
で定義します。

従って、レコード長やブロック長、キーブロック長、キー長、キー位置などはCOMP-1
アロケートサイズや二次アロケートサイズ、エクステントのアドレスはCOMP-2
となります。

お尋ねの有効レコード数は6バイトの2進数項目ですが、それを表現できるCOBOLの書き方はありません。
ただし、4バイトの2進数項目のとる値の範囲は約21億なので、常識的なデータ数を扱うのであれば前2バイトを無視するというのが最も手っ取り早いです。

正確に6バイトの2進数項目を表現しようとすれば、前2バイトをCOMP-1、後4バイトをCOMP-2と定義し、それぞれの値から計算することは可能ですが、マイナスの値となった場合は2の補数として換算しなければならず、少々複雑になります。

書き方としては、
01 FDF-REC.
  02 FILLER PIC X(44).
  02 RECCNT COMP-2.
  02 FILLER PIC X(208).
となります。
COMP-1項目およびCOMP-2項目にはPICTURE句を書きません。


9:Re: ファイルの各種情報をファイルに出力したい
ろろけい 05/10 10:42
温泉好きのうさぎさん

とてもわかりやすい解説、ありがとうございます!

今までは、COMP-3しか使ったことがなかったのですが、
COMP-1、COMP-2の使い方がわかったので、とても嬉しいです!
この解説をいただいた後に、改めてマニュアルを読んで、それで初めて、理解できました(^^;

そして、「前2バイトをカットする」というテクニックも教えてくださり、ありがとうございます。

先ほど、テストプログラムで、数値を正しく読み取れることを確認しました。

今回もほんとうに助かりました。

ありがとうございました。


10:Re: ファイルの各種情報をファイルに出力したい
ろろけい 03/06 10:08
なんと2年ぶりのろろけいです。

引き続き、SYS@FDFから情報を取得する件なのですが。

2年前は、とりあえず「有効レコード数」を得られればそれでよしとしていました。
ですが最近になって、#MAPで表示されるその他の項目も得られるとなおよいなと感じまして、
データ管理説明書から得られる情報をもとになんとか算出しようと試みたのですが、
残念ながら答えを導き出せずにいます。

下記の情報を得るのはどのようにすればよいか、ヒントを教えていただけると助かります。

USED RECORD COUNT : 15066
DELETED RECORD COUNT : 137
UNUSED RECORD COUNT : 14797

欲しいのは、この3項目(USEDは直接得られるのでその他の2項目)だけなのです。
ファイルの種類は、MIXのデータ部だけでOKです。

ファイル名がキーになっている「使用ファイルマスタ」みたいなものを用意して、
そこに、上記3項目を入れ込むプログラムを作れば、それを定期的にチェックすることで、
オーバーフロートラブルを防げるというわけです。

まぁ、上記3つを合計した「総レコード数」は、そうそう変動するものではないのだから、
「使用ファイルマスタ」にあらかじめ入れておけばいいだろ!ですし、
削除レコードだって、たとえば毎晩バッチで#MIXGNを実行しておけば、
そうそうたまることもないだろう!ではあるのですが…(^^;

もしもSYS@FDFからこれらを得られるのであれば、それも知っておきたいなと思ったので、
質問させていただきました。

いかがでしょうか。

1-

BluesBB ©Sting_Band