Set the trigger date to the previous date according to the periodicity and rules
| Return Type | Function name | Arguments |
|---|---|---|
| hzEcode | hzCron::Retard | (hzXDate&,uint32_t,) |
Declared in file: hzCron.h
Defined in file : hzCron.cpp
Function Logic:
Function body:
hzEcode hzCron::Retard (hzXDate& date)uint32_t factor,
{
// Set the trigger date to the previous date according to the periodicity and rules
//
// Arguments: 1) date Full date and time
// 2) factor No of intervals to retard
//
// Returns: E_ARGUMENT If the number of intervals to retard is zero
// E_NOINIT If this hzCron is not active or cannot be retarded
// E_OK If this hzCron set the date of the previous occurance
_hzfunc("hzCron::Advance(hzXDate)") ;
uint32_t Y ; // Year
uint32_t M ; // Month
uint32_t dow ; // Day of week
uint32_t alt ; // No of days to retard
if (!m_bActive)
{
date.Clear() ;
m_error = "Interval not active" ;
return E_NOINIT ;
}
if (factor < 1)
{
m_error = "Factor must be 1 or more" ;
return E_ARGUMENT ;
}
if (!date.IsSet())
date.SysDateTime() ;
do
{
Y = date.Year() ;
M = date.Month() ;
dow = date.Dow() ;
// Every day
if (m_Period == HZPERIOD_DAY) { alt = 1; date.altdate(DAY, -alt) ; }
// Mon - Sat",
else if (m_Period == HZPERIOD_MONSAT) { alt = dow==0? 2: 1; date.altdate(DAY, -alt) ; }
// Weekdays only
else if (m_Period == HZPERIOD_WEEKDAY) { alt = dow>4? dow - 4: dow ? 1: 3; date.altdate(DAY, -alt) ; }
// Every [Monday - Friday]
else if (m_Period == HZPERIOD_EMON) { alt = dow>0? dow : 7; date.altdate(DAY, -alt) ; }
else if (m_Period == HZPERIOD_ETUE) { alt = dow>1? dow - 1: dow + 6; date.altdate(DAY, -alt) ; }
else if (m_Period == HZPERIOD_EWED) { alt = dow>2? dow - 2: dow + 5; date.altdate(DAY, -alt) ; }
else if (m_Period == HZPERIOD_ETHR) { alt = dow>3? dow - 3: dow + 4; date.altdate(DAY, -alt) ; }
else if (m_Period == HZPERIOD_EFRI) { alt = dow>4? dow - 4: dow + 3; date.altdate(DAY, -alt) ; }
else if (m_Period == HZPERIOD_ESAT) { alt = dow>5? dow - 5: dow + 2; date.altdate(DAY, -alt) ; }
else if (m_Period == HZPERIOD_ESUN) { alt = dow + 1; date.altdate(DAY, -alt) ; }
// Every other [Monday - Friday]
else if (m_Period == HZPERIOD_ALT_MON) { alt = dow>0? dow : 7; alt += 7; date.altdate(DAY, -alt) ; }
else if (m_Period == HZPERIOD_ALT_TUE) { alt = dow>1? dow - 1: dow + 6; alt += 7; date.altdate(DAY, -alt) ; }
else if (m_Period == HZPERIOD_ALT_WED) { alt = dow>2? dow - 2: dow + 5; alt += 7; date.altdate(DAY, -alt) ; }
else if (m_Period == HZPERIOD_ALT_THR) { alt = dow>3? dow - 3: dow + 4; alt += 7; date.altdate(DAY, -alt) ; }
else if (m_Period == HZPERIOD_ALT_FRI) { alt = dow>4? dow - 4: dow + 3; alt += 7; date.altdate(DAY, -alt) ; }
else if (m_Period == HZPERIOD_ALT_SAT) { alt = dow>5? dow - 5: dow + 2; alt += 7; date.altdate(DAY, -alt) ; }
else if (m_Period == HZPERIOD_ALT_SUN) { alt = dow + 1; alt += 7; date.altdate(DAY, -alt) ; }
else
{
switch (m_Period)
{
// Monthly
case HZPERIOD_MONTH:
M-- ; break ;
// Bi-monthly [odd/even]
case HZPERIOD_MONTH1:
case HZPERIOD_MONTH2:
alt = M % 2; M -= alt ? alt : 2; break ;
// Quarterly [month1 - month3]
case HZPERIOD_QTR1: case HZPERIOD_QTR2: case HZPERIOD_QTR3:
alt = M % 3; M -= alt ? alt : 3; break ;
// Half yearly [month1 - month6]
case HZPERIOD_HYEAR1: case HZPERIOD_HYEAR2: case HZPERIOD_HYEAR3: case HZPERIOD_HYEAR4: case HZPERIOD_HYEAR5: case HZPERIOD_HYEAR6:
alt = M % 6; M -= alt ? alt : 6; break ;
// Every [Jan - Dec]
case HZPERIOD_YEAR1: case HZPERIOD_YEAR2: case HZPERIOD_YEAR3: case HZPERIOD_YEAR4: case HZPERIOD_YEAR5: case HZPERIOD_YEAR6:
case HZPERIOD_YEAR7: case HZPERIOD_YEAR8: case HZPERIOD_YEAR9: case HZPERIOD_YEAR10: case HZPERIOD_YEAR11: case HZPERIOD_YEAR12:
Y-- ; break ;
}
if (M < 1)
{ Y-- ; M += 12;}
date.SetDate(Y, M, 1);
}
// Have arrived at a possible date. Check if this is not excluded. If it is we do not decrement the factor
if (!IsHoliday(date, m_exclhols))
factor-- ;
}
while (factor) ;
return E_OK ;
}