Autor Thema: Feldwerte zählen mit Formelsprache  (Gelesen 4710 mal)

Offline zysmo

  • Aktives Mitglied
  • ***
  • Beiträge: 107
  • Geschlecht: Männlich
Feldwerte zählen mit Formelsprache
« am: 29.07.09 - 12:29:53 »
Moin,

ich steh grad etwas auf dem Schlauch.
Ich habe ein Feld das Datumswerte enthält.
Jetzt möchte ich in einer Ansicht die Anzahl der Werte eines bestimmten Datumsbereichs anzeigen...
Wenn also zum Beispiel in dem Feld 5 Daten im Juli 2009 stehen und ich alles des aktuellen Monats haben möchte, sollte in der Ansicht die Zahl 5 ausgegeben werden.

Wie realisiere ich das in Formelsprache?

Offline pram

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.169
  • Geschlecht: Männlich
    • Foconis Object Framework
Re: Feldwerte zählen mit Formelsprache
« Antwort #1 am: 29.07.09 - 14:52:07 »
ich würde eine "echte" Formel, also ohne IF-Bedingungen versuchen:
z.B.:
Code
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
Roland Praml

IBM Certified Application Developer - Lotus Notes and Domino 8
Ich verwende das Foconis Object Framework

Offline zysmo

  • Aktives Mitglied
  • ***
  • Beiträge: 107
  • Geschlecht: Männlich
Re: Feldwerte zählen mit Formelsprache
« Antwort #2 am: 29.07.09 - 15:13:52 »
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:

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

Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Re: Feldwerte zählen mit Formelsprache
« Antwort #3 am: 29.07.09 - 15:21:32 »
Was soll den der Quatsch mit AppendToTextList? Zum ersten - Datumswerte packt man nicht in Strings. Zum zweiten: Today ergibt keinen String wie von AppendToTextList erwartet. Zum dritten: Initial erstellst Du das Item "Counterdate" als Date/Time-Item. Text anhängen ist dann eher ungeschickt, meinst Du nicht??

Bernhard

Offline zysmo

  • Aktives Mitglied
  • ***
  • Beiträge: 107
  • Geschlecht: Männlich
Re: Feldwerte zählen mit Formelsprache
« Antwort #4 am: 29.07.09 - 15:34:34 »
Jetzt wo du es sagst....
Aber wie packt man Datumswerte in eine Liste? Ich bin grad etwas phantasielos  ???

Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Re: Feldwerte zählen mit Formelsprache
« Antwort #5 am: 29.07.09 - 15:50:03 »
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

Offline pram

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.169
  • Geschlecht: Männlich
    • Foconis Object Framework
Re: Feldwerte zählen mit Formelsprache
« Antwort #6 am: 29.07.09 - 16:33:03 »
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
Roland Praml

IBM Certified Application Developer - Lotus Notes and Domino 8
Ich verwende das Foconis Object Framework

Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Re: Feldwerte zählen mit Formelsprache
« Antwort #7 am: 29.07.09 - 17:14:46 »
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

Offline pram

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.169
  • Geschlecht: Männlich
    • Foconis Object Framework
Re: Feldwerte zählen mit Formelsprache
« Antwort #8 am: 29.07.09 - 22:23:50 »
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
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()
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

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

Gruß
Roland
Roland Praml

IBM Certified Application Developer - Lotus Notes and Domino 8
Ich verwende das Foconis Object Framework

Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Re: Feldwerte zählen mit Formelsprache
« Antwort #9 am: 29.07.09 - 22:58:55 »
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:
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.
Roland, das steht sehr wohl "irgendwo bei IBM" - das steht unübersehbar in der DesignerHelp ...

Bernhard

Offline zysmo

  • Aktives Mitglied
  • ***
  • Beiträge: 107
  • Geschlecht: Männlich
Re: Feldwerte zählen mit Formelsprache
« Antwort #10 am: 30.07.09 - 11:04:26 »
Danke euch beiden, ihr habt mir sehr geholfen.

Gruß
Alex

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz