Domino 9 und frühere Versionen > Entwicklung

Dokument nachlesen - Datensatzsperre

(1/1)

FrankLU:
Einen weihnachtlichen Gruß an alle!

Da ich mit einem Notes5-Server arbeiten muss, muss ich versuchen, eine Datensatzsperre hinzubekommen.

Bisherige Lösung: Beim Schalten in den Edit-Modus durch Benutzer 1 wird vor dem Umschalten in den Edit-Modus ein Kennzeichen gesetzt (im iuDoc und im Doc) und das Doc erst mal gesichert. So kann ich ein Bearbeiten durch Benutzer 2 verhindern, in dem ich das Kennzeichen abfrage, wenn Benutzer 2 sein Doc lädt und bearbeiten will, nachdem Benutzer 1 in den Edit-Modus  gegangen ist. Auch für die Abbruch-Situation (ohne Speichern) habe ich eine Lösung.

Problem ist aber: Wenn Benutzer 1 und Benutzer 2 das gleiche Doc in der Anzeige haben (Lese-Modus) und Benutzer 1 dann in den Edit-Modus geht (und somit das Kennzeichen setzt), kann trotzdem auch Benutzer 2 das Doc in den Edit-Modus schalten.

Ein Nachlesen des Dokuments beim Wechsel in den Edit-Modus über GetDocumentByUNID liest mir den Datensatz aus dem Cache ein, nicht das Doc von der Datenbank mit dem gesetzten Kennzeichen. Eine Entsprechnung von @DBLookup mit der Option "NoCache" habe ich für LotusScript nicht gefunden. Ein Arbeiten mit Evaluate ist bei @DBLookup nicht möglich.

Bekomme ich das System dazu, dass Benutzer 2 das Doc von der Datenbank in ein zweites NotesDocument neu einliest, obwohl es schon angezeigt wird.

Frohe Weihnachten!
Frank

Mark³:
ich habe mal 2 Jahre lang eine Sperre in Betrieb gehabt, die in einer separaten Datenbank einen Sperreintrag anlegt, wo die Unique-ID des gesperrten Dokumentes drinsteht. Bei jeder Änderung Lesen - Bearbeiten - Lesen wird hier das Dokument erzeugt oder gelöscht. Dies funktionierte recht gut, das ganze dauerte nur Millisekunden. Zusätzlich habe ich vermerkt, welcher Benutzer das Dokument wann gesperrt hat.
Einziges Problem: Ab und zu blieben Dokumente im Gesperrt-Modus, wenn z.B. ein Client abgestürzt ist während des Editierens. Daher habe ich abends alle Sperrdokumente automatisch gelöscht.

Code zur Abfrage der Sperre:


--- Code: ---Function IsDocLockedUI(doc As Notesdocument) As Integer
Dim session As NotesSession
Dim dbLock As NotesDatabase
Dim viewLock As NotesView
Dim docLock As NotesDocument
Dim strUNID As String
Dim strUser As String
Dim strCallnr As String
Dim db As NotesDatabase
Dim view As NotesView
Dim IsLocked As Integer
On Error Goto ProcessError

Set session = New NotesSession

Dim prodoc As NotesDocument
Set db = session.CurrentDatabase
Set prodoc=db.GetProfileDocument("SETUP")

Set dbLock = New NotesDatabase(prodoc.LockServer(0), prodoc.LockDB(0))
Set viewLock = dbLock.GetView("refLock")

strUNID = doc.UniversalID

Set docLock = viewLock.GetDocumentByKey( strUNID, True)

If docLock Is Nothing Then
IsDocLockedUI = False
Else
IsDocLockedUI = True
End If
Exit Function
ProcessError:
Call LogEntry(Err, "Error (" & Cstr(Err) & " ) -> " & Error$(Err) & " in Zeile " & Erl & " Lib: HelpDesk - IsDocLockedUI")
Exit Function
End Function
--- Ende Code ---

FrankLU:
Hallo Mark,

danke für die schnelle Antwort. Auf die einfachsten Dinge kommt man immer selten. Das löst schon mal mein akutes Problem.  :)

Dabei werde ich die Sperrdokumente aber in einer anderen Datenbank ablegen, wo die Leute auch Löschrechte haben, die Sie in der eigentlichen Datenbank natürlich nicht haben sollen.

Trotzdem würde mich interessieren, ob es per Script möglich ist, ein Doc neu von der Datenbank einzulesen, obwohl es schon angezeigt wird.

Frohe Weihnachten
Frank

Navigation

[0] Themen-Index

Zur normalen Ansicht wechseln