我有一个从UNIT=TAPE读取记录的COBOL程序
记录长度是可变长度。
我试图读取可变长度的记录,并将记录长度转换为变量,但得到的长度为零。
我的问题是我写的代码有什么问题
这是我的密码:
IDENTIFICATION DIVISION.
PROGRAM-ID. TDCBLALC.
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT KOVETZ-SPOOL ASSIGN TO OTFILE
ORGANIZATION IS SEQUENTIAL
ACCESS MODE IS SEQUENTIAL
FILE STATUS IS SW-END.
DATA DIVISION.
FILE SECTION.
FD KOVETZ-SPOOL
LABEL RECORD IS STANDARD
RECORD IS VARYING IN SIZE FROM 1 TO 12600
DEPENDING ON ORECH-S
RECORDING MODE IS V.
01 RESHUMAT-SPOOL PIC X(12600).
WORKING-STORAGE SECTION.
01 ORECH-S PIC 9(8) COMP.
01 I PIC S9(4) VALUE 0.
01 SW-END PIC 99.
01 FN PIC X(44).
01 WS-ALLOC-STRING PIC X(100).
01 PGM PIC X(08) VALUE 'BPXWDYN'.
PROCEDURE DIVISION.
MOVE 'LYTO.SPOOL.PISD0735.T1401803.M001.D1191030' TO FN.
STRING 'ALLOC DD(OTFILE) DSN(' DELIMITED BY SIZE
FN DELIMITED BY SPACE
') SHR REUSE '
' UNIT(TAPE) '
DELIMITED BY SIZE
INTO WS-ALLOC-STRING
END-STRING.
DISPLAY ' WS-ALLOC-STRING *' WS-ALLOC-STRING '*'
CALL PGM USING WS-ALLOC-STRING.
DISPLAY 'ALLOC RC='RETURN-CODE.
OPEN INPUT KOVETZ-SPOOL
DISPLAY 'OPEN RC='RETURN-CODE.
MOVE 00 TO SW-END
READ KOVETZ-SPOOL
AT END MOVE 1 TO SW-END
END-READ
DISPLAY 'READ RC='RETURN-CODE' SW-END='SW-END
PERFORM UNTIL SW-END = 1 OR I > 100
ADD 1 TO I
DISPLAY 'ORECH-S=' ORECH-S
DISPLAY 'RESHUMAT-SPOOL=' RESHUMAT-SPOOL(1:100)
READ KOVETZ-SPOOL
AT END MOVE 1 TO SW-END
END-READ
DISPLAY 'READ RC='RETURN-CODE' SW-END='SW-END
END-PERFORM
CLOSE KOVETZ-SPOOL
GOBACK. alloc=0的返回码
open=0的返回码
read=0的返回码
读取后的文件状态(SW-END)为47 (未打开的文件已尝试读取或启动操作,输入或I-O)。
我不知道为什么,我显式地打开文件输入
不管怎样,的问题依然存在。读取后的记录长度为零。
ORECH-S=00000000
发布于 2020-05-05 17:32:40
简单的错误-您忘记声明工作-存储部分。
IDENTIFICATION DIVISION.
PROGRAM-ID. TDCBLALC.
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT KOVETZ-SPOOL
ASSIGN TO OTFILE
ORGANIZATION IS SEQUENTIAL
FILE STATUS IS SW-END.
DATA DIVISION.
FILE SECTION.
FD KOVETZ-SPOOL
LABEL RECORD IS STANDARD
RECORD IS VARYING IN SIZE FROM 1 TO 32600
DEPENDING ON ORECH-S
RECORDING MODE IS V.
01 RESHUMAT-SPOOL PIC X(32600).
WORKING-STORAGE SECTION.
01 ORECH-S PIC 9(8) COMP.
01 I PIC S9(4) VALUE 0.
01 SW-END PIC X(02).
01 FN PIC X(44).
01 WS-ALLOC-STRING PIC X(100).
01 PGM PIC X(08) VALUE 'BPXWDYN'.
PROCEDURE DIVISION.
MOVE 'LYTO.SPOOL.PISD0735.T1401803.M001.D1191030' TO FN.
STRING 'ALLOC DD(OTFILE) DSN(' FN ') SHR REUSE '
' UNIT(TAPE) '
DELIMITED BY SIZE
INTO WS-ALLOC-STRING
END-STRING.
DISPLAY ' WS-ALLOC-STRING *' WS-ALLOC-STRING '*'
CALL PGM USING WS-ALLOC-STRING.
DISPLAY RETURN-CODE.
OPEN INPUT KOVETZ-SPOOL
READ KOVETZ-SPOOL
AT END MOVE 1 TO SW-END
END-READ
PERFORM UNTIL SW-END = 1 OR I > 100
ADD 1 TO I
DISPLAY 'ORECH-S=' ORECH-S
DISPLAY 'RESHUMAT-SPOOL=' RESHUMAT-SPOOL(1:100)
READ KOVETZ-SPOOL
AT END MOVE 1 TO SW-END
END-READ
END-PERFORM
CLOSE KOVETZ-SPOOL
GOBACK.我使用GnuCobol编译并运行了这个程序,因此程序在语法和逻辑上都是正确的。我确实替换了一个本地文件,并注释掉了对BPXDYN的调用,因为我在Linux上运行它,而且该文件有一个Z/OS命名约定。
文件分配失败,所以打开的文件也会失败,但他从未检查过文件状态。读取返回'47‘,因为文件从未成功打开
程序输出如下: ALLOC DD(OTFILE) DSN(LYTO.SPOOL.PISD0735.T1401803.M001.D1191030 ) SHR重用单元(磁带)
您需要数据集名称周围的引号,否则系统会尝试在其前缀加上您的TSO ID。
https://stackoverflow.com/questions/61609330
复制相似问题