Home The Company Publications Products Links Tips

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



Back to NATURAL Tips, Tricks, Techniques -- Overview