Domino 9 und frühere Versionen > ND8: Entwicklung
Historie anlegen
ThomasHB:
Hallo Zusammen,
wir würden gerne innerhalb einer Notes DB / Anwendung etwas einführen, das man als Historie sehen kann. Und zwar geht es im konkreten Fall um Hardware. Wer hatte welche Hardware, wann zugewiesen... Also ab welchem Datum.
Da Notes nicht relational ist, hatte ich folgende Überlegung, die ich einfach mal versucht habe umzusetzen... Und zwar dafür ein neues Form zu nehmen, welches Ref die DocUniqueID erhält.
Für jede Änderung wird ein neues Dokument angelegt, mit der ID als Referenz.
Dazu habe ich ins PostSave folgenden Code gebaut:
--- Code: ---Sub Postsave(Source As Notesuidocument)
Dim DocUnID As NotesItem
Dim person As NotesItem
Dim Datum As NotesDateTime
Dim v As NotesView
Dim s As New NotesSession
Dim doc As NotesDocument
Dim db As NotesDatabase
Dim doc2 As NotesDocument
Dim composed1, composed2 As String
composed1 = Source.FieldGetText("DocUnID")
composed2 = Source.FieldGetText("person")
Set db = s.CurrentDatabase
Set v = db.GetView("nHist_Hardware")
Set doc = v.GetFirstDocument
Set Datum = doc.GetItemValue("HistHW_Datum")
Set doc2 = New NotesDocument(db)
While Not (doc Is Nothing)
If composed1 = doc.GetItemValue("HistHW_DocUnID") And Not Today() = Datum.DateOnly Then
Call doc2.AppendItemValue("HistHW_DocUnID", composed1)
Call doc2.AppendItemValue("HistHW_Name", composed2)
Call doc2.AppendItemValue("HistHW_Datum", Today())
End If
Wend
End Sub
--- Ende Code ---
Das Programm hängt sich allerdings, immer wieder hier auf:
--- Code: ---Set Datum = doc.GetItemValue("HistHW_Datum")
--- Ende Code ---
Die Meldung ist Type Mismatch.
Nur verstehe ich den Grund nicht, mal abgesehehn davon, der Code vermutlich auch noch weiter fehlerhaft ist... Das Feld was abgefragt wird, ist ein Datumsfeld... Und Datum ist auch als NotesDateTime deklariert...
Hat da jemand eine Idee?
Das ist ein Punkt, da komme ich nicht weiter.
Falls jemand weitere Fehler sieht, bitte NICHT nennen.
Ein Satz wie, da sind weitere Fehler drin ist ok, aber bennent diese mal nicht.
Ich will das schon selber rauskriegen. Im Zweifel kann ich ja dann noch mal fragen.
Nur will ich versuchen meine Entwicklerfähigkeiten aufzubessern.
Nur bei dieser Datumssache da komme ich nicht dahinter...
Viele Grüße,
Thomas
ascabg:
Hallo,
Weil Dir doc.GetItemValue("HistHW_Datum") einen Array zurueckliefert.
Versuch mal folgendes
Dim varDatumswerte As Variant
varDatumswerte = doc.GetItemValue("HistHW_Datum")
oder
Set Datum = doc.GetFirstItem("HistHW_Datum")
Andreas
koehlerbv:
Kein Fehler im eigentlichen Sinne, aber eine grosse Unsauberkeit, die man sich gar nicht erst angewöhnen sollte:
--- Code: ---Dim composed1, composed2 As String
--- Ende Code ---
composed1 wird hier nicht explizit deklariert und wird daher Variant gesehen. Korrekt wäre
Dim composed1 As String, composed2 As String
Bernhard
ThomasHB:
Hallo,
super vielen Dank für die Hilfe...
@Andreas
Set Datum = wurde schon während der Code Eingabe rot hinterlegt mit dem Hinweis Type Mismatch. Mit der zweiten Möglichkeit hat es jetzt geklappt.
@Bernhard
Danke für die Info... Aber ich könnte schwöre, das ich genau diese Schreibweise aus der Designerhelp habe...
Der Code schaut jetzt so aus, funktioniert.
Ist trotzdem irgendwo noch was faul bzw. eine Unsauberkeit?
--- Code: ---Sub Postsave(Source As Notesuidocument)
Dim DocUnID As NotesItem
Dim person As NotesItem
Dim Datum As Variant
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
composed1 = Source.FieldGetText("DocUnID")
composed2 = Source.FieldGetText("person")
Set db = s.CurrentDatabase
Set v = db.GetView("nHist_Hardware")
Set doc = v.GetFirstDocument
Datum = doc.GetItemValue("HistHW_Datum")
Set doc2 = New NotesDocument(db)
While Not (doc Is Nothing)
If composed1 = doc.GetItemValue("HistHW_DocUnID")(0) And composed2 <> doc.GetItemValue("HistHW_Name")(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
Set doc = v.GetNextDocument(doc)
Wend
End Sub
--- Ende Code ---
Danke.
Grüße,
Thomas
koehlerbv:
Nicht nur als unsauber, sondern sogar als falsch würde ich bezeichnen, dass Du Objekte instantiiertst, aber deren Existenz danach nicht überprüfst. Was ist, wenn es die Ansicht nicht (mehr) gibt? Was ist, wenn es noch gar kein erstes Dokument gibt? Was ist, wenn dem Ausführenden die Rechte fehlen, doc2 zu erzeugen?
Und vor allem natürlich: Es fehlt jegliches ErrorHandling!
Bernhard
PS: Ich finde es aber sehr gut, wie Du an die Einarbeitung in LS vorgehst!
Navigation
[0] Themen-Index
[#] Nächste Seite
Zur normalen Ansicht wechseln