/*------------------------------------------------------------------------------ Author: Speedy Mercer Purpose: Compare 2 dRightFromte ranges. Parameters: INPUT LeftFrom AS DATE INPUT LeftTo AS DATE INPUT RightFrom AS DATE INPUT RightTo AS DATE OUTPUT Result AS CHARACTER Notes: Result: "BEFORE", "AFTER", "EQUAL", "OVERLAP", "{Error Mesage}". Valid for all date values and ?. Thanks To: Jeff Pilant for suggesting and providing verbose comments and reworking the code to allow for any date. ------------------------------------------------------------------------------*/ DEFINE INPUT PARAMETER dLeftFrom AS DATE NO-UNDO. DEFINE INPUT PARAMETER dLeftTo AS DATE NO-UNDO. DEFINE INPUT PARAMETER dRightFrom AS DATE NO-UNDO. DEFINE INPUT PARAMETER dRightTo AS DATE NO-UNDO. DEFINE OUTPUT PARAMETER cResult AS CHARACTER NO-UNDO. /* If From and To are defined, require From < To */ IF (dLeftFrom <> ? AND dLeftTo <> ? AND dLeftFrom > dLeftTo) OR (dRightFrom <> ? AND dRightTo <> ? AND dRightFrom > dRightTo) THEN DO: ASSIGN cResult = "ERROR!" + CHR(13) + "FROM From times must be Before the TO times!". RETURN. END. /* Simple equality check */ IF dLeftFrom = dRightFrom AND dLeftTo = dRightTo THEN DO: ASSIGN cResult = "EQUAL":U. RETURN. END. /* if both ends of either range are undefined then overlap */ IF (dLeftFrom = ? AND dLeftTo = ?) OR (dRightFrom = ? AND dRightTo = ?) THEN DO: ASSIGN cResult = "OVERLAP":U. RETURN. END. /* Test if the left To is before the right From */ IF dLeftTo <> ? AND dRightFrom <> ? AND dLeftTo < dRightFrom THEN DO: ASSIGN cResult = "BEFORE":U. RETURN. END. /* Test if the left From is after the right To */ IF dLeftFrom <> ? AND dRightTo <> ? AND dLeftFrom > dRightTo THEN DO: ASSIGN cResult = "AFTER":U. RETURN. END. /* OverLap Check */ IF (dLeftTo <> ? AND dRightFrom <> ? AND dLeftTo > dRightFrom) OR (dLeftFrom <> ? AND dRightTo <> ? AND dLeftFrom < dRightTo) THEN DO: ASSIGN cResult = "OVERLAP":U. RETURN. END. /* You should NEVER get here! */ ASSIGN cResult = "Unexpected error! Condition not allowed for!" + CHR(13) + STRING(dLeftFrom, "99/99/9999") + " - " + STRING(dLeftTo, "99/99/9999") + CHR(13) + STRING(dRightFrom, "99/99/9999") + " - " + STRING(dRightTo, "99/99/9999").