Frank | |
prod: WF 7.6.10 platform Windows, databases: msSQL2000, msSQL2005, RMS, Oracle, Sybase,IE7 test: WF 7.6.10 on the same platform and databases,IE7 |
SET WEEKFIRST=ISO2 -RUN -* Supply week and year from the table -SET &TABLE_YEAR = 2013; -SET &TABLE_WEEK = 6; -* Set the maximum week for the year to check for error. -SET &WEEK_FOR_PREV = HPART(HINPUT(8,EDIT(&TABLE_YEAR)|'1231',8,'HYYMDS'),'week','I2'); -* Does the first week of the year contain a Thursday? If so subtract 1 from &TABLE_WEEK. -SET &TABLE_WEEK = IF HPART(HINPUT(8,EDIT(&TABLE_YEAR) |'0101',8,'HYYMDS'),'dw','I1') LE '5' THEN &TABLE_WEEK - 1 ELSE &TABLE_WEEK; -* Get current date and get the current week and year, subtract from the supplied values. -SET &WEEK_DIFF = &TABLE_WEEK - HPART(HGETC(8,'HYYMDS'),'week','I2') ; -SET &YEAR_DIFF = &TABLE_YEAR - HPART(HGETC(8,'HYYMDS'),'year','I2') ; -* Move current date to equivalent in supplied week -SET &ACT_YEAR_DT = HADD(HGETC(8,'HYYMDS'), 'year', &YEAR_DIFF, 8, 'HYYMDS'); -SET &ACT_WEEK_DT = HADD(&ACT_YEAR_DT, 'week', &WEEK_DIFF, 8, 'HYYMDS'); -* Is equivalent a Sat or Sun? If so subtract 1 week from &ACT_WEEK_DT, otherwise the following week will be retrieved with DATEMOV -SET &ACT_WEEK_MV = IF (HPART(&ACT_WEEK_DT,'dw','I1') EQ '7' OR HPART(&ACT_WEEK_DT,'dw','I1') EQ '1') THEN HADD(&ACT_WEEK_DT,'week',-1,8,'HYYMDS') ELSE &ACT_WEEK_DT; -* Move equivalent week to begining of week, and convert to display value and check for an incorrect week. -SET &CALC_DATE = IF &TABLE_WEEK GT &WEEK_FOR_PREV THEN 'Error' ELSE HCNVRT(HDTTM(DATEMOV(HDATE(&ACT_WEEK_MV,'YYMD'),'BOW'),8,'HYYMDS'), '(HYYMD)', 10, 'A10'); -TYPE Beginning of week &CALC_DATEor within a TABLE
SET WEEKFIRST=ISO2 DEFINE FILE SYSCOLUM TABLE_YEAR/I4 = 2013; TABLE_WEEK/I2 = 6; WEEK_FOR_PREV/I2 = HPART(HINPUT(8,EDIT(TABLE_YEAR)|'1231',8,'HYYMDS'),'week','I2'); TABLE_WEEK_MOV/I4 = IF HPART(HINPUT(8,EDIT(TABLE_YEAR)|'0101',8,'HYYMDS'),'dw','I1') LE 5 THEN TABLE_WEEK-1 ELSE TABLE_WEEK; WEEK_DIFF/I4 = TABLE_WEEK_MOV - HPART(HGETC(8,'HYYMDS'),'week','I4') ; YEAR_DIFF/I4 = TABLE_YEAR - HPART(HGETC(8,'HYYMDS'),'year','I4') ; ACT_YEAR_DT/HYYMDS = HADD(HGETC(8,'HYYMDS'), 'year', YEAR_DIFF, 8, 'HYYMDS'); ACT_WEEK_DT/HYYMDS = HADD(ACT_YEAR_DT, 'week', WEEK_DIFF, 8, 'HYYMDS'); ACT_WEEK_MV/HYYMDS = IF (HPART(ACT_WEEK_DT,'dw','I1') EQ 7 OR HPART(ACT_WEEK_DT,'dw','I1') EQ 1) THEN HADD(ACT_WEEK_DT,'week',-1,8,'HYYMDS') ELSE ACT_WEEK_DT; CALC_DATE/A10 = IF TABLE_WEEK GT WEEK_FOR_PREV THEN 'Error' ELSE HCNVRT(HDTTM(DATEMOV(HDATE(ACT_WEEK_DT,'YYMD'),'BOW'),8,'HYYMDS'), '(HYYMD)', 10, 'A10'); END TABLE FILE SYSCOLUM PRINT TABLE_YEAR TABLE_WEEK CALC_DATE BY TBNAME NOPRINT IF READLIMIT EQ 1 END
SET WEEKFIRST=ISO2 -RUN -* Supply week and year from the table -SET &TABLE_YEAR = 2028; -SET &TABLE_WEEK = 1; -* If the 2nd January is not in week 1 of the selected year - could be week 52/53 of previous year, the 3rd will be, -* and even if the 2nd is in week 1 and falls on a Saturday or Sunday, DATEMOV with BOW will move to the following Monday. -* Main Calculation - INPUT the DATETIME of the 2nd or 3rd, ADD the required week, convert to DATE, Move to the Monday(BOW), Convert back to DATETIME and then to alpha YYYY/MM/DD. -* Error if week is not valid. -SET &CALC_DATE = - IF &TABLE_WEEK LT 1 THEN 'Error' ELSE - IF &TABLE_WEEK GT HPART(HINPUT(8,EDIT(&TABLE_YEAR)|'1231',8,'HYYMDS'),'week','I2') THEN 'Error' ELSE - IF HYYWD(HINPUT(8,EDIT(&TABLE_YEAR)|'0102',8,'HYYMDS'),'A10') CONTAINS &TABLE_YEAR THEN - HCNVRT(HDTTM(DATEMOV(HDATE(HADD(HINPUT(8,EDIT(&TABLE_YEAR)|'0102',8,'HYYMDS'),'week',&TABLE_WEEK-1,8,'HYYMDS'),'YYMD'),'bow'),8,'HYYMDS'),'(HYYMD)',10,'A10') ELSE - HCNVRT(HDTTM(DATEMOV(HDATE(HADD(HINPUT(8,EDIT(&TABLE_YEAR)|'0103',8,'HYYMDS'),'week',&TABLE_WEEK-1,8,'HYYMDS'),'YYMD'),'bow'),8,'HYYMDS'),'(HYYMD)',10,'A10') ; -TYPE &TABLE_YEAR is &CALC_DATE
SET WEEKFIRST=ISO2 DEFINE FILE SYSCOLUM TABLE_YEAR/I4 = 2021; TABLE_WEEK/I2 = 1; CALC_DATE/A10 = IF TABLE_WEEK LT 1 THEN 'Error' ELSE IF TABLE_WEEK GT HPART(HINPUT(8,EDIT(TABLE_YEAR)|'1231',8,'HYYMDS'),'week','I2') THEN 'Error' ELSE IF HYYWD(HINPUT(8,EDIT(TABLE_YEAR)|'0102',8,'HYYMDS'),'A10') CONTAINS EDIT(TABLE_YEAR) THEN HCNVRT(HDTTM(DATEMOV(HDATE(HADD(HINPUT(8,EDIT(TABLE_YEAR)|'0102',8,'HYYMDS'),'week',TABLE_WEEK-1,8,'HYYMDS'),'YYMD'),'bow'),8,'HYYMDS'),'(HYYMD)',10,'A10') ELSE HCNVRT(HDTTM(DATEMOV(HDATE(HADD(HINPUT(8,EDIT(TABLE_YEAR)|'0103',8,'HYYMDS'),'week',TABLE_WEEK-1,8,'HYYMDS'),'YYMD'),'bow'),8,'HYYMDS'),'(HYYMD)',10,'A10') ; END TABLE FILE SYSCOLUM PRINT TABLE_YEAR TABLE_WEEK CALC_DATE BY TBNAME IF READLIMIT EQ 1 END