Reader Feld mit Scipt setzen

  • Hallo,


    ich habe ein kleines Problem mit einem Script.
    Ich erstelle mit Script ein Dokument und setze mit folgendem Part das Readerfeld mit dem bereits vorhandenen Wert des Feldes "lesen" sowie der Rolle [ReadAll]


    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)


    Funktioniert auch soweit gut, Tatsache ist jedoch das im Feld "lesen"
    die Namen zwar hierachisch stehen ( vorname nachname/Organisation), jedoch nicht kanonisch und der Zugriff somit nicht funktioniert.
    Wenn ich ein "@Command([ToolsRefreshSelectedDocs])" über die Dokumente laufen lasse, stehen die Namen auch kanonisch drin und der Zugriff funktioniert.


    Leider habe ich nichts gefunden in Script um das Feld neu zu rechnen (wenn es dann funktionieren würde).


    Jemand eine Idee ?


    Danke und Gruss
    Achim

  • Vielleicht tut ja ein doc.ComputeWithForm


    Ansonstens durch den Inhalt des "Lesen" durchiterieren, aus den Einträgen ein NotesName bilden, den per notesName.Canonical umformen und ins Leserfeld reinschreiben

    Life is not a journey to the grave with the intention of arriving safely in a pretty and well-preserved body, but rather to skid in broadside, thoroughly used up, totally worn out, and loudly proclaiming "Wow, what a ride!!! :evil:
    Beschleunigung ist, wenn die Tränen der Ergriffenheit waagrecht zum Ohr hin abfliessen - Walter Röhrl

  • Danke für die Vorschläge,


    ComputeWithForm funktioniert nicht.
    Was heisst "durchiterieren". Wüsste so Ad-Hoc nicht wie ich in Script die Liste durcharbeite und Kanonische Einträge erzeuge.
    Jemand schon einmal sowas gebaut ?


    Schönes Wochenende
    Achim

  • ...danke für den Vorschlag, habe das Problem anders gelöst.
    Habe das vorhandene Feld "Leser" beim befüllen gleich mit dem
    kanonischen Namen gefüllt (und ändere es bei Bedarf einfach ab,
    z.B. nur auf den Namen, bzw. hierachischen Namen).



    Danke für den Hinweis, man lernt doch gerne dazu :)

  • 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.

  • ...fühle mich keineswegs angegriffen, genau das Gegenteil ist der Fall.
    Danke für deine Ausführungen zu meinem Problem bzw. meinem Versuch dieses zu lösen !!!
    Vielleicht vergessen viele einfach, das Kritik auch positiv sein kann.
    Primär verdiene ich meine Brötchen mit Netzwerkinfrastruktur und Systemadministration.
    Programmieren ist nicht meine Hauptaufgabe, jedoch gibt es auch Anwendungen die nicht direkt den Business Prozess bedienen und an denen versuche ich mich schon mal :)
    An derartigen Anwendungen finde ich es auch nicht negativ, wenn
    diese von Personen erstellt werden die nicht hauptberuflich Domino programmieren, das Ziel zählt, nicht der Weg.
    Anwendungen die den Business Prozess bedienen gehören in die Hand von "Profis", da laufen wir konform.


    Noch einmal, Danke für deine Mühe, aus derartigen Erläuterungen kann man nur lernen.
    Wenn du mal Hilfe zu Netzwerkinfrastruktur benötigst
    (Lan, Wan, WLan, VPN etc.) stehe ich gerne zur Verfügung :D



    Achim


    PS: das mit dem ändern der Namen bezieht sich nur auf Anzeigemöglichkeiten.