Ohne Quellcode ist das reine Raterei. Ich vermute, dass Du bei Deinem NotesView- Objekt nicht "AutoUpdate=False" gesetzt hast und dass das neu erstellte innere Dokument die Navigation der äußeren Schleife durcheinanderbringt, weil Du "on the fly" Dokumente in die View einfügst.
Zwei Möglichkeiten, das zu umgehen:
1. Vor Deiner äußeren While Schleife die Ansicht, auf die Du Dich beziehst, auf AutoUpdate=False setzen: view.AutoUpdate = False
2. Schon am Anfang der äußeren Schleife das nächste Dokument holen, und am Ende einfach zuweisen:
Statt:
While not doc is Nothing
'- hier wird Deine innere Schleife durchgeührt
Set doc = view.GetNextDocument( doc )
Wend
das hier:
While not doc is Nothing
Set nextDoc = view.GetNextDocument( doc )
'- hier wird Deine innere Schleife durchgeührt
Set doc = nextDoc
Wend
Hallo, Tode,
danke schonmal für die Ansätze. Beides brachte leider keine Besserung. Nachdem ich das nexDoc an den Anfang der äußeren Schleife geholt hatte, kam an dieser Stelle die Fehlermeldung. Ich füge mal mein Script in vereinfachter Form ein:
Set view1=db.GetView("namederAnsicht")
view1.AutoUpdate = False
Set doc1 = view1.GetFirstDocument
While Not (doc1 Is Nothing)
Set nextDoc1 = viewCol.GetNextDocument( doc1 )
Set view2=db.GetView("namederAnsicht")
Set doc2 = view2.GetFirstDocument
While Not (doc2 Is Nothing)
Inhalt der Schleife
Set doc2=view.GetnextDocument (doc2)
Wend
Set doc1 = nextDoc1
Wend
Vielleicht doch irgendein Denkfehler meinerseits?
@ronka: Hier habe ich mich auch nochmal beim Posten verschrieben. Es muss auch hier view2 heißen. Hier nochmal das korrekte Skript:
Set view1=db.GetView("namederAnsicht")
view1.AutoUpdate = False
Set doc1 = view1.GetFirstDocument
While Not (doc1 Is Nothing)
Set nextDoc1 = view1.GetNextDocument(doc1)
Set view2=db.GetView("namederAnsicht")
Set doc2 = view2.GetFirstDocument
While Not (doc2 Is Nothing)
Inhalt der Schleife
Set doc2=view2.GetnextDocument (doc2)
Wend
Set doc1 = nextDoc1
Wend
view2 wird innerhalb der Schleife gesetzt, weil dort erst eruiert wird, welche Ansicht gesetzt werden soll, was aber natürlich in dieser vereinfachten Form nicht ersichtlich ist.
Wenn ich folgenden Code exakt so ausführe, gib es die Fehlermeldung "The Document is not in view "vwhonorarabrechnungen_kdnr_rechnung"" beim ersten Ausführen der Zeile "Set nextDoc1 = view1.GetNextDocument(doc1)":
Sub Click(Source As Button)
Dim session As New NotesSession
Dim doc1 As NotesDocument
Dim doc2 As NotesDocument
Dim nextDoc1 As NotesDocument
Dim view1 As NotesView
Dim view2 As NotesView
Dim db As NotesDatabase
Set db = session.CurrentDatabase
Set view1=db.GetView("vwhonorarabrechnungen_kdnr_rechnung")
Set view2=db.GetView("vwhonorarabrechnungen_status")
view1.AutoUpdate = False
Set doc1 = view1.GetFirstDocument
While Not (doc1 Is Nothing)
Set nextDoc1 = view1.GetNextDocument(doc1)
Set doc2 = view2.GetFirstDocument
While Not (doc2 Is Nothing)
Print "Schleife2"
Set doc2=view2.GetnextDocument (doc2)
Wend
Set doc1 = nextDoc1
Wend
End Sub
Noch eine Anmerkung zum Schluss: Du solltest wirklich mehr Sorgfalt walten lassen, wenn Du Beispiel-Code für das Nachstellen eines Problems postest... Sonst jagt man bei der Bug- Analyse Fehler, die in Deinem original- Code gar nicht drin sind. Das hat Rudi und Pantelis unnötige Zeit gekostet, die sie nicht mit der Lösung Deines wirklichen Problems verbringen konnten...
Ich weiß. Hätte nicht passieren dürfen.
Bekommst Du bei dem Code auch eine Fehlermeldung?
Meine Änderung: die erste Schleife geht über alle Dokumente, liest nur die Schlüsselwerte aus und schreibt sie in einen String, mit Kommas getrennt. Das ist nicht ideal für die Produktion! Es kommt auf die Anzahl der Dokumente und die Länge der Keys an und in den Schlüsseln darf kein Komma verwendet werden. Sauberer wäre ein Array oder eine Liste, aber zum Test sollte das reichen.
In der zweiten Schleife wird jeder Schlüssel in der zweiten Ansicht mit GetDocumentByKey gesucht und dann kann die Verarbeitung durchgeführt werden.
Sub Click(Source As Button)
Dim session As New NotesSession
Dim doc1 As NotesDocument
Dim doc2 As NotesDocument
Dim nextDoc1 As NotesDocument
Dim view1 As NotesView
Dim view2 As NotesView
Dim db As NotesDatabase
Dim keys as String
Dim keylist as Variant
Set db = session.CurrentDatabase
Set view1=db.GetView("vwhonorarabrechnungen_kdnr_rechnung")
Set view2=db.GetView("vwhonorarabrechnungen_status")
view1.AutoUpdate = False
Set doc1 = view1.GetFirstDocument
REM Erste Schleife, um die Keys einzusammeln
While Not (doc1 Is Nothing)
keys = keys + "," + CStr( doc1.GetItemValue( "<KEY-FELD>" )( 0 ) )
Set doc1 = view1.GetNextDocument( doc1 )
Wend
REM Aus dem Komma getrennten String, ein Array machen
keylist = Fulltrim( Split( keys, "," ) )
REM Zweite Schleife, um die Keys einzusammeln
forall key in keylist
Set doc2 = view2.GetDocumentByKey( key, True )
Print "Verarbeitung"
End Forall
End Sub