[AccessD] Appointment collisions

John W. Colby jwcolby at colbyconsulting.com
Wed Apr 7 21:23:29 CDT 2004


Lets try that again.  I got a couple of other functions in the first email


For anyone who has never seen the code, Lembit donated the following code
which I documented and placed into a function which checks for appointment
collisions.  I just finished building a set of two queries and a report to
display any collisions between times entered into my billing programs.  I
work on site a lot and if I don't have my laptop I keep an email open which
I then email home to myself with my hours and a brief summary of what I am
doing.  In any case I end up copying that into my billing program every few
days.  I have always "manually" checked my hours to make sure I didn't enter
times in wrong, but a simple report to tell me if I am entering overlapping
times is a must.  There is nothing more embarrassing that billing the
customer twice for the same time!

The following is the function.

'Comments  :    THANKS TO LEMBIT SOOBIK
'there is a 'simple' equation which defines a conflict in appointments:
'let's name the starting point of an existing appointment Se, endpoint Ee
'and for the new appointment to be tested the starting point St, endpoint Et
'now you can simply check
'
'If St < Ee AND Et > Se
'
'then you have a conflict.
'you can easily visualize that by following drawing
'
'_________Se______Ee______
'1_St__Et
'2_St_________Et
'3_St__________________Et
'4___________St_Et
'5___________St________Et
'6_____________________St__Et
'
'As you can see, only cases 2, 3, 4, 5 have a conflict. case 1 does not have
a conflict because it ends before the existing one starts (Et < Se) and 6
does not have a conflict since it starts after the existing ends (St > Ee.
'
'Parameters:
'Sets      :
'Returns   :
'Created by: Colby Consulting
'Created   : 6/25/99 11:43:56 AM
Function ccApptCollision(IDNew As Long, dtmSTNew As Date, dtmETNew As Date,
_
                        IDExist As Long, dtmSTExist As Date, dtmETExist As
Date) As Boolean
On Error GoTo Err_ccApptCollision
#If boolELE Then
    Call gProcStack.EnterProc("ccApptCollision", "Module1")
#End If

    'CHECK IF WE ARE COMPARING A RECORD TO ITSELF
    If IDNew = IDExist Then
        ccApptCollision = False
        Exit Function
    End If

    'CHECK FOR COLLISIONS
    If (dtmSTNew < dtmETExist) And (dtmETNew > dtmSTExist) Then
        ccApptCollision = True
    Else
        ccApptCollision = False
    End If

Exit_ccApptCollision:
#If boolELE Then
    Call gProcStack.ExitProc("ccApptCollision")
#End If
Exit Function

Err_ccApptCollision:
#If boolELE Then
    WriteErrorLog Err
#End If
    Select Case Err
    Case 0      'insert Errors you wish to ignore here
        Resume Next
    Case Else   'All other errors will trap
        Beep
        MsgBox Err.Description, , "Error in function
Module1.ccApptCollision"
    Resume Exit_ccApptCollision
    End Select
    Resume 0    'FOR TROUBLESHOOTING
End Function

**********

In my billing I keep the time and date separate.  I then build a query where
I drop the time table in twice, join on the date, then add the time and date
fields into a single value and pass them into the parameters of the function
above as well as the time record IDs from the two records.  Out pops a true
/ false value that tells me if I have a collision.  You can actually do the
same without any join but the result set can get huge in a hurry so you will
need to limit the date ranges.

Again, thanks to Lembit for the logic.
John W. Colby
www.ColbyConsulting.com





More information about the AccessD mailing list