2016-09-21 91 views
1

所以我想在OpenCobolIDE中制作一个程序,它使用COBOL中的SCREEN SECTION功能创建一个菜单,用户可以选择是否要输入数据或显示数据。 此数据正在顺序.txt文件中记录。写入过程正常,所以我不在这里添加这部分代码。问题在于阅读过程。我希望程序在PERFORM循环中多次显示DISPLAY-SCREEN,以显示我的文件中的所有记录,但这不起作用。我认为通过从我的DISPLAY-SCREEN中删除BLANK SCREEN它会以我想要的方式工作,但所发生的只是该程序一次显示DISPLAY-SCREEN并且它甚至不显示任何记录。可能是什么问题呢?下面是代码:是否可以在cobol循环中显示多个屏幕?

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. 
+3

将你的显示器后接受。屏幕太快,你看不到,然后回到你的“命令行” –

回答

3

正如比尔已指出:本PERFORMDISPLAY太快。

要看到每一个记录you'd需要DISPLAY后添加一个ACCEPT,我想ACCEPT OMITTED将工作,如果不添加一个虚拟VAR和ACCEPT这一点。

您似乎不想在PERFORM期间停止该程序,那么您可以在程序结尾处添加ACCEPT DUMMY(如果使用扩展DISPLAY/ACCEPT,总是有用)。但是你只会显示最后一个项目。

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

但可能是最好的办法是ACCEPT dummy WITH TIMEOUT time(如果按Enter键直接进入下一DISPLAY如果你不将做下一个DISPLAY之前等待指定的时间。

+0

我试着在显示显示屏幕后放一个ACCEPT,但它最终只显示第一条记录。我不知道是否我编码的方式是这样的:看起来像这样:没有结束显示屏显示 - 屏幕接受虚拟 –

+0

@LeviMoraes是的,这正是我提到的选项1 - 它会停止后的第一条记录,直到你按下输入,然后再次如果你认为这不起作用复制整个程序,只包括'READ'部分和直接'DISPLAY记录UPON SYSOUT' - 它应该输出相同的(只有没有暂停'ACCEPT')。选项b导致显示的所有记录都具有可调节的暂停和自动下一个显示。 更好:(我将这个选项添加到第一个选项)将是'ACCEPT WITH TIMEOUT'。 –

+0

TIMEOUT子句没有被编译器识别,也许我搞砸了语法。这是正确的:ACCEPT dummy WITH TIMEOUT 1000?而当我不得不按下输入接受虚拟变量时,它在第一行显示为恼人的“0”。我怎么把它拿走?还有,无论如何要一次显示所有记录多次显示屏幕,而不是按下按钮进入具有以下记录的下一个屏幕? –

相关问题