2016-09-21 19 views
1

私はOpenCobolIDEでCOBOLのSCREEN SECTION機能を使用してユーザーがデータを入力するか表示するかを選択するメニューを作成するプログラムを作ろうとしています。 このデータは、連続した.txtファイルに記録されています。書き込みプロセスは正常に動作するので、ここではこのコードを追加しません。問題は読書過程にある。プログラムがのループに複数回表示され、ファイル内のすべてのレコードが表示されたが、これは機能していなかった。私は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

はあなたのDISPLAY後ACCEPT置きますあなたが見ることができる画面がちょうど速すぎて、 "コマンドライン"に戻る –

答えて

3

ビルはすでに指摘したように:PERFORMDISPLAYが速すぎます。 DISPLAYACCEPTを追加するためのすべてのレコードyou'd必要性を確認するには

、私はダミーvarとACCEPTこれを追加しない場合ACCEPT OMITTEDは、動作しますね。

PERFORMの間にプログラムを停止したくない場合は、プログラムの最後にACCEPT DUMMYを追加してください(拡張子がDISPLAY/ACCEPTの場合は常に便利です)。しかし、あなたは最後のアイテムを表示するだけです。

DISPLAY DISPLAY-SCREENの後にCALL 'CBL_OC_NANOSLEEP' USING 500000000(半分待つ)またはCALL 'C$SLEEP' USING 1の結果に応じて、必要な結果が得られます。

しかし、おそらく最良のオプションは、Enterキーを押した場合、あなたはそれが次の DISPLAYを行う前に、指定された時間を待っていますしていない場合、それは次の DISPLAYに直接行く( ACCEPT dummy WITH TIMEOUT timeだろう。

+0

DISPLAY DISPLAY-SCREENの後にACCEPTを置こうとしましたが、最初のレコードしか表示されませんでした。私はあなたが意味するようにコード化しました。これは次のように見えます:終わりに表示されないDISPLAY-SCREEN ACCEPT DUMMY –

+0

@LeviMoraesはい、これは私がオプション1として言及したものです - Enterを押すまで、また2回目以降は... - もしこれがうまくいかないと思うならば、プログラム全体をコピーし、 'READ'部分だけを' DISPLAY record UPON SYSOUT'に入れてください - それは同じものを出力しなければなりません(一時停止せずに「ACCEPT」)。オプションbは、調整可能な一時停止と自動次の表示で表示されるすべてのレコードにつながります。 より良い:(最初のオプションにこのオプションを追加します)は、 'ACCEPT WITH TIMEOUT'になります。 –

+0

TIMEOUT句がコンパイラによって認識されていない、多分私は構文で台無しにしました。これは正しいですか?ACCEPT dummy with TIMEOUT 1000?そして、ダミー変数を受け入れるためにEnterキーを押す必要があるとき、最初の行に迷惑な "0"が表示されます。どうすればそれを取り除くことができますか?また、次のレコードで次の画面に進むためにボタンを押すのではなく、一度に画面を複数回表示すると、すべてのレコードを表示することはできますか? –

関連する問題