Das Notes Forum

Domino 9 und frühere Versionen => ND9: Entwicklung => Thema gestartet von: schroederk am 07.02.20 - 08:32:45

Titel: Bei erzeugtem Kalendereintrag ist letzter Tag nicht belegt?
Beitrag von: schroederk am 07.02.20 - 08:32:45
Hallo,

seit einigen Jahren läuft bei uns im Intranet ein Workflow-Tool, um Urlaub zu beantragen und zu genehmigen. Der genehmigte Urlaub wird dann auch im Kalender desjeinigen eingetragen.
Im Kalender sieht der Eintrag eigentlich super aus (für mich sowohl optisch als auch inhaltlich), es ist aber erst jetzt aufgefallen, dass immer nur bei mehrtägigem Urlaub immer nur der letzte Eintrag weiterhin als nicht belegt zu gelten scheint und damit von Kollegen zu Besprechungen eingeladen werden kann.

Hat jemand von Euch eine Idee? Ich hatte vermutet, dass es mit EndDate und EndTime liegen könnte. Ich hatte dafür testweise mal 23:59 eingetragen, hatte aber keine Auswirkungen.

Hier mal der Code, der den Eintrag erstellt. Die Parameter werden dem Script beim Aufruf übergeben.
Aufruf z.B. über: CalendarTasks?OpenAgent&neu&mail/testdb.nsf&10.88.11.22&4&09.03.2020&13.03.2020&12345678&Urlaub+von+Max+Tester

Die Parameter werden als Array gelesen und in die Variablen geschoben:

Code
	argaction = argarray(0)
	argdb = argarray(1)
	argserver = argarray(2)
	argtype = argarray(3)
	argvdat = argarray(4)
	argbdat = argarray(5)
	arguid = argarray(6)
	argtext = urlDecode(argarray(7))

Code
		Dim starttime As String
		Dim endtime As String
		Dim startDate As Variant
		Dim endDate As Variant
		Dim aExcludeView(1) As String
		Dim cprofile As NotesDocument
		Dim mailowner As String
		Dim vDates As Variant
		Dim iLoop As Integer
		
		Dim atCSWISL (0 To 4) As String
		atCSWISL(0)="$S:1"
		atCSWISL(1)="$L:1"
		atCSWISL(2)="$B:1"
		atCSWISL(3)="$R:1"
		atCSWISL(4)="$E:1"
		
		Dim atWatched (0 To 4) As String
		atWatched(0)="$S"
		atWatched(1)="$L"
		atWatched(2)="$B"
		atWatched(3)="$R"
		atWatched(4)="$E"

		aExcludeView(0) = "D"
		aExcludeView(1) = "S"
		
		starttime = "07:00:00"
		endtime = "20:00:00"

		Set db = s.GetDatabase(argserver, argdb, False)
		
		If Not db.IsOpen Then Call db.Open("", "")

		Set cprofile = db.GetProfileDocument("CalendarProfile")
		mailowner = cprofile.GetItemValue("Owner")(0)

		Set view = db.GetView("Calendar")

		startdate = CDat(argvdat)
		enddate = CDat(argbdat)

		Set doc = db.Createdocument()
		docid = doc.UniversalID
		doc.form = "Appointment"
		doc.Subject = argtext
		doc.Location = " "
		doc.SequenceNum = "1"

		doc.StartDate = startdate
		doc.StartTime = startdate
		doc.StartDateTime = startdate
		doc.EndDate = enddate
		doc.EndTime = enddate
		doc.EndDateTime = enddate
		
		iLoop = enddate - startdate
		ReDim vDates (0 To iLoop)
		
		vDates (0) = startdate
		For iLoop = 1 To UBound (vDates)
			vDates (iLoop) = startdate + iLoop
		Next
		
		doc.CalendarDateTime = vDates
		
		doc.Repeats = "1"
		doc.RepeatFor = iLoop
		doc.RepeatHow = "F"									' U=repeat until, F=repeat for
		doc.RepeatForUnit = "D"								' repeat in days (W=weekly,M=monthly,Y=yearly)
		doc.RepeatWeekends = "X"							' Do nothing if on a weekend
		doc.RepeatUnit = "D"
		doc.RepeatInterval = "1"							' dayly
		doc.RepeatAdjust = "1"								' only used if weekly or monthly
		doc.RepeatStartDate = startdate
		doc.RepeatDates = vDates
		
		doc.ExcludeFromView = aExcludeView

		doc.MeetingType = "1"

		doc.AppointmentType	= argtype
		doc.MessageType = "Not a draft"
		doc.Logo = "StdNotesLtr3"
		doc.OrgTable = "P0"
		doc.SchedulerSwitcher = "1"
		doc.Notes = ""
		doc.Body = "Erzeugt durch den Urlaubsplaner im Intranet.**ID=" & arguid & "**"
		doc.~_ViewIcon = "9"
		doc.EndTimeZone = "Z=-1$DO=1$DL=3 -1 1 10 -1 1$ZX=71$ZN=W. Europe"
		doc.StartTimeZone = "Z=-1$DO=1$DL=3 -1 1 10 -1 1$ZX=71$ZN=W. Europe"
		doc.UpdateSeq = 1
		doc.WebDateTimeInit = 1
		doc.~$AlarmDisaOObled = "1"
		doc.~$PublicAccess = "1"
		
		doc.~$CSWISL = atCSWISL
		doc.~$WatchedItems = atWatched
		doc.~$CSFlags = "m"
		doc.OrgRepeat = "1"
		doc.~$CSVersion = "2"
		
		doc.Chair = mailowner
		doc.AltChair = mailowner
		doc.From = mailowner
		doc.Principal = mailowner

		If argtype = "2" Then
			doc.BookFreeTime = "0"
			doc.~$BusyName = mailowner
			doc.~$BusyPriority = "1"
		End If		
		doc.ApptUNID = docid		

		Call doc.Save( True, True )
Titel: Re: Bei erzeugtem Kalendereintrag ist letzter Tag nicht belegt?
Beitrag von: schroederk am 11.02.20 - 14:08:59
Hat niemand eine Idee?  :-[
Ein Ticket bei HCL kann ich wohl nicht aufmachen, das Thema ist da sicherlich out-of-scope.  :-:
Titel: Re: Bei erzeugtem Kalendereintrag ist letzter Tag nicht belegt?
Beitrag von: Bastel123 am 11.02.20 - 16:50:40
Was gibt dir

iLoop = enddate - startdate

für einen Wert aus? 13.03.2020 - 09.03.2020?
Da könntest du mal ansetzen.

Gruß
Sebastian

Titel: Re: Bei erzeugtem Kalendereintrag ist letzter Tag nicht belegt?
Beitrag von: schroederk am 11.02.20 - 17:09:42
im Loop wird vDates befüllt und im Anschluss in das Feld CalendarDateTime geschrieben.
Das Ergebnis sieht meiner Meinung nach gut aus (siehe angehängte Screenshots)
Es ist auch immer nur der letzte Tag, der zwar nicht anders aussieht als alle anderen, aber von Kollegen dennoch als verfügbar angezeigt wird.
Bei Einzeltagen funktioniert es auch korrekt.

Titel: Re: Bei erzeugtem Kalendereintrag ist letzter Tag nicht belegt?
Beitrag von: jBubbleBoy am 11.02.20 - 17:59:45
das "Calendaring & Scheduling" Dokument schon gelesen?
https://web.archive.org/web/20120905054315/http://www-12.lotus.com/ldd/doc/uafiles.nsf/docs/WPNotesCSSchema/$File/csschema.pdf (https://web.archive.org/web/20120905054315/http://www-12.lotus.com/ldd/doc/uafiles.nsf/docs/WPNotesCSSchema/$File/csschema.pdf)

oder man erstellt einen Kalendereintrag, mit den gewünschten Eigenschaften und vergleicht das mit dem vom Code generierten Dokument
Titel: Re: Bei erzeugtem Kalendereintrag ist letzter Tag nicht belegt?
Beitrag von: Tode am 12.02.20 - 08:06:25
Einige Dinge, die mir sofort auffallen, und die gegen das von Erik gepostete Schema verstossen:

1. Repeating Entries bestehen immer aus mindestens 2 Dokumenten: Dem "Hauptdokument" und einem Antwortdokument mit den Terminen... Das Hauptdokument wird im Kalender nicht angezeigt.
2. StartDate, StartTime und StartDateTime enthalten eigentlich unterschiedliche Werte und nicht alle das selbe...
3. Ganztägige Termine gehen von 04:00 - 20:00 Uhr, nicht von 07:00 - 20:00 Uhr.
4. Der richtige Wert für BookFreeTime ist "" nicht "0"

Einen direkten Grund, warum der letzte Tag nicht als Busy gilt, kann ich aber nicht erkennen...
Titel: Re: Bei erzeugtem Kalendereintrag ist letzter Tag nicht belegt?
Beitrag von: CarstenH am 12.02.20 - 17:56:34
Laut dem Script wird keinerlei Uhrzeit eingetragen und in der Beispiel-URL wird AppointmentType 4 benutzt (argtype = argarray(3) und wenn ich richtig zähle steht da eine 4).

AppointmentType 4 sind aber keine Termine oder ganztägige Ereignisse sondern lediglich Erinnerungen und damit immer ohne Reservierung, eine Erinnerung hat nur einen Zeitpunkt (der nie festgelegt wird da die Uhrzeiten gar nicht übernommen werden).
Eine Erinnerung hat keine Dauer und kann damit per Definition keine Zeit belegen - das kann man gerne mal ausprobieren: legt euch eine Erinnerung im Kalender an und die Maske sperrt automatisch das Feld "als verfügbar markieren". Wenn man das versucht mit Script auszutricksen ist das Ergebnis im besten Fall "undefiniert".

Also entweder stimmt das Script oder das Beispiel nicht, so kann das jedenfalls nicht wirklich (seit Jahren!) funktionieren.

HTH
Carsten
Titel: Re: Bei erzeugtem Kalendereintrag ist letzter Tag nicht belegt?
Beitrag von: schroederk am 13.02.20 - 07:45:33
Hallo Carsten,

Du hast recht, der Parameter hätte "2" anstelle von "4" heißen müssen. Da habe ich versehentlich einen Aufruf kopiert, der den Eintrag auch in einem gemeinsamen Kalender erzeugt. Hier hatte natürlich nur Erinnerung Sinn gemacht.
Das Script lief seit mehr als 3 Jahren unverändert.

Ich hatte als erstes auch die Uhrzeiten in Verdacht. Ich hatte vermutet, dass EndTime und EndDateTime bei 0:00 Uhr bedeuten könnten, dass er dann um 07:00 Uhr natürlich wieder verfügbar wäre.
In einem Test habe ich dann die Ende-Zeit auf 23:59:59 gesetzt, aber das hat keinen Unterschied gemacht. Der letzte Tag bleibt weiterhin verfügbar.

@jBubbleBoy: Ich habe mir das PDF angeschaut, konnte aber auch hier keinen verursachenden Fehler finden.
@Tode:
- In den bisher gefundenen Beispielen im Netz wurde auch bei StartDate, StartTime und StartDateTime immer derselbe Wert geschrieben.
- Die beiden Variablen starttime und endtime werde aktuell gar nicht verwendet.
- Wenn ich BookFreeTime = "" setze, wird die Variable aus dem Dokument entfernt. Vermutlich hatte ich damals deshalb den Wert "0" gesetzt. Hat aber auch leider keinen Einfluss auf das Ergebnis.
- Ich habe bisher kein Beispiel-Script gefunden, um mehrtägige Einträge, also 2 Dokumente, zu erzeugen. Hast Du vielleicht eins?
Titel: Re: Bei erzeugtem Kalendereintrag ist letzter Tag nicht belegt?
Beitrag von: maxritti am 13.02.20 - 07:50:17
oder man erstellt einen Kalendereintrag, mit den gewünschten Eigenschaften und vergleicht das mit dem vom Code generierten Dokument

Hast Du das mal gemacht?
Wäre ja ein Versuch, einen manuellen korrekten Eintrag auf Feldebene mit deinem "Problemeintrag" zu vergleichen.
Titel: Re: Bei erzeugtem Kalendereintrag ist letzter Tag nicht belegt?
Beitrag von: jBubbleBoy am 13.02.20 - 08:38:56
oder man erstellt einen Kalendereintrag, mit den gewünschten Eigenschaften und vergleicht das mit dem vom Code generierten Dokument

Hast Du das mal gemacht?
Wäre ja ein Versuch, einen manuellen korrekten Eintrag auf Feldebene mit deinem "Problemeintrag" zu vergleichen.

Ja klar - ein Kalenderdokument hat etwa 80 Notes-Felder und es gibt Werkzeuge die Dokumente vergleichen können.
Titel: Re: Bei erzeugtem Kalendereintrag ist letzter Tag nicht belegt?
Beitrag von: schroederk am 13.02.20 - 10:22:48
Ich denke, dass ich den Fehler gefunden habe. Es lag wohl doch an den angebenen Zeiten (00:00 Uhr) bei Start und Ende.
Nachdem ich die korrekten Zeiten (4 Uhr - 20 Uhr) eingetragen und den Loop zum Füllen der Werte angepasst habe, wird jetzt auch der letzte Tag als belegt angezeigt.
Ein paar andere Kleinigkeiten hatte ich auch noch ergänzt (z.B. doc.~$IconSwitcher = "AllDayEvent"), auch wenn ich nicht denke, dass diese ausschlaggebend waren.

Herzlichen Dank für Eure Unterstützung.  :)