2016-09-21 56 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」。我怎麼把它拿走?還有,無論如何要一次顯示所有記錄多次顯示屏幕,而不是按下按鈕進入具有以下記錄的下一個屏幕? –

相關問題