Autor Thema: "The Document is not in view" bei zwei While-Schleifen  (Gelesen 2279 mal)

Offline Obrac

  • Senior Mitglied
  • ****
  • Beiträge: 277
  • Geschlecht: Männlich
Hallo, Notes-Experten,

ich habe ein Problem, das mich schon Stunden des Rumprobierens und der Recherche gekostet hat. Ich habe ein LS-Script mit zwei While-Schleifen, die Dokumente auslesen. Die erste Schleife nimmt sich ein Doc und liest einen Feldwert aus. Danach fängt die zweite Schleife innerhalb der ersten an, nimmt sich wiederum alle Docs mit dem ausgelesenen Wert und erstellt ein neues Dokument. Das Problem ist, dass beim getNextDocument der äußeren Schleife die Fehlermeldung "The Document is not in view" ausgegeben wird. Wenn die innere Schleife ausgeführt wird, kann die äußere also nicht das nächste Doc auslesen. Offenbar will das Script das NextDoc der inneren Schleife haben, obwohl es das der äußeren nehmen müsste. Das ist zumindest meine Interpretation. Dabei ist aber die view eine andere und das doc hat auch eine andere Variable, allerdings greifen beide Schleifen auf dieselben Dokumente zu.

Nun wäre wohl die Idee, die innere Schleife durch etwas anderes zu ersetzen, z.B. durch GetdocumentbyKey. Den Key habe ich ja, nämlich den ausgelesenen Feldwert. Was ich allerdings nicht verstehe, ist, wie ich es schaffe, über diese Methode wirklich alle docs zu finden und nicht nur das erste. Ich brauche also dann doch eine Art Schleife. Es gibt ja noch GetAllDocumentsByKey, allerdings müsste ich die Dokumente nacheinander auslesen, da Feldwerte addiert werden.

Hat jemand eventuell eine Idee, wie das Problem noch zu umgehen ist?

Offline Tode

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 6.883
  • Geschlecht: Männlich
  • Geht nicht, gibt's (fast) nicht... *g*
Antw:"The Document is not in view" bei zwei While-Schleifen
« Antwort #1 am: 21.02.23 - 17:00:28 »
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:
Code
While not doc is Nothing
  '- hier wird Deine innere Schleife durchgeührt
  Set doc = view.GetNextDocument( doc )
Wend

das hier:
Code
While not doc is Nothing
  Set nextDoc = view.GetNextDocument( doc )
  '- hier wird Deine innere Schleife durchgeührt
  Set doc = nextDoc
Wend
Gruss
Torsten (Tode)

P.S.: Da mein Nickname immer mal wieder für Verwirrung sorgt: Tode hat NICHTS mit Tod zu tun. So klingt es einfach, wenn ein 2- Jähriger versucht "Torsten" zu sagen... das klingt dann so: "Tooode" (langes O, das r, s und n werden verschluckt, das t wird zum badischen d)

Offline Obrac

  • Senior Mitglied
  • ****
  • Beiträge: 277
  • Geschlecht: Männlich
Antw:"The Document is not in view" bei zwei While-Schleifen
« Antwort #2 am: 21.02.23 - 17:31:11 »
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:

Code
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?



pantelis.botsas

  • Gast
Antw:"The Document is not in view" bei zwei While-Schleifen
« Antwort #3 am: 21.02.23 - 20:35:55 »
Nur um Unklarheiten zu vermeiden...

In Zeile 7 versuchst Du aus einer viewCol das nächste Dokument zu holen.
Doch die Collection ist nirgends definiert und initialisiert.

Offline Obrac

  • Senior Mitglied
  • ****
  • Beiträge: 277
  • Geschlecht: Männlich
Antw:"The Document is not in view" bei zwei While-Schleifen
« Antwort #4 am: 21.02.23 - 22:31:45 »
Das ist eine berechtigte Frage, und in meinem echten Skript heißt die Variable auch so, weil sie im Frühstadium des Skriptes mal eine Collection war. Hier habe ich aber nur den Namen aus Versehen nicht geändert. Im echten Skript stimmen die Namen.

Offline ronka

  • Senior Mitglied
  • ****
  • Beiträge: 377
  • Was macht der hier denn, muß der überall sein ?
    • das nächste DominoCamp kommt in Juni 2023
Antw:"The Document is not in view" bei zwei While-Schleifen
« Antwort #5 am: 21.02.23 - 23:13:29 »
In zeile 10 machst du ein
Set doc2 = view2.GetFirstDocument

In Zeile 17 dann aber

Set doc2=view.GetnextDocument (doc2)

Wieso ist in Zeile 10 view2 und in Zeile 17 View wodraus das geholt wird ?
das neueste von Notes und Domino auf den DominoCamp vom 19 bis 21 Juni 2023 auf www.DominoCamp.de

Offline Obrac

  • Senior Mitglied
  • ****
  • Beiträge: 277
  • Geschlecht: Männlich
Antw:"The Document is not in view" bei zwei While-Schleifen
« Antwort #6 am: 22.02.23 - 07:13:11 »
@ronka: Hier habe ich mich auch nochmal beim Posten verschrieben. Es muss auch hier view2 heißen. Hier nochmal das korrekte Skript:

Code
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

Offline Tode

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 6.883
  • Geschlecht: Männlich
  • Geht nicht, gibt's (fast) nicht... *g*
Antw:"The Document is not in view" bei zwei While-Schleifen
« Antwort #7 am: 22.02.23 - 08:03:18 »
Abgesehen davon, dass es Quatsch ist, view2 in jeder Iteration neu zu setzen (die Zeile "Set view2=db.GetView("namederAnsicht")" kannst Du direkt hinter die Zeile "Set view1=db.GetView("namederAnsicht")" außerhalb der While- Schleife verschieben), sehe ich kein Problem mit Deinem Code.

Wie genau lautet die Fehlermeldung?

Ich vermute, dass Du auch in Deinem "Echt"- Script Variablen vertauscht hast...

Wenn zwischen Zeile 4 und 7 Deines Original- Codes wirklich nichts anderes passiert, dann kann die Meldung "Document not in View" so nicht kommen...

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...

Meine Vermutung ist aber, dass Du gar nicht beim übertragen des Codes in ein "anonymisiertes Beispiel" den Fehler gemacht hast, sondern dass Dein Code durch das viele rumprobieren wirklich so chaotisch ist, dass Du nicht mehr durchblickst, welche Variable welche ist...
« Letzte Änderung: 22.02.23 - 08:07:52 von Tode »
Gruss
Torsten (Tode)

P.S.: Da mein Nickname immer mal wieder für Verwirrung sorgt: Tode hat NICHTS mit Tod zu tun. So klingt es einfach, wenn ein 2- Jähriger versucht "Torsten" zu sagen... das klingt dann so: "Tooode" (langes O, das r, s und n werden verschluckt, das t wird zum badischen d)

Offline Obrac

  • Senior Mitglied
  • ****
  • Beiträge: 277
  • Geschlecht: Männlich
Antw:"The Document is not in view" bei zwei While-Schleifen
« Antwort #8 am: 22.02.23 - 08:23:17 »
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)":

Code
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


Zitat
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.

Offline DominoDancing

  • Aktives Mitglied
  • ***
  • Beiträge: 141
  • Geschlecht: Männlich
  • Kugel im Käfig, lsmf, hurz ...
Antw:"The Document is not in view" bei zwei While-Schleifen
« Antwort #9 am: 22.02.23 - 08:55:48 »
Hallobrac  :),

ich vermute mal, dass der Fehler nicht beim ersten Durchlaufen der äußeren Schleife auftritt, sondern frühestens beim zweiten, richtig? Wenn dem so ist, vermute ich weiterhin, dass doc2 beim Durchlaufen der inneren Schleife irgendwann einmal mit nextDoc1 übereinstimmt, also das gleiche Dokument ist.

Wenn dem so ist, übernimmt zu diesem Zeitpunkt, nextDoc1 die parentview von doc2 (Ich war auch erschrocken als ich das erstmalig feststellte.). Mit set doc1 = nextDoc1 übergibst Du dann die (für Dich falsche) parentview auch an doc1. Das erneute Durchlaufen der äußeren Schleife führt dann mit Set nextDoc1 = view1.GetNextDocument(doc1) zu der Fehlermeldung, da doc1 laut parentview gar nicht in der Anicht view1 enthalten ist, sondern in der Ansicht view2.

Wenn ich also nicht ganz falsch liege und nicht zu viel vermute (ich habe das Wünschelrutensyndrom), ist es somit notwendig, doc1 innerhalb der view1 neu zu setzen, da parentview read-only ist. Aber vielleicht liege ich auch ganz falsch und bin zu alt für das alles ... :) Überprüfe einfach einmal die parentview von doc1 beim Auftreten des Fehlers.

Liebe Grüße
René
... ich fühl' mich so ... Regenbogen ... ;D
... man muss die Ursache des Problems finden ... oder eine Tüte Glitzerfeenstaub ...
... Ich bin rhythm, I'm a dancer und I don't like Influenzer ...

Offline Obrac

  • Senior Mitglied
  • ****
  • Beiträge: 277
  • Geschlecht: Männlich
Antw:"The Document is not in view" bei zwei While-Schleifen
« Antwort #10 am: 22.02.23 - 09:18:12 »
Hallo zurück,

Zitat
ich vermute mal, dass der Fehler nicht beim ersten Durchlaufen der äußeren Schleife auftritt, sondern frühestens beim zweiten, richtig? Wenn dem so ist, vermute ich weiterhin, dass doc2 beim Durchlaufen der inneren Schleife irgendwann einmal mit nextDoc1 übereinstimmt, also das gleiche Dokument ist.

Genau, der Fehler tritt auf, nachdem die innere Schleife einmal durchgelaufen ist und die äußere Schleife sich das nächste doc holen will. So ähnlich hatte ich es ja auch in meinem Anfangsposting vermutet. Es wird auf jeden Fall in beiden Schleifen bis dahin dasselbe doc ausgelesen.

Zitat
Wenn ich also nicht ganz falsch liege und nicht zu viel vermute (ich habe das Wünschelrutensyndrom), ist es somit notwendig, doc1 innerhalb der view1 neu zu setzen, da parentview read-only ist. Aber vielleicht liege ich auch ganz falsch und bin zu alt für das alles ... :) Überprüfe einfach einmal die parentview von doc1 beim Auftreten des Fehlers.

Mir ist noch nicht ganz klar, was hier zu tun ist. Wie setze ich doc1 neu und wo? Wenn ich die view1 am Ende der äußeren Schleife mit getView nochmal auf die richtige view setze (und doc1 auf getNextDocument), kommt der Fehler wieder. Wie überzeuge ich die äußere Schleife davon, wieder an die richtige Stelle zu springen und das nächste doc1 zu nehmen?

Deinen Gedankengang halte ich für sehr richtig.

Offline DominoDancing

  • Aktives Mitglied
  • ***
  • Beiträge: 141
  • Geschlecht: Männlich
  • Kugel im Käfig, lsmf, hurz ...
Antw:"The Document is not in view" bei zwei While-Schleifen
« Antwort #11 am: 22.02.23 - 10:06:55 »
Hallobrac,

ich würde mir von doc1 jeweils einen eindeutigen Sortierschlüssel entsprechend der Sortierung von view1 merken (existiert kein eindeutiger Sortierschlüssel, dann einen solchen schaffen oder beispielsweise per ID des doc1 die Eindeutigkeit abprüfen) und dann in der Schleife

Set doc1 = view1.GetDocumentByKey(eindeutiger Sortierschlüssel, true)
Set doc1 = view1.GetNextDocument(doc1)

verwenden (anstelle von Set nextDoc1 = view1.GetNextDocument(doc1)). Natürlich kann dann auch Set doc1 = nextDoc1 entfallen.

Sicherlich existieren auch elegantere Lösungen. Bin halt nicht so der Elegante. ;D

Liebe Grüße
René
« Letzte Änderung: 22.02.23 - 11:19:21 von DominoDancing »
... ich fühl' mich so ... Regenbogen ... ;D
... man muss die Ursache des Problems finden ... oder eine Tüte Glitzerfeenstaub ...
... Ich bin rhythm, I'm a dancer und I don't like Influenzer ...

pantelis.botsas

  • Gast
Antw:"The Document is not in view" bei zwei While-Schleifen
« Antwort #12 am: 22.02.23 - 10:29:54 »
... auch nur so mal ins Blaue geraten ...

Kann es sein, dass in einer Deiner while-Schleifen das darin enthaltene Dokument so verändert wird, dass es anschließend nicht mehr Teil der Dokumentenmenge in der Ansicht ist?

Kontrolliere mal bitte die Auswahlformel in der Ansicht - und ob aufgrund Deiner Änderungen durch das Script, das bearbeitete Dokument dadurch nicht mehr in der Ansicht enthalten ist.

Lieben Gruß,
Pantelis
« Letzte Änderung: 22.02.23 - 11:38:08 von pantelis.botsas »

Offline Obrac

  • Senior Mitglied
  • ****
  • Beiträge: 277
  • Geschlecht: Männlich
Antw:"The Document is not in view" bei zwei While-Schleifen
« Antwort #13 am: 22.02.23 - 17:11:09 »
@DominoDancing: Good thinking, aber Notes meckert immer noch, diesmal nur anders ausgedrückt: "Function Requires a Valid ADT Argument". Wenn ich das richtig sehe, ist das die Entsprechung von "The Document is not in view", nur für die GetDocumentByKey-Methode. Notes findet immer noch kein doc, obwohl welche da sind. Der Fehler tritt bei der Zeile "Set doc1 = view1.GetNextDocument(doc1)" auf Die beiden von dir vorgeschlagenen Zeilen gehören doch vor das Wend der äußeren Schleife, oder?

@pantelis.botsas: Das war tatsächlich auch mein allererster Ansatz zur Fehlerbehebung gewesen, aber es ist in der Tat nicht die Ursache. In dem gesposteten vereinfachten Skript wird gar nichts mit den Dokumenten gemacht.

pantelis.botsas

  • Gast
Antw:"The Document is not in view" bei zwei While-Schleifen
« Antwort #14 am: 22.02.23 - 18:00:00 »
Hallo Obrac,

soweit ich Deine Anforderung verstanden habe, möchtest Du folgendes erreichen:

In einer Ansicht befinden sich Dokumente. Diese sind in der ersten Spalte über einen Feldwert (Schlüsselwert) sortiert.
Du möchtest nun alle Dokumente verarbeiten, die denselben Schlüsselwert in einer zweiten Ansicht besitzen.

Jetzt bin ich aber nicht ganz schlau geworden, ob am Ende dieser Verarbeitung für *alle* Dokumente mit dem gleichen Schlüsselwert ...
a) die Feldinhalte angeglichen werden sollen
b) die Dokumente der Reihe nach neue Feldinhalte bekommen sollen

Ich würde Deine Anforderung mit diesen Schritten lösen

Schritt 1:
Baue eine Liste aller verfügbaren, eindeutigen Schlüsselwerte aus Deiner ersten Ansicht auf.
Ich würde Dir gerne sagen, dass es hierfür eine einfache Methode im Ansichts-Objekt gibt ... doch leider ist das wieder eine Lücke, die auch HCL nicht schließen will.
Also bleibt der unperformante Weg über alle Dokumente in der Ansicht.
Oder der absurd komplizierte Weg über ein NotesViewNavigator-Objekt.

Schritt 2:
Hole Dir anhand der Einzeleinträge aus der zuvor erstellten Liste der Schlüsselwerte, alle Dokumente als ViewEntryCollection aus der zweiten Ansicht mit view.getAllEntriesByKey(keyValue) - damit behalten die Dokumente ihre festgelegte Reihenfolge aus der Ansicht bei.

Schritt 3:
Verarbeite alle Dokumente der ViewEntryCollection mit der entsprechenden Logik.

Lieben Gruß,
Pantelis

Offline DominoDancing

  • Aktives Mitglied
  • ***
  • Beiträge: 141
  • Geschlecht: Männlich
  • Kugel im Käfig, lsmf, hurz ...
Antw:"The Document is not in view" bei zwei While-Schleifen
« Antwort #15 am: 23.02.23 - 07:28:18 »
Hallobrac,

um mein Wünschelrutensyndrom nicht weiter zu verstärken: Bitte prüfe zunächst einmal, ob zum Zeitpunkt des Auftretens des Fehlers view1 einen gültigen Wert enthält. Wenn ja, wie lautet die parentview des doc1 zum Fehlerzeitpunkt?

Liebe Grüße
René
... ich fühl' mich so ... Regenbogen ... ;D
... man muss die Ursache des Problems finden ... oder eine Tüte Glitzerfeenstaub ...
... Ich bin rhythm, I'm a dancer und I don't like Influenzer ...

Offline Riccardo Virzi

  • Junior Mitglied
  • **
  • Beiträge: 69
Antw:"The Document is not in view" bei zwei While-Schleifen
« Antwort #16 am: 23.02.23 - 09:52:01 »
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.

Code
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
« Letzte Änderung: 23.02.23 - 09:54:29 von Riccardo Virzi »

Offline Obrac

  • Senior Mitglied
  • ****
  • Beiträge: 277
  • Geschlecht: Männlich
Antw:"The Document is not in view" bei zwei While-Schleifen
« Antwort #17 am: 23.02.23 - 16:56:04 »
So, jetzt erstmal ein dickes Danke an alle, die mitüberlegt haben. Dank euch klappt es jetzt. Letztlich hat DominoDancings Ansatz mit "GetDocumentByKey" doch funktioniert, denn die Fehlermeldung "Function Requires a Valid ADT Argument" basierte auf einer fehlerhaften Formatierung der ersten Ansichtspalte. Als Spaltenwert und Variable ein String waren, hat es tatsächlich geklappt. doc1 und doc2 sowie deren Parentviews hatten die richtigen Werte und alles wurde korrekt ausgelesen.

@pantelis.botsas: Danke auch nochmal an dich für die Anleitung des Alternativweges. Das wird für mich in Zukunft dennoch interessant sein bei anderen Anforderungen. Genauso an @Riccardo Virzi: Die Arraylösung sieht auch vielversprechend. Dafür hätte ich mein Skript leider ziemlich umbauen müssen, aber das ist sicherlich auch ein Weg.

Schönen Tag noch euch allen und nochmal thanks.

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz