Tips, Tricks, and Techniques
Last update: 30 April 2004
Move Edit And Edit Mask
Invalid date in input edit mask
Mask(YYYY) checks the four positions for a valid year (0000 - 2699).
MOVE EDITED (EM=YYYY) checks the four positions for a valid year >= 1582.
So '0097' or '1400' is an invalid year.
Be careful. Additional checks are necessary! Otherwise the program ends with
SYSFUL 1143: Input does not correspond to input edit mask.
All ....+....1....+....2....+....3....+....4....+....5....+...
0010 DEFINE DATA
0020 LOCAL
0030 *
0040 1 #DATD (D)
0050 1 #DATE (A8)
0060 1 #DATE-A8 (A8) INIT <'00971008'>
0070 END-DEFINE
0080 IF #DATE-A8 = MASK(YYYYMMDD)
E 0090 MOVE EDITED #DATE-A8 TO #DATD(EM=YYYYMMDD)
0100 MOVE EDITED #DATD(EM=MMDDYYYY) TO #DATE
0110 WRITE '=' #DATE
0120 END-IF
0130 END
0140
0150
0160
0170
0180
0190
0200
....+....Current Source Size: 281 Char. Free: 59359
SYSFUL 1143: Input does not correspond to input edit mask.
Solution:
0080 IF #DATE-A8 > 19000000 AND
0081 #DATE-A8 = MASK(YYYYMMDD)
0090 MOVE EDITED #DATE-A8 TO #DATD(EM=YYYYMMDD)
0100 MOVE EDITED #DATD(EM=MMDDYYYY) TO #DATE
0110 WRITE '=' #DATE
0120 END-IF
Top Page
DD Value Check
Don't check out DD values without the month!!!
Problem
DEFINE DATA LOCAL
1 #DTE (N6) 1 REDEFINE #DTE
2 #MM (N2)
2 #DD (N2)
2 #YY (N2) 2 REDEFINE #YY
3 #YY-A2(A2)
END-DEFINE
* *******************************
MOVE 013197 TO #DTE
IF #MM NE MASK(MM)
WRITE 'BAD MONTH'
END-IF
IF #DD NE MASK(DD)
WRITE 'BAD DAY'
END-IF
IF #YY-A2 NE MASK(NN)
WRITE 'BAD YEAR'
END-IF
END
Since November only has 30 days the value 31 is not valid and the message "BAD DAY" is displayed. Because #DD is checked without a month associated with it NATURAL uses the system date month which (in this case) is November.
The NATURAL REFERENCE MANUAL points out (page 1-44):
The two positions are to be checked for a valid day notation (01-31; dependent on the values of MM and YY/YYYY, if specified. If MM, YY or YYYY are not specified, the current system date is used to provide values for month and year.)
It does not make sense to check out a day without a month!!
Many wrong date in ICIS are the result of such a check, for example February 31, 1988.
There are at least two possible solutions if you find this code in any of the programs you maintain.
Solution 1
Check the entire date and skip the #DD edit.
DEFINE DATA LOCAL
1 #DTE (N6) 1 REDEFINE #DTE
2 #MM (N2)
2 #DD (N2)
2 #YY (N2) 2 REDEFINE #YY
3 #YY-A2(A2)
END-DEFINE
* ***********************
MOVE 013197 TO #DTE
* ***********************
** SOLUTION NUMBER ONE *
* **********************
IF #DTE NE MASK(MMDDYY)
WRITE 'BAD FORMAT'
END-IF
IF #MM NE MASK(MM)
WRITE 'BADMONTH'
END-IF
* IF #DD NE MASK(DD)
* WRITE 'BAD DAY'
* END-IF
IF #YY-A2 NE MASK(NN)
WRITE 'BAD YEAR'
END-IF
END
Solution 2
Check the day with the month attached.
DEFINE DATA LOCAL
1 #DTE (N6) 1 REDEFINE #DTE
2 #MM (N2)
2 #DD (N2)
2 #YY (N2) 2 REDEFINE #YY
3 #YY-A2(A2)
1 REDEFINE #DTE
2 #MMDD (N4) /* SOLUTION NUMBER TWO
2 #YEAR (N2)
END-DEFINE
* *************************************
MOVE 013197 TO #DTE
IF #MM NE MASK(MM)
WRITE 'BAD MONTH'
END-IF
* **********************
* * SOLUTION NUMBER TWO *
* **********************
IF #MMDD NE MASK(MMDD)
WRITE 'BAD DAY'
END-IF
IF #YY-A2 NE MASK(NN)
WRITE 'BAD YEAR'
END-IF
END
Top Page