Das Notes Forum

Domino 9 und frühere Versionen => Entwicklung => Thema gestartet von: Rob Green am 01.03.03 - 17:29:53

Titel: Zeitvergleich kompliziert, warum so komisch?
Beitrag von: Rob Green am 01.03.03 - 17:29:53
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

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..
(http://www.basicthinking.de/grafics/slots.jpg)

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?
Titel: Re:Zeitvergleich kompliziert, warum so komisch?
Beitrag von: ata am 02.03.03 - 17:04:07
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
Titel: Re:Zeitvergleich kompliziert, warum so komisch?
Beitrag von: eknori am 02.03.03 - 17:52:30
@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.

Titel: Re:Zeitvergleich kompliziert, warum so komisch?
Beitrag von: Rob Green am 02.03.03 - 22:16:51
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.
Titel: Re:Zeitvergleich kompliziert, warum so komisch?
Beitrag von: Performance am 02.03.03 - 22:39:35
@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
Titel: Re:Zeitvergleich kompliziert, warum so komisch?
Beitrag von: Rob Green am 02.03.03 - 23:11:49
*yep*
*kratz*
basst scho...  ;D
Titel: Re:Zeitvergleich kompliziert, warum so komisch?
Beitrag von: eknori am 03.03.03 - 07:51:05
@Rob:

das du nicht mich meinst; das habe ich schon verstanden.
Ich hatte das Ganze damals auch einfach kommentarlos übernommen, da ich was brauchte, was ich der Geschäftsleitung vorstellen konnte.
Wie du ja selbst in dem Thread zur Resourcen DB lesen kannst, habe ich mir mit den Timeslots aber nur neue Probleme geschaffen.
Da ich die TimeSlots beim Speichern der Termine erzeuge, werden keine TimeSlots erzeugt, wenn ein Termin direkt aus dem Planer ( da isser wieder  ;D ) erzeugt wird.
Wird nun ein weiterer termin aus einer Ansicht erzeugt, fehlen die Informatioen zur busytime; und schon ist eine terminüberschneidung möglich.

Bei deinem Verfahren kann man sich die ganze Berechnerei sparen und die Verfügbarkeit "on the fly" berechnen.

Hast du Lust das mal in die Resourcen DB einzubauen ?  ;D ;D

@Performance:

mit LDD hast du absolut recht; manchmal gibt es da Sachen, da fasst man sich echt an den Kopf...

Titel: Re:Zeitvergleich kompliziert, warum so komisch?
Beitrag von: Rob Green am 03.03.03 - 08:20:09
doofe Frage, kann man den Planer in irgendeiner Form nachbauen? Meine damit den Planer aus dem R6 bzw dieses Planer Sheet von JNotes, ohne aber daß man damit was buchen kann in letzteren Falle...nur zur grafischen Ansicht der belegten Termine ist es absolut ideal.
Titel: Re:Zeitvergleich kompliziert, warum so komisch?
Beitrag von: eknori am 03.03.03 - 08:43:45
das ist ein Parameter im Planer; damit kanns du steuern, ob man Dokumente erstellen kann oder nicht.
Titel: Re:Zeitvergleich kompliziert, warum so komisch?
Beitrag von: Rob Green am 03.03.03 - 12:17:53
eine Frage zu dem Planer:
wenn ich den originalen Planer downloade incl. dem Jar File..dann schreiben die von JNotes was von "Textdateien" die man anpassen könnte im Sinne einer Config. Ähm..bitte nicht lachen...wo sollen diese Textdateien sein? Oder versteh ich einfach was falsch?
Zumal die PopUp Maske im Sheet irgendwie anders aussieht als bei mir (habe das Applet für den 5er verwendet)
Titel: Re:Zeitvergleich kompliziert, warum so komisch?
Beitrag von: eknori am 03.03.03 - 13:10:50
Ja, zwischen dem was du bei JNotes downloaden kannst und dem, was irgendwie den Weg hierhin gefunden hat  ;D gibt es einen Unterschied.
Allerdings sollte man auch den R5 Planer mit den entsprecjenden Parametern zu umnauen können, daß er so aussieht wie meiner. Zumindest nach Aussage von Jörn Schwarze von ULC ( JNotes )

Das Mit den COnfig Dateien habe ich auch nicht so richtig verstanden. Gut, du kannst natürlich die Parameter, die dem Planer übergeben werden auch aus einer Textdatei beziehen. Das würde dann die Sache dynamischer machen, da du dann niemanden ans Desig lassen muß. Aber ob das damit gemeint ist ??

Ulrich
Titel: Re:Zeitvergleich kompliziert, warum so komisch?
Beitrag von: Rob Green am 03.03.03 - 14:49:55
hihihi*** ich komme wohl um eine Einblick in Java einfach nicht mehr drum.

Was ich nachbauen möchte ist:
in der Buchungsmaske sollen entsprechend
- der eingestellte Raum zur Lokation XYZ (mehrere Standorte möglich, damit auch mehrere Räume je Standort )
- die Ressource(n) wie Beamer etc.. zum Standort
- die gewünschte Start-End Zeit
innerhalb der Maske als eigener Planer auftauchen, der nur diese Infos bekommt und dann die belegten Zeiten pro Tag/Woche/Monat in Balkenform anzeigt. Also eigentlich ein nachgebauter R6 Planer vom Notes Original.

Ist das Deines Erachtens sehr aufwendig oder geht das einigermassen, wenn Du Deinen Aufwand mit Deinem Java Planer betrachtest? Immerhin bietet die Noteshilfe zu allen Notesklassen die komplementären Scriptklassen..sollte also eigentlich recht gut gehen, sich da einzuarbeiten.
Titel: Re:Zeitvergleich kompliziert, warum so komisch?
Beitrag von: eknori am 04.03.03 - 08:34:34
@Rob:

Ich habe deine theoretischen Überlegungen zur Ermittlung von Terminkollisionen mal in eine Formel  verpackt.

zunaächst einmal eine Variable ueberschneidung mit 1 vorbesetzen; also grundsätzlich immer von einer Ueberschneidung ausgehen.

dann

if SZn > EZa then
   ueberschneidung = 0 ' keine Überschneidung
else
   if SZn < EZa AND EZn < SZa then
      ueberschneidung = 0
   end if
end if

trifft also keine der Bedingungen zu, dann haben wir eine Terminüberschneidung.

Das ganze dann in einer Schleife über alle Dokumente für den betreffenden Tag.

eknori
Titel: Re:Zeitvergleich kompliziert, warum so komisch?
Beitrag von: Rob Green am 04.03.03 - 09:07:04
nur ein Hinweis, falls das unklar oder undeutlich ist:
der Vergleich muß unbedingt ein Datums/Zeitwert sein..eine Zeitangabe alleine bringt nix...denn es kann ja auch Termine geben wie:

01.02.2003 09:00 - 05.02.2003 10:00

Wenn man jetzt nur die Uhrzeit nehmen würde (09:00 - 10:00) dann käme man mit der "Formel", wie Du sie oben gepostet hast nicht darauf, daß dieser Termin mit einem anderen vom 03.02.2003 15:00 - 03.02.2003 16:00 kollidiert.

Ist zwar klar, aber es sei nur zur Sicherheit nochmals erwähnt.

Im Sript hab ichs momentan so, daß ich zuerst den RAUM suche, ob der schon überhaupt irgendwann belegt worden ist, anhand der Bezeichnung des Raums (also nicht ausgehend von der Zeit!!!). Dann nehme ich mir in eine Collection alle entsprechenden Raumtermine und mache erst dann den Datums/Zeitvergleich.

Ich habe mich deswegen für diese Variante entschieden, da es wie gesagt mehrtägige Termine geben kann vom obigen Typ.

Auch ein Explode von Datumswerten einer LookUp Ansicht würde nichts bringen, da man ausgehend vom neuen Termin - die beiden Eckwerte Startdatum und Enddatum nehmend - nicht unbedingt die richtigen Termine findet (zB dann wenn neuer Termin vom 01.02. - 05.02. läuft, und für den Raum schon ein Termin am 03.02.-04.02. gebucht worden ist). Sucht man also "wo ist denn ein Termin am 01.02....nix...wo ist ein Termin am 05.02...nix..." und das ist natürlich falsch.

Auszug aus Code:
Code
'Variablen für Zeitvariablen des jetzigen Docs und der zu vergleichenden Docs
   Dim dateNEUStart As Variant
   Dim dateALTStart As Variant
   Dim dateNEUnde As Variant
   Dim dateALTEnde As Variant
   
   'Ziehe Startdatumzeit zB. "12.03.2003 16:00" und EndDatumZeit zB. "12.03.2003 18:00" des jetzigen Docs
   dateNEUStart = uidoc.FieldGetText( "StartdatumZeit" )
   dateNEUEnde = uidoc.FieldGetText( "EndDatumZeit" )
   startdateNEU$ = Cstr(dateNEUStart)
   enddateNEU$ = Cstr(dateNEUEnde)
   
   'Erzeuge von den beiden Anfangs und Endwerten NotesDateTime Objekte
   Dim dtimefromNEU As New NotesDateTime(startdateNEU$)
   Dim dtimetoNEU As New NotesDateTime(enddateNEU$)
.....
                'Dann der Vergleich später...
                'hole erstes Alt-Doc aus Collection heraus zwecks Vergleich
         Set AltDoc = DocColl.getFirstDocument
         While Not AltDoc Is Nothing
            
            'Checklauf wenn jetziges Doc nicht neu ist
            If flag=False Then            
               unidAlt$ = AltDoc.UniversalID
               If unidAlt$ <> unid$ Then    'wenn UNID nicht übereinstimmt ist es ein anderes Alt-Doc      
                  
                  dateALTStart = AltDoc.StartdatumZeit(0)
   dateALTEnde = AltDoc.EndDatumZeit(0)   
   startdateALT$ = Cstr(dateALTStart)
   enddateALT$ = Cstr(dateALTEnde)   
                  
   Dim dtimefrom2ALT As New NotesDateTime(startdateALT$)
   Dim dtimeto2ALT As New NotesDateTime(enddateALT$)
                  
                 'ist Startdatumzeit NEU > EndeDatumZeit ALT ? ..keine Überschneidung..da neue Termin nachher beginnt...wenn nicht, muß man noch weiter checken
                  If dtimefromNEU.TimeDifference( dtimeto2ALT ) > 0 Then
                     meldung$={- Raum } & Cstr(doc.Raum(0))  & {: -} & Chr(10)
                  Else 
                  'ist EndeDatumZeit NEU < StartDatumZeit ALT ? ..keine Überschneidung, da neue Termin vorher fertig      
                     If dtimetoNEU.TimeDifference( dtimefrom2ALT ) < 0 Then
                        meldung$={- Raum } & Cstr(doc.Raum(0))  & {: -} & Chr(10)
                     Else 
                        meldung$={- Raum } & Cstr(doc.Raum(0))  &  {: - Terminüberschneidung } & Chr(10) & startdateALT$ & { - } & enddateALT$ & Chr(10)
                        Sperrflag$="1"
                     
               End If
            End If


Und abstrakt ist die Formel gemäß Deiner Schreibkonvention:

if SZn > EZa then
  ueberschneidung = 0 ' keine Überschneidung
else
  if EZn < SZa then 'habe die erste Bedingung wech, da bereits in ersten IF
      ueberschneidung = 0
  end if
end if
Titel: Re:Zeitvergleich kompliziert, warum so komisch?
Beitrag von: eknori am 04.03.03 - 12:45:44
und warum nicht gleich

if SZn > EZa  OR EZn < SZa then
  ueberschneidung = 0 ' keine Überschneidung
end if

Titel: Re:Zeitvergleich kompliziert, warum so komisch?
Beitrag von: Rob Green am 04.03.03 - 12:58:02
das wäre die "gezippte" Endversion...schlanker als der Minute Slot Ansatz, oder?

cool..eine Zeile gegen X .wow...das wäre in der Praxis der Versionsanstieg von 1.0 auf 3.0. ;)
Titel: Re:Zeitvergleich kompliziert, warum so komisch?
Beitrag von: Rob Green am 04.03.03 - 14:40:51
übrigens..mir fällt gerade was auf..

nicht OR sondern AND:

if SZn > EZa  OR AND EZn < SZa then
  ueberschneidung = 0 ' keine Überschneidung
end if


Titel: Re:Zeitvergleich kompliziert, warum so komisch?
Beitrag von: eknori am 04.03.03 - 19:39:03
zuviel StarTrek gesehen ??

nein; habe noch nicht gehört, daß das Startdatum/Zeit das EndeDatum/Zeit rückwärts überholt ; bei Warp 10 allerdings...


enweder liegt  SZn nach dem EZa ODER EZn liegt vor den SZa
;
dann liegt auch logischerweise EZn nach SZn bzw SZn vor EZn

nur dann ist es keine Terminkollision

eknori
Titel: Re:Zeitvergleich kompliziert, warum so komisch?
Beitrag von: Rob Green am 04.03.03 - 21:57:04
jy, genau das war es .. Star Trek...

ok, wo Du Recht hast sagt Dir jetzt das Licht *plop*
öh..

wo Du Recht hast, hast Du Recht

 ;)
Titel: Re:Zeitvergleich kompliziert, warum so komisch?
Beitrag von: GeorgeF am 20.03.03 - 13:07:56
Hi the Name is George France the Author of the Meeting Room database.  I did not know that a whole thread in a forum would be dedicated to it, makes me feel quite humble.

I see what you are trying and I agree that the changes are what is needed, remember I had to throw the together because I was on a deadline to get the project out.

Unfortunately .... Ich kann nich Deutsche spraken oder lesen. :-[

Aber, viel gluck! :D

George France

Titel: Re:Zeitvergleich kompliziert, warum so komisch?
Beitrag von: Rob Green am 20.03.03 - 13:32:30
hi George, how did you find this thread in the huge I-Net and zillions of informations? wow... :o

Your meeting room db was a very good starting point to my own application. congrats! But, when i stumbled across the given minute-time-slots-code posted above i wondered what the reasons could have been by the developer to choose that kind of - well - "complicated"  ;D solution.
I was unsure to adopt that alternative or choose another way.


The thread is about this way:

1 new, planned appointment, lets say 03.31.03 08:00-10:00
1 old, existing appointment, lets say 03.31.03 09:00-11:00

Now, how to check for time collisions?

The idea

is New STARTDateTime > Old ENDDateTime
IF YES: no time collision
IF NO: 2nd check
[/list]

is New ENDDateTime < Old STARTDateTime
IF YES: no time collision
IF NO: time collision
[/list]

In our example above the first condition is FALSE
since 03.31.03 08:00 is not > 03.31.03 11:00
The second condition is FALSE too (the new appointment isnt ending before the start of the old existing appointment)
since 03.31.03 10:00 is not < 03.31.03 09:00


So its a one-liner:

if SDTnew > EDTold  OR EDTnew < SDTold then
  collision_flag$="no"
end if

(.."DT".. stands for = "DateTime")

Now im nearly finished with my project and im a little proud of it because it goes a bit further, mastering repeating appointments, fulltime events with >1 day and starting time > end time and so on and so on...

Thanks again for your DB as a very good starting point!!!
*bows*
Titel: Re:Zeitvergleich kompliziert, warum so komisch?
Beitrag von: eknori am 20.03.03 - 13:37:39
@Rob:

ich habe ihn auf  "den richtigen Weg" geführt; habe in der Sandbox einen Link auf deinen Thread hinterlassen.  ;D ;D
Titel: Re:Zeitvergleich kompliziert, warum so komisch?
Beitrag von: Rob Green am 20.03.03 - 13:41:11
ah..dankeschön...hätte ich depp selbst machen sollen, wenn ich mich schon von Dritten bzw. deren Ideen befruchten lasse zwecks einem netten Dankschön  ;)
Titel: Re:Zeitvergleich kompliziert, warum so komisch?
Beitrag von: GeorgeF am 24.03.03 - 12:49:27
H Rob

I found the thread from the link in the Sandbox with the Comments section where my db is located.

Why did I make it so complicated using the time slots the way I did?  Well, The version of the db that I posted onto the sandbox was a different version in that they only had seven (7) rooms which would make the database code much easirer to handle, as you have done and shown.  

In my live version it was more complicated because they had rooms that had partitions that could be removed so that one room could be combined to create a larger meeting room.

Shown below is the room setup that display in my room selection list:-

Boardroom 1
Boardroom 2
Boardroom 3
Boardrooms 1 & 2 combined
Boardrooms 2 & 3 combined
All Boardrooms 1 - 2 & 3 combined
Project room

As can be seen from above rooms 1 2 & 3 could be combined this made it more complicated in checking what room(s) were free (a nightmare).  I was playing with the time slots idea and decided to stick with it, although I like your idea.

But as I mentioned before when your under pressure by the boss you don't often see the wood through the trees.

If I am not presuming too much, can you send a copy of your db with the option of repeating bookings to:-

george.france@pinkroccade.co.uk

I would appreciate a fresh look at your version

Thanks George

Titel: Re:Zeitvergleich kompliziert, warum so komisch?
Beitrag von: Rob Green am 24.03.03 - 13:08:00
ok, im still working on it...my customer isnt that unhappy, since he has already 115%  ;D  np..i will send it to you if im ready.

The combination of rooms is as in my DB...im playing with multiple ressources in one entry. But, the collision routine is always the same, just a for all loop between.