Das Notes Forum

Domino 9 und frühere Versionen => Entwicklung => Thema gestartet von: CLP-Alex am 05.02.08 - 16:50:55

Titel: Sommerzeit per Agent in Kalenderdoks einstellen?
Beitrag von: CLP-Alex am 05.02.08 - 16:50:55
Hy Lotusprofis,

ich habe ein Problem, muß in einer 5er Umgebung Kalendereinträge durchscannen und auf Winter/Sommerzeit umstellen. Scriptseitig eigentlich kein Problem nur wie bekomme ich raus wann die Sommerzeit startet bzw. endet???

Ich muß wohl eine Routine programmieren die mir entsprechend den März und Oktober auf den letzten Sonntag scannt.

Gerade Jahrestage über 10 oder 20 Jahre stellen mein Problem dar.
OK - haben keine relevante Uhrzeit.

Wird es reichen in der Sommerzeit alle Datumsfelder mit CEDT zu versehen oder sind das nur bestimmte Felder. Wenn keiner eine Lösung hat muß ich das wohl in meiner Testumgebung rausfinden.

Danke für die Hilfe.

Gruß Alex
 
Titel: Re: Sommerzeit per Agent in Kalenderdoks einstellen?
Beitrag von: koehlerbv am 05.02.08 - 18:09:51
Wegen Beginn und Ende der Sommerzeit brauchst Du nichts zu scannen - das lässt sich über den Wochentag des 31.3. bzw. 31.10. simpelst ausrechnen.

Wenn Du IsDST setzt, wird sofort die Uhrzeit verändert, aus 11:00:00 CET wird 12:00:00 CEDT, die Zeit muss also mit angepasst werden.
Wenn auf der Box, auf der der Code abläuft, bereits auf Sommerzeit umgestellt wurde, dann reicht es auch aus, den bisherigen Wert in eine DT-Variant-Variable zu holen, die Stunde anzupassen und wieder zu speichern. IsDST wird dabei automatisch gesetzt.

Und ja: Es müssen alle Items geändert werden (ausser $Revisions  ;D), in denen ein komplettes Datum (also Tag und Uhrzeit) enthalten ist.

HTH,
Bernhard
Titel: Re: Sommerzeit per Agent in Kalenderdoks einstellen?
Beitrag von: m3 am 05.02.08 - 18:13:32
Thread kam von http://atnotes.de/index.php?topic=22119.msg254063#msg254063 (nur für den Kontext).
Titel: Re: Sommerzeit per Agent in Kalenderdoks einstellen?
Beitrag von: CLP-Alex am 06.02.08 - 08:24:03
Guten Morgen zusammen,

mein plan ist wie folgt, als erstes einen Agenten in PostOpen aller Maildatenbanken starten der die Arbeitsumgebungen auf die Sommer/Winterzeit einstellt. Somit werde ich alle User zwingen die Umstellung vorzunehmen und sie können keine falschen Kalendereiträge mehr erfassen.
Desweiteren wird am Wochenende ein Agent laufen der alle Kalender scannt und neu berechnet. Damit habe ich wohl ausgeschlossen das wieder falsche Werte in die Agenten kommen.

@Bernhard
So einfach ist es wohl wirklich, weekday ist schon ne schöne Funktion wenn man dran denkt, danke

Gruß Alex
Titel: Re: Sommerzeit per Agent in Kalenderdoks einstellen?
Beitrag von: Matthias1974 am 07.02.08 - 20:33:38
Hallo CLP-Alex,

ich hatte letztes Jahr die gleiche Hürde zu nehmen da bei uns der Haken "Automatisch von Sommer-/Winterzeit umstellen" nicht  aktiv war. Ich habe darauf hin zusammen mit der Hilfe vom IBM Support einen Agent geschrieben der unsere Zeitzonen und Kalendereinträge anpasst. Allerdings habe ich die Finger von wiederkehrenden Einträgen gelassen, diese werden nicht modifiziert.

Ich kann Dir ja mal die Scripte zukommen lassen.
Titel: Re: Sommerzeit per Agent in Kalenderdoks einstellen?
Beitrag von: koehlerbv am 07.02.08 - 21:16:18
Allerdings habe ich die Finger von wiederkehrenden Einträgen gelassen, diese werden nicht modifiziert.

Warum? Das ist doch das gleiche Procedere ... Okay, ggf. ist noch ein weiteres Dokument beteiligt, aber (alle) C&S-Dokumente kann man sich im Mail-File ja nun einfach greifen.

Bernhard
Titel: Re: Sommerzeit per Agent in Kalenderdoks einstellen?
Beitrag von: Matthias1974 am 08.02.08 - 07:14:34
Hallo Bernhard,

vielleicht erinnerst Du dich an den folgenden Beitrag http://atnotes.de/index.php?topic=35155.msg221331

.. da hatte ich das Thema angesprochen, das Problem war sobald ich den wiederholenden Eintrag per Agent geändert hatte ist dieser aus der Kalenderansicht verschwunden.

Zitat
Gerade Jahrestage über 10 oder 20 Jahre stellen mein Problem dar.
OK - haben keine relevante Uhrzeit.

... mein Script geht nicht ganz auf die Frage von Alex ein, da die wiederkehrenden Einträge ja nicht modofiziert werden  :-X

Das Script habe ich für V7 erstellt, unter V5 habe ich es nicht getestet, sollte aber keine Probleme machen
und wie immer voher das Script testen, testen, testen  ;D

Code

'This Agent adjust the Lotus Notes Calendar to the correct German Timezone
' 09.03.2007 Matthias Schlimm


Sub Initialize
	Dim s As New notessession 
	Dim Sadjusted As notesdatetime 
	Dim Eadjusted As notesdatetime 
	Dim startDST As Variant 
	Dim endDST As Variant
	Dim tzInDST As Variant
	Dim tzOutDST As Variant
	Dim dc As NotesDocumentCollection
	Dim FileName As String
	Dim FileNbr As Integer
	Dim CheckAgent As String 
	
	Dim Db As String
	Dim DbName As String
	Dim maildoc As NotesDocument
	Dim dbs As NotesDatabase
	Dim rtbody As NotesRichTextItem
	Dim isDST As New NotesDateTime ("25.03.2007 02:00:00")
	
	If Not (isDST.isDST) Then
		Messagebox ("Bitte kontrollieren Sie unter Start -> Einstellungen -> 
Systemsteuerung ->  Datum/Uhrzeit, ob bei 'Zeitzone' -> 'Uhr auf Sommer-/Winterzeit umstellen' aktiv ist. 
Sollte dies nicht der Fall sein, korrigieren Sie dies bitte bzw. wenn Sie dafür nicht die benötigte 
Berechtigung haben, kontaktieren Sie bitte Ihren Systembetreuer. Anschließend starten Sie 
Ihren Notes-Client neu !")
		Exit Sub 
	End If
	
	Set dbs = s.CurrentDatabase
	Set maildoc = New NotesDocument (dbs)
	
	
	cntInDST=0
	cntOutDST=0
	cntTZTrue=0
	cntTZFalse=0
	CheckAgent="no"
	notespath=s.GetEnvironmentString("Directory",True)
	CheckAgent=s.GetEnvironmentString("$CheckAgentIfRunning2k7",True)
	If CheckAgent="yes" Then Exit Sub
	Call s.SetEnvironmentVar("CheckAgentIfRunning2k7","no")
	
	startDST = Datevalue("25.03.2007")
	endDST = Datevalue("28.10.2007")
	tzInDST = "Z=-1$DO=1$DL=3 -1 1 10 -1 1$ZX=81$ZN=W. Europe"
	tzOutDST = "Z=-1$DO=0$ZX=81$ZN=W. Europe"
	
	
	On Error Goto ErrHandle
	
	Print "Zeitzonenumstellung wird vorbereitet..."
	
	Set dc=s.currentdatabase.AllDocuments
	db=dc.Parent.FilePath
	dbname=dc.Parent.FileName
	'Datenbanken ausschließen
	If dbname="test.nsf" Then Exit Sub  ' Dieses Datenbank von der Umstellung ausschließen
	Msgbox "Hinweis:Die Kalendereinträge werden nun für die Sommerzeit vom "& startDST & " bis zum " & endDST & " korrigiert !"
	Print "Bitte warten...."
	FileName =notespath+"\AgentAdjustCalender_ "+dbname+".log"
	FileNbr= Freefile()
	Open FileName For  Output  As FileNbr
	Print #Filenbr,"LogDatei des Agent zur Zeitzonenkorrektur des Kalenders"
	Print #FileNbr, "Datenbank: "+db
	
	maildoc.form="Memo"
	maildoc.subject = "Bericht Zeitzonenumstellung für "+db
	Set RtBody = New NotesRichTextItem( maildoc, "Body" )
	Call rtbody.AppendText ("Wiederkehrende Kalendereinträge werden nicht korrigiert, 
diese müssen manuell umgestellt werden")
	Call rtbody.AddNewline(2)
	Call rtbody.AppendText("Folgende Kalendereinträge wurden korrigiert:")
	Call rtbody.AddNewline(2)
	maildoc.sendTo = s.UserName
                'Zentrale Mail-DB für Logfiles hier eintragen
	maildoc.BlindCopyTo = "MailInDB@cfirma.de"
	
	
	For i = 1 To dc.Count
		On Error Goto ErrHandle
		CalenderEntry=0
		Set doc =dc.GetNthDocument(i)			
		Set Form=doc.getfirstItem("Form")
		If doc.hasitem("Form")=False Then Goto NextDocument
		Print "Prüfe Dokument  Nr. "&Str$( i)& " von  "&Str$(dc.Count)& " / Typ:  "&Form.values(0)
		If  Form.values(0)="Appointment" Then
			Set startdatetime=doc.getfirstitem("StartDateTime") 
			If doc.hasitem("StartDateTime")=False Then Goto NextDocument
			Set startdate=doc.getfirstitem("StartDate") 
			If doc.hasitem("StartDate")=False Then Goto NextDocument
			Set starttime=doc.getfirstitem("StartTime") 
			If doc.hasitem("StartTime")=False Then Goto NextDocument
			Set calendardatetime=doc.getfirstitem("CalendarDateTime") 
			If doc.hasitem("CalendarDateTime")=False Then Goto NextDocument
			Set starttimezone=doc.getfirstitem("StartTimeZone")
			If doc.hasitem("StartTimeZone")=False Then Goto NextDocument
			Set Subject=doc.getfirstitem("Subject")
			Set enddatetime=doc.getfirstitem("EndDateTime") 
			If doc.hasitem("EndDateTime")=False Then Goto NextDocument
			Set enddate=doc.getfirstitem("EndDate") 
			If doc.hasitem("EndDate")=False Then Goto NextDocument
			Set endtime=doc.getfirstitem("EndTime") 
			If doc.hasitem("EndTime")=False Then Goto NextDocument
			Set endtimezone=doc.getfirstitem("EndTimeZone")
			If doc.hasitem("EndTimeZone")=False Then Goto NextDocument
			Set Repeats=doc.getfirstitem("Repeats")
			Set AppointmentType=doc.getfirstitem("AppointmentType")
			Set Sadjusted= startdatetime.datetimevalue
			Set Eadjusted=enddatetime.datetimevalue
		End If
	'Prüfen ob der Eintrag kein Jahrestag / AppointmentType=1 oder eine
	'ganztätige Veranstaltung / AppointmentType=2 ist. 		
		If  Form.values(0)="Appointment" Then
			If AppointmentType.values(0)="1"  Or AppointmentType.values(0)="2" Then 
				CalenderEntry=0
			Else
				CalenderEntry=1
			End If	
		Else
		'Prüfen ob der Eintrag eine Aufgabe ist
			If Form.values(0)="Task" Then CalenderEntry=0
		End If
		If CalenderEntry=1 Then
			If startdatetime.text="ERROR:" Then Goto NextDocument
			Print "Dokument "&Subject.values(0)& " am " &startdatetime.values(0)&" wird geprüft.. !"
			Print #FileNbr,"Dokument "&Subject.values(0)& " am " &startdatetime.values(0)&" wird geprüft.. !"
			On Error Goto ErrHandle
	    'Prüfen ob das Kalenderdatum innerhalb der Sommerzeit liegt
			If startdate.values(0) >= startDST And startdate.values(0) <= endDST Then
				If doc.hasitem("Repeats") Then
					If Repeats.values(0)="1" Then
						Print "Dokument "&Subject.values(0)& " am "  &startdatetime.values(0)&" ist ein 
wiederkehrender Eintrag und wird nicht korrigiert. 
Bitte prüfen Sie den Eintrag manuell"
						Print #FileNbr,"Dokument "&Subject.values(0)& " am " &startdatetime.values(0)&" ist ein 
wiederkehrender Eintrag und wird nicht korrigiert. 
Bitte prüfen Sie den Eintrag manuell"
						Call rtbody.AppendText ("Dokument "&Subject.values(0)& " am " &startdatetime.values(0)&" ist ein 
wiederkehrender Eintrag und wird nicht korrigiert. 
Bitte prüfen Sie den Eintrag manuell")
						Call rtbody.AddNewline(1)
						Goto NextDocument
					End If
				End If
				cntInDST=cntINDST+1
				If starttimezone.values(0) <> tzInDST Then 
					Call Sadjusted.adjusthour(-1) 
					Call sadjusted.ConvertToZone(sadjusted.TimeZone, True)
					Call Eadjusted.AdjustHour(-1)
					Call Eadjusted.converttozone(eadjusted.timezone, True) 
					doc.starttimezone = tzINDST
					doc.endtimezone = tzInDST
					cntTZFalse=cntTZFalse+1
					Print "Dokument "&Subject.values(0)& " am " &startdatetime.values(0)&" ->>>> 
fehlerhafte Zeitzone wird korrigiert.. !"
					Print #FileNbr,"Dokument "&Subject.values(0)& " am " &startdatetime.values(0)&" ->>>> 
fehlerhafte Zeitzone korrigiert.. !"	
					Call rtbody.AppendText ("Dokument "&Subject.values(0)& " am " &startdatetime.values(0)&" ->>>> 
fehlerhafte Zeitzone wurde korrigiert.. !")
					Call rtbody.AddNewline(1)
				Else
					Call Sadjusted.adjusthour(0)   
					Call Eadjusted.AdjustHour(0)
					cntTZTrue=cntTZTrue+1
					Print "Dokument "&Subject.values(0)& " am " &startdatetime.values(0)&" ->>> 
Zeitzone ist o.k, keine Korrektur notwendig"
					Print #FileNbr,"Dokument "&Subject.values(0)& " am " &startdatetime.values(0)&"  ->>> 
Zeitzone ist o.k, keine Korrektur notwendig"					
				End If	
				Set startdatetime.datetimevalue=Sadjusted
				Set startdate.datetimevalue=Sadjusted 
				Set starttime.datetimevalue=Sadjusted 
				Set calendardatetime.datetimevalue=Sadjusted
				Set enddatetime.datetimevalue=Eadjusted
				Set enddate.datetimevalue=Eadjusted 
				Set endtime.datetimevalue=eadjusted 
				Call doc.save(True,True)
			End If	
		End If
		Goto NextDocument
ErrHandle:
		On Error Resume Next
		Print  #FileNbr,"Ein Dokument war fehlerhaft und konnte nicht geprüft werden !"
		On Error Goto ErrHandle
		
NextDocument:		
	Next
	Close FileNbr	
	Call s.SetEnvironmentVar("CheckAgentIfRunning2k7","yes")
	Call s.SetEnvironmentVar("DST","1",True)
	Call s.SetEnvironmentVar("Timezone","-1",True)
	Call s.SetEnvironmentVar("DSTLAW","3,-1,1,10,-1,1",True)
	maildoc.Send (False)
	Call DisplayMessages(cntINDST,cntOutDST,cntTZTrue,cntTZFalse)
	
End Sub


Sub DisplayMessages (cntInDST,cntOutDST,cntTZTrue,cntTZFalse)
	If cntInDST<>0 And cntTZFalse<>0 Then
		Messagebox "Es wurde(n) "& cntInDST &" Dokumente in der 
Sommerzeit gefunden, "& cntTZFalse & " Dokument(e) davon wurde(n) auf die 
richtige Zeitzone eingestellt !"
	End If
	If cntOutDST<>0 And CntTZFalse<>0 Then
		Messagebox "es wurden(n) " & cntOutDST &" Dokumente ausserhalb der 
Sommerzeit gefunden, "& cntTZFalse & " Dokument(e) davon wurde(n) auf die 
richtige Zeitzone eingestellt !"
	End If	
End Sub


Titel: Re: Sommerzeit per Agent in Kalenderdoks einstellen?
Beitrag von: CLP-Alex am 11.02.08 - 15:32:50
Hy zusammen,

bin jetzt erst wieder online.
Zuerst mal danke an Matthias, werde mir das Script mal anschauen.
Über den Plan werde ich euch dann informieren wenn er in Script steht

Danke und Gruß
Alex
Titel: Re: Sommerzeit per Agent in Kalenderdoks einstellen?
Beitrag von: CLP-Alex am 04.03.08 - 08:35:22
Hallo Leute,

erstmal danke an Matthias1974, habe mich von deinem Script inspirieren lassen, und komplett auf 5er angepasst, auch das mit den Wiederholungen habe ich in den Griff bekommen. 

Auch danke an Bernhard für seine hilfreichen Tipps.

Es wurden Fehlerfrei 250 Mailsfiles mit ca. 1.250.000 Appointment Dokumenten umgestellt. Nach 5 Stunden war der Agent fertig  ;D

Gruß Alex

Ach ja, Notes kann wirklich alles wenn man ihm zeigt wie es geht  ;D ;D ;D
Titel: Re: Sommerzeit per Agent in Kalenderdoks einstellen?
Beitrag von: ata am 04.03.08 - 10:30:29
Zitat
Ach ja, Notes kann wirklich alles wenn man ihm zeigt wie es geht  ;D ;D ;D

... na ja - fast alles  ;D

Toni