Ziel ist eine automatische Zeiterfassung für Zeiten in denen das Dokument geöffnet im Vordergrund der Applikation liegt. Solange es nur ein offenes Dokument im Notes UI gibt, ist das einfach möglich.
Sind jedoch mehrere Dokumente in Notes offen, so wird bei jedem (im UI offenen Dokument) die Zeit gezählt.
Ich suche also ein Event, das in Notes den Fokuswechsel zwischen mehreren (in separaten Tabs) offenen UI-Dokumenten mitgekommt, so daß die Zeitzählung nur beim Dokument mit Fokus läuft, und bei den anderen nicht.
Zur Programmierung: mehrere Jahre Erfahrung mit Formelsprache und Lotus-Script.
Konkret sieht das ganze wie folgt aus:
=============Allgemeine Klasse für die Zeiterfassung=================
Class Zeiterfassung
Private CurStart As NotesDateTime
Private CurEnde As NotesDateTime
Private CurDauer As NotesDateTime
Private Running As Boolean
Private Modified As Boolean
Sub New
Set CurStart = New notesdatetime("")
Set CurEnde = New notesdatetime("")
Set CurDauer = New notesdatetime("00:00:00") ' Dauer auf 0 Minuten setzen
Modified = False
End Sub
Sub Start
Running = True
Modified = True
Call CurStart.setnow 'Heutiges DAtum setzen.
End Sub
Sub Ende
Dim Dauer As NotesDateTime
Dim difference As Long
' Liefert die Dauer in Sekunden seit dem letzten Aufruf von Start
If Running Then
Running = False
Call CurEnde.setnow 'Heutiges DAtum setzen.
difference = CurEnde.TimeDifference( CurStart)
If difference = 0 Then
modified = False
Else
CurDauer.AdjustSecond(difference)
End If
End If
End Sub
Sub Load (Source As Notesuidocument)
Dim NullDauer As NotesDateTime
Set NullDauer = New notesdatetime("00:00:00") ' Dauer auf 0 Minuten setzen
Set CurDauer = NullDauer ' Dauer auf 0 Minuten setzen
Dim doc As NotesDocument
Set doc = source.document
Dim DauerST As String
DauerST = doc.CaseDauer(0)
If Not source.IsNewDoc Then
If Isnumeric (DauerST) Then
CurDauer.AdjustMinute(DauerST)
End If
End If
End Sub
Sub Save (Source As Notesuidocument)
Dim doc As NotesDocument
Dim Minuten As Double
Set Doc = Source.document
Dim StartNI As NotesItem
Dim EndeNI As NotesItem
If modified Then
Set StartNI = doc.GetFirstItem("CaseStart")
Set EndeNI = doc.GetFirstItem("CaseEnde")
Set StartNi.DateTimeValue = CurStart
Set EndeNi.DateTimeValue = CurEnde
minuten =Hour(CurDauer.LSLocalTime)*60 + Minute(CurDauer.LSLocalTime)
Call doc.replaceitemvalue("CaseDauer",minuten)
Call doc.Save(True,True)
End If
End Sub
End Class
==============In der zugrundeliegenden Maske verwendete Events===============
Globals
Declarations:
Dim Zeiterf As Zeiterfassung
Initialize:
Set ZeitErf = New Zeiterfassung
Sub Queryopen(Source As Notesuidocument, Mode As Integer, Isnewdoc As Variant, Continue As Variant)
If Not IsNewDoc Then Call zeiterf.load(source)
zeiterf.start
Continue = True
End Sub
Sub Querymodechange(Source As Notesuidocument, Continue As Variant)
If source.editmode = False Then 'd.h. beim Umschalten von RO auf EditMode
zeiterf.start
Else
zeiterf.ende
End If
Continue = True
End Sub
Sub Querysave(Source As Notesuidocument, Continue As Variant)
Dim doc As NotesDocument
Set Doc = Source.document
zeiterf.ende
Call zeiterf.save(source) ' ggf. geänderte Zeirefassung abspeichern)
End Sub