是否可以在 cobol 中循环显示多个屏幕?
Is it possible to display multiple screens in a loop in cobol?
所以我试图在 OpenCobolIDE 中制作一个程序,该程序使用 COBOL 中的 SCREEN SECTION
功能来创建一个菜单,用户可以在其中选择是要输入数据还是显示数据。
此数据记录在连续的 .txt 文件中。写的过程很顺利所以这里就不添加这部分的代码了。问题出在阅读过程中。我希望程序在 PERFORM
循环中多次显示 DISPLAY-SCREEN
,显示我文件中的所有记录,但这不起作用。我认为通过从我的 DISPLAY-SCREEN
中删除 BLANK SCREEN
它会按照我想要的方式工作,但所有发生的事情是程序只显示 DISPLAY-SCREEN
并且它甚至不显示任何记录。可能是什么问题呢?这是代码:
IDENTIFICATION DIVISION.
PROGRAM-ID.PGM001.
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT MYFILE ASSIGN TO "DATA.TXT"
ORGANIZATION IS LINE SEQUENTIAL.
DATA DIVISION.
FILE SECTION.
FD MYFILE.
01 FS-TB.
02 FS-ID PIC X(03).
02 FS-NAME PIC A(15).
02 FS-PHONE PIC X(09).
WORKING-STORAGE SECTION.
01 WS-TB.
02 WS-ID PIC X(03).
02 WS-NAME PIC A(15).
02 WS-PHONE PIC X(09).
01 WS-EOF PIC A(01) VALUE "N".
01 WS-COUNT PIC 9(01) VALUE ZERO.
01 WS-OP PIC 9(01).
SCREEN SECTION.
01 MENU-SCREEN.
02 BLANK SCREEN.
02 LINE 1 COL 1 VALUE "------------------------------------".
02 LINE 2 COL 1 VALUE "- MENU -".
02 LINE 3 COL 1 VALUE "------------------------------------".
02 LINE 4 COL 1 VALUE "- (1).REGISTER -".
02 LINE 5 COL 1 VALUE "- (2).DISPLAY -".
02 LINE 6 COL 1 VALUE "- (3).EXIT -".
02 LINE 7 COL 1 VALUE "- -".
02 LINE 8 COL 1 VALUE " OPTION:( ) -".
02 LINE 9 COL 1 VALUE "------------------------------------".
02 LINE 8 COL 20 PIC 9(01) TO WS-OP.
01 DISPLAY-SCREEN.
02 LINE 1 COL 1 VALUE "------------------------------------".
02 LINE 2 COL 1 VALUE "- DISPLAY -".
02 LINE 3 COL 1 VALUE "------------------------------------".
02 LINE 4 COL 1 VALUE "-(1).ID : -".
02 LINE 4 COL 18 PIC X(03) FROM WS-ID.
02 LINE 5 COL 1 VALUE "-(2).NAME : -".
02 LINE 5 COL 18 PIC A(15) FROM WS-NAME.
02 LINE 6 COL 1 VALUE "-(3).PHONE : -".
02 LINE 6 COL 18 PIC X(09) FROM WS-PHONE.
02 LINE 7 COL 1 VALUE "------------------------------------".
PROCEDURE DIVISION.
A-100.
DISPLAY MENU-SCREEN.
ACCEPT MENU-SCREEN.
EVALUATE WS-OP
WHEN 1
GO TO A-200
WHEN 2
GO TO A-300
WHEN 3
STOP RUN
WHEN OTHER
GO TO A-100
END-EVALUATE.
A-200.
A-300.
OPEN INPUT MYFILE
PERFORM UNTIL WS-EOF = "Y"
READ MYFILE INTO WS-TB
AT END MOVE "Y" TO WS-EOF
NOT AT END DISPLAY DISPLAY-SCREEN
END-READ
END-PERFORM
CLOSE MYFILE.
STOP RUN.
END PROGRAM PGM001.
正如 Bill 已经指出的那样:PERFORM
和 DISPLAY
太快了。
要查看每条记录,您需要在 DISPLAY
之后添加一个 ACCEPT
,我想 ACCEPT OMITTED
可以工作,如果不添加虚拟变量和 ACCEPT
这个。
您似乎不想在 PERFORM
期间停止该程序,那么您可以在程序末尾添加一个 ACCEPT DUMMY
(如果您使用扩展 DISPLAY/ACCEPT
,这总是有用的)。但是您只会显示最后一项。
根据您的需要,在DISPLAY DISPLAY-SCREEN
之后的CALL 'CBL_OC_NANOSLEEP' USING 500000000
(等待半秒)或CALL 'C$SLEEP' USING 1
可能就是您想要的结果。
但可能最好的选择是 ACCEPT dummy WITH TIMEOUT time
(如果您按 ENTER,它会直接进入下一个 DISPLAY
,如果您不这样做,它将等待指定的时间,然后再执行下一个 DISPLAY
.
所以我试图在 OpenCobolIDE 中制作一个程序,该程序使用 COBOL 中的 SCREEN SECTION
功能来创建一个菜单,用户可以在其中选择是要输入数据还是显示数据。
此数据记录在连续的 .txt 文件中。写的过程很顺利所以这里就不添加这部分的代码了。问题出在阅读过程中。我希望程序在 PERFORM
循环中多次显示 DISPLAY-SCREEN
,显示我文件中的所有记录,但这不起作用。我认为通过从我的 DISPLAY-SCREEN
中删除 BLANK SCREEN
它会按照我想要的方式工作,但所有发生的事情是程序只显示 DISPLAY-SCREEN
并且它甚至不显示任何记录。可能是什么问题呢?这是代码:
IDENTIFICATION DIVISION.
PROGRAM-ID.PGM001.
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT MYFILE ASSIGN TO "DATA.TXT"
ORGANIZATION IS LINE SEQUENTIAL.
DATA DIVISION.
FILE SECTION.
FD MYFILE.
01 FS-TB.
02 FS-ID PIC X(03).
02 FS-NAME PIC A(15).
02 FS-PHONE PIC X(09).
WORKING-STORAGE SECTION.
01 WS-TB.
02 WS-ID PIC X(03).
02 WS-NAME PIC A(15).
02 WS-PHONE PIC X(09).
01 WS-EOF PIC A(01) VALUE "N".
01 WS-COUNT PIC 9(01) VALUE ZERO.
01 WS-OP PIC 9(01).
SCREEN SECTION.
01 MENU-SCREEN.
02 BLANK SCREEN.
02 LINE 1 COL 1 VALUE "------------------------------------".
02 LINE 2 COL 1 VALUE "- MENU -".
02 LINE 3 COL 1 VALUE "------------------------------------".
02 LINE 4 COL 1 VALUE "- (1).REGISTER -".
02 LINE 5 COL 1 VALUE "- (2).DISPLAY -".
02 LINE 6 COL 1 VALUE "- (3).EXIT -".
02 LINE 7 COL 1 VALUE "- -".
02 LINE 8 COL 1 VALUE " OPTION:( ) -".
02 LINE 9 COL 1 VALUE "------------------------------------".
02 LINE 8 COL 20 PIC 9(01) TO WS-OP.
01 DISPLAY-SCREEN.
02 LINE 1 COL 1 VALUE "------------------------------------".
02 LINE 2 COL 1 VALUE "- DISPLAY -".
02 LINE 3 COL 1 VALUE "------------------------------------".
02 LINE 4 COL 1 VALUE "-(1).ID : -".
02 LINE 4 COL 18 PIC X(03) FROM WS-ID.
02 LINE 5 COL 1 VALUE "-(2).NAME : -".
02 LINE 5 COL 18 PIC A(15) FROM WS-NAME.
02 LINE 6 COL 1 VALUE "-(3).PHONE : -".
02 LINE 6 COL 18 PIC X(09) FROM WS-PHONE.
02 LINE 7 COL 1 VALUE "------------------------------------".
PROCEDURE DIVISION.
A-100.
DISPLAY MENU-SCREEN.
ACCEPT MENU-SCREEN.
EVALUATE WS-OP
WHEN 1
GO TO A-200
WHEN 2
GO TO A-300
WHEN 3
STOP RUN
WHEN OTHER
GO TO A-100
END-EVALUATE.
A-200.
A-300.
OPEN INPUT MYFILE
PERFORM UNTIL WS-EOF = "Y"
READ MYFILE INTO WS-TB
AT END MOVE "Y" TO WS-EOF
NOT AT END DISPLAY DISPLAY-SCREEN
END-READ
END-PERFORM
CLOSE MYFILE.
STOP RUN.
END PROGRAM PGM001.
正如 Bill 已经指出的那样:PERFORM
和 DISPLAY
太快了。
要查看每条记录,您需要在 DISPLAY
之后添加一个 ACCEPT
,我想 ACCEPT OMITTED
可以工作,如果不添加虚拟变量和 ACCEPT
这个。
您似乎不想在 PERFORM
期间停止该程序,那么您可以在程序末尾添加一个 ACCEPT DUMMY
(如果您使用扩展 DISPLAY/ACCEPT
,这总是有用的)。但是您只会显示最后一项。
根据您的需要,在DISPLAY DISPLAY-SCREEN
之后的CALL 'CBL_OC_NANOSLEEP' USING 500000000
(等待半秒)或CALL 'C$SLEEP' USING 1
可能就是您想要的结果。
但可能最好的选择是 ACCEPT dummy WITH TIMEOUT time
(如果您按 ENTER,它会直接进入下一个 DISPLAY
,如果您不这样做,它将等待指定的时间,然后再执行下一个 DISPLAY
.