Domino 9 und frühere Versionen > ND8: Entwicklung
Historie anlegen
ThomasHB:
...ok, verstehe was ihr mir sagen wollt.
Danke für die Unterstützung. Ich werde versuchen das zu beachten.
Mal sehen wie weit ich das Script mit den Tipps noch optimieren kann.
Grüße,
Thomas
ThomasHB:
Hallo Zusammen,
ich habe jetzt noch mal weiter gemacht... Ich habe mich auch mal am Error Handling veruscht ala on Error Goto... Das klappt nur offenbar nicht, weil er eine Rückmeldung gibt:
Hardware: Postsave: 26: Illegal executable code oustide procedure.
Ich hatte mich bei der Angabe an dem verlinkten Thread orientiert...
Auf die Existenz der Objekte will ich Morgen mal zurückgreifen, sprich das mal versuchen...
Aber vielleicht kann man ja noch mal über das aktuelle Eregnis sprechen.
Da interessiert mich, kann man das so machen... Grundlegend falsch, solche Dinge eben.
Tipps zur Verbesserung...
Der Code so wie er jetzt ist, tut aber genau das was ich will... Das macht mich ja irgendwo trotzdem ein bisschen Stolz... ;D
Also so sieht das PostSave Event jetzt aus:
--- Code: ---Sub Postsave(Source As Notesuidocument)
Dim v As NotesView
Dim s As New NotesSession
Dim doc As NotesDocument
Dim db As NotesDatabase
Dim doc2 As NotesDocument
Dim composed1 As String, composed2 As String, PersName As String
composed1 = Source.FieldGetText("DocUnID")
composed2 = Source.FieldGetText("person")
Set db = s.CurrentDatabase
Set v = db.GetView("nHist_Hardware")
Set doc = v.GetDocumentByKey(composed1)
Set doc2 = New NotesDocument(db)
PersName = getLastDocument(composed1)
If composed1 = doc.GetItemValue("HistHW_DocUnID")(0) And Strcomp(composed2, PersName) <> 0 Then
Call doc2.AppendItemValue("Form", "Hardware_Historisierung")
Call doc2.AppendItemValue("HistHW_DocUnID", composed1)
Call doc2.AppendItemValue("HistHW_Name", composed2)
Call doc2.AppendItemValue("HistHW_Datum", Today())
Call doc2.Save(0,0)
End If
End Sub
--- Ende Code ---
So sieht die Funktion getLastDocument aus:
--- Code: ---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)
While Not (doc Is Nothing)
NamePers = doc.GetItemValue("HistHW_Name")(0)
Set doc = v.GetNextDocument(doc)
Wend
getLastDocument = NamePers
End Function
--- Ende Code ---
Gefühlt wäre diese Funktion unnötig... Da war natürlich auch Spielerei dabei und das eigene Training, was geht wie etc.
Bin auf Kommentare gespannt.
Viele Grüße,
Thomas
Axel:
Stichpunktartig was mir aufgefallen ist:
1. Jegliche Fehlerbehandlung fehlt.
2. Objekte werden instantiiert, aber die Existenz danach nicht überprüft, besonders in Postsave.
--- Zitat von: ThomasHB am 09.02.11 - 18:12:40 ---ich habe jetzt noch mal weiter gemacht... Ich habe mich auch mal am Error Handling veruscht ala on Error Goto... Das klappt nur offenbar nicht, weil er eine Rückmeldung gibt:
Hardware: Postsave: 26: Illegal executable code oustide procedure.
Ich hatte mich bei der Angabe an dem verlinkten Thread orientiert...
--- Ende Zitat ---
Ohne zu sehen wie du das programmiert hast lässt sich dazu nichts sagen.
Axel
Peter Klett:
Sorry, wahrscheinlich fehlt mir der intellektuelle Zugang zu Deinem Werk.
Stiere nun seit 10 Minuten auf das Script und verstehe nicht, was es eigentlich machen soll.
Sub Postsave(Source As Notesuidocument)
Dim v As NotesView
Dim s As New NotesSession
Dim doc As NotesDocument
Dim db As NotesDatabase
Dim doc2 As NotesDocument
Dim composed1 As String, composed2 As String, PersName As String
composed1 = Source.FieldGetText("DocUnID") -> irgendeinde ID aus dem aktuellen Dokument
composed2 = Source.FieldGetText("person") -> die Person aus dem aktuellen Dokument
Set db = s.CurrentDatabase -> die aktuelle Datenbank
Set v = db.GetView("nHist_Hardware") -> eine Ansicht, was für Dokumente werden da ausgegeben?
Set doc = v.GetDocumentByKey(composed1) -> das erste Dokument aus dieser Ansicht mit der ID des aktuellen Dokuments (was für ein Dokument?)
Set doc2 = New NotesDocument(db) -> ein neues Dokument
PersName = getLastDocument(composed1) -> der Name der Person aus dem letzen Dokument der Ansicht, die übergebene ID ist wirkungslos, da damit nur in der Ansicht das Einstiegsdokument gesucht wird und dann die Ansicht bis zum letzten Dokument durchgehechelt wird
If composed1 = doc.GetItemValue("HistHW_DocUnID")(0) And Strcomp(composed2, PersName) <> 0 Then -> die erste Bedingung wird immer erfüllt sein, außer es gibt das Dokument nicht, die zweite Bedingung wird nur erfüllt, wenn die Person mit der aus dem letzten Dokument der Ansicht übereinstimmt. Sinn?
Call doc2.AppendItemValue("Form", "Hardware_Historisierung")
Call doc2.AppendItemValue("HistHW_DocUnID", composed1)
Call doc2.AppendItemValue("HistHW_Name", composed2)
Call doc2.AppendItemValue("HistHW_Datum", Today())
Call doc2.Save(0,0)
End If
End Sub
Und das führst Du bei jedem Speichern des Dokuments aus. Dass das funktioniert, liegt vermutlich nur an den Laborbedingungen: immer der gleiche User und niemals das Dokument zwischenspeichern (STRG+S).
Du solltest Dir mal den gewünschten Ablauf analog vorstellen, ohne Überlegung, mit welchem Befehl Du das umsetzt. Wenn der Ablauf steht, setze es in Script um.
ThomasHB:
Hallo Peter und hallo alle anderen,
danke zunächst für die Kommentare.
@Axel: Wie ich schon schrieb, diese Punkte sollen heute dann noch folgen.
@Peter:
Du musst dir vorstellen, das ist eine Database, die einen Hardwarebestand erfasst, also zu jedem Rechner, zu jedem Notebook zisch versch. Hardwaremerkmale speichert.
Anschaffungsdatum, Garantiezeit etc.
Ausserdem Bildschirme und viele weitere Dinge.
Diese Hardware wird immer wieder versch. Personen zugewiesen.
Allerdings kann man nach 2 Jahren nicht mehr sagen, wer hatte das mal...
Und genau da kommt das Script ins Spiel... Es ist für eine Historie gebaut.
Ich habe das an dieser Stelle nicht mit Children Documents aufgebaut.
Im Hardware Formular, gibt es das Feld DocUnID, welches die Unique ID des Dokuments enthält.
Ein Agent, hat zu jeder Hardware, genauer zu jedem Dokument ein weiteres, in einem neuen Form angelegt.
Ein Feld in dem neuen Dokument enthält die Document Unique ID des ersten Hardwaredokuments.
Der Agent holt sich ähnlich wie die Postsave Funktion, die benötigten Daten und trägt sie damit als erstes Dokument einmal Initial ein. Damit existieren dann die Dokumente und mein Programm im Postsave kann nie auf diesen Fehler stossen, beim anlegen eines neuen Hardwaredokuments, wird ein Historiendokument direkt mit angelegt.
Dieses Script im Postsave geht jetzt hin und ermittelt zunächst mal ein paar Werte...
Die Unique ID, die Person... Dann guckt es in die Historien View, die entsprechend aufgebaut ist und geht dann diese durch...
Dann holt es sich den Namen der letzten Person, welche diese Hardware zugewiesen hatte...
Danach guckt dann das IF, ob beide IDs stimmen und ob die Person ungleich der zuletzt zugewiesen ist... Sonst würde ja ständig ein neues Historiendok angelegt werden.
Viele Grüße,
Thomas
Navigation
[0] Themen-Index
[#] Nächste Seite
[*] Vorherige Sete
Zur normalen Ansicht wechseln