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
Gruß
Roland