• 締切済み

COBOL85のコーディングについて

COBOL85のコーディングについて教えてください。 以下のようなレコードを持つテーブルで、CD1="B"のレコードを、(1)→(2)→(3)の降順で読み込むには、どのようにコーディングすれば可能でしょうか? コーディング例をお願いします。   CD1|CD2|DATE   ――――――――――――――――   A  |1  |20120101   A  |2  |20991231 (3) B  |1  |20120101 (2) B  |2  |20131231 (1) B  |3  |20991231   C  |1  |20120101   C  |2  |20991231

みんなの回答

回答No.3

データベースなのか、シーケンシャルファイルなのかで違うと思いますが データベースなら EXEC SQL DECLARE CUR1 CURSOR FOR SELECT CD1,CD2,DATE FROM テーブル ORDER BY CD2 DESC END-EXEC. EXEC SQL DECLARE CUR1 CURSOR FOR EXEC SQL FETCH CUR1 INTO :XXX-REC END-EXEC. みたいにすると、ソートのかかった状態でデータ処理できますよ。

全文を見る
すると、全ての回答が全文表示されます。
回答No.2

2か、4ならしってるけど多分同じでしょ(操作方法は大幅に違うかな..)だとしても、ファイル編成は多分同じなので 上記通りのファイルであれば、Bのレコードが上記例で3件程度なら、一度メモリに貯めこんで、内部ソートするのが いいと思います。 最近のCOBOLでは、OCCURS句にて最大65534指定できるかと思いましたが、一昔では最大255でした。 この辺は、COBOLマニュアルを確認してください。 仮に、何件くるかわからない場合は、Bのレコードを別ファイルに抜き出して、(BをキーとしJCLで抽出)後、Bが 入ったファイルをsort(降順に)後、上記ファイルと抜き出しソート後ファイルを照合し結果として上記ご質問の内容を 実現する方法があるかと思います。  元のファイル(キーのみ抜粋)    A,1    A,2    B,1    B,2         B,3    C,1    C,2      上記ファイルを抽出 (temp1)    B,1    B,2         B,3         ソート後ファイル ファイル1    B,3    B,2         B,1   このファイルと元のファイルからBを除いたファイル (以下ファイル2と仮名)    A,1    A,2    C,1    C,2       ファイル1とファイル2を照合(1番目の項目を照合キーとして)    A,1    A,2    B,3    B,2         B,1    C,1    C,2       結果上記B項目が降順となるようにファイルが作成される    (って具合になるかと思います)   (注意:上記例では、CD1がコード順であることが前提です。)            ★基本的に汎用機では大容量のデータを扱うことが多くマシン1台に多くの端末がぶら下がり     多くの利用者が同時に利用しています。よってあまり多くのレコードをメモリ上に抱えて処理する     のは好ましくありません。上記例のようにファイルの抽出、ソート、マージのパターンを駆使して     処理を実現していきます。     JCLを利用して処理を考案する前に、マニュアルとしてスーパーバイザ解説書ってのがある     はずなので最初にそれを熟読しておきましょ!      

全文を見る
すると、全ての回答が全文表示されます。
回答No.1

COBOLで扱える標準編成ファイルは、基本的に順編成ファイル、直編成ファイル、索引順編成ファイル、区分編成ファイル の4種類です。(マシンにより、汎用機、linux(unix系)にもよるのですが、ご質問の言語はどの環境で取り扱うのでしょうか? 汎用機などでは、COBOL言語だけでなく、js(jcl)のユーティリティも駆使して実現することになります。 また、unix系だと、専用のユーティリティ(sort、margeなど)も用意されているかと思いますが?? また、扱うデータ量によりDBを選択する選択肢もあります。

zucchy_no3
質問者

補足

大変失礼しました。 ACOS2の環境で取り扱います。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • COBOLのコーディングについて

    下記の内容を実行するときのコーディングを教えてください。 01 WORK-TABLE.  03 ITEM  PIC X(02)OCCURS 10. テーブルの中身。 02,01,03,04,05,06,04,03,02,01の時、 (1)ITEMの最大値を求める→答え:06 (2)ITEMの種類をカウントする→答え:01~06の6種類 (3)降順に3つだけ他のテーブルに転記する→答え:01,02,03 本当に教えて君で申し訳ありませんが宜しくお願いします。

  • select文

    お世話になります。 以下のような内容のテーブルA、B、Cがあります。 テーブルA  id a_data a_date ----------- テーブルB id b_data b_date テーブルC id c_data c_date ----------- テーブルAとテーブルBは「id」がキーで1:N テーブルAとテーブルCは「id」がキーで1:N このような3のテーブルで idを検索キーにして次のフィールドのデータを抽出したいのですが。。。(テーブルCのc_dateを降順で) id a_data a_date テーブルBのidで検索したレコード数 説明不足かもしれませんがよろしくお願いします。

  • COBOLについて

    COBOL初心者なのですが。 COBOLで 01 A.   03 B PIC 9(02).   03 C PIC X(02). MOVE  SPACE  TO  A. とした時、基本項目であるBには何が入っているのでしょうか? 数字項目にSPACEというのはありえないですよね。 どなたかわかる方、教えていただけませんか?

  • COBOLの動的SQLについて

    COBOLにおいて、動的にSQLを組みたいのですが、 取得する方法も含めてご教授願いませんでしょうか? 例) 条件により コード=1の場合、 SELECT A.ID,B.NAME FROM ID A,NAME B コード=2の場合、 SELECT A.ID,B.NAME,C.ADDRESS FROM ID A,NAME B,ADDRESS C のように条件により取得する項目も数もテーブルも違います。 この場合でのSQLの組み方とデータを取得する(FETCHの方法)がわかりません。 また、取得する件数も1件ではありません。 よろしくお願い致します。

  • COBOLの文字列検索を教えて下さい。

    cobol初心者です。 「100バイトのレコードを複数件読み込み、決まった文字列を検索する」というPGMを作ろうとしています。 03 REC-1 PIC X(100) 03 REC-2 PIC X(05) という定義があるとき REC-1 = "abcdefghijklmnopqrstu…"       というデータに対して、 REC2 = "hijkl"                    の検索をしたい場合 どのようなコーディングで調べることができるのでしょうか? 何レコード目の何バイトでヒットしたかを表示したいので、 INSPECT命令は使用せず、REC-1を1バイト単位で取り出して、 1文字ずつ判定しようと思っています。 レコードを越えてのヒットは行いません。 この場合配列を使うという考え方は正しいですか? 読み込んだ100バイトのレコードを1バイト単位で取り出して比較するには、 REDEFINEを用いて再定義すると考えています。 その場合のREADでの読み込み方がよくわかりません。 コーディング例等を載せてもらえると助かります。 cobolをはじめたばかりで、基本的な知識が抜けているかもしれません・・・ よろしくお願い致します。

  • 複数テーブルの結合

    テーブルA  a_id id a_data a_date ----------- テーブルB id b_data b_date テーブルC id c_data c_date ----------- テーブルAとテーブルBは「id」がキーで1:N(Nは0も含む) テーブルAとテーブルCは「id」がキーで1:N(Nは0も含む) このような3のテーブルで a_idを検索キーにして次のフィールドのデータを抽出したいのですが。。。 ※テーブルCのc_dateを降順で先頭の1レコードのみ ※テーブルBのidをカウントする selectの結果(イメージ) id a_data a_date count(B.id) c_date ------------------------------------- 001 AAAA 2007/02/01 20 2007/02/14 005 BBBB 2007/02/02 0 2007/02/10 006 CCCC 2007/02/02 0 2007/01/08 003 DDDD 2007/02/01 100 002 EEEE 2007/02/01 9 004 FFFF 2007/02/01 0 よろしくお願いします

  • COBOL プログラミング

    課題で「DBからデータを取得する際、それぞれの項目から登録日が最新のデータを1件取得する」という課題をしています。 そこで以下のような処理のプログラムを書きました。 IF MECIDENPYO_NO NOT = SPACE EXEC SQL SELECT  SKA_SAKI_CD --出荷先        ,SKA_TYPE --出荷タイプ INTO :A. SKA_SAKI_CD,   :A. SKA_TYPE FROM テーブル名 WHERE SKA_SLIP_NO LIKE '____' || :HST-EDIT_BIKOU AND DEL_FLG = '0' AND INS_DATE =(SELECT MAX(INS_DATE) FROM テーブル名 END-EXEC END-IF 上記の処理だとテーブルの中で登録日(INS_DATE)の最大値であるデータ1件だけしか取得できません。 私が実現したい機能はたとえば Aという項目とBという項目があったとして      登録日 A    2011/9/9 A 2011/9/11 A 2011/9/10 B 2011/8/9 B 2011/8/18 B 2011/9/20 Aの中で登録日が最新(最大)である A 2011/9/11 Aの中で登録日が最新(最大)である B 2011/9/20 を取得する処理を実現したいです!! これを実現するにはORDER BY して降順に並べた後に、ROWNUMを使うらしいのですが よくわかりません。どなたかプログラムで書いていただけますかか?? ヒントや考え方でもかまいません よろしくお願いいたします。

  • COBOLで入力レコードフォーマットが可変の場合

    COBOLのプログラミングの質問です。 基本的な質問かもしれませんが。。。 入力となるレコードのフォーマットが可変である場合、 DATA DIVISIONをどのように定義をすれば必要な項目を得られるでしょうか? たとえば以下の場合です。  入力レコード:1024バイト  レコード内容:開始4バイトは固定。          以降は、A(10バイト)、B(20バイト)、C(30バイト)のいずれかのパターンが来る。          ※AからCの先頭1バイトのフラグでA,B,Cのどれかがわかる          Aのフォーマット            1バイト目:フラグ、2~4バイト目:レコード長、5~10バイト目:会社名          Bのフォーマット            1バイト目:フラグ、2~4バイト目:レコード長、5~10バイト目:会社名、            11~20バイト目:会社の従業員数          Cのフォーマット            1バイト目:フラグ、2~4バイト目:レコード長、5~10バイト目:会社名、            11~20バイト目:会社の従業員数、21~30バイト目:会社の売上金額      [レコードの例]      1レコード目:固定部,C,B,A,B,B・・・B,B      2レコード目:固定部,A,C,C,A,B・・・B,C      上記のレコードから、会社名や会社の売上金額を取り出すようにしたいです。  入力レコードのフォーマットが決まっていれば、その項目にそって定義すればよいと思いますが  決まっていない場合の方法がわかりません。  また、読み込んでから判断する必要があるため、どうしてよいかわかりません。  質問内容がわかりにくくてすみませんが、わかる方がいましたらよろしくおねがいします。

  • COBOL

    すごい簡単な問題なんで恐縮します。COBOL超初心者です。 通信学習で学んでるのですが、テキストに詳しく載っていないので行き詰っています。 下記A, B, Cの値を求めなさい。 MOVE 9 TO A. COMPUTE B = A / 3 COMPUTE C = A + B COMPUTE A = A * 2 で、私が考えた答は、 A = 18 B = 3 C = 12     です。 自分の出した答に全く自信がありません。 どなたか、合っているか教えて下さいませんか? そして、間違っている場合、答の求め方を教えて下されば幸いです。 宜しくお願いいたします。

  •  cobolのカーソルについて

     cobolのカーソルについて  初投稿させていただきます。ですので体裁やルールを守れていない場合は、ご指摘願います。  cobolにおいて埋め込みSQL文によるカーソルをオープンし、fetchでテーブルを読み込む作業についてなんですが、一度のプログラム起動において同じテーブルを複数回読むにはどのようなソースを描けばよいのでしょうか。  具体的にはあるテーブルの5個のレコードを上から順に何度も読むといった次第です。  お分かりになられる方がいましたら、ご指導願います。よろしくお願いします。