在 COBOL 中执行 until 循环仅读取一次,然后尽管条件仍然为假但仍会中断
Perform until loop in COBOL only reads once, then breaks out despite the condition still being false
对 COBOL 还是很陌生。我有一个简单的程序 运行s 读取一个文件,然后读取该文件的内容并将其格式化为另一个文件。我的主要问题在于事实上由于某种原因,我的模块将测试条件,发现它是假的,然后执行里面的语句。之后,它会在不改变条件的情况下重复该过程,然后终止程序。根据调试器,它甚至没有 运行 最后一个模块,200-TERM-RECORD,它只是结束。
这是程序的代码
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL
SELECT INVENT-FILE-IN
ASSIGN TO "C:\TEST.TXT"
ORGANIZATION IS LINE SEQUENTIAL.
SELECT INVENT-REPORT-OUT
ASSIGN TO "C:\INVREPT.TXT"
ORGANIZATION IS LINE SEQUENTIAL.
data division.
FILE SECTION.
FD INVENT-FILE-IN
RECORD CONTAINS 32 CHARACTERS.
01 INVENTORY-DATA-INPUT
05 PART-NUMBER-INPUT PIC 9(5)
05 PART-NAME-INPUT PIC X(20)
05 QUANTITY-ON-HAND-INPUT PIC 9(3)
05 UNIT-PRICE-INPUT PIC 9(4)
FD INVENT-REPORT-OUT
RECORD CONTAINS 77 CHARACTERS.
01 INVENTORY-DATA-OUTPUT
05 HEADER
10 PRODUCT-NUMBER PIC A(6)
10 FILLER PIC A(1)
10 PRODUCT-NAME PIC A(8)
10 FILLER PIC A(16)
10 PRODUCT-QTY PIC A(3)
10 FILLER PIC A(3)
10 PRODUCT-VALUE PIC A(5)
10 FILLER PIC A(3)
05 PART-NUMBER-OUTPUT PIC 9(5)
05 PART-NAME-OUTPUT PIC X(20)
05 QUANTITY-ON-HAND-OUTPUT PIC 9(3)
05 UNIT-PRICE-OUTPUT PIC 9(4)
05 SUPPLIER-CODE-OUTPUT PIC X(5)
05 RE-ORDER-POINT-OUTPUT PIC 9(3)
05 RECORD-COUNTER-OUTPUT PIC 9(2)
working-storage section.
01 VALUES-AND-TOTALS
05 EOF-SWITCH PIC X(1) VALUE "N"
05 TOTAL-VALUE PIC 9(6) VALUE ZERO
05 INVENTORY-VALUE PIC 9(6) VALUE ZERO
05 RECORD-COUNTER PIC 9(2) VALUE ZERO
procedure division.
100-CREATE-INVENTORY-RECORD.
PERFORM 200-INIT-CREATE-INV-RECORD.
PERFORM 200-CREATE-RECORD
UNTIL EOF-SWITCH = "Y".
PERFORM 200-TERM-RECORD.
200-INIT-CREATE-INV-RECORD.
PERFORM 700-OPEN-INV-FILE.
PERFORM 700-READ-FILE.
200-CREATE-RECORD.
PERFORM 700-WRITE-RECORD.
PERFORM 700-READ-FILE.
200-TERM-RECORD.
CLOSE INVENT-FILE-IN.
CLOSE INVENT-REPORT-OUT.
700-OPEN-INV-FILE.
OPEN INPUT INVENT-FILE-IN.
OPEN OUTPUT INVENT-REPORT-OUT.
700-READ-FILE.
READ INVENT-FILE-IN
AT END MOVE "Y" TO EOF-SWITCH.
700-WRITE-RECORD.
MOVE PART-NUMBER-INPUT TO PART-NUMBER-OUTPUT.
MOVE PART-NAME-INPUT TO PART-NAME-OUTPUT.
MOVE QUANTITY-ON-HAND-INPUT TO QUANTITY-ON-HAND-OUTPUT.
MOVE UNIT-PRICE-INPUT TO UNIT-PRICE-OUTPUT.
WRITE INVENTORY-DATA-OUTPUT.
goback.
end program Project2.
您的代码流(从 100-create 开始)是:
- 200-初始化
- 700开
- 700 次阅读
- 200-创建
- 700-写入 -> 返回
不涉及循环...
一般
我建议使用 SECTION
并且只在主 SECTION
或从 prog-end SECTION
中调用 GOBACK
你的主要(在特殊情况下也可能被调用)。
将 goback
语句从程序末尾移至第一段末尾。
在700-WRITE-RECORD
中,当控制到达goback
语句时程序终止。您可能希望程序在 100-CREATE-INVENTORY-RECORD
.
结束时终止
对 COBOL 还是很陌生。我有一个简单的程序 运行s 读取一个文件,然后读取该文件的内容并将其格式化为另一个文件。我的主要问题在于事实上由于某种原因,我的模块将测试条件,发现它是假的,然后执行里面的语句。之后,它会在不改变条件的情况下重复该过程,然后终止程序。根据调试器,它甚至没有 运行 最后一个模块,200-TERM-RECORD,它只是结束。
这是程序的代码
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL
SELECT INVENT-FILE-IN
ASSIGN TO "C:\TEST.TXT"
ORGANIZATION IS LINE SEQUENTIAL.
SELECT INVENT-REPORT-OUT
ASSIGN TO "C:\INVREPT.TXT"
ORGANIZATION IS LINE SEQUENTIAL.
data division.
FILE SECTION.
FD INVENT-FILE-IN
RECORD CONTAINS 32 CHARACTERS.
01 INVENTORY-DATA-INPUT
05 PART-NUMBER-INPUT PIC 9(5)
05 PART-NAME-INPUT PIC X(20)
05 QUANTITY-ON-HAND-INPUT PIC 9(3)
05 UNIT-PRICE-INPUT PIC 9(4)
FD INVENT-REPORT-OUT
RECORD CONTAINS 77 CHARACTERS.
01 INVENTORY-DATA-OUTPUT
05 HEADER
10 PRODUCT-NUMBER PIC A(6)
10 FILLER PIC A(1)
10 PRODUCT-NAME PIC A(8)
10 FILLER PIC A(16)
10 PRODUCT-QTY PIC A(3)
10 FILLER PIC A(3)
10 PRODUCT-VALUE PIC A(5)
10 FILLER PIC A(3)
05 PART-NUMBER-OUTPUT PIC 9(5)
05 PART-NAME-OUTPUT PIC X(20)
05 QUANTITY-ON-HAND-OUTPUT PIC 9(3)
05 UNIT-PRICE-OUTPUT PIC 9(4)
05 SUPPLIER-CODE-OUTPUT PIC X(5)
05 RE-ORDER-POINT-OUTPUT PIC 9(3)
05 RECORD-COUNTER-OUTPUT PIC 9(2)
working-storage section.
01 VALUES-AND-TOTALS
05 EOF-SWITCH PIC X(1) VALUE "N"
05 TOTAL-VALUE PIC 9(6) VALUE ZERO
05 INVENTORY-VALUE PIC 9(6) VALUE ZERO
05 RECORD-COUNTER PIC 9(2) VALUE ZERO
procedure division.
100-CREATE-INVENTORY-RECORD.
PERFORM 200-INIT-CREATE-INV-RECORD.
PERFORM 200-CREATE-RECORD
UNTIL EOF-SWITCH = "Y".
PERFORM 200-TERM-RECORD.
200-INIT-CREATE-INV-RECORD.
PERFORM 700-OPEN-INV-FILE.
PERFORM 700-READ-FILE.
200-CREATE-RECORD.
PERFORM 700-WRITE-RECORD.
PERFORM 700-READ-FILE.
200-TERM-RECORD.
CLOSE INVENT-FILE-IN.
CLOSE INVENT-REPORT-OUT.
700-OPEN-INV-FILE.
OPEN INPUT INVENT-FILE-IN.
OPEN OUTPUT INVENT-REPORT-OUT.
700-READ-FILE.
READ INVENT-FILE-IN
AT END MOVE "Y" TO EOF-SWITCH.
700-WRITE-RECORD.
MOVE PART-NUMBER-INPUT TO PART-NUMBER-OUTPUT.
MOVE PART-NAME-INPUT TO PART-NAME-OUTPUT.
MOVE QUANTITY-ON-HAND-INPUT TO QUANTITY-ON-HAND-OUTPUT.
MOVE UNIT-PRICE-INPUT TO UNIT-PRICE-OUTPUT.
WRITE INVENTORY-DATA-OUTPUT.
goback.
end program Project2.
您的代码流(从 100-create 开始)是:
- 200-初始化
- 700开
- 700 次阅读
- 200-创建
- 700-写入 -> 返回
不涉及循环...
一般
我建议使用 SECTION
并且只在主 SECTION
或从 prog-end SECTION
中调用 GOBACK
你的主要(在特殊情况下也可能被调用)。
将 goback
语句从程序末尾移至第一段末尾。
在700-WRITE-RECORD
中,当控制到达goback
语句时程序终止。您可能希望程序在 100-CREATE-INVENTORY-RECORD
.