【问题标题】:Is it possible to display multiple screens in a loop in cobol?是否可以在 cobol 中循环显示多个屏幕?
【发布时间】:2016-09-21 00:45:29
【问题描述】:

所以我试图在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.

【问题讨论】:

  • 在您的 DISPLAY 之后添加 ACCEPT。屏幕太快了,你看不到,然后恢复到你的“命令行”

标签: cobol gnucobol


【解决方案1】:

正如比尔已经指出的那样:PERFORMDISPLAY 太快了。

要查看您需要在DISPLAY 之后添加ACCEPT 的每条记录,我猜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

【讨论】:

  • 我尝试在 DISPLAY DISPLAY-SCREEN 之后放置一个 ACCEPT,但它最终只显示了第一条记录。我不知道我是否按照您的意思编码。它看起来像这样:NOT AT END DISPLAY DISPLAY-SCREEN ACCEPT DUMMY
  • @LeviMoraes 是的,这正是我提到的选项 1 - 它会在第一个记录之后停止,直到你按下回车键,然后在第二个记录之后再次停止,然后...... - 如果你认为这个不能复制整个程序,只包括READ 部分和直接DISPLAY record UPON SYSOUT - 它应该输出相同(只有没有来自ACCEPT 的暂停)。选项 b 导致所有记录显示为可调整的暂停和自动下一个显示。更好:(我会将此选项添加到第一个选项中)将是 ACCEPT WITH TIMEOUT
  • 编译器无法识别 TIMEOUT 子句,也许我搞砸了语法。这是正确的:ACCEPT dummy WITH TIMEOUT 1000?当我必须按回车键接受虚拟变量时,它会在第一行出现一个烦人的“0”。我怎么能把它拿走?而且,有没有办法一次显示所有记录,多次显示屏幕,而不是按一个按钮进入下一个屏幕,显示以下记录?
  • @LeviMoraes 您最初的问题应该包括您使用的编译器的确切版本。您应该能够在 GnuCOBOL 选项卡的 about 对话框中看到这一点。 OpenCOBOL 1.1 也支持ACCEPT dummy WITH TIMEOUT time(时间是正数字文字或标识符)。如果 DUMMY 是 PIC X 项目,则任何地方都不应该有任何奇怪的零,但您可能希望使用 ACCEPT dummy AT ... WITH AUTO TIMEOUT 来定位它并消除对 enter 的需要(另一个键也可以使用)。
  • @LeviMoraes 如果您想一次DISPLAY 多条记录,您要么需要屏幕中的多个字段,要么在不使用带有固定 line/col 子句的屏幕条目的情况下显示它们(只显示记录)。
猜你喜欢
  • 1970-01-01
  • 2011-11-16
  • 1970-01-01
  • 2018-04-17
  • 1970-01-01
  • 1970-01-01
  • 2016-08-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多