Domino 9 und frühere Versionen > Entwicklung
Zeitvergleich kompliziert, warum so komisch?
Rob Green:
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):
--- Code: ---'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
--- Ende Code ---
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?
ata:
Hoy Rob,
... also ich kann keinen direkten Sinn für diese Vorgehensweise erkennen - ich würde es wie du über einen dirketen Zeitvergleich machen - allerdings würde ich eine Minute Überlappung zulassen...
Termin1: 17:00 - 18:00
Termin2: 18:00 - 19:00
... das Handling wäre m.E. umständlich, wenn ich...
Termin1: 17:00 - 17:59
... oder...
Termin2: 18:01 - 19:00
... eingeben muß...
ata
eknori:
@Rob und ata:
nicht gleich meckern; ich habe das Script auch so in der Resourcendatanbank übernommen.
allerdings mit ein paar Modifikationen...
ich vergleiche auch den kompletten TimeSlot; allerdings habe ich das ganze Gedönse mit den Colums weggelassen.
ein GetAllDocsByKey und eine DocumentCollection erfüllen den gleichen Zweck.
Allerdings breche ich beim ersten Hit ab; dann brauche ich eh nicht mehr weiterzusuchen.
Rob Green:
hi @eknori, u...sorry, ich meinte nicht Dich als Author, sondern den Burschen, der diese Meeting Ressource Reservation DB in die Sandbox gestellt hatte ;D. Ich war etwas stutzig geworden aufgrund des Verfahrens im 1er Minute Step, denn ich dachte, da muß ein Haken mit meinem Ansatz sein, wenn der das nicht gewählt hatte.
Performance:
@Rob
Es gibt eine einfache Regel für LDD- wenn das ganze funtioniert und noch keine Lösung für diese Problem da war dann wird es einfach übernommen... mit no comments...
Jeder programmiert wie er es am besten kann, manche besser manche etwas weniger gut - Haupsache es funktioniert.
cu
Navigation
[0] Themen-Index
[#] Nächste Seite
Zur normalen Ansicht wechseln