file - 在 COBOL 中写入顺序数据集使其成为无法访问的二进制文件
问题描述
以下代码应通过 DDINPUT 将顺序数据集作为描述银行账户的输入,并通过 DDOUTPUT 输出一个顺序数据集,其中包含余额大于 8,500,000 美元的银行账户所有者的姓名。但是,正如我们在 Stack Overflow 中一样,它没有。
IDENTIFICATION DIVISION.
PROGRAM-ID. TOPACCTS.
*
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT INFILE ASSIGN TO DDINPUT
ORGANIZATION IS SEQUENTIAL.
SELECT OUTFILE ASSIGN TO DDOUTPUT
ORGANIZATION IS SEQUENTIAL.
*
DATA DIVISION.
FILE SECTION.
FD INFILE RECORD CONTAINS 80 CHARACTERS RECORDING MODE F.
01 ACCT-FIELDS.
05 LAST-NAME PIC A(11).
05 FIRST-NAME PIC A(22).
05 ACCT-NO-A PIC 9(8).
05 FILLER PIC X(3) VALUE SPACES.
05 ACCT-NO-B PIC 9(8).
05 FILLER PIC X(9) VALUE SPACES.
05 ACCT-BALANCE PIC $,$$$,$$9.99.
*
FD OUTFILE RECORD CONTAINS 80 CHARACTERS RECORDING MODE F.
01 PRINT-ACC.
05 LAST-NAME-O PIC A(11) VALUE SPACES.
05 FILLER PIC X(2) VALUE SPACES.
05 FIRST-NAME-O PIC A(22) VALUE SPACES.
*
WORKING-STORAGE SECTION.
01 WS-EOF PIC A VALUE SPACE.
01 RES PIC 9(7)V99.
01 WS-RECORD.
05 WS-LAST-NAME PIC A(11).
05 WS-FIRST-NAME PIC A(22).
05 WS-ACCT-NO-A PIC 9(8).
05 WS-ACCT-NO-B PIC 9(8).
05 WS-ACCT-BALANCE PIC $,$$$,$$9.99.
*
PROCEDURE DIVISION.
*
OPEN INPUT INFILE.
OPEN OUTPUT OUTFILE.
PERFORM UNTIL WS-EOF = 'Y'
READ INFILE INTO WS-RECORD
AT END MOVE 'Y' TO WS-EOF
NOT AT END PERFORM WRITE-RECORD
END-READ
END-PERFORM.
CLOSE INFILE.
CLOSE OUTFILE.
STOP RUN.
*
WRITE-RECORD.
COMPUTE RES = FUNCTION NUMVAL-C (ACCT-BALANCE).
IF RES > 8500000
DISPLAY "Adding " WS-FIRST-NAME " " WS-LAST-NAME "..."
MOVE SPACES TO PRINT-ACC
MOVE WS-LAST-NAME TO LAST-NAME-O
MOVE WS-FIRST-NAME TO FIRST-NAME-O
DISPLAY "Writing " FIRST-NAME-O " " LAST-NAME-O "..."
WRITE PRINT-ACC
END-IF.
该代码正确地获取了余额大于 $8,500,000 的所有者的名称,但没有正确写入,因为当访问输出数据集时,VS Code 会引发以下错误:
无法打开文件:zowe_path。详细信息:文件似乎是二进制文件,无法以文本形式打开。
我是 COBOL 的新手,我不知道在写入输出时我做错了什么。也许是 JCL 导致了问题:
//TOPACJCL JOB 1,NOTIFY=&SYSUID
//***************************************************/
//COBRUN EXEC IGYWCL
//COBOL.SYSIN DD DSN=&SYSUID..SOURCE(TOPACCTS),DISP=SHR
//LKED.SYSLMOD DD DSN=&SYSUID..LOAD(TOPACCTS),DISP=SHR
//***************************************************/
// IF RC = 0 THEN
//***************************************************/
//RUN EXEC PGM=TOPACCTS
//STEPLIB DD DSN=&SYSUID..LOAD,DISP=SHR
//DDINPUT DD DSN=MY.DATA(INPUTD),DISP=SHR
//DDOUTPUT DD DSN=MY.DATA(OUTPUTD),DISP=SHR
//SYSOUT DD SYSOUT=*,OUTLIM=15000
//CEEDUMP DD DUMMY
//SYSUDUMP DD DUMMY
//***************************************************/
// ELSE
// ENDIF
希望你能帮助我,因为我过去几个小时一直在努力解决这个问题。提前致谢!
编辑#1:添加了“将空间移动到 PRINT-ACC”,仍然不起作用。
解决方案
在更新之前尝试将空格移动到输出记录
WRITE-RECORD.
COMPUTE RES = FUNCTION NUMVAL-C (ACCT-BALANCE).
IF RES > 8500000
DISPLAY "Adding " WS-FIRST-NAME " " WS-LAST-NAME "..."
Move space to PRINT-ACC
MOVE WS-LAST-NAME TO LAST-NAME-O
MOVE WS-FIRST-NAME TO FIRST-NAME-O
DISPLAY "Writing " FIRST-NAME-O " " LAST-NAME-O "..."
WRITE PRINT-ACC
END-IF.
基本上你只是在更新LAST-NAME-O
,FIRST-NAME-O
其余的记录将是十六进制零,因此被识别为二进制。您将能够使用ISPF edit
或File-Aid
等编辑大型机上的文件。
推荐阅读
- c# - ASP.NET 核心 MVC 中的动态依赖注入
- sql - SQL 查询 SSRS 报告
- ios - 使搜索栏通知 viewController 用户即将搜索
- android - React Native:在 Mac 终端上运行命令“npm run android”后看不到变化
- java - 在用户与按钮交互后禁用 Activity 上的按钮
- jenkins - 在詹金斯管道中将参数从for循环传递到多行sh
- python - 将矩阵提高到 n 次方
- office365 - Office 365 管理 API 通知数据 ClientIP 为空
- axapta - 表格网格中的动态字段 (X++)
- javascript - 动态 setState 在反应中添加新的动态属性