Domino 9 und frühere Versionen > ND8: Entwicklung

Historie anlegen

<< < (4/7) > >>

Peter Klett:
Ok, vom Ansatz verstanden.

Dann solltest Du diese Funktion nochmal überdenken

Function getLastDocument(ID As String) As String
   Dim v As NotesView
   Dim s As New NotesSession
   Dim doc As NotesDocument
   Dim db As NotesDatabase
   Dim NamePers As String
   
   Set db = s.CurrentDatabase
   Set v = db.GetView("nHist_Hardware")
   Set doc = v.GetDocumentByKey(ID) -> hier suchst Du das erste Dokument mit der passenden ID
   
   While Not (doc Is Nothing)
      NamePers = doc.GetItemValue("HistHW_Name")(0) -> hier setzt Du NamePers, unabhängig von der ID
      Set doc = v.GetNextDocument(doc)
   Wend
   getLastDocument = NamePers -> NamePers beinhaltet den Namen des letzten Dokuments der Ansicht, welche ID das Dokument hat, spielt in Deinem Script fälschlicherweise keine Rolle
End Function

Wenn Du die Ansicht mit den IDs so aufbaust, dass die Dokumente nach ID sortiert sind, die neuesten zuoberst, findest Du mit einem Zugriff (das erste Dokument mit der ID) das gewünschte Dokument. Das spart viel Zeit.

Deine Hauptroutine wird dann kürzer:

Set doc = v.GetDocumentByKey(composed1) -> das jüngste "Parallel"-Dokument
Set doc2 = New NotesDocument(db)
   
PersName = doc.HistHW_Name (0)
   
If composed1 = doc.GetItemValue("HistHW_DocUnID")(0) And Strcomp(composed2, PersName) <> 0 Then
 
Die erste Bedingung ist unnötig.

EDIT: Fehlerhandling, wie nicht gesetzte Objekte, habe ich ignoriert

ThomasHB:
Hallo Peter,

danke für deinen Kommentar...
Ich brösel das noch mal etwas weiter auf...

Ich hatte ja schon geschrieben, das die View, in welche geschaut wird, entsprechend eingestellt ist, damit meine ich folgendes... Es gibt eine Kategorisierung nach der UniqueID, weil es ja mehrere Hostoriendokumente zu einem Hardware Dokument (UniqueID) geben kann.


--- Zitat ---Set doc = v.GetDocumentByKey(ID) -> hier suchst Du das erste Dokument mit der passenden ID
--- Ende Zitat ---

Ja genau... Und zwar innerhalb der Kategorie nach UniqueID.


--- Zitat ---NamePers = doc.GetItemValue("HistHW_Name")(0) -> hier setzt Du NamePers, unabhängig von der ID
--- Ende Zitat ---

Kann ich so aber nicht stehen lassen... Die Aussage so stimmt schon, ich gebe eine ID nicht explizit an... Aber "doc." bezieht sich auf GetDocumentByKey und dieses wiederrum auf die genannte View.

Durch die Angabe von GetDocumentByKey und der Kategorisierung der View nach UniqueID bleibt er in der Kategorie... Deshalb kann mir das da egal sein, weil nur Dokumente zu dieser Unique ID gefunden werden.


--- Zitat ---Set doc = v.GetNextDocument(doc)
--- Ende Zitat ---

Holt sich an dieser Stelle nämlich auch nur noch die Dokumente, zu dieser UniqueID Kategorie innerhalb der View... Und es stehen zisch Dokumente in X UniqueID Kategorien.

Was ich will, ist das letzte Dokument, das angelegt wurde...

Ich bin mir nicht sicher, aber ich glaube, das GetLastDocument diese Schleife ersetzen könnte, denn es müsste sich ja ähnlich wie GetNextDocument verhalten...

Viele Grüße,
Thomas

Peter Klett:
Eine viel elegantere Lösung wäre aber, nicht in den Historierendokumenten suchen zu müssen.

Du willst ein neues Historiendokument erstellen, wenn sich die Person geändert hat? Dann merke Dir im PostOpen die aktuelle Person, im QueryClose vergleichst Du die Person im Dokument mit der gemerkten. Bei Abweichung schreibst Du das Historiendokument.

Declarations
Dim vglperson As String

PostOpen
Dim doc As NotesDocument
Set doc = Source.Document
vglperson = doc.Person (0)

QueryClose
Dim doc As NotesDocument
Set doc = Source.Document
If vglperson <> doc.Person (0) Then
   ' -> neues Historiendokument schreiben
End If

2 Vorteile:

1. Performanter, da kein Zugriff auf andere Dokumente nötig
2. Es wird nur die Person protokolliert, die beim Schließen des Dokuments gespeichert war, zwischenzeitliche Falscheingaben, die gespeichert, aber vorm Verlassen korrigiert wurden, werden nicht protokolliert

ThomasHB:
Hah... Na hätte ich das mal vorher gewusst.
Da macht man sich dann die riesen Mühe...  ;D

Ich glaube, ich sollte doch noch mal mehr tun in Richtung, was gibts für Events...

Schöner Hinweis, vielen Dank!

Tja, dann verbuche ich wohl diese Aktion einfach mal unter Learning LotusScript.  :P

Aber ich finde das gerade sehr interessant, deshalb würde ich das Script noch mal weiterführen und mir dann noch mal Tipps abholen, wenn das ErrorHandling und die Prüfung auf Objekte drin sind.

Viele Grüße,
Thomas

Peter Klett:

--- Zitat von: ThomasHB am 10.02.11 - 11:11:11 ---
--- Zitat ---NamePers = doc.GetItemValue("HistHW_Name")(0) -> hier setzt Du NamePers, unabhängig von der ID
--- Ende Zitat ---

Kann ich so aber nicht stehen lassen... Die Aussage so stimmt schon, ich gebe eine ID nicht explizit an... Aber "doc." bezieht sich auf GetDocumentByKey und dieses wiederrum auf die genannte View.

Durch die Angabe von GetDocumentByKey und der Kategorisierung der View nach UniqueID bleibt er in der Kategorie... Deshalb kann mir das da egal sein, weil nur Dokumente zu dieser Unique ID gefunden werden.


--- Zitat ---Set doc = v.GetNextDocument(doc)
--- Ende Zitat ---

Holt sich an dieser Stelle nämlich auch nur noch die Dokumente, zu dieser UniqueID Kategorie innerhalb der View... Und es stehen zisch Dokumente in X UniqueID Kategorien.

Was ich will, ist das letzte Dokument, das angelegt wurde...


--- Ende Zitat ---
Das ist ein Irrtum, GetNextDocument (doc) stoppt nicht, wenn sich die ID ändert, bleibt also nicht innerhalb der Kategorie (wäre mir jedenfalls völlig neu).

Navigation

[0] Themen-Index

[#] Nächste Seite

[*] Vorherige Sete

Zur normalen Ansicht wechseln