是否可以在cobol中循环显示多个屏幕?

时间:2016-09-21 00:45:30

标签: cobol gnucobol

所以我试图在OpenCobolIDE中创建一个程序,该程序使用COBOL中的SCREEN SECTION功能创建一个菜单,用户可以选择是否要输入数据或显示它。 此数据记录在顺序.txt文件中。写作过程很好,所以我不在这里添加这部分的代码。问题出在阅读过程中。我希望程序在DISPLAY-SCREEN循环中多次显示PERFORM,显示我文件中的所有记录,但这不起作用。我认为从BLANK SCREEN移除DISPLAY-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.

1 个答案:

答案 0 :(得分:4)

比尔已经指出:PERFORMDISPLAY太快了。

要查看在ACCEPT之后需要添加DISPLAY的每条记录,我猜ACCEPT OMITTED将起作用,如果没有添加虚拟变量而ACCEPT这个

您似乎不想在PERFORM期间停止该程序,然后您可以在程序结束时添加ACCEPT DUMMY(如果您使用扩展DISPLAY/ACCEPT,则始终有用)。但是你只会显示最后一项。

根据您的需要,CALL 'CBL_OC_NANOSLEEP' USING 500000000(等待半秒)或CALL 'C$SLEEP' USING 1之后DISPLAY DISPLAY-SCREEN可能是您想要的结果。

但最好的选择可能是ACCEPT dummy WITH TIMEOUT time(如果按ENTER键,它会直接进入下一个DISPLAY,如果不这样做,它会等到指定的时间再进行下一个DISPLAY }。