# ROUTINE %DT

From VistApedia

Revision as of 15:11, 9 December 2019 by DavidWhitten (talk | contribs) (Created page with " As most of us know, the VA KERNEL has a program %DT which originally came from VA FileMan, which David Whitten assumes was originally written by George Timson. In that code...")

As most of us know, the VA KERNEL has a program %DT which originally came from VA FileMan, which David Whitten assumes was originally written by George Timson.

In that code, there is a line that validates the number of days entered versus the maximum number of daysper month. The code looks like this: I %I(2)>28,$E("303232332323",%I(1))+28<%I(2),%I(1)-2!(%I(2)-29)!(%I(3)#4)!('(%I(3)#100)&(%I(3)+1700#400)) G 1

basically, the local variable % has subscripts for the various parts of the date being validated. %(1) has the {number entered for the month} %(2) has the {number entered for the day in the month} %(3) has the {year entered for the date}.

Expanded, this means

- IF {the number entered for the day in the month} is greater than 28
- AND
- TEST
- SELECT { the number entered for the month}VALUES
- CASE 1 : RETURN (3) ;;January
- CASE 2 : RETURN (0) ;;February
- CASE 3 : RETURN (3) ;;March
- CASE 4 : RETURN (1) ;;April
- CASE 5 : RETURN (3) ;;May
- CASE 6 : RETURN (2) ;;June
- CASE 7 : RETURN (3) ;;July
- CASE 8 : RETURN (3) ;;August
- CASE 9 : RETURN (2) ;;September
- CASE 10 : RETURN (3) ;;October
- CASE 11 : RETURN (2) ;;November
- CASE 12 : RETURN (3) ;;December
- DEFAULT : RETURN (0) ;; invalid month number
- END SELECT

- ADD SELECT RETURN TO 28 THEN COMPARE LESS THAN {number entered for the day in the month}

- AND
- TEST {number entered for the month} NUMERICALLY NOT EQUAL TO 2 ;;February
- OR {number entered for the day in the month} NUMERICALLY NOT EQUAL TO 29
- OR TEST
- BOTH
- {year entered for the date} MODULO 4 ;; true if 1,2,3

- AND
- {year entered for the date} MODULO 100 NUMERICALLY EQUALS 0
- AND ADD {year entered for the date} TO 1700 THEN MODULO 400 NUMERICALLY NOT EQUALS 0)

- BOTH

- AND
- GOTO 1 ;; because local variable % is an acceptable date