Bei der Entwicklung einer Anwendung stießen wir auf einen Fehler, der unter Umständen kritische Folgen haben kann. Wird mit Dokumenten gearbeitet, die sich in einer sortierten Ansicht befinden, kann es passieren dass Notes ein bereits geöffnetes Dokument durch ein anderes austauscht. Das tritt immer dann auf, wenn in den Lesemodus gewechselt wird, nachdem ein Feldwert, der Einfluss auf die Sortierung hat, geändert und gespeichert wurde.
Konkreter an einem Beispiel dargestellt:
In einer Ansicht befinden sich zwei Dokumente, welche beide in dem Feld "Nummer" einen numerischen Wert enthalten. Das Feld im ersten Dokument hat den Wert 1, im zweiten Dokument den Wert 2. In der Ansicht sind die Dokumente nach dem Feld "Nummer" aufsteigend sortiert.
Das erste Dokument wird im Bearbeitungsmodus geöffnet und der Wert des Feldes "Nummer" von 1 in 3 geändert.
Anschließend wird gespeichert und in den Lesemodus gewechselt.
Statt dem ersten Dokument mit dem Feldwert 3, befindet sich jetzt das zweite Dokument mit dem Feldwert 2 im Lesemodus.
Warum passiert das? Weil das Dokument durch die Sortierung in der Ansicht nach unten gerutscht ist und dies scheinbar Auswirkungen auf das anzuzeigende Dokument hat.
Wir haben diesem Blogeintrag eine Datenbank hinzugefügt, an welcher Sie den Fehler gut nachvollziehen können. Dort finden Sie zwei Ansichten (view1, view2). In der view1 haben wir für das Problem bereits eine Lösung implementiert. In der view2 können Sie den Fehler anhand des eben beschriebenen Beispiels nachvollziehen.
Folgenden Code haben wir zur Lösung des Problems im "QueryModeChange" der Maske der Dokumente aus view1 hinzugefügt:
Dim uiws As New NotesUIWorkspace Dim doc As NotesDocument Dim docReopen As notesDocument Dim newUIDoc As NotesUIDocument Dim item As NotesItem Dim unid As String Dim msgSave As Integer Dim msgReset As Integer If source.EditMode Then If source.ModifiedSinceSaved Then msgSave = Messagebox("Möchten Sie Ihre Änderungen speichern?", MB_YESNOCANCEL, "IBM Notes") If msgSave = IDYES Then source.Save Elseif msgSave = IDNO Then msgReset = Messagebox("Möchten Sie das Dokument zurücksetzen?" + Chr$(10) + Chr$(10) + _ |Bei "Ja" wird das Dokument in den Zustand der letzten Speicherung versetzt.| + Chr$(10) + _ |Bei "Nein" werden die letzten Änderungen ungespeichert angezeigt.|, MB_YESNO, "IBM Notes") End If End If If Not msgSave = IDCANCEL Then Set doc = source.Document unid = doc.UniversalID Set item = New NotesItem(doc, "SaveOptions", 0) source.Close If msgReset = IDYES Then Delete doc End If Set docReopen = uiws.CurrentDatabase.Database.GetDocumentByUNID(unid) Set newUIDoc = uiws.EditDocument(False, docReopen) Call uiws.ViewRefresh End If continue = False End If