tennisnovice001
tennisnovice001

Reputation: 33

COBOL- Find year of Birth from age

I'm used the below code to find only the year of birth from age using cobol but couldn't able to convert the year into numeric variable. My code is

IDENTIFICATION DIVISION.
PROGRAM-ID. AGECONV.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 CURR-YEAR PIC X(4) VALUES SPACES.
01 YEAR-OF-BIRTH X(4).
PROCEDURE DIVISION
MOVE FUNCTION CURRENT-DATE TO CURR-YEAR.
DISPLAY CURR-YEAR
SUBTRACT CURR-YEAR BY 22
GIVING YEAR-OF-BIRTH.
DISPLAY YEAR-OF-BIRTH.

I got the error that curr-year is not numeric.

Upvotes: 0

Views: 1720

Answers (3)

Lyra404
Lyra404

Reputation: 1

I did it that way, an activity was passed to display this additional information in my group

IDENTIFICATION DIVISION.
   PROGRAM-ID. AGECONV.
   DATA DIVISION.
   WORKING-STORAGE SECTION.
   01 CURR-YEAR PIC 9(4) VALUE ZERO.
   01 YEAR-OF-BIRTH PIC 9(4).
   PROCEDURE DIVISION.
   MOVE FUNCTION CURRENT-DATE (1:4) TO CURR-YEAR.
   SUBTRACT 1999 FROM CURR-YEAR
   GIVING YEAR-OF-BIRTH.
   DISPLAY 'Me chamo Thiago Lyra e tenho '  YEAR-OF-BIRTH  ' anos de idade'.
   DISPLAY 'Meu email é: [email protected]'.

Upvotes: 0

Rick Smith
Rick Smith

Reputation: 4417

For SUBTRACT the sending field, CURR-YEAR, needs to be numeric. It was defined as alphanumeric. This means that CURR-YEAR needs to be PIC 9(4). The same is true of YEAR-OF-BIRTH which was missing the PIC.

FUNCTION CURRENT-DATE is an alphanumeric sending field. This rules for MOVE do not allow it to be moved directly to a numeric field. The reference modifier, (1:4), was added to allow the move.

The format of the SUBTRACT statement was incorrect and has been changed.

Revised code:

   IDENTIFICATION DIVISION.
   PROGRAM-ID. AGECONV.
   DATA DIVISION.
   WORKING-STORAGE SECTION.
   01 CURR-YEAR PIC 9(4) VALUE ZERO.
   01 YEAR-OF-BIRTH PIC 9(4).
   PROCEDURE DIVISION.
   MOVE FUNCTION CURRENT-DATE (1:4) TO CURR-YEAR.
   DISPLAY CURR-YEAR
   SUBTRACT 22 FROM CURR-YEAR
   GIVING YEAR-OF-BIRTH.
   DISPLAY YEAR-OF-BIRTH.

Output:

2020
1998

Upvotes: 1

Gilbert Le Blanc
Gilbert Le Blanc

Reputation: 51551

You need a more elaborate WORKING-STORAGE SECTION.

IDENTIFICATION DIVISION.
PROGRAM-ID. AGECONV.

DATA DIVISION.
WORKING-STORAGE SECTION.
01  WS-CURRENT-DATE-DATA.
    05  WS-CURRENT-DATE.
        10  WS-CURRENT-YEAR         PIC 9(04).
        10  WS-CURRENT-MONTH        PIC 9(02).
        10  WS-CURRENT-DAY          PIC 9(02).
    05  WS-CURRENT-TIME.
        10  WS-CURRENT-HOURS        PIC 9(02).
        10  WS-CURRENT-MINUTE       PIC 9(02).
        10  WS-CURRENT-SECOND       PIC 9(02).
        10  WS-CURRENT-MILLISECONDS PIC 9(02).

01  YEAR-OF-BIRTH                   PIC 9(04).

PROCEDURE DIVISION.
MOVE FUNCTION CURRENT-DATE TO WS-CURRENT-DATE-DATA
DISPLAY WS-CURRENT-YEAR
SUBTRACT WS-CURRENT-YEAR BY 22 GIVING YEAR-OF-BIRTH
DISPLAY YEAR-OF-BIRTH.

Upvotes: 2

Related Questions