Reputation:
I am currently writing a COBOL program with a screen that checks and display a record from a file. However, the program keeps getting stuck when I try to input a command other than "F" or "Q". While it is suppose to display a new screen with an error message.The error message that I am trying to invoke is "<>"
Identification Division.
Program-ID. Lab10b.
Environment Division.
Input-Output Section.
File-Control.
Select InFile Assign to "Lab10b-master.dat"
Organization is Indexed
Access Mode is Random
Record Key is Movie-Key
Status is FileStatus.
Data Division.
File Section.
FD InFile.
01 Movie.
05 Movie-Key Pic 9(5).
05 Movie-Title Pic X(50).
05 Movie-Genre Pic X(20).
Working-Storage Section.
01 black constant as 0.
01 blue constant as 1.
01 green constant as 2.
01 cyan constant as 3.
01 red constant as 4.
01 magenta constant as 5.
01 brown constant as 6.
01 white constant as 7.
01 Today-Date.
05 YYYY Pic 9(4).
05 MM Pic 9(2).
05 DD Pic 9(2).
01 FileStatus Pic 99.
01 Error-Message Pic X(50).
01 Res1.
05 a Pic X.
05 b Pic X.
05 c Pic X.
05 d Pic X.
05 e Pic X.
01 Res2 Pic X.
88 Quit Value "Q" "q".
88 Find Value "F" "f".
Screen Section.
01 data-screen.
05 screen-header.
10 PH-Month Blank Screen Line 01 Col 01 Pic Z9/ From MM.
10 PH-Day Line 01 Col 04 Pic 99/ From DD.
10 PH-Year Line 01 Col 07 Pic 9999 From YYYY.
10 Value "Stomper & Wombat's Movie Warehouse"
Line 01 Col 40.
05 screen-data.
10 Value "Movie #: " Line 05 Col 9.
10 Movie-Number-Out Line 05 Col 24
Pic 9(5) from Movie-Key Blank When Zero.
10 Value "Title: " Line 06 Col 9.
10 Movie-Title-Out Line 06 Col 24
Pic X(50) From Movie-Title.
10 Value "Genre: " Line 07 Col 9.
10 Movie-Genre-Out Line 07 Col 24
Pic X(50) From Movie-Genre.
05 Error-Message-Out Line 11 Col 15 Pic X(50)
From Error-Message foreground-color red.
05 screen-response.
10 Value "Key: [" Line 13 Col 9.
10 Key-Response Line 13 Col 25 Pic X(5) to Res1.
10 Value "]" Line 13 Col 30.
05 screen-response2.
10 Value "Command: [" Line 14 Col 9.
10 Command-response Line 14 Col 25 Pic X to Res2.
10 Value "]" Line 14 Col 26.
Procedure Division.
000-Main.
Accept Today-Date From Date YYYYMMDD
Move YYYY To PH-Year
Move MM To PH-Month
Move DD To PH-Day
Open Input InFile
Move " " to Error-Message
Display data-screen
Accept screen-response2
If Res2 = "F" Or "f"
Accept screen-response
End-If
Perform Until res2 = "q" or "Q"
Move " " to Error-Message
If res2 <> "Q" And "q" and "f" and "F" *> If Command Response is not valid, Write this error message.
Move "<<Command Invalid>>" to Error-Message
Else if res2 = "f" Or "F" *> If command = find
If a = " " And b = " " And c = " " And d = " "
And e = " " *> Check if key is empty
Move "<<Key Must Be Provided>>" to Error-Message
Move " " to Movie
Else If (a = " " Or b = " " Or c = " " Or d = " "
Or e = " ") Or res1 is not numeric *> Check if key is numeric and complete?
Move "<<Invalid Key>>" to Error-Message
Move " " to Movie
Else
Move res1 to Movie-Key
Read InFile
Evaluate FileStatus
When 00
Continue
When 23
Move " " to Movie
Move "<<Key Not Found>>" to Error-Message
When Other
Move "<<Unknown Read Error>>" to Error-Message
End-Evaluate
End-If
Else
Continue
End-If
Display data-screen
Accept screen-response2
If Res2 = "F" Or "f"
Accept screen-response
End-If
End-Perform
Close InFile
Stop Run.
Upvotes: 0
Views: 634
Reputation: 483
Perhaps this might be easier to read and debug:
01 Perform Until res2 = "q" or "Q"
02 Move " " to Error-Message
03 If res2 <> "Q" And "q" and "f" and "F"
04 Move "<<Command Invalid>>" to Error-Message
05 Else
06 if res2 = "f" Or "F"
07 If a = " " And b = " " And c = " " And d = " " And
08 e = " " *> Check if key is empty
09 Move "<<Key Must Be Provided>>" to Error-Message
10 Move " " to Movie
11 Else
12 If (a = " " Or b = " " Or c = " " Or d = " "
13 Or e = " ") Or res1 is not numeric
14 Move "<<Invalid Key>>" to Error-Message
15 Move " " to Movie
16 Else
17 Move res1 to Movie-Key
18 Read InFile
19 Evaluate FileStatus
20 When 00
21 Continue
22 When 23
23 Move " " to Movie
24 Move "<<Key Not Found>>" to Error-Message
25 When Other
26 Move "<<Unknown Read Error>>" to Error-Message
27 End-Evaluate
28 End-If
29 Else
30 Continue
31 End-If
32
33 Display data-screen
34 Accept screen-response2
35 If Res2 = "F" Or "f"
36 Accept screen-response
37 End-If
38 End-Perform
(I added line numbers for easy reference.)
Here's what's happening: You're missing an end-if in there somewhere.
You're likely missing one after line 28, but that's not the problem. Because you already had an else
(on line 11) for the if
on line 7, the else
will terminate the if
from line 7 and apply to the one on line 6.
I believe you're missing another end-if
after line 31. What's happening currently is that if you enter something other than Q and F, it does the move
on line 4, and then skips everything between the else
on line 5 and when the if
is terminated. Because you're missing the end-if
after line 31, it skips everything up until the end-perform
on line 38.
A little clarification: The reason it goes into an endless loop if you enter something other than Q or F is that it's skipping the accept
on line 34 and thus you have no opportunity to enter anything else. And because your perform continues until res2 = "q" or "Q"
, which it clearly isn't, it will just keep looping forever.
This is why proper indentation is so very necessary. Once I indented everything, it was obvious what the problem was. It might be okay for you to just type stuff every which way, but if someone else has to come along later and work on this you'll make them hate you very quickly. If it's neat and clear, they'll love you.
Also, I notice you have 88 levels defined for Quit and Find but you don't use them. They would make your code a lot more readable. And the tests with a = " "
etc on lines 7 & 8 could be simplified by using if res1 = spaces
(assuming OpenCOBOL works the way it should; I've not used it.)
Hope this helps.
Upvotes: 1