Domino 9 und frühere Versionen > ND7: Entwicklung

Feldwerte zählen mit Formelsprache

<< < (2/3) > >>

koehlerbv:
Wie wäre es zum Beispiel mit ArrayAppend? Und nett wäre es, wenn Du einen richtigen (Vor-)Namen unter Deine Postings setzen würdest - normalerweise antworten ich und andere recht nämlich bald nicht mehr.

Bernhard

pram:
Datum + ArrayAppend = Alarmglocken.  :-P

http://www-111.ibm.com/search/SupportSearchWeb/SupportSearch?action=search&ibmsst=defSrchBtn&pageCode=MPS&productKey=&clearAll=false&brand=&searchTerms=arrayappend

ich würde lieber einen Variant per "redim preserve v(ubound(v)+1)" vergrößern und das Element dann ganz hinten rein schreiben

und da ich gerade über Arrayfunktionen lästere: Split/Fulltrim/ArrayUnique/... sollte man übrigens keinesfalls als Funktionsargument verwenden
http://www-01.ibm.com/support/docview.wss?&uid=swg21169330

Gruß
Roland

koehlerbv:
Roland, ich weiss nicht, an wieviel hundert Stellen ich ArrayAppend (im Rahmen einer eigenen Function, die noch ein paar mehr nette Dinge erledigt) einsetze - mit keiner Anwendung hatte ich bisher Probleme. Und da allein schon meine Workflow-Engine massiven Gebrauch davon macht: Ich wüsste hundertprozentig, wenn das irgendwann einmal gekracht hätte.

Das Redim ist performancemässig alles andere als der Bringer. Häufig spielt das natürlich im Kontext keinerlei Rolle.
Wer das eine will (Performance) und das andere lassen (ArrayAppend), kann ja immer noch Evaluate verwenden  ;)

Bernhard

pram:
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

--- Code: --- if isArray(ar) then
ar = arrayappend(ar, obj)
 else
redim ar(0)
set ar(0) = obj
 end

--- Ende Code ---
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("&lt; &gt;"))
zwar geht (aber schuld an einen Crash sein kann), aber das
 srch = split("< >")
 repl = split("&lt; &gt;")
 txt = replace(txt, srch, repl)
zu einem Type-Mismatch führt?

Aber nun BTT:

um die Zeitwerte wirklich sauber auszulesen empfehle ich:

--- Code: ---arr = item.GetValueDateTimeArray()

--- Ende Code ---
verwenden. den neuen fügst du dann hinten an mit:

--- Code: ---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

--- Ende Code ---

wobei es mit Evaluate wohl wirtklich  einfacher gehten würde  ;D

Gruß
Roland

koehlerbv:
Hallo Roland,

wie gesagt - derartige Funktionen von LS setze ich nur und ausschliesslich in eigenen Functions ein, die weitere Funktionalität hinzufügen. Insofern habe ich das sicherlich zentral unter Kontrolle - es knallt immêr oder oder gar nicht.

Was mich aber irritiert:

--- Zitat von: pram am 29.07.09 - 22:23:50 ---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.

--- Ende Zitat ---
Roland, das steht sehr wohl "irgendwo bei IBM" - das steht unübersehbar in der DesignerHelp ...

Bernhard

Navigation

[0] Themen-Index

[#] Nächste Seite

[*] Vorherige Sete

Zur normalen Ansicht wechseln