Domanda

Why would this if statement below need a NEXT SENTENCE because there is a statement in both the IF and the ELSE part of the statement.

Question: Why is this an error in the if statement.

CHECK-PARM.                                                                   
    IF NAME = 'SW89JS' THEN                                               1183
       E-NAME = 'FALSE'                                                       

Expected a verb or "NEXT SENTENCE", but found "E-NAME". The statement was discarded.

    ELSE                                                                      
       E-NAME = 'TRUE'                                                        

"E-NAME" was invalid. Skipped to the next verb, period or procedure-name definition.

       P-NAME = 'SW89JS'                                                      
    END-IF. 
È stato utile?

Soluzione 2

As Bill stated the problem is:

   E-NAME = 'FALSE'

In Cobol (unlike most other languages), each statement starts with a control word e.g.

   Compute abc = 123
   Move 'FALSE'              to E-NAME
   Perform  abc
   Call  'xyz'

With Cobol the control word on the far left of a line tells you what the statement is doing.

Also as Bill stated, in Cobol a boolean is normally define using 88 levels:

   01  FILLER PIC X VALUE SPACE.
       88  IS-ENAME     VALUE "Y".
       88  ENAME-OFF    VALUE "N".

and your code becomes

   IF NAME = 'SW89JS' THEN                                               
      Set ENAME-OFF             to true                         
   ELSE                                                                      
      Set IS-ENAME              to true                                      

      Move 'SW89JS'             to P-NAME
   END-IF. 

Altri suggerimenti

Since it is somewhere buried in this answer, I'm going to repeat it up hear, even expand it a little.

You have a value you are testing. From the name it likely comes from the PARM on the EXEC card in the JCL.

You test the value, set a flag (TRUE/FALSE literals) on the result of the value, and use it later.

With an 88 you can make that parm value into the flag itself.

01  NAME PIC X(6).
    88  IT-IS-SW89JS VALUE "SW89JS".

Now you can never get your flags out of step, as you only have one flag. One fewer flag to understand and potentially get wrong.

Because we don't have assignments in COBOL.

MOVE 'TRUE' TO E-NAME

or

MOVE data-name-with-value-true TO E-NAME

or

01  FILLER PIC X VALUE SPACE.
    88  IT-IS-SW89JS VALUE "Y".

SET IT-IS-SW89JS TO TRUE

or

01  NAME PIC X(6).
    88  IT-IS-SW89JS VALUE "SW89JS".

And with the last forget about anything else.

COBOL is not like many other languages. No strings, as you may know them. No arrays, as you may know them. No assignments. No booleans. No user-written functions. Few Intrinsic Functions. No public function libraries. It does have some other stuff :-)

A couple of points from the comments.

COBOL is a language of fixedness. Fixed-length field, fixed-length tables. The length of the data in a 30-byte field is 30 bytes. The length of the content of the field, in terms of what the data represents, is something the programmer has to work out, if needed. Mostly we don't need it, so we don't have to work it out.

The fixedness also imposes limits. So we think of ways to do things differently, so we don't have a limit, waiting to bust, dangling over our heads. We don't just pick a function which looks like maybe it makes life easy for us (less code to write) regardless of how it carries out the task. Usually we don't have a function anyway, and we write specific code to be re-used, through a CALL, for a specific system or set of systems.

A COBOL program may take longer to write (I say may because 90+% of the time it is a question of starting out by copying a program which is close to what you want, and then making it specific) but that program may have a lifetime of 30 years. It may be changed many times during its life. It may never be changed, but need to be understood many times during that period.

Conceptually, COBOL is a very different language from those with assignments/strings/arrays. If you are supposed to pick up COBOL with no training, there will be many pitfalls.

Yes, Bruce Martin, I suppose COBOL does have an assignment: the COMPUTE. The left-side can only be numeric or numeric-edited, although there can be multiple fields, and the right-side can only have numerics (or intrinsic functions returning numerics). It only supports basic mathematical operators (+, -, , /, *). It does allow rounding of the final answer if desired, and also allows for interception of "overflow" (ON SIZE ERROR).

It can be used as a simple assignment:

COMPUTE A = B

This will generate the same code as:

MOVE B TO A

Some people do this, though I've never really worked out why. There is a rumour that it means you can use ON SIZE ERROR (and don't forget END-COMPUTE if you do use it) to trap an overflow.

However, I always make my fields big enough, or deliberately truncate when that is the result I want, so I don't really get that.

In short, welcome to COBOL. Don't expect it to be like any other language you've used.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top