Code:
- H NOMAIN
- /DEFINE Copy_DtTools
- /INCLUDE CDSRCLIB/QPROTOTYPE,COPYCOMMON
-
- //=======================================================================
- // ___ _ ___ _ ___
- // | \| |_ / __|___| |_ / __|___ _ _
- // | |) | _| (_ / -_) _| (_ / -_) ' \
- // |___/ \__|\___\___|\__|\___\___|_||_|
- //
- //Gets a Lot of Useful General Items Regarding Input Date.
- //=======================================================================
- PDtGetGen B Export
- DDtGetGen PI LikeDS(DtGen)
- D InputDt D Const
- //Local Variables
- D X S 10I 0 Inz
- D DSDtGen DS LikeDS(DtGen) Inz
- /Free
-
- DSDtGen.Date = InputDt;
- DSDtGen.Year = %subdt(InputDt:*YEARS);
- DSDtGen.Month = %subdt(InputDt:*MONTHS);
- DSDtGen.Day = %subdt(InputDt:*DAYS);
- DSDtGen.Period = DtGetPerDt(InputDt);
- DSDtGen.DayOfWk = DtGetDay(InputDt);
- DSDtGen.PrevDt = InputDt - %days(1);
- DSDtGen.NextDt = InputDt + %days(1);
- DSDtGen.FirstOfMth = DtGetFoM(InputDt);
- DSDtGen.LastOfMth = DtGetLoM(InputDt);
- DSDtGen.Firsts = DtGetFirsts(InputDt);
- DSDtGen.Lasts = DtGetLasts(InputDt);
- DSDtGen.DayFoY = DtGetDayFoY(%subdt(InputDt:*YEARS));
- DSDtGen.DayLoY = DtGetDayLoY(%subdt(InputDt:*YEARS));
-
- Return DSDtGen;
-
- /End-Free
- PDtGetGen E
-
-
- //=======================================================================
- // ___ _ ___ _ ___
- // | \| |_ / __|___| |_| \ __ _ _ _
- // | |) | _| (_ / -_) _| |) / _` | || |
- // |___/ \__|\___\___|\__|___/\__,_|\_, |
- // |__/
- //
- //Gets Day of Week (Num: 1-7; Name: SUNDAY-SATURDAY) for Input Date.
- //=======================================================================
- PDtGetDay B Export
- DDtGetDay PI LikeDS(DtDay)
- D InputDt D Const
- //Local Variables
- D TmpNum S 1S 0 Inz
- D DSDtDay DS LikeDS(DtDay) Inz
- /Free
-
- //1=Sun, 2=Mon, 3=Tues, 4=Wed, 5=Thu, 6=Fri, 7=Sat
- Exec SQL Set :TmpNum = DayOfWeek(:InputDt);
- DSDtDay.Num = TmpNum;
- Select;
- When DSDtDay.Num = 1;
- DSDtDay.Name = 'SUNDAY';
- When DSDtDay.Num = 2;
- DSDtDay.Name = 'MONDAY';
- When DSDtDay.Num = 3;
- DSDtDay.Name = 'TUESDAY';
- When DSDtDay.Num = 4;
- DSDtDay.Name = 'WEDNESDAY';
- When DSDtDay.Num = 5;
- DSDtDay.Name = 'THURSDAY';
- When DSDtDay.Num = 6;
- DSDtDay.Name = 'FRIDAY';
- When DSDtDay.Num = 7;
- DSDtDay.Name = 'SATURDAY';
- EndSl;
-
- Return DSDtDay;
-
- /End-Free
- PDtGetDay E
-
-
- //=======================================================================
- // ___ _ ___ _ ___ ___ _
- // | \| |_ / __|___| |_| \ __ _ _ _| \| |_
- // | |) | _| (_ / -_) _| |) / _` | || | |) | _|
- // |___/ \__|\___\___|\__|___/\__,_|\_, |___/ \__|
- // |__/
- //Gets the Date for a Specified Previous or Future Occurrence of a
- // Specified Day(SUNDAY-SATURDAY) for Input Date.
- //=======================================================================
- PDtGetDayDt B Export
- DDtGetDayDt PI D
- D InputDt D Const
- D InputDayNum 1S 0 Const
- D InputOp 1A Const
- D InputOccur 2S 0 Const
- //LocalVariables
- D InDays S 1S 0 Inz
- D X S 2S 0 Inz
- D DSDtDay DS LikeDS(DtDay) Inz
- D Date S D Inz
- /Free
-
- DSDtDay = DtGetDay(InputDt);
- If InputOp = '+';
- If DSDtDay.Num >= InputDayNum;
- InDays = (7-DSDtDay.Num) + InputDayNum;
- Else;
- InDays = InputDayNum - DSDtDay.Num;
- EndIf;
- Date = InputDt + %days(InDays);
- If InputOccur = 1;
- Return Date;
- Else;
- For X = 2 to InputOccur;
- Date += %days(7);
- EndFor;
- EndIf;
- ElseIf InputOp = '-';
- If DSDtDay.Num <= InputDayNum;
- InDays = (7-InputDayNum) + DSDtDay.Num;
- Else;
- InDays = DSDtDay.Num - InputDayNum;
- EndIf;
- Date = InputDt - %days(InDays);
- If InputOccur = 1;
- Return Date;
- Else;
- For X = 2 to InputOccur;
- Date -= %days(7);
- EndFor;
- Return Date;
- EndIf;
- EndIf;
-
- Return Date;
-
- /End-Free
- PDtGetDayDt E
-
-
- //=======================================================================
- // ___ _ ___ _ ___ ___ __ __
- // | \| |_ / __|___| |_| \ __ _ _ _| __|_\ \ / /
- // | |) | _| (_ / -_) _| |) / _` | || | _/ _ \ V /
- // |___/ \__|\___\___|\__|___/\__,_|\_, |_|\___/|_|
- // |__/
- //Gets Day (Num: 1-7; Name: SUNDAY-SATURDAY) for the First Day of the
- // Year for Input Year.
- //=======================================================================
- PDtGetDayFoY B Export
- DDtGetDayFoY PI LikeDS(DtDay)
- D InputYr 4S 0 Const
- //Local Variables
- D FoYDate S D Inz
- D DSDtDay DS LikeDS(DtDay) Inz
- /Free
-
- FoYDate = %date(%char(InputYr) + '-01-01');
- DSDtDay = DtGetDay(FoYDate);
-
- Return DSDtDay;
-
- /End-Free
- PDtGetDayFoY E
-
-
- //=======================================================================
- // ___ _ ___ _ ___ _ __ __
- // | \| |_ / __|___| |_| \ __ _ _ _| | __\ \ / /
- // | |) | _| (_ / -_) _| |) / _` | || | |__/ _ \ V /
- // |___/ \__|\___\___|\__|___/\__,_|\_, |____\___/|_|
- // |__/
- //Gets Day (Num: 1-7; Name: SUNDAY-SATURDAY) for the Last Day of the Year
- // for Input Year.
- //=======================================================================
- PDtGetDayLoY B Export
- DDtGetDayLoY PI LikeDS(DtDay)
- D InputYr 4S 0 Const
- //Local Variables
- D LoYDate S D Inz
- D DSDtDay DS LikeDS(DtDay) Inz
- /Free
-
- LoYDate = %date(%char(InputYr) + '-12-31');
- DSDtDay = DtGetDay(LoYDate);
-
- Return DSDtDay;
-
- /End-Free
- PDtGetDayLoY E
-
-
- //=======================================================================
- // ___ _ ___ _ ___ _ _
- // | \| |_ / __|___| |_| __(_)_ _ __| |_ ___
- // | |) | _| (_ / -_) _| _|| | '_(_-< _(_-<
- // |___/ \__|\___\___|\__|_| |_|_| /__/\__/__/
- //
- //Gets the Date of the First Sun-Sat of the Month for Input Date.
- //=======================================================================
- PDtGetFirsts B Export
- DDtGetFirsts PI LikeDS(DtFirstLast)
- D InputDt D Const
- //Local Variables
- D TmpDate S D Inz
- D X S 10I 0 Inz
- D TmpDay DS LikeDS(DtDay) Inz
- D DSDtFirsts DS LikeDS(DtFirstLast) Inz
- /Free
-
- TmpDate = DtGetFoM(InputDt);
- For X = 1 to 7;
- TmpDay = DtGetDay(TmpDate);
- Select;
- When TmpDay.Num = 1;
- DSDtFirsts.Sun = TmpDate;
- When TmpDay.Num = 2;
- DSDtFirsts.Mon = TmpDate;
- When TmpDay.Num = 3;
- DSDtFirsts.Tue = TmpDate;
- When TmpDay.Num = 4;
- DSDtFirsts.Wed = TmpDate;
- When TmpDay.Num = 5;
- DSDtFirsts.Thu = TmpDate;
- When TmpDay.Num = 6;
- DSDtFirsts.Fri = TmpDate;
- When TmpDay.Num = 7;
- DSDtFirsts.Sat = TmpDate;
- EndSl;
- TmpDate = TmpDate + %days(1);
- EndFor;
-
- Return DSDtFirsts;
-
- /End-Free
- PDtGetFirsts E
-
-
- //=======================================================================
- // ___ _ ___ _ ___ __ __
- // | \| |_ / __|___| |_| __|__| \/ |
- // | |) | _| (_ / -_) _| _/ _ \ |\/| |
- // |___/ \__|\___\___|\__|_|\___/_| |_|
- //
- //Gets the Date of the First Day of the Month for Input Date.
- //=======================================================================
- PDtGetFoM B Export
- DDtGetFoM PI D
- D InputDt D Const
- //Local Variables
- D FirstOfMthChr S 10A Inz
- D FirstOfMth S D Inz
- /Free
-
- FirstOfMthChr = %char(%subdt(InputDt:*years)) + '-' +
- %char(%subdt(InputDt:*months)) +
- '-01';
- FirstOfMth = %date(FirstOfMthChr);
-
- Return FirstOfMth;
-
- /End-Free
- PDtGetFoM E
-
-
- //=======================================================================
- // ___ _ ___ _ _ _
- // | \| |_ / __|___| |_| | __ _ __| |_ ___
- // | |) | _| (_ / -_) _| |__/ _` (_-< _(_-<
- // |___/ \__|\___\___|\__|____\__,_/__/\__/__/
- //
- //Gets the Date of the Last Sun-Sat of the Month for Input Date.
- //=======================================================================
- PDtGetLasts B Export
- DDtGetLasts PI LikeDS(DtFirstLast)
- D InputDt D Const
- //Local Variables
- D TmpDate S D Inz
- D X S 10I 0 Inz
- D TmpDay DS LikeDS(DtDay) Inz
- D DSDtLasts DS LikeDS(DtFirstLast) Inz
- /Free
-
- TmpDate = DtGetLoM(InputDt);
- For X = 7 downto 1;
- TmpDay = DtGetDay(TmpDate);
- Select;
- When TmpDay.Num = 1;
- DSDtLasts.Sun = TmpDate;
- When TmpDay.Num = 2;
- DSDtLasts.Mon = TmpDate;
- When TmpDay.Num = 3;
- DSDtLasts.Tue = TmpDate;
- When TmpDay.Num = 4;
- DSDtLasts.Wed = TmpDate;
- When TmpDay.Num = 5;
- DSDtLasts.Thu = TmpDate;
- When TmpDay.Num = 6;
- DSDtLasts.Fri = TmpDate;
- When TmpDay.Num = 7;
- DSDtLasts.Sat = TmpDate;
- EndSl;
- TmpDate = TmpDate - %days(1);
- EndFor;
-
- Return DSDtLasts;
-
- /End-Free
- PDtGetLasts E
- P
-
- //=======================================================================
- // ___ _ ___ _ _ __ __
- // | \| |_ / __|___| |_| | ___| \/ |
- // | |) | _| (_ / -_) _| |__/ _ \ |\/| |
- // |___/ \__|\___\___|\__|____\___/_| |_|
- //
- //Gets the Date of the Last Day of the Month for Input Date.
- //=======================================================================
- PDtGetLoM B Export
- DDtGetLoM PI D
- D InputDt D Const
- //Local Variables
- D FirstOfMth S D Inz
- D LastOfMth S D Inz
- /Free
-
- FirstOfMth = DtGetFoM(InputDt);
- LastOfMth = (FirstOfMth +
- %months(1)) - %days(1);
-
- Return LastOfMth;
-
- /End-Free
- PDtGetLoM E
-
-
- //=======================================================================
- // ___ _ ___ _ ___
- // | \| |_ / __|___| |_| _ \___ _ _
- // | |) | _| (_ / -_) _| _/ -_) '_|
- // |___/ \__|\___\___|\__|_| \___|_|
- //
- //Gets the beginning and Ending Dates of Period for Input Year and Period
- // Number
- //=======================================================================
- PDtGetPer B Export
- DDtGetPer PI LikeDS(DtPer)
- D InputYr 4S 0 Const
- D InputNum 2S 0 Const
- //LocalVariables
- D DSDtPer DS LikeDS(DtPer)
- /Free
-
- DSDtPer.BegPer = %date('2012-12-29');
- DSDtPer.EndPer = %date('2013-01-25');
- DSDtPer.PerNum = 1;
- DSDtPer.PerYr = 2013;
-
- //Requested Period Before First Period Tracked
- If InputNum < DSDtPer.PerNum
- And InputYr <= DSDtPer.PerYr;
- Clear DSDtPer;
- Return DSDtPer;
- //Requested Period Equals First Period Tracked
- ElseIf InputNum = DSDtPer.PerNum
- And InputYr = DSDtPer.PerYr;
- Return DSDtPer;
- EndIf;
-
- DoU InputNum = DSDtPer.PerNum
- And InputYr = DSDtPer.PerYr;
- DSDtPer.BegPer = DSDtPer.EndPer + %days(1);
- DSDtPer.EndPer = DSDtPer.EndPer + %days(28);
- If DSDtPer.PerNum = 13;
- DSDtPer.PerNum = 1;
- DSDtPer.PerYr += 1;
- ElseIf DSDtPer.PerNum = 12;
- If %subdt(DSDtPer.EndPer:*days) < 28
- And %subdt(DSDtPer.EndPer:*days) > 20;
- DSDtPer.EndPer = DSDtPer.EndPer + %days(7);
- EndIf;
- DSDtPer.PerNum += 1;
- Else;
- DSDtPer.PerNum += 1;
- EndIf;
- EndDo;
-
- Return DSDtPer;
-
- /End-Free
- PDtGetPer E
-
-
- //=======================================================================
- // ___ _ ___ _ ___ ___ _
- // | \| |_ / __|___| |_| _ \___ _ _| \| |_
- // | |) | _| (_ / -_) _| _/ -_) '_| |) | _|
- // |___/ \__|\___\___|\__|_| \___|_| |___/ \__|
- //
- //Gets the Beginning and Ending Dates of Period, As Well as the Period
- // Number for Input Date.
- //=======================================================================
- PDtGetPerDt B Export
- DDtGetPerDt PI LikeDS(DtPer)
- D InputDt D Const
- D InputOp 1A Const Options(*NoPass)
- D InputOccur 2S 0 Const Options(*NoPass)
- //LocalVariables
- D X S 10I 0 Inz
- D Period S 2S 0 Inz
- D Year S 4S 0 Inz
- D DSDtPer DS LikeDS(DtPer)
- /Free
-
- DSDtPer.BegPer = %date('2012-12-29');
- DSDtPer.EndPer = %date('2013-01-25');
- DSDtPer.PerNum = 1;
- DSDtPer.PerYr = 2013;
-
- //Date Before First Period Tracked
- If InputDt < DSDtPer.BegPer;
- Clear DSDtPer;
- Return DSDtPer;
- //Date Within First Period Tracked
- ElseIf InputDt >= DSDtPer.BegPer
- And InputDt <= DSDtPer.EndPer;
- Return DSDtPer;
- EndIf;
-
- //Get Period of Input Date
- DoU DSDtPer.EndPer >= InputDt;
- DSDtPer.BegPer = DSDtPer.EndPer + %days(1);
- DSDtPer.EndPer = DSDtPer.EndPer + %days(28);
- If DSDtPer.PerNum = 13;
- DSDtPer.PerNum = 1;
- DSDtPer.PerYr += 1;
- ElseIf DSDtPer.PerNum = 12;
- If %subdt(DSDtPer.EndPer:*days) < 28
- And %subdt(DSDtPer.EndPer:*days) > 20;
- DSDtPer.EndPer = DSDtPer.EndPer + %days(7);
- EndIf;
- DSDtPer.PerNum += 1;
- Else;
- DSDtPer.PerNum += 1;
- EndIf;
- EndDo;
-
- //Calculate Previous or Future Period if Specified
- If %parms > 1
- And (InputOp = '+'
- Or InputOp = '-');
- Period = DSDtPer.PerNum;
- Year = DSDtPer.PerYr;
- Select;
- //Future Period
- When InputOp = '+';
- For X = 1 to InputOccur;
- If Period = 13;
- Period = 1;
- Year += 1;
- Else;
- Period += 1;
- EndIf;
- EndFor;
- //Previous Period
- When InputOp = '-';
- For X = 1 to InputOccur;
- If Period = 1;
- Period = 13;
- Year -= 1;
- Else;
- Period -= 1;
- EndIf;
- EndFor;
- EndSl;
- DSDtPer = DtGetPer(Year:Period);
- EndIf;
-
- Return DSDtPer;
-
- /End-Free
- PDtGetPerDt E
|
|