過去の桐井戸端BBS (桐ver.8)
2840 一括処理中にファイルオープンエラーなどを処理したい こざる 1999/10/6-10:31
一括処理中にファイルオープンエラーなどを処理したいのですが
やり方がわかりません。

一括処理中に他のAPにて「専有」形式?でテーブルをオープン
されていると、「ファイルがありません」というエラーが
発生してしまいます。(OKボタン押下で復帰)

夜間バッチとして動作させたいので、メッセージを表示させたく
ありません。どのようにエラーを判別して自動で処理するように
できるのでしょうか?
それとも一括処理ではできないのでしょうか?
2842 Re: 宮城 1999/10/6-12:05
記事番号2840へのコメント
こざるさん、こんにちは。

表コマンドでいいんでしたら、パラメーターで終了状態を変数にとり、
1(正常終了=ちゃんと開けたということ)でなければ遅延あたりで
時間を稼ぎ、分岐で表コマンドの前に戻すことはできます。ケース制
御ですがわかりますよね?

桐の表以外でしたら#ファイル使用関数を使います。

ただし、いずれにしても、表(ファイル)の状態が変わらなければ朝
までループしっぱなしになりますが・・・。
2843 Re: 宮城 1999/10/6-13:16
記事番号2842へのコメント
こざるさんの実力を疑うわけではありませんが、念のため。他のかたの
ご意見も伺いたく。

名札 表Aオープン
表 "A",終了状態=&終了状態
ケース開始
 ケース(&終了状態<>1)
  遅延 100
  分岐 表Aオープン
ケース終了

当然のことながら、同じ表を何回も開ける場合、その箇所ごとに名札名
を変えなくてはなりません。

さらに複数の表をこのやり方で開く場合、そういうプログラムが複数あ
ったとすると、表を開ける順を揃えておかないと、

プログラム1、Aを開ける。
プログラム2、Bを開ける。

プログラム1、Bを開けようとしてループ突入。
プログラム2、Aを開けようとしてループ突入。

という悲劇(喜劇?)が起きるおそれもあります。
2844 Re: 幅田 1999/10/6-17:39
記事番号2840へのコメント
DOSのver.5でやってたことが、ver.8で通用するのかどうか
試していませんが、

変数宣言 数値{&ANS}
繰り返し (.NOT #ファイル使用(”該当ファイル名”,1)
 機能キー入力 (1,1)−(1,1),プロンプト=””,¥
  カーソル=オフ,文字キー=無効,¥
  入力待ち=しない,バッファクリア=する,&ANS
 条件 (&ANS=27) 繰り返し中止
繰り返し終了
 分岐 (&ANS=27),キャンセル

表 ”該当ファイル名”




名札 キャンセル 



#ファイル使用を使って、該当ファイルが開けるかどうか
を調べて、開けない間は無限ループに入ります。
開けると同時にループから抜けて、次へ進んで該当ファイルを開きます。

手動でキャンセルしたい場合は、ESCキーを押すと
名札 キャンセルへ分岐します。
2849 Re: 佐田 守弘 1999/10/6-23:21
記事番号2840へのコメント
こざるさん
既に宮城さんが書かれております通り、一括処理コマンドの中で終了状態を取
る事により、エラーを回避できます。これについて、多少の付け加えを行いま
す。
●エラー処理の方法
 桐の一括処理コマンドの中には、その時の状況によってコマンドが実行でき
ないことが考えられるコマンドがあります。
例えばご質問の表を開くコマンドがそうですし、それ以外にも多数のコマンド
があります。
この様なコマンドには、パラメータとして「終了状態=」があります。このパ
ラメータを記述すると、コマンドを実行した結果が、指定した変数に戻されま
す。この終了状態の戻値は、コマンドによって決まっており、この値を評価し
て、コマンドが実行されたか、実行されなかった理由は何かを判断できる仕組
みになっています。

 そして、このパラメータを省略した時には、コマンドが実行されないとエラ
ーになります。しかしパラメータを付けた場合には、コマンドが実行できなか
った場合であってもエラーにはならず、「コマンドが実行できなかった」とい
う結果を返してコマンドが終了します。ですからエラーメッセージなどは出さ
れません。
 返された値をケースコマンドなどで判断し、実行できなかった場合には、そ
の対処方法を行います。

●表を再オープンする場合
 方法は宮城さんが書かれている通りです。クライアントが多数あって、複数
のマシンで同じ表を開こうとした場合、極まれに、同時にぶつかり、同じ時間
待って再び同時にぶつかるといった事があり得ます。
 そこで、遅延コマンドで遅延させる時間を一定値ではなく、例えば#乱数
(100)+100の様に指定して、待ち時間をランダマイズする方法が考えられます。

●基本的には更新共有で開くべき
 サーバ上のファイル複数クライアントで利用する場合には、専有モードで開
かせず、更新共有モードで開かせるべきと考えますが、いかがでしょうか。

佐田守弘(KS-00119)
2855 Re: こざる 1999/10/7-20:49
記事番号2840へのコメント
みなさん貴重な意見をありがとうございました。

桐のVer8からなのか知りませんが、便利な命令がありました。
#表オープン状態
この命令を使うと、表のオープン状態が取れるので、専有オープン
されている場合、スキップできます。

とりあえず、これで回避することにいたしました。
2857 Re: 宮城 1999/10/7-21:08
記事番号2855へのコメント
ちょっと気になります。#表オープン状態はヘルプでは「編集表の共有モード
または更新モードを調べます。」となっており、自プログラムが現在開いてい
る表の状態を調べるようにとれるのですが・・・。

それから、ほかの誰かが使っていたらとばしてしまってもよいような処理、ち
ょっと想像がつきません。

最後に細かいことをいって申し訳ないのですが、#表オープン状態は関数であ
り「命令(コマンド)」ではありません。
2861 Re: 佐田 守弘 1999/10/8-00:56
記事番号2857へのコメント
こざるさん
宮城さんが書かれている通り、「#表オープン状態」関数は、その桐が開いてい
る表の状態を調べる関数です。その表が他の桐から開かれていても、自身が開い
ていないと未定義値が返されます。

佐田守弘(KS-00119)

戻る