Hallihallo,
ich habe seit Wochen ein Problem, das ich nicht gelöst bekomme - ich hoffe, ihr könnt mir helfen, der Kunde, für den ich die Anwendung entwickle, wird langsam (und natürlich verständlicherweise) grantig.
AusgangslageZunächst muss ich dazu sagen, dass die Anwendung auf Druck des Kunden bereits produktiv im Einsatz ist. Mir ist durchaus bewusst, dass nicht fertige bzw. nicht komplett fehlerbereinigte Programme nicht in Produktion gehen sollten.
Durch einen Fehler in der anfänglichen Programmierung waren Autoren-Felder nicht als solche im Dokument angelegt, sondern lediglich als Text-Felder. Bemerkt habe ich das nur durch einen Zufall - die Benutzer selbst hatten keine Probleme, da nur sie selbst ihre Dokumente sehen sollten - der Server ist als Manager eingetragen und konnte offensichtlich die Dokumente durch die periodischen Agenten verarbeiten. Soweit so gut.
Interessanterweise kann der Admin der Datenbank
nicht alle Dokumente sehen, denn in einer Administrations-Ansicht wurden leere Kategorien angezeigt.
Darum habe ich eine Methode geschrieben, der durch jeden Benutzer im PostOpen des DB-Scripts ausgeführt werden und die Rechte in den eigenen Dokumenten setzen soll.
Die folgende Funktion steht in einer separaten Script-Bibliothek und wird, wie gesagt, aus dem PostOpen der Datenbank geöffnet. Der Fehler tritt in Zeile 83 auf (hier eingeschlossen durch die ' ##### Zeilen)
DBScript - PostOpenSub Postopen(Source As Notesuidatabase)
Const SCRIPT_NAME$ = "DB-Script - PostOpen"
On Error Goto ERRORHANDLER
Dim stErrorEndanwender As String
Dim stErrorDBAdmin As String
Dim vIsError As Variant
Dim lLog As New Logging
lLog.Category = "Datenbankskript"
lLog.Subject = SCRIPT_NAME$
lLog.LogAlways = True
Dim vKeysRole(0 To 2) As Variant
vKeysRole(0) = session.Username
vKeysRole(1) = "[DBAdmin]"
vKeysRole(2) = True
Dim vKeysLevel(0 To 2) As Variant
vKeysLevel(0) = session.Username
vKeysLevel(1) = ACLLEVEL_MANAGER
vKeysLevel(2) = True
vIsError = False
stErrorEndanwender = "Bitte definieren Sie in der Konfiguration eine Archiv-Datenbank, da " + _
"eine korrekte Funktionsweise sonst nicht gewährleistet werden kann."
stErrorDBAdmin = "Die Anwendung ist noch nicht konfiguriert. Bitte führen Sie keine weiteren Aktionen aus und kontaktieren Sie den Verantwortlichen für diese Datenbank."
If (docConfig.is_archivdb(0) = "1") Then
' Wenn die DB die Archiv-DB ist
If (dbProduktiv Is Nothing) Then
vIsError = True
Elseif (dbProduktiv.IsOpen = False) Then
vIsError = True
End If
Else
' Wenn die DB die Produktiv-DB ist
If (dbArchiv Is Nothing) Then
vIsError = True
Elseif (dbArchiv.IsOpen = False) Then
vIsError = True
End If
If (vIsError = False) Then
Call CorrectRightsForAllKundenkontakte(lLog)
End If
End If
If (vIsError = True) Then
If (h_HasLevel(vKeysLevel, lLog) = True Or h_HasRole(vKeysRole, lLog) = True) Then
' Wenn der angemeldete Benutzer die Rolle DBAdmin hat oder Manager ist
Msgbox stErrorDBAdmin, 48, "Hinweis"
Else
' Der Endanwender muss das ja doch nicht UNBEDINGT wissen. Reicht, wenn der
' Admin das sieht
' Msgbox stErrorEndanwender, 48, "Hinweis"
End If
End If
EXITSCRIPT:
Exit Sub
ERRORHANDLER:
Dim vErrorparams(5) As Variant
vErrorparams(0) = SCRIPT_NAME$
vErrorparams(1) = Erl
vErrorparams(2) = Err
Set vErrorparams(3) = Nothing
vErrorparams(4) = False
vErrorparams(5) = False
Call SendErrorNotification(vErrorparams)
Dim stError As String
stError = "Fehler #" & Err & ", " & Error$(Err) & ", " & "Zeile #" & Erl & " im Script : <" & SCRIPT_NAME$ & ">"
Call lLog.AddError(stError)
Resume EXITSCRIPT
End Sub
LibDocuments - CorrectRightsForAllKundenkontakteFunction CorrectRightsForAllKundenkontakte (lLog As Logging)
Const SCRIPT_NAME$ = "LibDocuments - CorrectRightsForAllKundenkontakte"
On Error Goto ERRORHANDLER
Dim dc As NotesDocumentCollection
Dim doc As NotesDocument
Dim counter As Long
Dim arrAuthors As Variant
Dim arrReaders As Variant
Dim itAuthors As NotesItem
Dim itReaders As NotesItem
Dim dtCurrent As NotesDatetime
Dim dtPrevious As NotesDatetime
Dim vAllowBreak As Variant
arrAuthors = h_GetGruppenleiterOfUser(session.Username, lLog)
arrAuthors = AddElementToArray(arrAuthors, "[DBAdmin]")
arrAuthors = AddElementToArray(arrAuthors, session.Username)
arrAuthors = AddElementToArray(arrAuthors, "[MBL]")
arrAuthors = RemoveElementFromArray(arrAuthors, "")
arrAuthors = ArrayRemoveDuplicates(arrAuthors)
arrReaders = "-no access-"
Set dc = dbCurrent.Search({form = "kundenkontakt" & (!@IsAvailable(is_korrigiert) | is_korrigiert < 1) & @Name([CN]; ersteller) = @Name([CN]; "} & session.Username & {")}, Nothing, 0)
Set doc = dc.GetFirstDocument
While Not (doc Is Nothing)
Call doc.ReplaceItemValue("is_korrigiert", 1)
Set itAuthors = doc.GetFirstItem("authors")
Set itReaders = doc.GetFirstItem("readers")
itAuthors.Values = arrAuthors
itAuthors.IsAuthors = True
itReaders.Values = arrReaders
itReaders.IsReaders = True
doc.is_korrigiert = 1
Call doc.Save(True, False, True)
Set doc = dc.GetNextDocument(doc)
Wend
Call lLog.AddText("Produktiv-DB: " & Cstr(dc.Count) & " Kundenkontakte in den Zugriffsrechten korrigiert.")
' Auch in der Archiv-DB
If Not (dbArchiv Is Nothing) Then
Set dc = dbArchiv.Search({form = "kundenkontakt" & (!@IsAvailable(is_korrigiert) | is_korrigiert < 1) & @Name([CN]; ersteller) = @Name([CN]; "} & session.Username & {")}, Nothing, 0)
Set doc = dc.GetFirstDocument
If Not (doc Is Nothing) Then
Set dtCurrent = New NotesDatetime(doc.datum(0))
Set dtPrevious = New NotesDatetime(doc.datum(0))
End If
vAllowBreak = True
counter = 0
While Not (doc Is Nothing Or (counter > 10 And vAllowBreak = True))
Set dtCurrent = New NotesDatetime(doc.datum(0))
If (Datevalue(dtCurrent.LSLocalTime) <> Datevalue(dtPrevious.LSLocalTime)) Then
vAllowBreak = True
Else
vAllowBreak = False
End If
counter = counter + 1
Call doc.ReplaceItemValue("is_korrigiert", 1)
Call doc.ReplaceItemValue("authors", arrAuthors)
Call doc.ReplaceItemValue("readers", arrReaders)
' ####################################
Call doc.Save(True, False, True)
' ####################################
' Dokumente aus der Archiv-Datenbank zurück in die produktive
' kopieren, damit sie auf jeden Fall nochmals verarbeitet werden
Call doc.CopyToDatabase(dbCurrent)
Call DeleteDocument(doc, lLog)
Set doc = dc.GetNextDocument(doc)
Set dtPrevious = New NotesDatetime(dtCurrent.DateOnly)
Wend
Call lLog.AddText("Archiv-DB: " & Cstr(counter) & " Kundenkontakte in den Zugriffsrechten korrigiert und zur Neuberechnung in die Produktiv-DB verschoben.")
End If
EXITSCRIPT:
Exit Function
ERRORHANDLER:
Dim vErrorparams(5) As Variant
vErrorparams(0) = SCRIPT_NAME$
vErrorparams(1) = Erl
vErrorparams(2) = Err
Set vErrorparams(3) = Nothing
vErrorparams(4) = False
vErrorparams(5) = False
Call SendErrorNotification(vErrorparams)
Dim stError As String
stError = "Fehler #" & Err & ", " & Error$(Err) & ", " & "Zeile #" & Erl & " im Script : <" & SCRIPT_NAME$ & ">"
Call lLog.AddError(stError)
Resume EXITSCRIPT
End Function
ProblemeDas erste Problem, in das ich gelaufen bin, war, dass die Benutzer ihre eigenen Dokumente nicht verändern durften, weil sie nur als Autoren in der Datenbank gestanden haben, und ein Kollege mir sagte, dass man Autor sein muss, um Dokumente erstellen zu können, das bedeutet aber nicht, dass man seine eigens erstellten Dokumente später auch wieder bearbeiten kann (man lernt ja nie aus
). Die Lösung hierfür - dachte ich zumindest - ist, die User als Editoren in die Datenbank zu schreiben. Das scheint aber keine Lösung zu sein.
In der Zeile 83 des oben geposteten Scripts (wenn man die Markierung entfernt) bekommt man einen Fehler #4000.
In Zeile 66 des PostOpen erhalten die User außerdem einen Fehler 4000 in der Zeile des Exit Sub, was ich ja überhaupt nicht verstehe - wie kann ein Fehler beim Exit Sub passieren?
Mit dem Notes-Admin des Kunden sind wir schon mit dem Debugger durch die Anwendung gegangen, ohne einen Hinweis auf die Fehlerquelle zu finden. Wir dachten auch schon an eine fehlerhafte Gestaltung der Datenbank und haben sie mit einer leeren Schablone überbügelt und dann nochmals mit der Schablone der Anwendung.
Bei mir kann ich diese Probleme nicht nachstellen, sie treten nur beim Kunden auf. Beim Kunden liegt eine CITRIX-Umgebung vor - was das genau ist, weiß ich nicht, aber offensichtlich stehen die Notes-Server nicht lokal vor Ort, sondern werden über eine Standleitung in einem externen Rechenzentrum erreicht. Die Benutzer arbeiten mit Notes 5.0.11 Clients, der Server ist Domino 6.x (die genaue Version weiß ich nicht genau, aber ich glaube, es ist Domino 6.5.2).
Ich kann mir die Fehler und die Problematik nicht erklären, natürlich fällt letztendlich alles auf mich, den Entwickler der Anwendung, zurück - darum würde ich mich wirklich sehr freuen, wenn das Problem euch bekannt vorkommt und ihr eine Lösung für mich habt.
Viele Grüße
- Jérôme