die offensichtlich mit des Pudels Kern nichts zu tun haben
sorry, ich bin mir immer noch unsicher, wann Quellcode, wann Beschreibung, ist zu lang, zu kurz, zu wenig ...
Warum kaprizierst Du Dich überhaupt auf das Objekt docCheck, was ja nirgendwo als Parameter vorkommt?
Weil hier der Fehler liegt - definitiv, ich aber nicht erkennen kann warum.
Es scheint ein Unterschied zu machen, ob ich auf diese Weise ein Objekt oder eine Variable benutze. Mir macht es Sorgen, weil es mich zum ersten mal trifft, obwohl zigmal benutzt - und Programmierung sollte ja nicht aus Glück bestehen ...
was man in solchen Situationen als erstes macht:
Ok, ich beschreibe. Von kurz nach lang - und eins nach dem anderen
Beschreibe logisch nachvollziehbar Dein Konstrukt
- Für alle Dokumente in einer View sind Fälligkeiten neu zu berechnen.
- Benutze dafür den (für mich) üblichen funktionierenden Code
Sub BerechneFaelligkeiten
Dim uiws as new notesuiworkspace
Dim viewCheck as notesview
Dim docCheck as notesdocument
Dim db as notesdatabase
set db = uiws.currentdatabase.database
Set viewCheck = db.GetView ("<ViewName>")
Set docCheck = viewCheck.GetFirstDocument
While Not docCheck Is Nothing
Set docCheck = viewCheck.GetNextDocument(docCheck)
Wend
EndSub
Neue Anforderung an diese Funktion.
- keine hardcodierte View
- Berechnung eines einzelnen Dokuments
Codeerweiterung wie folgt
Sub BerechneFaelligkeiten [color=blue](docCheck as notesdocument, sViewName as string)[/color]
Dim uiws as new notesuiworkspace
Dim viewCheck as notesview
[s]Dim docCheck as notesdocument[/s]
Dim db as notesdatabase
set db = uiws.currentdatabase.database
[color=blue]
if docCheck is nothing then
[/color]
Set viewCheck = db.GetView ([color=blue]sViewName[/color])
Set docCheck = viewCheck.GetFirstDocument
While Not docCheck Is Nothing
Set docCheck = viewCheck.GetNextDocument(docCheck)
Wend
else
[color=blue]
...
endif
[/color]
EndSub
Rufe ich Funktion nun auf mit
Call BerechneFälligkeiten (nothing, "MeineView")
Was beobachtest Du bei der Codeausführung im Entwanzer?
liefert mir
Set docCheck = viewCheck.GetFirstDocument
IMMER nothing zurück. Ich bin in der richtigen View, die Anzahl der Dokumente stimmt ....
Ändere ich den Funktionsaufruf wie folgt ab, läuft es fehlerfrei.
Sub BerechneFaelligkeiten [color=blue]([color=red]docHallo[/color] as notesdocument, sViewName as string)[/color]
Dim uiws as new notesuiworkspace
Dim viewCheck as notesview
[color=blue]Dim docCheck as notesdocument[/color]
Dim db as notesdatabase
set db = uiws.currentdatabase.database
[color=blue]
if [color=red]docHallo[/color] is nothing then
[/color]
Set viewCheck = db.GetView ([color=blue]sViewName[/color])
Set docCheck = viewCheck.GetFirstDocument
While Not docCheck Is Nothing
Set docCheck = viewCheck.GetNextDocument(docCheck)
Wend
else
[color=blue]
...
endif
[/color]
EndSub
An der Stelle ist auch keine Vererbung im Spiel. Es geht an der Stelle um eine Assoziation, die aber wiederum bei Bernhards Beschreibung dann richtig besetzt ist. Ich finde die Bezeichnungen child und parent legen hier begrifflich eine Vererbung nahe, dabei ist es einfach keine. Oder kannst du an jeder Stelle das Notesdokument verwenden, wo eine View verwendet wurde? ... Nein, natürlich nicht, denn Notesdocument ist keine Unterklasse Notesview.
Ich denke nämlich nicht, dass Notesdocument so declariert ist (Bitte nagelt mich nicht auf Syntax fest, aber so war doch Vererbung in LS, oder?):
public class Notesdocument As NotesView
...
end class
@Markus: Offensichtlich sparst du durch diesen Code keinen Aufwand, wie wir hier ja gerade sehen. Selbst wenn die Funktion zum Berechnen nur die Klasse verwendet, wäre das schon eine sinnvolle Trennung, in Iteration, Aufruf der Logik und Ausführung der Logik.
Markus, probiert einfach folgendes aus:
Sub Test (docTmp As NotesDocument)
Dim session As New NotesSession
Dim dbCurrent As NotesDatabase
Dim collAllDocs As NotesDocumentCollection
Set dbCurrent = session.CurrentDatabase
Set collAllDocs = dbCurrent.AllDocuments
Set docTmp = collAllDocs.GetFirstDocument
If docTmp Is Nothing Then
Msgbox "docTmp is Nothing"
Else
Msgbox "docTmp is NOT Nothing!" & Chr$ (10) & "Form = " & docTmp.Form (0)
End If
End Sub
Button mit dem Test-Code:
Sub Click (Source As Button)
Dim session As New NotesSession
Dim dbCurrent As NotesDatabase
Dim docOther As NotesDocument
Set dbCurrent = session.CurrentDatabase
Call Test (Nothing)
Set docOther = Nothing
Call Test (docOther)
Set docOther = dbCurrent.CreateDocument
docOther.Form = "TEST"
Call Test (docOther)
End Sub
Call Test (Nothing) zeigt das beklagte Verhalten, wie es Werner beschrieben und Markus (der andere) erlebt hat.
Bernhard