Domino 9 und frühere Versionen > Entwicklung

Autoren/Editoren dürfen Felder nicht ändern?

(1/2) > >>

Jérôme:
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.

Ausgangslage

Zunä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 - PostOpen

--- Code: ---Sub 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
--- Ende Code ---

LibDocuments - CorrectRightsForAllKundenkontakte

--- Code: ---Function 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
--- Ende Code ---

Probleme
Das 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

thorsten_w:
Hast du mal versucht einen periodischen Agenten zu erstellen (signiert mit der Server ID) um damit Zugriff auf alle Dokumente zu bekommen?

Gruss Thorsten

Jérôme:
Der Grund, warum ich diese Methode durchführen möchte (jeder Benutzer korrigiert die Autoren/Leserfelder in seinen Dokumenten) ist, dass ich durch zwei Fehler meines Wissens keinen Zugriff mehr auf die Dokumente erhalten:

Zum einen gibt es Dokumente, in denen es keine Autoren- und Leserfelder gibt - ich glaube, hier besteht kein Problem, weil der Server hier dran kommen müsste.

Zum zweiten gibt es Dokumente, in denen explizit ein Benutzer steht, im Leserfeld steht "-no access-" - das bedeutet doch, soweit ich weiß, dass außer diesem Benutzer niemand auf das Dokument drauf kommt, oder?

Ein periodischer Agent ist im Einsatz - damit dieser ordentlich läuft und alle Dokumente zur Verfügung hat, mache ich ja das ganze Theater :/

- Jérôme

koehlerbv:
Wenn es in einem Dokument keine Leserfelder gibt, hast Du mit diesen überhaupt kein Problem, solange Du Managerrechte auf die DB hast (okay, hierfür reichen bereits Editorrechte). Einen Server brauchst Du dafür nicht bemühen.

Leser felder mit einem Eintrag "-no access-": Wer ist denn auf die Schnapsidee gekommen ? Unter R5 kommt da nicht mal der Server mehr ran, das geht erst mit R6 und Full admin access.
Wenn er Eintrag genauso lautet, müsstest Du Dir eine Gruppe einrichten mit Dir und oder dem Server als Member, damit Du diese Doks wieder erreichen kannst.

Es ist dringend anzuraten, Autoren- und vor allem Leserfelder einzusetzen, wenn man weiss, was man da tut. Wenn ich dann noch lese, dass sowas an einen armen Kunden verkauft wurde, beginnt es in mir zu kochen.

Bernhard

thorsten_w:
Ein Agent auf dem Server läuft immer mit den Rechten desjenigen, der ihn signiert hat.
Wenn der Server Manager Rechte hat, dann solltest du Zugriff mit der entsprechenden Signatur bekommen.

Desweiteren habe ich mir angewöhnt, 2 gemeinsame Felder zu erstellen und diese in jeder Maske mit einzufügen:

adminreader (Leserfeld) inhalt [Admin]
adminauthor (Autorenfeld) inhalt [Admin]

Damit kannst du dann eine Rolle in der DB definieren und entsprechend hat man IMMER Zugriff.


Gruss Thorsten

Navigation

[0] Themen-Index

[#] Nächste Seite

Zur normalen Ansicht wechseln