"History" bei Änderungen eines Dokuments!!!

  • Hallo zusammen,


    ich habe eine Maske bei welcher hin und wieder Änderungen vorgenommen werden. Wie kann ich eine Art "History" am Ende der Maske erstellen, die auflistet, welche Person zu welchem Datum das Dokument verändert hat???


    Gruß
    Benny

  • Vom Prinzip her im QueryOpen die aktuellen Feldwerte in temporären Feldern oder besser Script Variablen speichern und beim Speichern prüfen welche geändert wurden.
    Dann kannst du dir entsprechend noch das Datum und einen Text zusammensetzen und dies in ein History Feld anhängen

  • QueryOpen


    doc.Feld1BKP = doc.Feld1
    doc.Feld2BKP = doc.Feld2
    ....


    QuerySave


    set item = doc.GetFirstItem("fd_History")


    if doc.Feld1BKP(0) <> doc.Feld1 then
    sText = "Feld1 wurde von " & doc.Feld1BKP(0) & " auf " & doc.Feld1(0) & " geändert"
    call item.AppendToTextList(sText)
    end if

  • In Deinem Fall wuerden 2 Felder genuegen....lastEditor und lastDateEdit z.B. nur. Koennen natuerlich auch anders heissen.
    Und bei jedem Speichern..also im Querysave-event...werden die Felder um die dementsprechenden Werte erweitert.

  • Wie gesagt..2 Felder - hier mal LastEditor und LastEditDate genannt und in den Querysave folgendes:
    In der Formelsprache saehe das so aus:

    Code
    field lastEditor := lastEditor:@name([abbreviate];@username);
    field lastEditDate := lastEditDate:@text(@today);
    ""


    Die beiden Felder computed when composed ..Formel = "". In einer Tabelle nebeneinander. Mehrfachwerte zulassen, einzelne Werte anzeigen in neuer Linie.
    Mal so ganz grob ;)

  • Hi,


    danke für die Hilfe, es funktioniert, aber die Auflistung ist ein bisschen schlecht. Die Auflistung ist wie folgt:


    Name;Name;Name;Name;Name;... Datum;Datum;Datum;...


    Wie bekomme ich das jetzt schön geordnet. Beispiel:


    Name Datum
    Name Datum
    Name Datum
    . .
    . .
    . .

  • Warum so kompliziert? Es gibt nicht umsonst die Felder $UpdatedBy und $Revisions...

    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

  • Mein Gott, natürlich helfen die! Weil, da steht z.B. drin:


    $UpdatedBy
    "CN=Username/O=Firma"
    "CN=Servername/O=Org"


    $Revisions
    31.01.2005 17:44:01 CET
    01.02.2005 18:23:00 CET


    Ich zitiere gern die Anfangsfrage:
    "Wie kann ich eine Art "History" am Ende der Maske erstellen, die auflistet, welche Person zu welchem Datum das Dokument verändert hat???"


    So, und nun darfst du dreimal raten, wer wann an dem Dokument dran war. Und du musst nicht einmal irgendwelche kruden Verrenkungen mit selbst gebastelten Feldern anstellen...

    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

  • Darueber biste leider auf dem Holzwege.
    Denn mitunter, aber nur manchmal, stehen in beiden Feldern unterschiedlich viele Werte. Selbst Anfaenger erfahren in Schulungen, dass man dgenau die beiden Felder nicht fuer eine Bearbeitungshistorie verwenden kann.

  • Das interessiert mich nun doch. Unter welchen Umständen soll das denn sein?


    Die Hilfe sagt nämlich eindeutig

    Zitat


    If a document contains an Authors field, Designer automatically stores the names of the users who have edited that document in an internal field called $UpdatedBy. Servers involved in replication are not considered editors, so they're not tracked in this list.


    Allerdings funktioniert das auch mit Masken ohne Autorenfeld, ist also nicht ganz so wörtlich zu nehmen...


    Wenn ich allerdings im Advanced-Tab der DB-Eigenschaften unterschiedliche Limits für die beiden Felder setze, falle ich damit auf die Nase, das ist richtig.

    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

  • Hmmm, im $Updatedby Feld wird nur ein Name eingetragen wenn er sich vom letzten in der Liste unterscheidet. Hingegen im $revisions feld immer ein Speicherdatum.
    Bedeutet...wenn Du dreimal das Dok bearbeitest stehst nur Du in dem Feld $Updatedby...im Feld $Revisions aber mehrere Werte. Leicht zu testen....erstelle ein Dok und speicher es ein paarmal.

  • Also einmal zum Prinzisätzlichen und Grundiziellen:


    Alle in einer Maske hinterlegten Felder oder "Aktionsfüllungen" werden nur dann revisioniert, wenn das Dokument MIT DER MASKE geändert wurde - die Felder $UpdatedBy und $Revisions werden auch gefüllt, wenn ein Agent oder der ADminP-Task das Dokument ändert.


    Und jetzt eine Lösung für unseren Freund, wie ich sie aus einer Notes Versions 3-Datenbank herausgeklaubt habe und bis heute in allen möglichen Masken verwende:


    Ganz oben in der Maske stehen die Felder


    TimesModified ZAHL BERECHNET
    @If(@IsNewDoc; 0; TimesModified + @IsDocBeingSaved)


    PastAuthors TEXT BERECHNET
    @If(@IsNewDoc; @Name([CN]; @UserName); @If(@IsDocBeingSaved; @If(TimesModified <= 0; @Name([CN]; @UserName); PastAuthors : @Name([CN]; @UserName)); PastAuthors))


    PastEditDates TEXT BERECHNET
    @If(@IsNewDoc; @Text(@Now); @If(@IsDocBeingSaved; @If(TimesModified <= 0; @Text(@Now); PastEditDates : @Text(@Now)); PastEditDates))


    Ganz unten in der Maske ist ein zusammenklappbarer Abschnitt, der beim Drucken oder Kopieren in die Zwischenablage verborgen wird und einen Tabstop enthält. Dort steht ein Feld TEXT BERECHNET ZUR ANZEIGE mit
    @If(TimesModified <= 0; ""; PastAuthors + @Char(9) + @Text(PastEditDates))


    In meinen Agenten habe ich dann immer einen Abschnitt
    FIELD PastAuthors := PastAuthors : (@Name([CN];UserName) + " (Makroxxxx)");
    FIELD PastEditDates := PastEditDates : @Text(@Now;"D0S0");
    FIELD TimesModified := TimesModified + 1;


    Damit wird auch das Dokumentiert.


    Und jetzt die Falle dabei: das geht für neue Datenbanken problemlos, bei Datenbanken, die bereits Dokumete enthalten, kann das @If(@IsNewDoc) bei TimesModified zu undefinierten Zahlen führen, die Fehler produzieren. Das alles kann man hinbekommen, indem man mit einem Zweizeiler alle bestehenden Dokumente einmal aus dem UpdatedBy und $Revision füllt mit
    @If(@IsAvailable(TimesModified) & @IsNumber(TimesModified;@Return("");NULL);
    FIELD TimesModified:=1;
    FIELD PastEditDates:=@Subset(@Text($Revisions);-1);
    FIELD PastAuthors:=@Name([CN];@Subset($UpdatedBy;-1))


    Wenn man in einem Agenten einmal einen ERROR in das PastEditDates-Feld bringt, z.B. indem man das D0S0 nicht mit Gänsefüßchen umschließt, dann sind alle Einträge der Datumswerte auf ERROR. Das ist unschön - und nur schwer wieder herauszubekommen. Das ist die einzige Warnung, die ich geben muß.

  • Die Lösung von LN4Ever ist ja ganz nett, führt aber bei relativ leicht zu Replizierkonflikten, wenn Dokumente auf verschiedenen Servern bearbeitet werden ...


    Und erzähle mir niemand, dass sowas schon nicht passiere. User schaffen das.

    Bye
    Torsten


    IBM Advanced Certified System Administrator - Lotus Notes and Domino 8.5

  • Wenn das gleiche Dokument zwischen zwei Replikationsintervallen auf verschiedenen Lokationen (ob Server oder lokale Replik, ist dabei egal) editiert wird, führt das eigentlich immer zu Replikationskonflikten. Auch ohne History.