Autor Thema: Über Agent erstellte Kalendereinträge teilweise doppelt?  (Gelesen 2596 mal)

Offline schroederk

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.924
  • Geschlecht: Männlich
  • Ich liebe dieses Forum!
Hallo,

ich habe in unserem Intranet (Abwesenheitsplaner) früher über die COM-Schnittstelle direkt Kalendereinträge beim Benutzer und beim Genehmiger erzeugt.
Mittelfristig war die Lösung ok, aber das hatte einige Nachteile:
Abwesenheiten über mehrere Tage wurden als Einzeleinträge erzeugt.
Die Schnittstelle war ziemlich langsam und hängte sich sogar oft auf.

Infolgedessen habe das Eintragen über einen Agenten der als Webservice aufgerufen wird gelöst (bzw. lösen wollen).
In meinen Testscript, das den Webservice aufruft, funktionierte alles soweit scheinbar fehlerfrei, aber leider nicht nach Live-Schaltung.
Bei Abwesenheiten, die nur einen Tag dauern, sieht auch alles gut aus, aber bei mehreren Tagen passiert folgendes:
Der erste Tag wird noch einzeln gezeigt, alle Folgetage werden immer doppelt angezeigt. (Siehe Screenshot)
Zudem wird ein Eintrag in Entwürfe angezeigt.
Bei Doppelklick auf einen Eintrag wird eine Meldung angezeigt (Siehe Screenshot)
Es werden immer beide doppelten Einträge markiert.

Hat jemand eine Idee, wodurch das zustandekommt bzw. welche Felder ich kontrollieren muss?
Mit der Meldung könnte ich leben, abre die doppelten Einträge müssen weg.

Hier der komplette Agent:
Code
%REM
	Agent CalendarTasks
	Aufruf: 
		CalenderTasks
			Aktion (del / neu)		del = Eintrag löschen, neu = neuer Eintrag
			Datenbank				Name der Datenbank z.B. kschroede.nsf
			Server					Name des Mailservers z.B. JKMAIL00/SRV/JK-Group
			Typ (2 / 4)				Abwesenheitsart (2 = mit belegt, 4 = nur als Info)
			Datum von
			Datum bis
			uniqueid				Eindeutige ID, erzeugt vom Intranet
			Text					Anzeigetext im Kalender (z.B. Urlaub von Knud) 
%END REM
Sub Initialize
	Dim s As New NotesSession
	Dim db As NotesDatabase
	Dim col As NotesDocumentCollection
	Dim doc As NotesDocument
	Dim view As NotesView
	Dim vc As NotesViewEntryCollection
	Dim arg As String, p1 As Long
	Dim argarray As Variant
	Dim counter As Integer
	Dim argdb As String
	Dim argserver As String
	Dim argaction As String 
	Dim argvdat As String
	Dim argbdat As String
	Dim argtype As String
	Dim arguid As String
	Dim argtext As String
	Dim vdate As NotesDateTime
	Dim bdate As NotesDateTime
	
	On Error GoTo ErrHandler

	Set doc = s.DocumentContext
	Dim qs As String
	qs = doc.query_string(0)
	If doc.HasItem("Request_Content") Then 
		qs=qs & "&"
		ForAll aContent In doc.Request_Content
			qs=qs & aContent
		End ForAll
	End If

	arg = qs
	p1 = InStr(arg, "&")
	If p1 = 0 Then											' kein Parameter angegeben?
		Print "Error 1: keine Parameter übergeben!"
		Exit Sub
	End If
	arg = Mid$(arg, p1 + 1)									' alle Parameter aus der URL extrahieren

	argarray = Split(arg,"&")								' jeden Parameter trennen und in Array speichern

	If s.DocumentContext.remote_addr(0) <> "10.1.20.23" Then
		Print "Error 2: dieser Aufruf ist nicht    End Ift!"
		Exit Sub
	End If

	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))
	
	If argaction = "del" Then
		Dim calsubj As String
		Dim calbody As String 
		Dim calvdat As String 
		Dim calbdat As String
		Dim searchformula As String
		Dim docid As String
		Dim dummydoc As NotesDocument
		Dim xflag As Boolean
		
		Set db = s.GetDatabase(argserver, argdb, False)
		If Not db.IsOpen Then Call db.Open("", "")
		Set view = db.GetView("Calendar")

		Set vdate = New NotesDateTime(argvdat)
		Set vdate = New NotesDateTime (vdate.DateOnly)

		searchformula = {Form = "Appointment" & @Begins(@Text(StartDate);"} & argvdat & {")}
		Set col = db.search(searchformula,Nothing,0)
		
		Set doc = col.GetFirstDocument
		xflag = False
		While Not(doc Is Nothing) And xflag = false
			calvdat = CStr(doc.GetItemValue("StartDate")(0))
			calbdat = CStr(doc.GetItemValue("EndDate")(0))
			calbody = doc.GetItemValue("Body")(0)
			If InStr(calbody,arguid) > 0 Then		' Lösch-ID suchen
				If calvdat = argvdat Then
					If calbdat = argbdat Then
						Print "Eintrag wurde entfernt"
						Set dummydoc = doc
						Set doc = col.GetNextDocument(doc)
						Call dummydoc.Remove (True)
						xflag = True
					End If
				End If
			End If
			If xflag = False Then
				Set doc = col.GetNextDocument(doc)
			End If 
		Wend
	End If
	
	If argaction = "neu" Then
		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 = "D"							' 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.ExcludeFormView = 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.~$AlarmDiabled = "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 )		
		Print "Eintrag wurde erstellt"
	End If
ErrResume:
	Exit Sub
ErrHandler: 
	Print "** CalendarTasks ** Error occured " &  Str(Err) & ": " & Error$ & " in line " & Str(Erl) & ". Agent stopped."
	Print argdb & " " & argserver & " " & argvdat & " " & argbdat
	Resume ErrResume	
End Sub

Public Function urlDecode(s As String) As String
	If Len(s) = 0 Then Exit Function
	Dim i As Integer
	Dim tmp As String
	Dim c As String
	For i = 1 To Len(s)
		c = Mid$(s, i, 1)
		If c = "+" Then c = " "
		If c = "%" Then
			c = Chr$("&H" + Mid$(s, i + 1, 2))
			i = i + 2
		End If
		tmp = tmp + c
	Next i
	urlDecode = tmp
End Function

So sieht der Aufruf auf:
Code
function notes_calendar ($aktion,$dbname,$mailserver,$typ,$von,$bis,$uniqueid,$subject) {
	global $notesuser, $noteswebpass;
	$datapost = $aktion."&".$dbname."&".$mailserver."&".$typ."&".$von."&".$bis."&".$uniqueid."&".$subject;
	$varURL = "https://mailserver/mail/mtester.nsf/CalendarTasks?OpenAgent";
	$ch = curl_init($varURL);
	curl_setopt($ch, CURLOPT_URL, $varURL);
	curl_setopt($ch, CURLOPT_POST, true);
	curl_setopt($ch, CURLOPT_POSTFIELDS, $datapost);
	curl_setopt($ch, CURLOPT_USERPWD, $notesuser.":".$noteswebpass);
	curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
	curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
	curl_setopt($ch, CURLOPT_SSL_VERIFYHOST,  2);
	curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)");
	$erg = curl_exec($ch);
	preg_match("#<body[^>]*>(.*?)</body>#si", $erg, $erg_array);
	$output = $erg_array[1];
	curl_close($ch);
	return $output;
}
Ich wäre ja gerne weniger egoistisch, aber was hab ich davon?

Offline schroederk

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.924
  • Geschlecht: Männlich
  • Ich liebe dieses Forum!
Re: Über Agent erstellte Kalendereinträge teilweise doppelt?
« Antwort #1 am: 10.03.15 - 17:16:08 »
Ich denke, ich habe den Fehler mit den doppelten Einträgen gefunden.
Die Abwesenheitsart wurde beim Aufruf verschluckt. Warum auch immer.  :-:
Ich habe das Feld mal manuell im Dokument geändert und siehe da, die doppelten Einträge sind verschwund und auch die Meldung beim Doppelklick ist weg.

Kleiner Fehler, große Wirkung.
Ich wäre ja gerne weniger egoistisch, aber was hab ich davon?

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz