PC COBOL 程序到 JCL

PC COBOL program to JCL

我有以下简单的 COBOL 程序 - 为 PC 编写。它只是从计算机中读取一个文件并写入文件:

ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT CUSTOMER-FILE ASSIGN TO
"C:Customers.dat"
ORGANIZATION IS LINE SEQUENTIAL.
DATA DIVISION.
FILE SECTION.
FD CUSTOMER-FILE.
01 CUSTOMER-RECORD.
05 FIRST-NAME PIC X(20).
05 LAST-NAME PIC X(20).
WORKING-STORAGE SECTION.
01 WS-CUSTOMER-RECORD.
05 WS-FIRST-NAME PIC X(20).
05 WS-LAST-NAME PIC X(20).
01 WS-EOF PIC X.
PROCEDURE DIVISION.
OPEN OUTPUT CUSTOMER-FILE
PERFORM UNTIL CUSTOMER-RECORD = SPACES
DISPLAY "Enter the first and last name for the customer"
ACCEPT CUSTOMER-RECORD
WRITE CUSTOMER-RECORD
END-PERFORM
CLOSE CUSTOMER-FILE
DISPLAY "Output from the Customer File:"
OPEN INPUT CUSTOMER-FILE.
PERFORM UNTIL WS-EOF = 'Y'
READ CUSTOMER-FILE INTO WS-CUSTOMER-RECORD
AT END MOVE 'Y' TO WS-EOF
NOT AT END DISPLAY WS-CUSTOMER-RECORD
END-READ
END-PERFORM.
CLOSE CUSTOMER-FILE.
GOBACK.

我的问题:我对JCL不是很熟悉。所以如果我把这个程序放在大型机上,我会为 JCL 做什么?

我猜你的识别部门在前往 Stack Overflow 的途中在剪切和粘贴事件中迷路了;你会需要的。

IBM Enterprise COBOL 的当前版本不允许自由格式源代码,因此为了让您的代码能够编译,您必须重新格式化并遵循传统的固定格式。

您的 Assign clause 必须引用与 JCL 中的 DD 名称相对应的名称,而不是通过名称引用您的数据文件。选择一些有意义的东西,尽可能在 8 个字符内,也许是 CUSTOMER。

由于您是 运行 JCL,因此您的 Accept statement 工作方式会有所不同。数据可能来自 SYSIN DD。

您的 JCL 看起来像这样...

[job card, which is shop-specific]
//TOMSPGM  EXEC PGM=yourProgramName
//STEPLIB  DD  DISP=SHR,DSN=mainframe.dataset.where.you.bound.your.program
//SYSIN    DD  *
[your customer records]
//CUSTOMER DD  DISP=(NEW,CATLG,DELETE),
//             DSN=mainframe.dataset.where.your.data.should.end.up,
//             LRECL=40,
//             AVGREC=U,
//             RECFM=FB,
//             SPACE=(40,(10,10),RLSE) Adjust to your needs
//SYSOUT       SYSOUT=*
//CEEDUMP      SYSOUT=*

我不确定这将如何与您创建客户文件然后在同一程序中读取它一起工作。在 30 年的大型机工作中,我从未见过这种情况。

添加来自@cschneid 的回答。

很高兴看到 AVGREC 被用于 DD 语句来为数据集分配 space。这比使用老式的 CYLTRK 单位要好得多。 不幸的是,恕我直言,IBM z/OS 架构师未能实现更现代的是指定 space:KiB 或 MiB。 (ISPF 支持 KB 和 MB 作为 space 单位,JCL 不支持。)

使用 AVGREC 您告诉系统 SPACE= 主要和次要 space 值是 记录数 ,而不是物理单位例如轨道或圆柱体。

//CUSTOMER DD  ...
//             AVGREC=U,
//             SPACE=(40,(10,20),RLSE) 

以上语句告诉系统写入的记录平均长度为40字节(这完全独立于RECFM=,或LRECL=!)。使用 AVGREC=UU 表示 单位 ),这进一步告诉系统为 10 条记录分配初始(主要)space,并添加额外的space 20 条记录,每次需要更多 space(有上限)。

物理分配仍在轨道或引擎盖下的圆柱体中。系统计算

所需的轨道或柱面
"average record length" * "number of records" * avgrec-unit

对于主要分配,这是

40 * 10 * 1 = 400 bytes

很好。但是我们如何使用这些关键字在 KiB 或 MiB 中指定我们的 space 需求?

请记住,SPACE= 参数中的 平均记录长度 与通过 [ 指定的 实际记录长度 完全无关=22=]。太好了,所以我们可以自由选择平均记录长度,并将其设置为,比如说,1。让我们也将上面论坛中的“记录数*”改为“数单位”。公式变为:

1 * "number of units" * avgrec-unit

"number of units" * avgrec-unit

AVGREC=支持单位U(1)、K(1024)、M(1024*1024)。因此,要以兆字节 (MiB) 为单位分配 space,我们只需编写代码:

//CUSTOMER DD  ...
//             AVGREC=M,
//             SPACE=(1,(10,20),RLSE) 

这将分配 10 MiB 主要 space 和 20 MiB 次要 space。根据物理磁盘结构,每个分配都向上舍入到下一个整数轨道或柱面。您根本不必再关心了。很整洁,不是吗?