Was heißt denn
Zitat
... und ändere es bei Bedarf einfach ab,
z.B. nur auf den Namen, bzw. hierachischen Namen
Lesernamen funktionieren nur mit kanonischen Namen - das konntest du ja schon feststellen. Und jetzt kommt so ein Murks in deiner abschließenden Zusammenfassung. Das halte ich dann doch für eine Form von Beratungsresistenz, die eine besondere Beachtung verdient.
Und jetzt zum Praktischen: bitte füge die Leserrollen nur dann ein, wenn es in einem Leserfeld bereits mindestens einen Namen gibt. Sonst kann nämlich jedes Dokument nur noch von den Inhabern dieser Rolle gelesen werden. Für die nicht rollengekrönten Häupter ist das Dokument verschwunden. Willst du das ?
Und jetzt betrachten wir uns noch einmal dein Script, das in 6 Zeilen schon einige Ungereimtheiten aus den Weissagungen des Konfusius enthält:
Dim item As NotesItem
Dim lesen As String
Set item = New NotesItem( docHistorie, "Reader", "[ReadAll]", READERS )
item.IsReaders= True
Call item.AppendToTextList( docHistorie.lesen )
Call docHistorie.Save (True, True)
Zeile 1 und Zeile 6 gehen in Ordnung.
Für Zeile 2 sehe ich nirgends eine sinnvolle Bedeutung.
Zeile 3 zeigt, daß du die Hilfe gelesen hast - sehr gut (!!!)
Zeile 4 zeigt aber leider, daß du sie nicht ganz verstanden hast (und Zeile 3 in ihrer Art, wie du sie eingefügt hast, auch). Durch den Parameter READERS in Zeile 3 ist Zeile 4 nämlich überflüssig.
Zeile 5 ist der eigentliche Hammer. An deinen neuen item willst du den Inhalt eines bestehenden Items dranhängen, aber du hängst ein item dran. Das kann nicht funktionieren.
Und da wird klar, daß du nicht weißt, was "durchiterieren" ist. Steht auch in keinem Duden, ist ein häßliches Wort. iter ist lateinisch und heißt sowohl "Weg" als auch "Schritt" (das übliche denglische Wort "durchsteppen" ist ja schon für den Debugger besetzt). Wenn ich "iter" höre, denke ich immer noch an unseren Lateinlehrer, der uns mit dem schönen Spruch traktierte:
"Os, os, iter, cor, ver, aes
sind alle Neutrum wie vas, das Gefäß"
(Zusatz - und ich immer bei mir dachte "wie Arsch, das Gesäß").
Genug der Abschweifungen. Der Weg ist das Ziel, der Schritt ist das Mittel. Also - frisch ans Werk.
ForAll xeintrag in docHistorie.Lesen
If xEintrag<>"" Then
Call item.AppendToTextList(xEintrag)
End If
End ForAll
Das heißt "durchiterieren".
Aber du solltest Zeile 5 (bzw. das Durchiterieren) am besten ganz sein lassen, denn du hast doch jetzt ein zweites Leserfeld READER, in dem dein Wert drinsteht. Leserfelder wirken additiv.
Und zu Zeile 3 gibt es doch noch eine klitzekleine Anmerkung, die nicht ganz ohne Bedeutung ist. Wenn du das erste Mal mit deinem Script über ein Dokument läufst, bekommst du ein Feld READER, wunderbar. Wenn du das zweite Mal drüberläufst, bekommst du ein weiteres Feld READER. Und beim 26. Mal merkst du, daß du 26 gleichnamige Felder hast.
Du wirst nicht der Erste sein, der sich eines Tages darüber ärgert, daß es zum Zugriff auf ein Feld nur ein "GetFirstitem" gibt. Leider fehlt bis jetzt im Vorrat von LS ein GetTwentysixthitem.
Und wenn du dann eines Tages das Feld löschen sollst, dann mußt du 26 Mal mit deinem Agenten drüberlaufen, der das Feld löscht. Das Schlimme ist nicht daß du 26 Mal drüberlaufen mußt, sondern daß du gar nicht wissen wirst, wie oft du drüberlaufen mußt.
Dein kleiner Agent hat mit 6 Zeilen Code (von denen 2 Zeilen selbstverständlich und 2 Zeilen "toter Code" sind) einen ganz erheblichen Schaden angerichtet. Über Zeile 6 haben wir an dieser Stelle noch gar nicht diskutiert. Dort ist die Richtigkeit der Parameter mit 2 dicken Fragezeichen zu versehen.Willst du wirklich einen Replikationskonflikt erzeugen, wenn jemand anders in dem Dokument eine Änderung vornimmt ?
Aber wie wäre es richtig ?
Damit ergibt sich doch ein schönes kleines Programm a la:
Dim item As NotesItem
Dim LeserVorhanden As Integer
Dim DocHasChanged As Integer
Dim i As Integer
Dim Feldwerte As Variant
DocHasChanged=False
Feldwerte=docHistorie.GetItemValue("Lesen")
LeserVorhanden=False
For i=0 To UBound(Feldwerte)
If Trim(Feldwerte(i))<>"" Then
LeserVorhanden=True
Exit For
End If
Next
If LeserVorhanden Then
If docHistorie.HasItem("Reader") Then
Set item=docHistorie.GetFirstitem("Reader")
If Not item.Contains("[ReadAll]") Then
Call item.AppendToTextList("[ReadAll]")
DocHasChanged=True
End If
Else
Set item = New NotesItem( docHistorie, "Reader", "[ReadAll]", READERS )
ElseIf docHistorie.HasItem("Reader") Then
Call docHistorie.Removeitem("Reader")
DocHasChanged=True
End If
If DocHasChanged Then
Call docHistorie.Save (False, False)
End If
Du fügst das Feld nur dann ein - und speicherst auch nur dann - wenn es bereits Leser gibt und in dem Feld READER noch nicht deine Leserrolle drinstehht. Wenn es keine benamten Leser mehr gibt, löschst du es. Gibt es das Feld und deine Rolle steht noch nicht drin, hängst du deine Rolle an das Feld dran.
Vielleicht ahnst du jetzt, warum es Berater gibt, die sich auf Notes spezialisiert haben, und warum es sinnvoll sein kann, denen einen Auftrag zu geben. 6 Zeilen Code stoppelt sich Jeder zusammen. 6 Zeilen sinnvollen Code - da wird die Luft schon dünner. Und 6 Zeilen sinnvollen und richtigen Code - da mußt du fast schon suchen.
Warum schreibe ich das in dieser Ausführlichkeit ?
Weil ich in letzter Zeit zunehmend den Eindruck gewinne, daß immer öfter Firmen von irgendwelchen Frischlingen, Praktikanten, Diplomanden und fragwürdigen Billiganbietern erwarten, daß die "auf die Schnelle" einmal eine Applikation auf die Beine stellen. Das böse Erwachen kommt erst viel später, denn der äußerliche Chic einer Anwendung läßt keinerlei Rückschlüsse auf die "inneren Werte" zu. Und das Meiste, was ich bis jetzt gesehen habe, ließ diese inneren Werte vermissen.
Ich weiß: ich habe dich arg gescholten. Das geht überhaupt nicht gegen dich persönlich. Du hast nur ein so typisches - und vor allem kurzes - Stück Codeschnipsel in die Runde geworfen, an dem sich einmal eemplarisch zeigen ließ, daß in jeder Zeile, in jedem Parameter etwas steckt, was wichtig ist.
Ich hoffe, daß ich dir im Gegenzug auch ein wenig geholfen habe.