2011-01-27 10 views
4

私のようなルーチンをコーディングしています:いくつかのファイルを読むためにCOBOLで関数をパラメータ化する方法はありますか?

READ-A. 
     READ FILE-A 
      AT END 
      MOVE 1 TO EOF-A 
      NOT AT END 
      ADD 1 TO CN-READ-A 
     END-READ. 
F-READ-A. EXIT. 

を、私はコードをする必要はありませんので、変数からファイル名を読み取ることができるルーチンをコーディングする方法があります場合、私は思っていました各ファイルについても同じことが言えます。ありがとう!

答えて

2

一つの解決方法上記の言ったように別の解決策解決策1.

である、私は以下の例が含まれている のために複数のプログラムまたはネストされたプログラムを、使用することです、あなたにではないかもしれませんCOBOLクラスにあります好きですが、私は好きなので、例2を挙げました。

解決策1:

program-id. TestProgram. 
    working-storage section. 
    01 file-name  pic x(128). 
    01 file-lines  pic 9(9). 
    procedure division. 
     move 0 to file-lines 
     move "d:\rts_win32.txt" to file-name 
     call "program1" using file-name file-lines 
     display file-lines 
     stop run 
    end program TestProgram. 
program-id. Program1. 

    file-control. 
     select file-a assign to myfile 
      organization is line sequential. 

    data division. 
    fd file-a. 
    01 file-a-line  pic x(80). 

    working-storage section. 
    01 EOF-A   pic 9 value 0. 
    linkage section. 
    01 lk-filename  pic x(128). 
    01 CN-READ-A  pic 9(9). 
    procedure division using lk-filename 
          CN-READ-A. 

     move lk-filename to myfile 
     open input file-a 

     perform READ-A until EOF-A equals 1 
     close file-a 
     goback. 

     READ-A. 
     READ FILE-A 
      AT END 
      MOVE 1 TO EOF-A 
      NOT AT END 
      ADD 1 TO CN-READ-A 
     END-READ. 
     F-READ-A. 
     EXIT. 


    end program Program1. 

溶液2

program-id. TestProgram.: 
    working-storage section. 
    01 file-counter type FileLineCounter. 
procedure division. 
     set file-counter to new type FileLineCounter("d:\rts_win32.txt") 
     display file-counter::LineCount 
     stop run 
    end program TestProgram. 
file-control. 
     select file-a assign to myfile 
      organization is line sequential. 

    data division. 
    fd file-a. 
    01 file-a-line  pic x(80). 

    working-storage section. 

    01 cn-read-a binary-long property as "LineCount". 

    method-id New. 
    01 EOF-A   pic 9 value 0. 
    procedure division using by value filename as string. 

     set myfile to filename 
     open input file-a 

     perform READ-A until EOF-A equals 1 
     close file-a 
     goback. 

     READ-A. 
     READ FILE-A 
      AT END 
      MOVE 1 TO EOF-A 
      NOT AT END 
      ADD 1 TO CN-READ-A 
     END-READ. 
     F-READ-A. 
     EXIT. 

    end method. 

    end class. 
+0

すてきな回避策。私は誰かがより直接的なアプローチを知っているかどうかを確認するために、これを数日間開いたままにします、ありがとう! –

1

ルーチンをパラメータ化する適切なCobolの方法は、ネストされたサブプログラムによるものです。

コンパイラと環境に依存しますが、ファイル、ファイル名、またはDD名を渡すことができます。

どのプラットフォームを使用していますか?

編集:z/OSでは、FILE-Aが使用するDDNAMEに関連付けられたデータセット名を調整するために、putenv()を使用して、実行時にFILE-Aが指しているものを変更できます。

を参照してください:あなたがOPEN-AおよびCLOSE-段落だけでなく間のスイッチングのファイルが必要になりますhttp://ibmmainframes.com/post-57281.html http://cicswiki.org/cicswiki1/index.php?title=How_do_I_allocate_a_file_dynamically_using_COBOL%3F

パラメータをあなたのread文に正確に渡すのではありませんが、異なるファイルに対してOPEN/READ/WRITE/CLOSE文を再利用することができます。しかし、唯一連続している。

のようなものになりますが、サブプログラムにFDを渡すことができVS COBOL II、下の方法、ありました:

CALL MYREADPGM使用して、ファイル・ CALLのMYREADPGMを使用してファイルを-B

は、

これはEnterprise Cobolでは可能ですが、IIRC VisualAgeはこれをサポートしていません。

+0

私はIBMのVisualAgeを使用しています。 –

-1

ファイル名のデータファイルを作成し、個々のレコードとして扱い、各ファイルを読み取ることができます。 "SELECT ... ASSIGN"では、ファイル名にワーキングストレージ変数を使用し、 'ファイル名のファイル'の値をそのファイルに移動する必要があります。

VisualAgeを使用しているので、私はUNIXで、ファイル名をパラメータとしてシェル(sh、ksh)からプログラムを実行し、それぞれのシェルからプログラムを繰り返し実行することもできますファイル名。

0

class-id FileLineCounter. 
は "野生で" まだコンパイラのサポートではないかもしれないが、現在のISOドラフト20XX標準は、PROGRAM-IDの代わりに FUNCTION-IDが含まれています。これは、COBOLにパラメーターに優しい関数呼び出し計算パラダイムを追加します。

今日は助かりませんが、近い将来可能性があります。私が間違っていない場合、ユーザー定義関数は実際にはCOBOL 2002仕様からのものですが、コンパイラベンダーはこの機能のサポートにヒットしているようです。

機能IDサポートはOpenCOBOL 2.0のクローズドトライアルでサポートされていますが、2.0リリースのタイムラインは未定で、公開されるまでにもう1年以上かかることがあります。

関連する問題