Domino 9 und frühere Versionen > Entwicklung

Zeitvergleich kompliziert, warum so komisch?

(1/5) > >>

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