MoinMoin
Ich habe eine Ansicht erstellt (wie im Bild) mit einer Aktion, die mir aus dieser Ansicht heraus eine bestimmte Spalte berechnen soll (in diesem Beispiel die letzte).
Die Berechnung soll aber nur für die kategorisierten einträge gemacht werden, auf der gerade die Markierung steht.
Ich muss also zuerst basierend auf der aktuellen Markierung den Namen auslesen. Das mach ich mit folgendem Script:
Dim session As New NotesSession
Dim db As NotesDatabase
Dim collection As NotesDocumentCollection
Dim doc As NotesDocument
Dim tmpName As String
Set db = session.CurrentDatabase
Set collection = db.UnprocessedDocuments
Set doc = collection.GetFirstDocument()
While Not(doc Is Nothing)
Set item = doc.GetFirstItem( "ProgName" )
tmpName=item.values(0)
Set doc = collection.GetNextDocument(doc)
Wend
Wie krieg ich aber jetzt alle Dokumente der Ansicht mit dem Namen aus tmpName, dem entsprechend ausgewählten Monat (im Bild März) und dort alle Werte aus der Spalte Stunden?
Der Monat wird über eine Spaltenformel aus dem Datum gebildet:
@Select( @Month( ProgDatum ); "Januar";"Februar";"März";...)
Wer schön, wenn mir jemand helfen könnte...
Grüsse Micha
Ich hab den Tipp von Axel umgesetzt, hier mal der vollständigkeit halber mein Code (ein bisschen verworren, verbesserungen immer gern gesehen ;) )
Sub Click(Source As Button)
Dim session As New NotesSession
Dim db As NotesDatabase
Dim collection As NotesDocumentCollection
Dim doc As NotesDocument
Dim tmpName As String
Dim tmpMonat As String
Dim tmpStunden As String
Dim tmpGesamt As Integer
Dim tAStd As Variant
Dim tAMin As Variant
Set db = session.CurrentDatabase
Set collection = db.UnprocessedDocuments
If collection.count = 0 Then
Messagebox "Sie müssen EINEN Eintrag auswählen, um den Nutzer sowie den Monat zu bestimmen!", MBOK, "Fehler: keine Auswahl!"
Exit Sub
End If
Set doc = collection.GetFirstDocument()
While Not(doc Is Nothing)
Set item = doc.GetFirstItem( "ProgName" )
tmpName=item.values(0)
Set item = doc.GetFirstItem( "ProgDatum" )
tmpMonat=Month(item.values(0))
Set doc = collection.GetNextDocument(doc)
Wend
Dim view As NotesView
Dim dc As NotesDocumentCollection
Dim keys (1 To 2) As String
keys(1)=tmpName
Select Case tmpMonat
Case 1: keys(2)="Januar"
Case 2: keys(2)="Februar"
Case 3: keys(2)="März"
Case 4: keys(2)="April"
Case 5: keys(2)="Mai"
Case 6: keys(2)="Juni"
Case 7: keys(2)="Juli"
Case 8: keys(2)="August"
Case 9: keys(2)="September"
Case 10: keys(2)="Oktober"
Case 11: keys(2)="November"
Case 12: keys(2)="Dezember"
End Select
Set view = db.GetView( "vProgname" )
Set collection = view.GetAllDocumentsByKey(keys, False)
Set doc = collection.GetFirstDocument()
While Not(doc Is Nothing)
Set item = doc.GetFirstItem( "Stunden" )
tmpStunden=item.values(0)
tmpGesamt=tmpGesamt + Cint(tmpStunden)
Set doc = collection.GetNextDocument(doc)
Wend
tAMin = tmpGesamt Mod 60
tAStd = tmpgesamt \ 60
Messagebox tAStd & " Stunden und " & tAMin & " Minuten", MBOK, "Ausgleich für " & tmpName & " im Monat: " & keys(2)
End Sub
Soweit sieht's ganz vernüftig aus. Zwei Anmerkungen habe ich allerdings.
1. Die Ecke ist nicht ganz konsequent zu Ende programmiert und kann in bestimmen Fällen zu unerwünschten Seiteneffekten führen. Es wird zwar abgefangen wenn kein Eintrag gewählt ist, aber nicht bei mehr als einem Eintrag.
...
Set db = session.CurrentDatabase
Set collection = db.UnprocessedDocuments
If collection.count = 0 Then
Messagebox "Sie müssen EINEN Eintrag auswählen, um den Nutzer sowie den Monat zu bestimmen!", MBOK, "Fehler: keine Auswahl!"
Exit Sub
End If
Set doc = collection.GetFirstDocument()
While Not(doc Is Nothing)
Set item = doc.GetFirstItem( "ProgName" )
tmpName=item.values(0)
Set item = doc.GetFirstItem( "ProgDatum" )
tmpMonat=Month(item.values(0))
Set doc = collection.GetNextDocument(doc)
Wend
...
Besser ist es so:
Set db = session.CurrentDatabase
Set collection = db.UnprocessedDocuments
If collection.count <> 1 Then
Messagebox "Sie müssen EINEN Eintrag auswählen, um den Nutzer sowie den Monat zu bestimmen!", MBOK, "Fehler: keine Auswahl!"
Exit Sub
End If
Set doc = collection.GetFirstDocument()
If Not(doc Is Nothing) Then
Set item = doc.GetFirstItem( "ProgName" )
tmpName=item.values(0)
Set item = doc.GetFirstItem( "ProgDatum" )
tmpMonat=Month(item.values(0))
Set doc = collection.GetNextDocument(doc)
End If
...
2. Diese Zeile kann entfallen
...
Dim dc As NotesDocumentCollection
...
Außerdem fehlt mir noch eine Fehlerbehandlung. Grundlagen hierzu findest du hier:
Best Practices: Error Handling in Lotus Script (http://www.atnotes.de/index.php?board=3;action=display;threadid=11980;start=0)
Axel