有没有办法在COBOL中参数化函数?

时间:2011-01-27 16:50:27

标签: 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.

读取几个文件,我想知道是否有办法编写一个能够从变量中读取文件名的例程,所以我不必为每个文件编写相同的代码。谢谢!

4 个答案:

答案 0 :(得分: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.
   class-id FileLineCounter.
   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.

答案 1 :(得分:1)

参数化例程的正确Cobol方法是通过嵌套子程序。

您可以执行您想要的操作,但这取决于您的编译器和环境,您可以传递文件,文件名或DDname。

你在哪个平台上?

编辑:在z / OS上,您可以使用putenv()更改FILE-A在运行时指向的内容,以调整与FILE-A使用的DDNAME关联的数据集名称。

请参阅:    http://ibmmainframes.com/post-57281.html    http://cicswiki.org/cicswiki1/index.php?title=How_do_I_allocate_a_file_dynamically_using_COBOL%3F

切换文件之间也需要一个OPEN-A和CLOSE-A段落。

并不是将参数传递给read语句,但它允许您为不同的文件重用OPEN / READ / WRITE / CLOSE语句。但只是连续的。

在VS COBOL II下,有一种方法可以将FD传递给子程序,这看起来像是:

使用文件A调用MYREADPGM    使用FILE-B打电话给MYREADPGM

这可能与Enterprise Cobol有关,但IIRC VisualAge不支持。

答案 2 :(得分:0)

在编译器支持下可能不是“野外”,但当前的ISO Draft 20xx标准包含 FUNCTION-ID 代替PROGRAM-ID。它为COBOL添加了一个参数友好函数调用计算范例。

今天可能没有帮助,但可能在不久的将来。如果我没有弄错的话,用户定义的函数实际上来自COBOL 2002规范,但似乎编译器供应商对该功能的支持有所不同。

FUNCTION-ID支持是针对OpenCOBOL 2.0的封闭式试验,但2.0发布的时间表尚未确定,可能需要一年或更长时间才能公布。

答案 3 :(得分:-1)

您可以创建文件名的数据文件,将每个文件名视为单个记录,然后读取每个文件。在“SELECT ... ASSIGN”中,您需要为文件名使用工作存储变量,并将值从“文件名文件”移动到其中。

当您使用VisualAge时,我假设在UNIX中,您也可以从shell(sh,ksh)运行程序,文件名作为参数,并从shell为每个文件重复运行程序名。