#if .f. Code Step && Comment Code Step && Comment Code Step && Comment Code Step && Comment Code Step && Comment Code Step && Comment Code Step && Comment #endifblock so that any maintenance on this "TESTED AND PROVEN" function can be easily applied. It is my belief that known good functions SHOULD be optimized but not at the sake of enhancement. That is why MsFox gave us the * and the &&.
ldTo = m.ldTo + IIF(m.lnDOWTo >= 2,7 - m.lnDOWTo,-1) > ldFrom = m.ldFrom - IIF(m.lnDOWFrom <= 6,m.lnDOWFrom - 1,0) > lnDays = INT((m.ldFrom - m.ldTo + 1) * 5 / 7) > lnDays = m.lnDays - IIF(m.lnDOWFrom >= 2 AND m.lnDOWFrom <= 6,m.lnDOWFrom - 2,0) > lnDays = m.lnDays - IIF(m.lnDOWTo >= 2 AND m.lnDOWTo <= 6,6 - m.lnDOWTo,0) >RETURN m.lnDays>
ldTo = m.ldTo + IIF(m.lnDOWTo >= 2,7 - m.lnDOWTo,-1) >ldFrom = m.ldFrom - IIF(m.lnDOWFrom <= 6,m.lnDOWFrom - 1,0) >lnGrossDays = (m.ldTo - m.ldFrom + 1) * 5 / 7 >lnFromAdj = IIF(m.lnDOWFrom >= 2 AND m.lnDOWFrom <= 6,m.lnDOWFrom - 2,0) >lnToAdj = IIF(m.lnDOWTo >= 2 AND m.lnDOWTo <= 6,6 - m.lnDOWTo,0) >RETURN m.lnGrossDays - m.lnFromAdj - m.lnToAdj>
>>LOCAL lntotaltime,iloops,idates,idays,icycle >> >>FOR icycle=1 TO 2 >> lntotaltime=0 >> >> ?IIF(icycle=1,'Legible','Faster')+" Started time:"+TRANSFORM(TIME()) >> >> FOR iloops = 1 TO 10 >> lnstarttime=SECONDS() >> >> FOR idates = 1 TO 100000 >> ldfrom=DATE()-(RAND()*50000) >> ldto=ldfrom+(RAND()*50000) >> >> idays=weekdays(ldfrom,ldto,(icycle=1)) >> >> ENDFOR >> >> lnendtime=SECONDS() >> ?SPACE(0) >> ?"Loop "+TRANSFORM(iloops)+" Elapsed time in seconds:"+TRANSFORM(lnendtime-lnstarttime) >> lntotaltime=lntotaltime+(lnendtime-lnstarttime) >> ENDFOR >> ?IIF(icycle=1,'Legible','Faster')+"Average per loop:"+TRANSFORM(lntotaltime/10) >> >>ENDFOR >> >> >>FUNCTION weekdays >> LPARAMETERS tdFrom, tdTo, tllegible >> >> IF VARTYPE(m.tdFrom)#"D" OR VARTYPE(m.tdTo)#"D" >> RETURN .F. >> ENDIF >> >> LOCAL ldfrom, ldto, lnDOWFrom, lnDOWTo,lnstep1,lnstep2,lnstep3 >> ldfrom = MIN(m.tdFrom,m.tdTo) >> ldto = MAX(m.tdFrom,m.tdTo) >> >> lnDOWFrom = DOW(m.ldfrom,1) >> lnDOWTo = DOW(m.ldto,1) >> >> IF tllegible >> lnstep1 = INT(((m.ldto + IIF(m.lnDOWTo >= 2,7 - m.lnDOWTo,-1)); >> - (m.ldfrom - IIF(m.lnDOWFrom <= 6,m.lnDOWFrom - 1,0)) + 1) * 5 / 7) >> lnstep2 = IIF(m.lnDOWFrom >= 2 AND m.lnDOWFrom <= 6,m.lnDOWFrom - 2,0) >> lnstep3 = IIF(m.lnDOWTo >= 2 AND m.lnDOWTo <= 6,6 - m.lnDOWTo,0) >> >> RETURN lnstep1 - lnstep2 - lnstep3 >> ELSE >> RETURN INT(((m.ldto + IIF(m.lnDOWTo >= 2,7 - m.lnDOWTo,-1)); >> - (m.ldfrom - IIF(m.lnDOWFrom <= 6,m.lnDOWFrom - 1,0)) + 1) * 5 / 7) ; >> - IIF(m.lnDOWFrom >= 2 AND m.lnDOWFrom <= 6,m.lnDOWFrom - 2,0) ; >> - IIF(m.lnDOWTo >= 2 AND m.lnDOWTo <= 6,6 - m.lnDOWTo,0) >> ENDIF >>