AT END が無視されて、再度、DELETE処理を行い、 不正十進数エラーで アボートしてしまいます

1:AT END が無視されて、再度、DELETE処理を行い、 不正十進数エラーで アボートしてしまいます
GAI 07/14 16:12
こんにちはいつも大変お世話になっております。

COBOL85で、
下記の処理をした場合、
最終レコードを削除した後、
AT END が無視されて、再度、DELETE処理を行い、
不正十進数エラーで アボートしてしまいます。

それなりにスキルのある前任者が作ったプログラムです。
最終レコードが削除されたら、レコードがなくなるので、AT END になると思うのですが、
なぜAT END GOTO ABC-090が無視されてしまうのでしょうか?
どう処置すればいいでしょうか?


1.RDBファイルを順読み
2.削除する
3.次のレコードを読む(最終レコード)
4.削除する(最終レコード)
5.次のレコードを読む(AT ENDになるはず)
6.削除する → 不正エラー!!?

ABC-010.

READ XX-FILE AT END GOTO ABC-090.

DELETE XX-FILE .

GO TO ABC-010.

ABC-090.

【例】
READ レコード 99997 →DELETE
READ レコード 99998 →DELETE
READ レコード 99999 →DELETE
READ  E M0021: (PRG=XXXXXX,ADR=00051C12) 不正十進数エラ―


2:Re: AT END が無視されて、再度、DELETE処理を行い、 不正十進数エラーで アボートしてしまいます
温泉好きのうさぎ 07/14 18:57
まず第一に疑うべきものは、ファイルに対する I-O 命令が正常に実行されているのかどうかということです。
すなわち、AT END が無視されたのではなく、READ 命令自体が正しく実行されなかったと考えるべきです。
それをチェックする最も簡単な方法は、「OPEN」「READ」「DELETE」各命令の直後にファイルステータスの値を画面表示させることです。

すべて値が正常終了であれば、別の原因を探す必要があります。

3:Re: AT END が無視されて、再度、DELETE処理を行い、 不正十進数エラーで アボートしてしまいます
tahrayan 07/15 00:52
私も温泉好きのうさぎさんと同じ意見です。
READなどの命令実行後のファイルステータスを見てみた方がいいです。
例えば
READ XX-FILE AT END GOTO ABC-090.
の後辺りで、
IF ファイルステータス(1:1)NOT= '0'
 DISPLAY ファイルステータス
END-IF
みたいな感じで。

なんとなく普通に考えると、最終レコードを削除したので次はAT ENDとなる、というようにも思われますが、実は別のエラーになっているのかもしれません。


それなりにスキルのある前任者が作ったプログラムとのことですが、今までずっと動いていたけど突然エラーが出るようになって動かなくなったというような、今までそれなりに実績があるというわけではないですよね。その人が作ったことは作ったが、動かしたのは今回初めてということですよね。


ところでORGANIZATIONは何を指定しているのでしょうか


このプログラムは何をしようとしているのでしょうか、全部のレコードを削除してテーブルをまっさらにするというプログラムでしょうか

4:Re: 久々COBOL85を見ました。(AT END が無視されて、再度、DELETE処理を行い、 不正十進数エラーで アボートしてしまいます)
江須扇 07/16 11:02
私も久々に見るので、記憶違いかもしれませんが、

プログラム内でFILE STATUSを一か所も使ってない場合は
AT END で再読み込みを実行すると命令実行順序エラーで
エラー表示するのではと記憶しております。

しかしながらFILE STATUSを使っている場合は
その命令でOSからのエラーは表示されず。
次の行で必ずSTATUSをIF命令で確かめる必要が
あると思います。

また、DELETE命令で不正十進数はエラー出ないと記憶しております。

説明上省略してあるのでしょうがREADの後、何らかの処理でエラーが出ていると考えます。

対応方法は

1.全てのFILE STATUSをコメントにして
 OSのエラー機能のみで実行する
2.全ての入出力命令(OPEN、CLOSE、READ、DELETE等)の直後でSTATUSを確認して全て自己管理にする

のどちらかにする必要があります。
中途半端(すいません言葉がきついかも)にSTATUSを確認すると正しい判定ができません。
まずはそこをご確認ください。

PS:
それにしても旧100からCOBOLがあったのでそれを引き継いだプログラムが多いので
GO TO ありありのプログラムはやむを得ないかもしれませんが
新規であればCOBOL85はEND−XXXとPERFORM
を使った構造化プログラムが作成が可能になります。
データベースのSELECTと命令と組み合わせると
かなりすっきりしたプログラムになります。
いまさらですが参考の為に蛇足を書きました。


5:Re: AT END が無視されて、再度、DELETE処理を行い、 不正十進数エラーで アボートしてしまいます
GAI 07/17 11:24
ファイルステータスですね?!
やり方調べて実施してみます!
ありがとうございます”

6:Re: AT END が無視されて、再度、DELETE処理を行い、 不正十進数エラーで アボートしてしまいます
gai 07/17 11:53
ありがとうございます。

おっしゃるとおり、それなりに実績があるといいつつ、
あるというわけではないですよね。
10年以上毎月動いているPGですが、
もしかしたら過去もあったのかもしれません。

ORGANIZATION IS INDEXED

となっております。

RDBを索引順に読みながら、
ある条件に合致した、古いレコードを削除する、
という処理です。




7:Re: 久々COBOL85を見ました。(AT END が無視されて、再度、DELETE処理を行い、 不正十進数エラーで アボートしてしまいます)
gai 07/17 13:14
ありがとうございます。

FILE STATUSでソースを検索したところ、
FILE-CONTROL.で
なんこかのSELECT で
FILE STATUS IS XXXXX
と書いてありました。
file statusとは この記述のことでしょうか?
ここで定義しておきながら、
実際のprocedure divisionでは、
file status xxxx は使っておりませんが。

したがって、FILE status を全処理で DISPLAYしてみます。



8:Re: AT END が無視されて、再度、DELETE処理を行い、 不正十進数エラーで アボートしてしまいます
gai 07/17 14:09
こんにちは。

各所にDISPLAYを入れて、
fileSTATUSを表示してみました。

最後のレコードがDELETE されたあと、
再度READ命令を実行した際、

READ XXXX NEXT
AT END の直後に
DISPLAY したところ
 ”10” 
が表示されました。

10はAT ENDですよね?

表示したあと、そこで 十進数エラーになります。

もしかしたら、KEYに HIGH-VALUE を入れているからいけないのでですか??

READ XXXX NEXT
AT END
DISPLAY STS UPON AAA-GDD
MOVE HIGH-VALUE TO XXXX-KEY2.

と書いてあります。




9:Re: AT END が無視されて、再度、DELETE処理を行い、 不正十進数エラーで アボートしてしまいます
GAI 07/17 15:57
こんにちは。

ためしに、

MOVE HIGH-VALUE TO XXXX-KEY2.



MOVE 88888888 TO XXXX-KEY2.

とやったら、エラーにならなくなりました。

上位のロジックでは、

XXXX-KEY2 が 88888888 だったら、
処理修了的に手続きを仕込みました。

とりあえず無理やりですが、これで運用はできそうですが、
なんで HIGH-VALUE を入れたら
十進数エラーなのかは不思議です。









10:Re: AT END が無視されて、再度、DELETE処理を行い、 不正十進数エラーで アボートしてしまいます
EXCHANGE 07/19 16:24
☆ 拝見させていただいて、前任者はかなり古風なソフト書法をご存じの方と思います。ひょっとしたらA−VX以外でのCOBOLを使っておられた経験者かも?low-value high-valueをendがらみで使われているところなんかそれっぽい感じがします)

☆それはともかく、私は江須扇さんのご指摘が(現在なら)妥当な書法ではないかと同感いたします。

以下、(江須扇氏より引用)
>それにしても旧100からCOBOLがあったのでそれを引き継いだプログラムが多いので
>GO TO ありありのプログラムはやむを得ないかもしれませんが
>新規であればCOBOL85はEND−XXXとPERFORM
を使った構造化プログラムが作成が可能になります。
>データベースのSELECTと命令と組み合わせると
かなりすっきりしたプログラムになります。

1-

BluesBB ©Sting_Band