メニューボタン
サポートチーム便り2023.05.10

ファイルが他で使用中のため処理ができません(T_T)

Question

物理ファイルが他で使用中のため処理できずエラーとなってしまいます。

書き込む処理の前で物理ファイル・メンバー消去(以下、CLRPFM)していますが、処理を行うとCPF3156のエラーが出てしまいます。

該当のプログラムの中でCLRPFMを処理する前に他の処理で使用中と解れば、分岐してエラーにならないようにしたいです。

何か良い方法はありませんでしょうか。

スクリーンショット

Answer

他で使用中かを確認するにはオブジェクト・ロック処理 (WRKOBJLCK)がありますが、出力先が画面かがスプールファイルになってしまいます。

スプールファイルをファイルにコピーしてCLプログラム内で読み込むことも可能ですが、手間が掛かってしまいます。

今回の場合でしたら、回復手順の中にあるオブジェクト割り振り (ALCOBJ)を組込んでみてはいかがでしょうか。

考え方としましては「他で使用中か?」ではなく、「使用するためにロックを掛ける」、「ロックを掛けられなければ、他で使用中」という考え方になります。

その場合、他で使われては意味がありませんので、ALCOBJのパラメタは「*EXCLロック状態は読み取りなし排他です。」になります。

オブジェクト割り振り (ALCOBJ)
https://www.ibm.com/docs/ja/i/7.5?topic=ssw_ibm_i_75/cl/alcobj.html

処理が完了したら、オブジェクト割り振り解除 (DLCOBJ)を行ってください。

オブジェクト割り振り解除 (DLCOBJ)
https://www.ibm.com/docs/ja/i/7.5?topic=ssw_ibm_i_75/cl/dlcobj.html

以下は簡単なサンプルです。

スクリーンショット

4ステップ目でオブジェクトを*EXCLでロックします。

他の処理で使用中の場合は、CPF1002のエラーとなりますので、モニターメッセージして、操作しているセッションに「他で使用中です」とメッセージを出してプログラムを終了します。

CPF1002のエラーが出ない場合は、9ステップ目のCLRPFMを行い、10ステップ目でロックを解除してプログラムを終了します。

上記のサンプルにはMONMSGやDLYJOB、例外処理等が入っておりませんので必要に応じて考慮してください。

また、他の処理が終わるのを待って再処理させるような事を組込んでも良いかと思います。

無限に待ってLOOPするのは良くないので、3回まではLOOPさせて再処理、それでもダメだったらメッセージを出して終了させるとかも良いのではないでしょうか。

CLRPFMをする対象のファイルがWORKファイルのような場合は他の人(他のジョブ)と競合しないように、QTEMPのライブラリーを使用するのも一つの手法かもしれません。

by けやきのじぃじ

あわせて読みたい記事

PAGE TOP