Thnks to every one. I will try this and get back
- Show quoted text -
I am not sure if this will help you but, I created this program in
1991 using the "Natral Adabas language" on a mainframe computer. This
was written as a callable subroutine, I think even if you do not know
the NATURAL language you can figure out what this program does. The
holdiays are the State of Washington holdiays
0020 ** PROGRAM : NXTWKDAY COMPUTES NEXT WORKING DAY.
0030 ** WRITTEN BY: R NESBITT
0040 ** CREATED : MAY OF 1991
0050 **
0060 ** COMPUTES THE FOLLOWING HOLIDAYS . . .
0070 ** NEW YEARS DAY = JAN 1
0080 ** MARTIN LUTHER KINGS B-DAY = 3RD MONDAY IN JAN
0090 ** PRESIDENTS DAY = 3RD MONDAY IN FEB
0100 ** MEMORIAL DAY = LAST MONDY IN MAY
0110 ** INDEPENDENCE DAY = 4TH OF JULY
0120 ** LABOR DAY = 1ST MONDAY IN SEPTEMBER
0130 ** VETERANS DAY = 11TH OF NOV
0140 ** THANKSGIVING = 4TH THURSDAY AND FRIDAY IN NOV
0150 ** CHRISTMAS = 25TH OF DEC
0160 **
0170 ** IF A HOLIDAY FALLS ON A SATURDAY THEN THE HOLIDAY IS FRIDAY.
0180 ** IF A HOLIDAY FALLS ON A SUNDAY THEN THE HOLIDAY IS MONDAY.
0190 **
0200 **
0620 **
0630 DEFINE DATA PARAMETER
0640 1 #NEXT-WRK-DAY (D)
0650 LOCAL
0660 1 #INPUT-DATE (D)
0670 1 #NEXT-DAY (D)
0680 1 #DAYOWK (A2)
0690 1 #WRK-MONTH (A2)
0700 1 #WRK-DAY (A2)
0710 1 #THURSDAY (A2)
0720 1 #FRIDAY (A2)
0730 1 #SATURDAY (A2)
0740 1 #SUNDAY (A2)
0750 1 #MONDAY (A2)
0760 END-DEFINE
0770 *
0780 * THIS MOVES THE FIRST TWO CHARACTERS TO THE DAY IN UPPER LOWER
CASE
0790 *
0800 MOVE H'E388' TO #THURSDAY /* Th
0810 MOVE H'C699' TO #FRIDAY /* Fr
0820 MOVE H'E281' TO #SATURDAY /* Sa
0830 MOVE H'E2A4' TO #SUNDAY /* Su
0840 MOVE H'D496' TO #MONDAY /* Mo
0850 *
0860 IF #NEXT-WRK-DAY GT 0
0870 DO
0880 MOVE #NEXT-WRK-DAY TO #INPUT-DATE
0990 DOEND /* (0870)
1000 ELSE
1010 MOVE *DATX TO #INPUT-DATE
1020 *
1030 COMPUTE #NEXT-DAY = #INPUT-DATE + 1
1040 *
1050 MOVE EDITED #NEXT-DAY (EM=NN) TO #DAYOWK
1060 MOVE EDITED #NEXT-DAY (EM=MM) TO #WRK-MONTH
1070 *
1080 DECIDE ON FIRST VALUE OF #DAYOWK
1090 VALUE #SATURDAY
1100 COMPUTE #NEXT-WRK-DAY = #NEXT-DAY + 2
1110 VALUE #SUNDAY
1120 COMPUTE #NEXT-WRK-DAY = #NEXT-DAY + 1
1130 NONE
1140 MOVE #NEXT-DAY TO #NEXT-WRK-DAY
1150 END-DECIDE /* (1080)
1160 *
1170 MOVE EDITED #NEXT-WRK-DAY (EM=DD) TO #WRK-DAY
1180 MOVE EDITED #NEXT-WRK-DAY (EM=NN) TO #DAYOWK
1190 MOVE EDITED #NEXT-WRK-DAY (EM=MM) TO #WRK-MONTH
1200 DECIDE ON FIRST VALUE OF #WRK-MONTH
1210 VALUE '01'
1220 PERFORM COMPUTE-JAN
1230 VALUE '02'
1240 IF #WRK-DAY = MASK(15-21) AND #DAYOWK = #MONDAY /*PRES DAY
*/
1250 COMPUTE #NEXT-WRK-DAY = #NEXT-WRK-DAY + 1
1260 VALUE '05'
1270 IF #WRK-DAY = MASK(25-31) AND #DAYOWK = #MONDAY /*MEMORIAL
DAY*/
1280 COMPUTE #NEXT-WRK-DAY = #NEXT-WRK-DAY + 1
1290 VALUE '07'
1300 PERFORM COMPUTE-JUL
1310 VALUE '09'
1320 IF #WRK-DAY = MASK(01-07) AND #DAYOWK = #MONDAY /*LABOR
DAY*/
1330 COMPUTE #NEXT-WRK-DAY = #NEXT-WRK-DAY + 1
1340 VALUE '11'
1350 PERFORM COMPUTE-NOV
1360 VALUE '12'
1370 PERFORM COMPUTE-DEC
1380 NONE
1390 IGNORE
1400 END-DECIDE /* (1200)
1410 *
1420 *****************************
1430 DEFINE SUBROUTINE COMPUTE-JAN
1440 *****************************
1450 *
1460 IF #WRK-DAY = MASK(01-02) /**** NEW YEARS DAY ****/
1470 DO
1480 DECIDE ON FIRST VALUE #DAYOWK
1490 VALUE #FRIDAY
1500 IF #WRK-DAY = MASK(01-01)
1510 COMPUTE #NEXT-WRK-DAY = #NEXT-WRK-DAY + 3
1520 VALUE #MONDAY
1530 IF #WRK-DAY = MASK(01-02)
1540 COMPUTE #NEXT-WRK-DAY = #NEXT-WRK-DAY + 1
1550 NONE
1560 IF #WRK-DAY = '01'
1570 COMPUTE #NEXT-WRK-DAY = #NEXT-WRK-DAY + 1
1580 END-DECIDE /* (1480)
1590 DOEND /* (1470)
1600 *
1610 ELSE /**** MLK JR BIRTHDAY ****/
1620 IF #WRK-DAY = MASK(15-21) AND #DAYOWK = #MONDAY
1630 COMPUTE #NEXT-WRK-DAY = #NEXT-WRK-DAY + 1
1640 RETURN /* (1430)
1650 *****************************
1660 DEFINE SUBROUTINE COMPUTE-JUL
1670 *****************************
1680 *
1690 IF #WRK-DAY = MASK(03-06) /**** INDEPENDENCE DAY ****/
1700 DO
1710 DECIDE ON FIRST VALUE #DAYOWK
1720 VALUE #FRIDAY
1730 IF #WRK-DAY = MASK(03-04)
1740 COMPUTE #NEXT-WRK-DAY = #NEXT-WRK-DAY + 3
1750 VALUE #MONDAY
1760 IF #WRK-DAY = MASK(04-05)
1770 COMPUTE #NEXT-WRK-DAY = #NEXT-WRK-DAY + 1
1780 NONE
1790 IF #WRK-DAY = '04'
1800 COMPUTE #NEXT-WRK-DAY = #NEXT-WRK-DAY + 1
1810 END-DECIDE /* (1710)
1820 DOEND /* (1700)
1830 *
1840 RETURN /* (1660)
1850 *****************************
1860 DEFINE SUBROUTINE COMPUTE-NOV
1870 *****************************
1880 *
1890 IF #WRK-DAY = MASK(10-13) /**** VETERANS DAY ****/
1900 DO
1910 DECIDE ON FIRST VALUE #DAYOWK
1920 VALUE #FRIDAY
1930 IF #WRK-DAY = MASK(10-11)
1940 COMPUTE #NEXT-WRK-DAY = #NEXT-WRK-DAY + 3
1950 VALUE #MONDAY
1960 IF #WRK-DAY = MASK(11-12)
1970 COMPUTE #NEXT-WRK-DAY = #NEXT-WRK-DAY + 1
1980 NONE
1990 IF #WRK-DAY = '11'
2000 COMPUTE #NEXT-WRK-DAY = #NEXT-WRK-DAY + 1
2010 END-DECIDE /* (1910)
2020 DOEND /* (1900)
2030 ELSE /* (1890)
2040 IF #WRK-DAY = MASK(22-28) /*** THANKSGIVING HOLIDAYS ***/
2050 DO
2060 DECIDE ON FIRST VALUE #DAYOWK
2070 VALUE #THURSDAY
2080 COMPUTE #NEXT-WRK-DAY = #NEXT-WRK-DAY + 4
2090 VALUE #FRIDAY
2100 IF #WRK-DAY NE '22'
2110 COMPUTE #NEXT-WRK-DAY = #NEXT-WRK-DAY + 3
2120 NONE
2130 IGNORE
2140 END-DECIDE /* (2060)
2150 DOEND /* (2050)
2160 ELSE
2170 IF #WRK-DAY = '29' AND #DAYOWK = #FRIDAY
2180 COMPUTE #NEXT-WRK-DAY = #NEXT-WRK-DAY + 3
2190 *
2200 RETURN /* (1860)
2210 *****************************
2220 DEFINE SUBROUTINE COMPUTE-DEC
2230 *****************************
2240 *
2250 IF #WRK-DAY = MASK(24-27) /**** CHRISTMAS DAY ****/
2260 DO
2270 DECIDE ON FIRST VALUE #DAYOWK
2280 VALUE #FRIDAY
2290 IF #WRK-DAY = MASK(24-25)
2300 COMPUTE #NEXT-WRK-DAY = #NEXT-WRK-DAY + 3
2310 VALUE #MONDAY
2320 IF #WRK-DAY = MASK(25-26)
2330 COMPUTE #NEXT-WRK-DAY = #NEXT-WRK-DAY + 1
2340 NONE
2350 IF #WRK-DAY = '25'
2360 COMPUTE #NEXT-WRK-DAY = #NEXT-WRK-DAY + 1
2370 END-DECIDE /* (2270)
2380 DOEND /* (2260)
2390 ELSE /* (2250)
2400 IF #WRK-DAY = '31' AND #DAYOWK = #FRIDAY /* NEW YEARS HOLIDAY
****/
2410 COMPUTE #NEXT-WRK-DAY = #NEXT-WRK-DAY + 3
2420 *
2430 RETURN /* (2220)
2440 END