【初心者歓迎】最新COBOLについての質問スレ
みんなでCOBOLの話題をしましょう。 質問あったらどうぞ。 最新リリース COBOL 2002 http://ja.wikipedia.org/wiki/COBOL ■ フリーCOBOL OpenCOBOL http://jp.opencobol.org/ TinyCOBOL http://tiny-cobol.sourceforge.net/index.php 第4次COBOL規格 COBOL2002のご紹介 http://www.cobol.gr.jp/knowledge/next_standard/standard002.html COBOL2002では、全体で約150の追加変更が行われています。ただし、追加変更項目の互換性の保持には 十分に注意がはらわれており、従来のCOBOLプログラムから外れるものではありません。大きな追加機能項目として次の項目があります。 1. コンパイル時指示機能 2. 自由形式の正書法 3. ビット操作機能 4. 漢字等の多オクテット文字機能 5. 浮動小数点データ操作機能 6. ポインタ項目とアドレス付け機能 7. 利用者定義のデータ型機能 8. 利用者定義の関数機能 9. ファイルの共用と排他制御の機能 10. 画面処理機能 11. 例外割り込み処理機能 12. データの妥当性検査機能 13. オブジェクト指向機能 14. 言語間連絡の拡張 15. 標準算術演算と31桁への拡張 16. その他(POSIXのロケールに対応した地域・文化固有機能、既存プログラムとの互換) >>45 意義がないとまでは思わんよ、EVALUATEは多分岐しなきゃいかんときは積極的に使うけど 黒か白かだけならIFで十分 >>46 そりゃそうだけどさ、例えばコーディングした時点では二択で良かったけど、 それから暫くしてそのプログラムに修正を加えることになった際に三択や四択になった場合でも、 最初からEVALUATE TRUEにしとけば修正が楽になると思う。 最初はIF文にしておいて、三択や四択になった際にEVALUATE TRUEに書き換えるのでもいいんだけど、 そうすると意味的には同じでもソースに差異があるから分岐を全部テストしろとか言い出す頭の固い現場が多いしねぇ…。 COBOL85とNetCOBOLってどれくらい違うの? 今からCOBOL独学で身につけるのに良いテキストとかある? コードを書くだけなら、COBOL85の古本で十分だと思う。作法以外は易しい言語だし。 処理系を作ろうとしてるなら、余りいい資料はないね。 サンクス 内定貰った所がCOBOL出来る人欲しいみたいで独学で少し勉強しようかと FLG をENDみたいな文字列で管理するのって何か理由あるん? >>55 遅延処理。主に大量のリアルタイムデータが発生する場合の更新処理に使われる 株取引での例 証券会社別取引集計等、遅れて処理もいい場合 顧客マスター等に索引部があると障害復旧時に時間がかかる場合がある リアルタイム処理用は別途、専用顧客ファイルを随時参照・更新しマスターへは後から更新したりする事をいう オンライントランザクションの対極に位置する処理方法やね クライアントはとにかくリクエストやメッセージをサーバに送ればそれで処理完了(サーバからの応答はいらない) サーバ側はキューにたまっているリクエストやメッセージをどんどん処理していけばいいだけ だから最悪の場合、通信回線やサーバが死んでいてもクライアントは処理が続けられる そこはディレイド通信システムなんかのミドルウェアがうまく取り計らってくれるから >>57 今はオンライントランザクションでは使わへんの? 株取引、銀行の送金(内為)システムでの取り扱い高集計処理なんかの多少遅延が発生しても良い部分は別プロセスにしてたけどなあ 今でもあるっしょ! たしかBMP処理とか言ってたなぁ。 ディレードは、同じ取引でも読込件数が多いとディレードに処理を移行させてた。 >>58 クライアントからメッセージを投げた時点でいったんトランザクションが終わるんだよね サーバでメッセージを受信して処理するときはまた別のトランが発生している 分散トランとかじゃなくて全く何の関係もない2つのトランで1つの処理が完了すること になるから、これとOLTPと呼んでいいのかと言われるとたぶん違う気がする あくまでバッチ処理だね >>60 うん、バッチだよ > 分散トランとかじゃなくて全く何の関係もない2つのトランで1つの処理が完了すること ここ、違う。一つのトランを別々、同期をとる為に即時処理する部分と多少遅延が発生してもいい部分に分けて処理する事 それはクライアントアプリの作りの話だね つうか、ディレイド処理する時点で通常のDBMSとは別のリソースマネージャ (たとえばIBM MQ)を使うことになるから、そこが2つのトランに分かれるのは当然の話 そこをあえて1つにしたければ、それこそ分散トランを使うしかないが そんなことをすると性能が出ないから、普通はやんないだろうね ちなみに俺が言ってたのはクライアントとバッチ処理するサーバでトランザクションが違うってことね 一般的なオンライン処理だとDBへの単独アクセスは1トランで済むが、 ディレイド通信を使うと最低でも2トラン発生するってこと(間に中継サーバがいるから) だから君の言ってる処理だと、普通のDBアクセスで1回、ディレイド処理で1回、 バッチ処理サーバで1回と合計3回のトランザクションが発生することになる。 >>62 ? ごめん、どんなシステムを想定しているのかわからない。通常サーバー側の仕様を指すものでクライアントアプリなんて関係ないと思うんだが 例えば、本来ライトスルーで処理したいところをアクセス頻度が高過ぎてメモリ上でライトバック処理にした しかし、障害後や過去ログとして扱うにはHDに書き込まなきゃいけないわけで、そこの処理の部分を指すものと思って >>53 > FLG をENDみたいな文字列で管理するのって何か理由あるん? Cとか列挙型あるよね。COBOLだと88レベルというのがある。多分、実装者が設計者の意に反して利用しなかっただけ 使い方を知らなかった、全て大文字表記のために変数なのか条件項目なのかわかりづらい等… 01 FLG PIC 9(1). 88 END VALUE 1. IF END STOP RUN. こう書くんだっけ? VBAでFLAGをENDって文字列で管理してる人が居るのだが、元コボラーなのかな すみません、可変長ファイルをREADする時、その行の厳密なレコード長でREADすることはできますでしょうか? 最大レコード長より短いレコードの場合、次のレコードの先頭が後ろにくっついてきてしまうので困っています。 >>67 連投スマン 次のレコードを読み込むのは仕様。 レコード長が取得できるのは汎用機だけかも知れん。 レコード識別でどのレコードか判断するのが一般的な気がする COBOLの可変長てLength付きレコードじゃなかったけ?(C形式はU:不定長) レコード間にもギャップがついていたような…ラベルの定義(STANDARD or OMITED)がプログラムとファイルで違う為に認識してくれない? >>70 各レコードの先頭には、レコード長をビッグエンディアン保持した4バイトのRDWが付くよ 皆様、ご回答ありがとうございます。また返答が遅くなりましてすみません。 先頭に4バイトのレコード長情報が入っているのはわかったのですが、これを参照する方法がわかりませんでした。 どなたかご存知ないでしょうか?ちなみに富士通のOSWなのですが。 連投ですみません。 LENGTH OF IN-DATAとしたら、最大レコード長が返されてしまい、読み込んだ行の実際のサイズにはなりませんでした。 はい。未だこのようなものを使っております。 この資産をWindowsに移行するため、可変長ファイルをレコードの種類ごとにタブ区切りで書き出そうとしてつまずいています。 >>73 OSIVなら、 どうやったか忘れたけどレコ長を調べられるよ。 マニュアルCOBOL利用手引書を調べるか、IKBの質問応答ページを検索してみて! IKB探してみたけど、情報ないなぁ 確か全銀協のマルチフォーマットファイルを振り分けるために、COBOLプログラム内でRDWを判定してた筈なんだけど。 もしかしたらシステムサブルーチンを呼び出してたかも知れん。 自分で作ってないから完全に忘れてしまってる スマン Fは使ったことないんで、間違えているだろうけどJCLのファイル定義で読取り方法をフィジカルにするとかかな?… 先ずはユーティリティでファイルコピーした? >>75 ナカーマ! うちのはXSPだけど、資産移行してるとこ。 レコード識別はないの? COBOLソースの移行でLIBEの出力が可変長だった時は、システムユーティリティで固定長にしてからFEXPORTかけたけど ソースならLOW-VALUEで初期化した固定長(80byte)のSFを作成して標準のエディタの外部への保存を行えばよくね? そんなんユーザーに富士通からやりかたマニュアルを くれているだろう それみたらぜんぶわかる 皆様、ご回答ありがとうございます。レコード識別はあるのですが、時期によって長さが違いまして、その確実な記録も残っていないので、データを全部調べなければなりません。 FIMPORTはCOMPの問題があるので難しいですね。 マニュアルは調べているのですが、RDWを扱える記述がまだ見つけられません。今日は本腰を入れて調べてみます。 >81 自分は、PFD でソースを表示させて、LISTAコマンドで表示用の一時ファイル(username.R9999)を調べて、そのファイルをimportしてた。 >>83 問い合わせ事例があるはずだから、 あっさりサポートに聞いたほうが早いかも。 FIMPORTはCOMPあってもBINARYなら転送可能だよ?でも可変長対応してないからなぁ。 あと、レコード長が調べられたとしても、結局その後、文字コードの移行しなきゃならんから、どのコピー句で変換させるかを完璧に押さえ込んでないと、本番移行が怖いよ(汗) 皆様、ご回答ありがとうございます。 マニュアルを調べたものの、RDWがどういうものかの記述はあれど、どうすれば情報を取り出せるかがどうしても見つからず、現在担当CEに 調べてもらっています。 >79 目からうろこですね。CVTFILEというユーティリティを見つけたのですが、構文エラーでうまく行っていません。 >84 PFDの表示だとCOMPがドット表示となり、全角で文字化けしてしまいます。 >85 ご指摘のとおり、可変長なのでFIMPORTはダメでした。 >>86 CVTFILEはXSP専用だと思われます MSPだと、GENERかGEM3ユーティリティ辺りが使えるかも。 ソートとかも簡易編集出来たりします。 PFDの表示は、GEM管理下のCOBOLソースをFIMPORTする裏ワザです GEM管理下は直接FIMPORT出来ないので。 したがって、compなどを含む順編成ファイルは直接FIMPORTして、バイナリ指定にするだけで転送出来ますよ データ部のレコード句、DEPENDING ON 変数名でREAD時のレコード長が変数名に設定されてくるんじゃなかったかな? 皆様、ご回答ありがとうございます。 >88 その通りでした。RECORD句のVARYINGも調べていたのですが、RDWに関する記述がまったくなくて、まさかこれだとは思いませんでした。 先ほど実験してみたところ、きちんとレコード長が戻されました。 皆様、どうもご協力ありがとうございました。 景気がよくなるとこれだけ情報投資があるんだな デフレ時はCOBOLはほんの少ししか仕事がなかった 1レコード読み込むごとに出力するのではなく、 最後に一括して、ファイルに出力する方法を教えて下さい。 例)入力ファイルを最後まで読み込み、全レコードがえらーがない場合のみ、 入力ファイルの全レコードを出力ファイルに出力する。 よろしくお願いいたします。 >>93 君は下のスレにも、書き込んでいるけど、 2chではマルチポスト禁止だよ。 書き込むスレは、1つだけにすべし くだすれPython(超初心者用) その27 ttp://peace.2ch.net/test/read.cgi/tech/1441317912/633 >>93 全部チェックしたらCLOSE-OPENして、全件READ-WRITEすりゃいいじゃん まぁそもそも俺ならそんな設計にしないけど。 >>95 どのような設計にされますか? 考えつかないので教えてください。 よろしくお願いします。 >>97 もっと大きなくくりで何をやりたいのか聞く必要があるが、 チェックエラーがある時だけ、RETURN-CODEに5点入れて終了 JOB制御で0点なら次の処理。とかにすれば、全件正常の時だけ次のステップが流れる。 回答ありがとうございます。 RETURN−CODEで制御する方法もあるのですね。 今回やりたいことは、以下の通りです。 入力ファイルのチェック処理を行い、チェックエラー有無によって 出力ファイルの内容を可変にしたいです。 前提として、チェックエラーの有無に関わらず、次のステップを行うようにしたいです。 (これについては、JOB制御でコードを判定すれば、 RETURN-CODEが0点でなくても大丈夫ということですね!) 大きな仕様としては チェックエラーありの場合→0件ファイルを出力。 チェックエラーなしの場合→入力ファイルを全件出力 という感じです。 文章にすると単純なのですが、実際コーディングすると 良い実現方法が分かりませんでした。 そもそも正常、エラーの振り分けをやって、エラーのみリスト出力の方が綺麗だとおもう。 エラー有り時は、JOB正常終了させなければ、次の処理にも進まないし。 でも、あなたの仕様で一番簡単なのは、こんな感じかな? OPENCLOSE技はあまりカッコいいとは言えないけど、内部テーブルやソート使うやり方よりシンプルに出来る気がする。 PROC-RTN. IF エラーあり? THEN MOVE 1TO ERROR-SW MOVE "END" TO END-SW END-IF END-RTN CLOSE FILE1. *エラー時、出力データ削除 IF ERROR-SW = 1 THEN OPEN OUTPUT FILE1 CLOSE FILE1 END-IF COBOLはレコード処理なので、 正常時のみ全件出力よりも、とりあえす処理済みレコード出力しておいて、エラー時に出力を無かったことにする方が簡単。 もっと真面目に書いてみた PERFORM INIT-RTN. PERFORM PROC-RTN UNTIL END-SW = "END". PERFORM END-RTN. INIT-RTN. OPEN INPUT INFILE. OPEN OUTPUT OUTFILE. PERFORM READ-RTN. EXIT. PROC-RTN. IF エラーなし? THEN WRITE OUT-REC FROM IN-REC ELSE MOVE 1TO ERROR-SW MOVE "END" TO END-SW END-IF PERFORM READ-RTN. EXIT. END-RTN CLOSE INFILE. CLOSE OUTFILE. *エラー時、出力データ全件削除 IF ERROR-SW = 1 THEN OPEN OUTPUT OUTFILE CLOSE OUTFILE END-IF. EXIT. >102 丁寧なご回答ありがとうございます。 自分では全くできない発想なので、とても感動しました!! また、COBOLはレコード処理なので、毎回出力する方が簡単という ご説明もあり、とても分かりやすかったです。 実際に例を参考にコーディングさせていただきたいと思います。 ありがとうございました。 SEQUENTIAL と LINE SEQUENTIAL って何が違うの? C言語でいうと前者がバイナリ、後者がテキスト レコード単位でアクセスするか、改行文字で区別して行単位でアクセスするかの差 LINE SEQUENTIALだとWRITE文使った時に改行文字が追加出力される 文法的にはORGANIZATION IS SEQUENTIALと書いたときは ORGANIZATION IS RECORD SEQUENTIALと指定したのと同じ意味 (SEQUENTIALはRECORDがデフォルト設定なので) >>113 わかりやすい解説ありがとうございます。 ハローワーク求人128,214件の平均月給197,300円〜268,000円 その中からCOBOLの求人486件の平均月給251,800円〜432,000円 https://goo.gl/E3yXUJ cobolを全然触ったことない初心者なんですが 仕事でcobolを使うことになったので勉強しようとしてます。 opencobolで環境構築して動かそうと思ったのですが上手くいきません。 どんな風に構築したか書いていいでしょうか? そしてどこが悪いのか教えてもらえますでしょうか? >>118 です。 ありがとうございます。 ある参考書を買ってそこに書いてあるOpenCobolを構築しようと思いました。 http://www.mingw.org/ まずはMinGWを上記からダウンロードし、インストールして ライブラリをインストールしました。 その後、環境変数のPATHにMinGWを格納したパス:C:\MinGWを設定。 次にOpenCobol(Guncobol)をダウンロードして ダウンロードした中のフォルダをMinGWのフォルダの中に上書き 環境変数COB_CONFIG_DIRを作成し、パスをC:\MinGW\configに設定 その後、コマンドプロンプトでcobcと入力しても 『"cobc"は、内部コマンドまたは外部コマンド、操作可能なプログラムまたは バッチファイルとして認識されていません。』と表示されます。 どこが悪いか教えてください。 お願い致します。 PATHにC:\MinGWを指定したのが間違い。EXEがある場所を指定しないといけない。 >>122 すいません。 PATHに指定していたのはC:\MinGW\bin でした。 簡単なCOBOLなら下のサイトで動かせるよ ideone.com >>124 ありがとうございます。 環境構築できないのは残念ですが 仕事で使うまでに基本的な文法を学びたかったので これで学習できそうです。 生前退位による新年号はCOBOLで運用されているシステムに影響を与えますか? >>126 ソースとオーバーレイを"平成"でgrepしたら山ほど出てきた(;´Д`) そら消費税よりは頻度が少ないからなぁ。 でも平成に切り替わる時にある程度やったんでわ? http://www.kunst1080.net/entry/2015/05/07/235848 どうにもできないのでこちらの方法でやってみたのですが、nkfのセットアップというところでmakeコマンドでコマンドが見つかりませんといわれます 環境構築でもかなりむずかしいですね opensourceCOBOLがwindows対応してなかったっけ? 俺ならCENTOSに入れちゃうから、windows+エミュレータは良くわからん VisualStudioにも対応してたけど、一個前バージョンは酷かった 色々間違ってて手直ししないとビルド通らなかった 1) VMWareやVirtualBoxなどの仮想環境用ソフトをWindows環境に入れる 2) 64bit日本語環境版Ubuntuを↑にisoイメージからインストールする(他と違って自力で設定する必要がある箇所がほとんどないので) ttp://cdimage.ubuntulinux.jp/releases/16.04/ubuntu-ja-16.04-desktop-amd64.iso 3) 仮想環境でUbuntuを立ち上げて、端末からsudo apt-get updateとsudo apt-get upgradeを実行して完了を待つ (最初はランチャーに端末が表示されてないので、左上にあるアイコンからshellで検索する必要あり) 4) ウェブブラウザでopensource COBOL v1.5.1J [UTF-8, Source Package, include vbisam (extend OSSCons patch)]をダウンロード(githubの方には手を出さない) 5) 不足しているパッケージを追加インストール、端末からsudo apt-get install libgmp-dev libncurses5-dev libncursesw5-dev autoconfする 6) ファイラから(ランチャーの上から二番目)ダウンロードを選び、opensource-cobol-1.5.1J-utf8.tar.gzをダブルクリックホームへ展開する 7) 端末からcd open*して移動後にcd vbisam、sudo chmod 777 configure、./configure、make、sudo make install、cd ..の順で実行 8) sed -e "s/lncurses/lncursesw/g" configure > configure2、sudo chmod 777 configure2、./configure2 --with-vbisam --enable-utf8の順に実行 9) make、sudo make install、sudo ldconfig、make checkを順に実行、エラーが出て無けりゃCOBOL環境構築完了 仮想環境の機能使って共有フォルダ設定してやれば、Windows環境で使い慣れたテキストエディタを使って作業できる 普段Windowsで作業する人も学習用にLinux環境用意オススメ(作業環境壊して泣かないために) 学習用途ならLinuxのクソ環境をいじくらなくてもいいようにUbuntu選ぶのが正解 ubuntuにCOBOL データーベースは何を使うの? vbisamより、BerkeleyDBのほうが好き >>140 直接じゃないけど、ポスグレ接続できるよ COBOL資産をJava(C#)に移行しようとしてプロジェクト頓挫 金融、自治体であちがちな事件 フロントをJava んでCOBOLで受けて処理、DBはOracle OSはUNIX 以前やった某金融系のお仕事 >>142 もよくありがちなんだろうけど、どこに原因があるんだろかね COBOLに未来はなさそうだから他言語に移したいってのは判るけど >>143 そもそも金額計算面倒で桁多い金融系にC言語系が向く訳無い >>145 ライブラリ設計にもよる 言語仕様には変えられない read.cgi ver 07.5.0 2024/04/24 Walang Kapalit ★ | Donguri System Team 5ちゃんねる