質問: " wk-shiten-code not invalid key display wk-shiten-code " の売上げ目標は " um-rec end-read. stop run. というプログラムを作成し、"mokuhyou.dat"という入力ファイルに正しくデータが格納されているのですが、コンパイルは問題なく、実行すると、 jmp0310i-u open error file=mokuhyou.dat. 'acc-method'. pgm=test046 adr=00401258 とまず画面にでて、okを押すと、 jmp0099i-u forced termination code=0310 というエラーになります。 おそらくファイルが正常に読み込めないものと推測されますが、解決法を教えてください。お願いします。
回答: う~ん、惜しい。 select uriage-mokuhyou assign to "c:\dat\mokuhyou.txt" organization is sequential. か、 select uriage-mokuhyou assign to "c:\dat\mokuhyou.txt" organization is line sequential. にする(行順ファイルがサポートされてて使える場合) select n-uriage-mokuhyou assign to "c:\dat\mokuhyou" organization is indexed access mode is dynamic record key is num-shiten-code. にする。索引ファイルを使う場合、主ファイル名は8文字以内に、拡張子は付けないのが無難。あと、ファイル名は大文字にしとく方が無難(後述) 05 um-kingaku pic 9(10) occurs 12. の後ろに 05 filler pic x(2). が必要(改行コードのcrとlfの分) move um-rec to num-rec はやっちゃいけない(テキスト側に改行コードのフィラが増え、テキストファイルと索引ファイルのレコード構造が違ってしまったから。それに各項目ごとに移送してるから不要) rewrite num-rec は write num-rec invalid key rewrite num-rec end-write にする。outputオープンしてるからファイルは空になってる。つまりレコードは1つも存在しないからrewriteは出来ない。 「writeしてみてinvalid keyだったらrewrite」をする理由は、元のテキストファイルに 0001shiten-a旧店名、aaに変更済~~~ 0001shiten-aa~~~~~~~~~~~~ 0002shiten-b~~~~~~~~~~~~ 0003shiten-c~~~~~~~~~~~~ のように「同一の支店コードが2つ書いてあった時」のため。rewriteではなく「同一コードが2つある」とのエラー表示をして終了するのでも良い。 これでダメだとしたら 「使ってるcobolに方言があって、テキストファイルを扱う場合のselect文に、何か特殊な書き方をしなきゃならない」 か 「『c:\dat\』のように、ドライブやパス指定を書けない」 か 「索引ファイルのファイル名には『n-mokuhyou.dat』のように拡張子は付けちゃいけない」 か 「索引ファイルのファイル名は『n-mokuhyou』のように8文字を超えちゃいけない」 か 「ファイル名に英文字の小文字を含むと問答無用でエラー」 などの制約が存在する場合がある。 特に索引ファイルでの「拡張子は付けない」と「主ファイル名は8文字以内」は注意。これを守らないとcobolが内部でキーファイルのファイル名を自動生成する際に、生成に失敗して実行時にopen文で予期せぬエラーが出る可能性が。 古いms-dosの仕様を引きずってて廃止して欲しい制約なんだが...。 あと「古いms-dosの仕様」に関連してか、ファイル名は大文字を使うのが慣例になっている。ファイル名に小文字を使うと動かないcobolがあるらしいので。