ich würde eine "echte" Formel, also ohne IF-Bedingungen versuchen:
z.B.:
loLimit := @yesterday;
hiLimit := @Tomorrow;
tmp := @Sign(@abs(Datum - loLimit) + (Datum - loLimit)) - @Sign(@abs(Datum - hiLimit) + (Datum - hiLimit));
@If(@IsError(tmp);.0;@Sum(tmp))
@Sign(@abs(Datum - loLimit) + (Datum - loLimit)) liefert 0, für jeden Tag in "Datum" wenn der Tag vor dem Limit liegt und 1 wenn er dahinter liegt
Gruß
Roland
Danke Roland.
So wie ich grad sehe liegt mein Problem noch wo anders.
Ich möchte eine Datum/Zeit-Liste generieren, immer wenn ein Dokument im Web aufgerufen wird.
Ich starte bei jedem Aufruf einen Agenten, der folgendes macht:
Dim Session As New NotesSession
Dim doc As NotesDocument
Dim item, dateitem As NotesItem
Set doc = Session.DocumentContext
Set item = doc.GetFirstItem ( "Counter")
Set dateitem = doc.GetFirstItem( "Counterdate" )
If item Is Nothing Then
doc.Counter=1
doc.CounterDate = Today
Else
Dim counter As Integer
counter = Val ( item.Text) +1
doc.Counter = counter
End If
Call dateitem.AppendToTextList(Today)
Call doc.Save ( True, False)
Bei Counterdate wird aber kein Datum angehängt...
Hallo Bernhard,
freut mich, dass es bei dir noch nicht aufgetaucht ist, (oder keinen unmittelbaren Zusammenhang fest gestellt hast,
da die Fehler nur sehr selten passieren und sich meistens nur sehr schwer reproduzieren lassen... s.u.)
Ich möcht hier mal ein wenig von meiner Erfahrung berichten, hier wirds leider ein wenig OT, also falls es nicht her passt bitte verschieben (aber nicht löschen, vielleicht hilft es den ein oder anderen):
Einmal hatte ich ein massives Problem mit Arrayappend in einem Agenten. Dieser fügte mittels
if isArray(ar) then
ar = arrayappend(ar, obj)
else
redim ar(0)
set ar(0) = obj
end
neue Objekte an das Array. Im Client lief alles wunderbar. Am Server auch, aber das Ergebnis passte irgendwie nicht. Den Grund zeigte mir der Remote Debugger: Im Array waren einige "Slots" leer.
(Nein die Objekte wurden nicht mit delete aus dem Speicher gelöscht). Umgebaut auf "redim preserve" lief es auf Anhieb (vielleicht etwas langsamer, aber der Kunde war zufrieden)
Oder wie viele von euch kennen das, der Client stürzt einfach ab, beim nächsten mal macht man genau das Gleiche und es geht (natürlich macht man nicht genau das Gleiche)
Der Absturz ist reproduzierbar, wenn man man die "klicksequenz" raus gefunden hat.
(z.B. ein Dokument öffnen, in den Bearbeiten Modus wechseln, einmal auf F9 drücken, Dokument schließen, aber nicht speichern. Nächstes Dokument öffnen -> crash)
Wenn dann eine Anwendung mit den Keywords "UnLinkDynArray" oder "ClearRTLinks" crashed, dann ist hier mit Sicherheit ein split/arrayappend/fulltrim/arrayunique (also alle Fkt. die ein Array als Rückgabewert haben) als Funktionsparameter verwendet worden. (bei "sprintf" / "unisprintf" im NSD ist der Schuldige vermutlich ein "IsDate"-Aufruf. Dies muss nicht mal die eigene DB sein)
Je komplexer eine Anwendung wird umso "anfälliger" werden die Arrayfunktionen.
Konstrukte wie:
tmp = fulltrim(arrayunique(tmp))
oder
call doc.replaceItemValue("item", split("eins zwei"))
waren Schuld an den Abstürzen. Die Funktion kann dabei an komplett anderer Stelle aufgerufen worden sein (z.B. QueryOpen) und beim QueryClose crashed dann der Client. (aber nur wenn man 1x auf F9 geklickt hat ;-) )
Umgebaut auf
tmp = arrayunique(tmp)
tmp = fulltrim(tmp)
bzw.
tmp = split("eins zwei")
call doc.replaceItemValue("item",tmp)
gab dies keine Probleme mehr.
Der Rückgabewert einer Arrayfunktion muss immer einem Variant zugewiesen werden (hab das glaub ich sogar mal irgendwo bei IBM gelesen), sonst passieren da irgendwlche "Schweinerein" im Speicher.
(und seitdem meiden wir solche Konstrukte, in denen eine Arrayfunktion als Parameter eingesetzt wird)
oder kannst du dir (bzw. mir) erklären warum das
txt = Replace(txt, Split("< >"), Split("< >"))
zwar geht (aber schuld an einen Crash sein kann), aber das
srch = split("< >")
repl = split("< >")
txt = replace(txt, srch, repl)
zu einem Type-Mismatch führt?
Aber nun BTT:
um die Zeitwerte wirklich sauber auszulesen empfehle ich:
arr = item.GetValueDateTimeArray()
verwenden. den neuen fügst du dann hinten an mit:
redim preserve arr(ubound(arr) + 1)
set arr(ubound(arr)) = new NotesDateTime(...)
call doc.replaceItemValue(item.name, arr)
' evlt reicht hier auch ein:
' set item.values = arr
wobei es mit Evaluate wohl wirtklich einfacher gehten würde ;D
Gruß
Roland