Autor Thema: Autoren/Editoren dürfen Felder nicht ändern?  (Gelesen 1918 mal)

Offline Jérôme

  • Aktives Mitglied
  • ***
  • Beiträge: 108
  • Geschlecht: Männlich
  • Teigwaren heißen Teigwaren weil sie mal Teig waren
    • jerome-gamez.de
Autoren/Editoren dürfen Felder nicht ändern?
« am: 13.12.05 - 06:55:55 »
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

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

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

Offline thorsten_w

  • Junior Mitglied
  • **
  • Beiträge: 60
  • Geschlecht: Männlich
Re: Autoren/Editoren dürfen Felder nicht ändern?
« Antwort #1 am: 13.12.05 - 12:28:52 »
Hast du mal versucht einen periodischen Agenten zu erstellen (signiert mit der Server ID) um damit Zugriff auf alle Dokumente zu bekommen?

Gruss Thorsten

Offline Jérôme

  • Aktives Mitglied
  • ***
  • Beiträge: 108
  • Geschlecht: Männlich
  • Teigwaren heißen Teigwaren weil sie mal Teig waren
    • jerome-gamez.de
Re: Autoren/Editoren dürfen Felder nicht ändern?
« Antwort #2 am: 13.12.05 - 17:29:17 »
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

Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Re: Autoren/Editoren dürfen Felder nicht ändern?
« Antwort #3 am: 13.12.05 - 17:39:07 »
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

Offline thorsten_w

  • Junior Mitglied
  • **
  • Beiträge: 60
  • Geschlecht: Männlich
Re: Autoren/Editoren dürfen Felder nicht ändern?
« Antwort #4 am: 14.12.05 - 08:36:29 »
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

Offline Jérôme

  • Aktives Mitglied
  • ***
  • Beiträge: 108
  • Geschlecht: Männlich
  • Teigwaren heißen Teigwaren weil sie mal Teig waren
    • jerome-gamez.de
Re: Autoren/Editoren dürfen Felder nicht ändern?
« Antwort #5 am: 14.12.05 - 10:33:46 »
Ich möchte das nochmal zusammenfassen:

Ausgangslage: Es gibt weder Autoren- noch Leserfelder, weil irrtümlich die dafür vorgesehenen Felder als Text-Felder angelegt worden sind.

Änderung: Die Textfelder wurden zu Autoren- und Leserfeldern gemacht. In den Autoren-Feldern steht *immer* die Rolle [DBAdmin] drin, der Server, der diese Rolle hat, sollte also immer auf die Dokumente Zugriff haben. Im Leserfeld steht "-no access-" weil niemand außer den Personen, die im Autorenfeld stehen, Zugriff auf das Dokument haben sollen. Außerdem würde es dem Server auch nicht reichen, einfach nur im Leserfeld zu stehen, wenn er Dokumente bearbeiten und/oder verschieben muss, was hier der Fall ist.

Ich werde zukünftig darüber nachdenken, ob ich nach meinem bisherigen Verfahren weiterarbeite (Rolle [DBAdmin] im Autorenfeld) oder die zusätzlichen Autoren- und Leserfelder verwende (danke für den Hinweis, thorsten_w).

Direkt zu kochen finde ich ein wenig übertrieben, koehlerbv, und es ist außerdem am Thema vorbei, auf das ich an dieser Stelle gerne zurückführen möchte:

Die Scripte, die ich hier angesprochen habe, stehen im PostOpen der Datenbank und werden durch Benutzer ausgeführt, die als Editoren in der ACL stehen und Zugriff auf ihre Dokumente haben. Das heißt im Einzelnen: Entweder hat das Dokument keine Leser- und Autorenfelder - in diesem Fall kann der Server ohne Probleme darauf zugreifen und der Ersteller des Dokuments sollte es eigentlich auch können. Oder das Dokument hat Leser- und Autorenfelder, dann steht der Benutzer im Autorenfeld drin und sollte auch ohne Einschränkungen auf sein Dokument zugreifen können.

Dennoch erhalten die Benutzer den in meinem Ausgangsposting beschriebenen Fehler.


PS: Ich weiß, dass ich in einem früheren Posting geschrieben habe, dass ich das "ganze Theater" mache, damit der periodische Agent läuft, wie er soll. Da habe ich mich missverständlich ausgedrückt. Der Agent tut, was er soll, ich möchte nur sicher gehen, dass er auch alle Dokumente im Zugriff hat. Ich gehe davon aus, dass das der Fall ist, möchte aber durch die Aktion im PostOpen, dass jeder Benutzer in seinen Dokumenten die Felder erneut korrekt füllt, alle Eventualitäten beseitigen.

Ich gebe zu, dass ich noch recht weit vom Status eines Notes-Guru entfernt bin, und bin deswegen stets bestrebt, mein Wissen zu erweitern. Unmut bekomme ich bereits durch meine Vorgesetzt zu spüren - hier in diesem Forum erhoffe ich mir ausschließlich Unterstützung und Ratschläge, auch und gerade von gestandenen Notes-Programmierern und aktiven Moderatoren, bei denen ich dann sogar einen gutmütigen und gönnerhaften Tonfall besser vertragen kann als leicht polemisch angehauchte Wortbeiträge. (nein, ich suche keinen Streit und möchte auch nicht vom Thema ablenken)

Offline thorsten_w

  • Junior Mitglied
  • **
  • Beiträge: 60
  • Geschlecht: Männlich
Re: Autoren/Editoren dürfen Felder nicht ändern?
« Antwort #6 am: 14.12.05 - 10:51:24 »
Warum gibt es diesen unterschied?

in der current database
Code
		Set itAuthors = doc.GetFirstItem("authors")
		Set itReaders = doc.GetFirstItem("readers")
		
		itAuthors.Values = arrAuthors
		itAuthors.IsAuthors = True
		
		itReaders.Values = arrReaders
		itReaders.IsReaders = True

im archiv
Code
			Call doc.ReplaceItemValue("authors", arrAuthors)
			Call doc.ReplaceItemValue("readers", arrReaders)
' ####################################
			Call doc.Save(True, False, True)
' ####################################

Sind die Felder im Archiv zuverlässig immer Zugriffsfelder?

Wenn nicht würde es erklären, warum das Speichern in der aktuellen Datenbank funktioniert und im Archiv nicht.

Oder habe ich das jetzt falsch interpretiert.

Gruss Thorsten.

Offline Jérôme

  • Aktives Mitglied
  • ***
  • Beiträge: 108
  • Geschlecht: Männlich
  • Teigwaren heißen Teigwaren weil sie mal Teig waren
    • jerome-gamez.de
Re: Autoren/Editoren dürfen Felder nicht ändern?
« Antwort #7 am: 14.12.05 - 11:43:19 »
Der Einwand ist definitiv berechtigt, ich habe den Code angepasst, weil er so, wie er da oben steht, zwar die Felder ändert, jedoch keine Autoren/Leser-Felder aus ihnen macht, insofern also nichts bringt. Aber einen Fehler dürfte er eigentlich nicht hochbringen.

Allerdings bringt mich das auf die Idee, dass es sein könnte, dass mein Ansprechpartner beim Kunden zwar die CurrentDB in der ACL angepasst hat, so dass alle User Editoren sind, jedoch nicht in der Archiv-DB - dort hätten die als bloße Autoren ja dann kein Recht, Dokumente zu verändern. Er hat mir zwar versichert, dass er die Rechte geändert hat, aber lieber einmal zu viel fragen als zu wenig. Danke! Ich melde mich zurück, wenn ich erfahren habe, ob es was gebracht hat (kann ein paar Tage dauern).

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz