Das Notes Forum
Domino 9 und frühere Versionen => Entwicklung => Thema gestartet von: KiTaMann am 07.03.06 - 07:05:17
-
Guten Morgen zusammen,
als Script-Anfänger stehe ich vor folgendem Problem:
Ich möchte die Änderungen an einem Dokument feldweise dokumentieren und jede Änderung in einem Änderungsdokument festhalten.
Dabei bin ich folgendermaßen vorgegangen:
Im PostOpenEvent des zu beobachtenden Dokuments wird die Prozedur AenderungenAufzeichnen aufgerufen.
Diese Prozedur hält den Inhalt der einzelnen Felder nach dem Öffenen des Dokuments fest, also
Sub AenderungenAufzeichnen (Source as NotesUIDocument)
Set doc = Source.Document
If Source.IsNewDoc Then Exit Sub
Feld1Anfang = Source.FieldGetText("Name")
usw....
Wenn der Benutzer das Dokument speichern möchte, rufe ich über den QuerySave-Event folgende Funktion auf:
Function Aenderungen (Source as NotesUIDocument) As Integer
Dim session As New NotesSession
Dim uiws As New NotesUIWorkspace
Dim db As NotesDatabase
Dim uidoc As NotesUiDocument
Dim Doc As NotesDocument
Dim Feld1Ende As String
usw...
Feld1Ende = Source.FieldGetText("Name")
usw....
Aenderungen = False
If Not source.IsNewDoc Then
If Strcompare(Feld1Ende, Feld1Anfang, 5)<>0 Then
Aenderungen = True
Set Doc = New NotesDocument(db)
Doc.Form = "Protokoll"
Doc.Bemerkungen = | Der Name wurde von | & |"| & Feld1Angang & |"| & | auf | & |"| & Feld1Ende & |"| & | geändert|
Doc.AktuellesDatum = Today
usw...
End If
Laut Debugger bekomme ich keine Fehlermeldung, auch stehen die Anfangsdaten in gewünschter Form bereit.
Wo liegt der (Denk-)fehler? Wer kann mir weiterhelfen?
Danke schonmal
Grüße
Klaus
-
Auf den ersten Blick sehe ich jetzt mal keinen Denkfehler.
Dass der Debugger keinen Fehler meldet ist erstmal ein Zeichen, dass kein grober Fehler vorliegt. Aber hast du mal deine Variableninhalte genau untersucht? Was steht wann in welcher Variable und muss/darf das zu diesem Zeitpunkt drin stehen.
Außerdem müssen die Variablen Feld1Anfang,... global sein.
Axel
-
Hallo, Axel,
danke für die prompte Antwort.
Hatte vergessen zu erwähnen, dass ich die Anfangswerte in den Globals | (Declarations) deklariert hatte, um sie später verfügbar zu machen.
Mein Problem ist, dass ich nicht genau nachvollziehen kann, was nicht funktioniert, da sich der Debugger zu einem gewissen Punkt einfach "verabschiedet" und seine Pflichten vernachlässigt; sonst wäre das Problem sicherlich besser einzugrenzen.
Fakt ist, dass keine neuen Änderungsdokumente erstellt werden, hierfür jedoch Maske und Felder vorhanden sind ???
Wie kann man denn das Debugger-Problem lösen?
Weiß hierauf jemand eine Antwort?
Klaus
-
Blöde Frage. Warum nimmst du nicht die History Klasse von Michael Woehrer. Die ist gut dokumentiert, sauber zu integrieren und von außen konfigurierbar, welche Felder überwacht werden sollen.
Die findest du hier im Forum und wenn du ein Integrationsbeispiel brauchst, auch im !!Help!!.
-
Danke, Thomas,
werde mich gleich auf die Suche danach machen...
Vielleicht fallen mir beim nächsten Problem ja "schlauere" Fragen ein ;D
Grüße
Klaus
-
;D
Nein die Frage die ich stellen wollte war eine "blöde" in Sinn von "da stelle mer uns eemal janz dumm und froche, wat is een Dampfmaschin".
-
Ich stelle dann auch noch mal eine "blöde Frage" ganz aus einer anderen Ecke: Geht es nur um die Überwachung eines oder ganz weniger Felder (aus einer grösseren Anzahl von Feldern, die geändert werden könnten)? Dann wäre Michis klasse Klasse nämlich ggf. eine Nummer zu gross ...
Ausserdem protokollierst Du, Klaus, in separate Log-Dokumente. Das macht Michis Klasse nicht. Obwohl sich das Logging mit separaten Dokumenten eher noch für Michis Klasse anbieten würde.
Was Dir bei den Protokoll-Dokumenten aber scheinbar noch fehlt, ist der Schutz der Dokumente vor einem Löschen durch Anwender, die die Doks gerade erstellt haben. Das wäre fatal. Aber Du hast ja auch nicht den ganzen Code gepostet.
Vielleicht sollten wir Deinen Ansatz doch weiterverfolgen bzw. korrigieren, wenn Du meine obige Frage mit "ja" beantwortest.
Bernhard
-
Ich sehe in dem String einen Tippfehler:
Doc.Bemerkungen = | Der Name wurde von | & |"| & Feld1Angang & |"| & | auf | & |"| & Feld1Ende & |"| & | geändert|
es muss statt Feld1Angang heißen: Feld1Anfang
Kürzer geht es dann noch mit:
Doc.Bemerkungen = | Der Name wurde von "| & Feld1Anfang & |" auf "| & Feld1Ende & |" geändert|
Aber ob das die Ursache ist... Mal ausprobieren.
Andreas
-
Wertvoller Hinweis, Andreas.
ABär: Das Erstellen eines Protokoll-Dokuments kann das nicht verhindern. Dies würde dann nur einen leeren Anfangswert zeigen. Das sich das kompilieren lässt, setzt wiederum ein fehlendes Option Declare voraus (was mit der Laufzeit nix zu tun hat).
Warten wir mal ab, was unser KitaMan aka Klaus sagt.
Bernhard
-
db ist nicht im obigen Auszug gesetzt - vielleicht liegt es auch daran.
Aber auch dann müsste Notes zur Laufzeit herummosern.
Andreas
-
... ich würde nicht über das Frontent gehen, sondern das Backend-NotesDocument verwenden. Gibt es irgendwo noch ein Fehlerhandling wie "On Error Resume Next" oder ähnliches ?
Toni
-
Hoppla, hoppla, hoppla,
... da kam ja noch eine ganze "Resonanzwelle" 'rübergeschwappt, wo ich doch dachte, dass das Thema erledigt sei.
Hatte eine Nachtschicht eingelegt und das Problem dann auch noch gelöst 8)
Trivial, wenn man's im Nachhinein weiß (nachdem man stuuuundenlang nach dem Fehler gesucht hat) - man sollte die neuen Dokumente einfach über die save-Methode abspeichern und schon fuktionierts!!
@Thomas
iss scho recht ;)
@Bernhard
Mein Script dokumentiert die Änderungen in jedem Feld. Für jedes Feld, das geändert wird, wird ein Dokument erzeugt, das dem Anwender nachher in Form einer eingebetteten Ansicht präsentiert wird.
Die nachträgliche Bearbeitung ist ausgeschlossen.
@Andreas
Hatte das Script nicht per Copy + Paste gepostet, sondern manuell "reingehämmert", dabei ist es zum "Angang" gekommen, also ein "Dreckfuhler" meinerseits - sorry...
@Toni
Bin wie gesagt relativer Script-Anfänger - macht es denn Sinn das Dokument, in dem ich augenblicklich arbeite, nachträglich im Backend zu bearbeiten?
So kann ich doch (mehr oder weniger) wunderbar über das QueryClose-Event das gewünschte Ergebnis erzielen?
@All
Nochmals vielen vielen Dank!
Grüße
Klaus
-
@Klaus
... die Backend-Klassen sind besser verwendbar. Du hast damit alle Feldwerte, die du im Frontend siehst zur Verfügung - im originären Datentyp - während du das im Frontend nur mit Strings bekommst und dann umständlich konvertieren musst.
Die Event's bleiben dir weiterhin zur Verfügung...
Toni ;-)