Domino 9 und frühere Versionen > ND8: Entwicklung

Frontend-Backend Probleme

(1/3) > >>

sja:
Hallo Zusammen,
Kennt jemand eine Lösung für folgendes  Problem
Eine Maske enthält eine Reihe von Buttons. Es ist nämlich internen Workflow-Prozess implementiert.
Wenn einen User A öffnet ein Dokument in dem nicht Bearbeitungsmodus und haltet das Dokument geöffnet nur zum Lesen. Dann öffnet anderen User B  dieses Dokument in dem Bearbeitungsmodus und betätigt einen von  Buttons. Dabei wird eine Email gesendet und bestimmte Werte gesetzt, das Dokument automatisch gespeichert und geschlossen. Dann entscheidet der User A, das bei ihm dieses bevor geöffneten Dokument in den Bearbeitungsmodus zu setzten, und dann beim Schlissen des Dokumentes passierte folgendes:
1.   Wenn der User  A keine Änderungen vornimmt, wird das Dokument trotzdem gespeichert, weil in der Maske in dem Script bei Queryclose bestimmte Prozesse mit der Speicherung programmiert sind. Und dann haben wir das Problem: da das Dokument beim User A im Frontend geöffnet war und kennt die Änderungen, die beim User B vorgenommen werden, werden die Änderungen von User B zurückgesetzt.
2.   Wenn der User A einige Änderungen vornimmt, dann beim Schlissen und Speichern entstehen zwei Konflikt-Dokumenten und dabei keinen Dokument die Änderungen vom User B enthält.
Das Problem, nehme ich an, bei  vielen Entwicklern schon bekannt ist. Vielen Dank im Voraus, wenn jemand mir dabei helfen möchte bzw. einen Link zur Lösung.
Hoffentlich habe ich mein Problem verständlich ausgedrückt trotz meinem keinen perfekten Deutsch  :)

Peter Klett:
Dein Deutsch ist perfekt genug, um das Problem verständlich zu machen.

Ich ignoriere bewusst, dass die Datenbank auf verschiedenen Servern liegen könnte.

Du könntest Dokument-Locking aktivieren, das verhindert, dass Benutzer A in den Bearbeitenmodus wechselt, während Benutzer B es im Bearbeitenmodus hat. Dein Problem scheint aber damit alleine nicht gelöst werden zu können.

Benutzer A öffnet das Dokument im Lesemodus
Danach bearbeitet Benutzer B, speichert und schließt das Dokument
Erst danach setzt Benutzer A das Dokument in den Bearbeitungsmodus -> Dokument Locking wirkt nicht, da B ja nicht mehr im Bearbeitenmodus ist

Bei mehreren Servern sehe ich keine realistische Chance, das Problem zu umgehen. Organisatorisch würde ich auf jeden Fall dafür sorgen, dass der Kreis der Benutzer, die gleichzeitig an einem Dokument in einem bestimmten Workflowstatus das Dokument bearbeiten können, so klein wie möglich halten (Autorensteuerung).

Weiterhin würde ich Speicherungsaktivitäten im Queryclose vermeiden, wenn es nicht absolut sein muss (ja, auch ich habe solche "Schweinereien" gemacht, Probleme bringt das immer mit sich).

Zwei Ansätze, die ich aber selbst noch nie ausprobiert habe:

1. Im Postmodechange nach Setzen in Bearbeitungsmodus ein Reload des Dokuments versuchen, damit die evtl. Änderungen von B nachgeladen werden

2. Im Querymodechange vor dem Setzen in Bearbeitenmodus das Dokument im Backend suchen, das letzte Änderungsdatum mit dem des aktuell geöffneten Dokuments vergleichen, ist das jünger, Dokument schließen, erneut öffnen und in den Bearbeitenmodus setzen

sja:
Hallo Peter,
erst herzlichen Dank für Deine Antwort.
Also, wir haben nur für eine einziege Replik auf nur einem Server uns entschieden, da bei solchem sehr intensiven Workflow es nicht anderes geht.
Wenn bei einem User das Dokument in dem Bearbeitungsmodus geöffnet ist , dann haben wir kein Problem, weil beim Versuch vom anderen User das Dokument auch im Bearbeitungsmodus zu öffnen, wird das Dokument gesperrt.
Also, wie schon beschrieben wurde, haben wir nur das Problem, wenn das Dokument beim User A schon vorher im nicht Bearbeitungsmodus geöffnet war und nach den Änderungen vom User B in das Bearbeitungsmodus gesetzt wird.

Habe auch auf diesen Vortrag hier in atnotes gestoßen
http://atnotes.de/index.php/topic,33892.0.html
und ich habe folgendes:
Im Querymodechange ohne Datumsänderungs-Vergleich, also,  in jedem Fall das Dokument schließen, erneut öffnen und in den Bearbeitungsmodus setzen
und
im Postmodechange nach Setzen in Bearbeitungsmodus ein Reload des Dokuments ausprobiert:



Sub Querymodechange(Source As Notesuidocument, Continue As Variant)
   
   Dim thisdoc As NotesDocument
   Dim ws As NotesUIWorkspace
   Dim olduidoc As NotesUIDocument
   
   Set ws = New NotesUIWorkspace
   Set olduidoc=Source
   Set thisdoc= Source.Document
   thisdoc.SaveOptions ="0"
   
   olduidoc.Close(False)
   ws.ViewRefresh
   Call ws.Editdocument(True,  thisdoc)
   'doc.SaveOptions ="1"
   thisdoc.RemoveItem "SaveOptions"
   Source.Refresh
End Sub

Sub Postmodechange(Source As Notesuidocument)
   Source.Reload
End Sub

Leider ohne Erfolg   :'(

Sofia

it898ur:
Hallo,

ich kenne das Problem auch und wir prüfen bei problematischen Anwendungen beim Wechsel in den Bearbeitungsmodus, ob das Änderungsdatum des Backend-Dokumentes (wichtig: geholt über session.CurrentDatabase.GetDocumentByUNID und nicht aus dem WS abgeleitet) ein anderes ist als das Änderungsdokument des aktuellen Frontenddokumentes (ws.CurrentDocument.Document).

Ist dies der Fall wird das Frontenddokument geschlossen und anschließend das Backend-Dokument im Bearbeitungsmodus geöffnet.

Alle vVersuche den aktuellen Stand über ein Objekt zu erreichen, welches aus dem Frontend geladen wurden (wie hier im Beispielcode) liefern immer den alten Stand !

Gruß

André

sja:

Vielen Dank Andrè für den Tipp.

Eigentlich spielt keine Rolle ob doc. geändert war, ich mache das auf jedem Fall  und habe es  so ausprobiert

Sub Querymodechange(Source As Notesuidocument, Continue As Variant)
   
   Dim thisdoc As NotesDocument
   Dim ws As NotesUIWorkspace
   'Dim db As NotesUIDatabase
   Dim olduidoc As NotesUIDocument
   
   unid$ = thisdoc.UniversalID
   
   Dim s As NotesSession   
   Dim doc As NotesDocument
   Set s = New NotesSession
   
   Set doc = s.CurrentDatabase.GetDocumentByUNID(unid$)
   
   Set ws = New NotesUIWorkspace
   Set olduidoc=Source
   Set thisdoc= Source.Document
   thisdoc.SaveOptions ="0"
   
   olduidoc.Close(False)
   ws.ViewRefresh
   
   Call ws.Editdocument(True,  doc)
   
   doc.RemoveItem("SaveOptions")
   'thisdoc.RemoveItem("SaveOptions")
   'Source.Refresh
   
End Sub

und die Ergebniss genauso wie frühe. Weiß nicht was ich falsch mache  ???

Sofia

Navigation

[0] Themen-Index

[#] Nächste Seite

Zur normalen Ansicht wechseln