anhand einer Meetingroom Vorlage aus dem I-Net habe ich mir anegschaut, wie der Autor einen zu buchenden Raum auf Terminüberschneidungen abgleicht. (Quelle:
http://www-10.lotus.com/ldd/sandbox.nsf/ecc552f1ab6e46e4852568a90055c4cd/3ceb15a46ae9a99185256c9500712b1c?OpenDocument )
Hierzu nimmt der Autor vom zu buchenden Raum
- das Datum, zB 15.03.2003
- die Startzeit, zB 16:00
- die Endzeit, zB 16:05
dann generiert er sog. Timeslots in 1-Minuten-Schritten-->
16:00, 16:01, 16:02, 16:03, 16:04, 16:05
Und vergleicht diese Werte mit allen bestehenden Terminen, die am gleichen Datum stattfinden (wenn der Raum der gleiche ist), indem er auch bei den bestehenden Terminen alle Zeitwerte in 1-Minuten Slots aufbröselt.
Anbei das Script (achtet auf den letzten Teil):
'Get and create the time slots for the current uidoc so we can check the back doc for time period clashes
startdate$ = Cstr(Mdate)
slotlist$ = "" ' For formating the time value
Dim dtimefrom As New NotesDateTime(startdate$ & " " & uidoc.FieldGetText("TimeFrom"))
Dim dtimeto As New NotesDateTime(startdate$ & " " & uidoc.FieldGetText("TimeTo"))
Dim Tslot As NotesDateTime
Dim TimeSlots2() As Variant 'Set up the dynamic array to hold the 1 minute time slots
Dim x As Integer 'counter for array elements
Set Tslot = dtimefrom
Tslot.AdjustMinute - Minute(dtimefrom.LSLocalTime) Mod 1
x=0
Redim TimeSlots2(x)
While Tslot.LSLocalTime < dtimeto.LSLocalTime
If Not slotlist$ = "" Then TimeSlots2(x) = slotlist$
slotlist$ = Format$(Tslot.LSLocalTime, "hh:mm:ss")
Tslot.AdjustMinute 1
x=x +1
Redim Preserve TimeSlots2(x) 'keep the array elements so far
Wend
Forall c In view.Columns
If ( c.IsSorted And c.IsCategory ) Then
Set column = c
Exit Forall
End If
End Forall
Do While Not ( doc Is Nothing ) ' now let's check all the other documents in the collection until we run out of docs
'The first column is 0
If ( doc.ColumnValues( column.Position - 1 ) = Datevalue(Mdate) ) Then
Val1 = doc.room
' Get the intervening 1 minute slots, these were created when the document being checked was approved
TimeSlots=doc.SlotList
docroom=Cstr(Val1(0))
%REM
Check rooms for availability, also if the room in the uidoc matches a room in the document collection
then check if the time slots in the back document being checked matches any of the time values in the uidoc.
%END REM
...
If Mroom = R5 And docroom = R5 Then
Forall period In TimeSlots
V1= period
Forall s In TimeSlots2
V2 = s
If V1 = V2 Then
Goto NotAvailable
End If
End Forall
End Forall
End If
anbei auch ein Bild aus dem Debugger..
V1 ist der bestehende "Alt-"Termin, bzw. gebildete Minuten Slot (sichtbar in Variable TIMESLOT) und
V2 ist der Wert des zu buchenden "Neu"-Termins, ebenso in Minuten stepweise hochgejagt und verglichen mit V1..
FRAGE:wozu macht man das kompliziert? Irgendwie sehe ich nicht den Sinn dahinter. Zumal das ziemlich lahm ist, weil die Anzahl der Iteration (zweck Vergleich) der Anzahl der Minutensteps aus Alttermin und Neutermin entspricht.
Das was ich machen würde...
1. nimm Docs (bestehende Termine) deren Datum gleich mit dem zu buchenden neuen Termindoc ist
2. WENN StartZeit Neuer Termin (SZn) > EndZeit Alter Termin (EZa) ist
dann ok
3. WENN StartZeit Neuer Termin < EndZeit Alter Termin
dann check, ob
Ende Zeit Neuer Termin (EZn) < Start Zeit Alter Termin (SZa)
Also Beispiel:
1. alter Termin wäre heute 17:00-18:00 Uhr
neuer Termin sei heute 18:01-19:00 Uhr
dann ist erste Bedingung ok (SZn > EZa) , also keine Überschneidung
2. alter Termin wäre heute 17:00-18:00 Uhr
neuer Termin sei heute 16:00-19:00 Uhr
dann ist erste Bedingung nicht ok (SZn > EZa) , also mögliche Überschneidung (kann ja sein, daß neuer Termin aufhört, bevor "alter" Termin anfängt heute)
also: zweite Bedingung EZn<SZa auch nicht ok, damit Terminüberschneidung
3. alter Termin wäre heute 17:00-18:00 Uhr
neuer Termin sei heute 16:00-16:59 Uhr
dann ist erste Bedingung nicht ok (SZn > EZa) , also mögliche Überschneidung (kann ja sein, daß neuer Termin aufhört, bevor "alter" Termin anfängt heute)
also: zweite Bedingung EZn<SZa ok, damit keine Terminüberschneidung
Hab ich was übersehen oder warum macht der obige AUtor so ein Gedönse?