Das Notes Forum
Domino 9 und frühere Versionen => ND8: Entwicklung => Thema gestartet von: Scotty67 am 26.04.10 - 10:07:39
-
...vielleicht kann mir jemand helfen.
ich erechne beim öffen eines dokuments werte aus anderen dokumenten via QueryOpen Event...
jetzt würde ich gerne diesen Wert im Frontenddocument darstellen ohne das dokument zu ändern..
sprich diese Wert soll immer neu berechnet werden sobald das dokument geöffnet wird
warum und wieso?
ich hab ein formular namens "störungsmeldung" - basierend auf diesem Dokument werden "störungsmeldungstätigkeiten"-docs angelegt und dort werden aufwandszeiten hinterlegt - jetzt möchte ich beim öffnen dieser störungsmeldung immer den aktuell aufgelaufenen gesamtaufwand angezeigt bekommen
-
Und wo ist jetzt das Problem ?
-
:) nun, ich hab keine ahnung wie ich diesen errechneten Wert im Frontend darstellen soll...wenn ich hier ein feld anlegen das "computed for display" ist - dann kann ich dort nur eine Formula legen...
ich steh wahrscheinlich völlig am schlauch - stimmts ? ;D
-
Im Postopen geht sowohl Formel als auch LS.
-
Ja und? Wo ist jetzt dein Problem?
Kannst du deine Zeiten mit Formelsprache nicht ermitteln?
Oder weist du nicht was ein ComputedForDisplay Feld so macht?
-
Queryopen scheint dafür die falsche Stelle zu sein.
-
so hier mein script - wie gesagt berechnet einwandfrei - nur mein plan wäre diesen errechneten Wert im Frontend-Doc
errechnet darstellen....
leute, ich bin mit formeln eher schlecht bestückt - vielleicht fällt euch ein formular 3-4zeiler ein der genau das macht
was dieser script leistet, ich bin auch eher anfänger was scriptprogrammierung betrifft - aber ich muß da leider durch *würg*
Sub Queryopen(Source As Notesuidocument, Mode As Integer, Isnewdoc As Variant, Continue As Variant)
Dim workspace As New NotesUIWorkspace
Dim session As New NotesSession
Dim doc As NotesDocument
Dim SMdoc As NotesDocument
Dim uidoc As NotesUIDocument
Dim db As NotesDatabase
Dim view As NotesView
Dim dc As NotesDocumentCollection
Set db = session.CurrentDatabase
Dim Nummer As Variant
Dim smdoingtime As Long
Set view = db.GetView( "SMDoingTime" )
Set doc=source.document
Nummer = doc.GetItemValue( "SMnummer" )
Set dc = view.GetAllDocumentsByKey("200000", False) 'testweise fixierte störungsmeldungsnummer
Set SMdoc = dc.GetFirstDocument
Do While Not(SMdoc Is Nothing)
CalcUsedSMDoingTime=SMdoc.GetItemValue("UsedTime")
If Cint(CalcUsedSMDoingTime(0)) = 0 Then
Goto loopweiter
Else
smdoingtime=smdoingtime+Cint(CalcUsedSMDoingTime(0))
End If
loopweiter:
Set SMdoc = dc.GetNextDocument(SMdoc)
Loop
'Msgbox smdoingtime
End Sub
-
Naja @Functions werden hier wohl nicht gehen, weil du mehrere Dokumente im Zugriff hast wofür @Functions nicht taugt.
Ich verstehe aber wie der Rest auch nicht dein Problem. Du kann doch im Queryopenevent dein Script zur Berechnung schreiben und dann ein beliebiges Feld setzen, das "Compute for Display" ist. Diese Felder sind ja nur existent wenn das Dokument geöffnet ist.
-
Wieso keine @Functions? Mit @DBColumn aus der Ansicht über den Schlüssel der Störungsnummer alle benötigten Zeiten auslesen und mit @Sum addieren. Das ganze kommt dann in die Berechnungsformel des zur Anzeige berechneten Feldes.
-
Stimmt geht auch. Mein Fehler
-
...ich habs !
danke - eure vielen aussagen "und wo bitte ist das problem..." ;D haben mich beflügelt ;D
ich lass den script im Queryopen - hab ein hidden field hinterlegt - welches wiederum für ein "computed for display" field
dient - am ende meines scripts wird genau diesen hidden field befüllt (temporär - also nicht gespeichert)
Sub Queryopen(Source As Notesuidocument, Mode As Integer, Isnewdoc As Variant, Continue As Variant)
Dim workspace As New NotesUIWorkspace
Dim session As New NotesSession
Dim doc As NotesDocument
Dim SMdoc As NotesDocument
Dim uidoc As NotesUIDocument
Dim db As NotesDatabase
Dim view As NotesView
Dim dc As NotesDocumentCollection
Set db = session.CurrentDatabase
Dim Nummer As Variant
Dim smdoingtime As Long
Set view = db.GetView( "SMDoingTime" )
Set doc=source.document
Nummer = doc.GetItemValue( "SMnummer" )
'Set dc = view.GetAllDocumentsByKey(Nummer(0), False)
Set dc = view.GetAllDocumentsByKey("200000", False)
Set SMdoc = dc.GetFirstDocument
Do While Not(SMdoc Is Nothing)
CalcUsedSMDoingTime=SMdoc.GetItemValue("UsedTime")
If Cint(CalcUsedSMDoingTime(0)) = 0 Then
Goto loopweiter
Else
smdoingtime=smdoingtime+Cint(CalcUsedSMDoingTime(0))
End If
loopweiter:
Set SMdoc = dc.GetNextDocument(SMdoc)
Loop
Dim item As NotesItem
Set item = doc.ReplaceItemValue( "collectedTime", smdoingtime )
End Sub
-
Und in der Formelsprache ist das ein Einzeiler.
@Sum(@ToNumber(@DbLookup( "" : "Nocache" ; "" : "" ; "SMDoingTime" ; Nummer ; "CalcUsedSMDoingTime" ; [FAILSILENT] )))
-
Genau! (@DBColumn von mir war Quatsch, musste natürlich @DBLookup heißen.) Das ist mit Sicherheit auch deutlich performanter.