Das Notes Forum

Domino 9 und frühere Versionen => ND8: Entwicklung => Thema gestartet von: Sommersprosse am 10.10.12 - 11:46:18

Titel: Werte aus Array addieren
Beitrag von: Sommersprosse am 10.10.12 - 11:46:18
Hallo zusammen,

ein Scriptanfänger hat mal 'ne Frage:

Folgendes Problem:

In der Helpdesk habe ich eine neue Funktion hinzugefügt, die einen Start-Stop der Ticketberechnenden Zeit ermöglichen soll. Das erfassen der Minuten funktioniert im Querysave auch soweit.

Beim Abschließen eines Tickets sollen nun die Werte aus diesem Feld zusammengezählt werden und von der Zeit assigned-completed abgezogen werden.

Folgende Informationen habe ich:
Ich habe ein Feld. DT Pause (kann Mehrfachwerte), welches mit Informationen gefüllt ist. Ich hatte das Feld zuerst vom Typ Zahl, aber da hat er mir gemeckert -NotesItem cannot be set to an arry of mixed data types ???

Darauf hin habe ich das ganze als Typ Text (bearbeitbar, aber verborgen) genommen und das Feld wird mit "Zahlen" gefüttert.


Den Code hierfür seht ihr hier.

Code
	
If source.Document.PauseStat(0) ="2" Then
		
		Dim strdt1 As String 
		Dim strdt2 As String
		Dim vpause As Variant
		
		Dim elapsed As String
		Set item = doc.GetFirstItem("DTPauseStart")
		strdt1 = item.text
		Set item = doc.GetFirstItem("DTPauseStop")
		strdt2 = item.text		
		elapsed = DTCalcpause.GetElapsedTime( strdt1, strdt2 )
		If source.Document.DTPause(0) = "" Then
			Call doc.ReplaceItemValue ("DTPause", elapsed)	
		Else
			
			vpause = doc.GetItemValue ("DTPause")
			Redim Preserve vpause(Ubound(vPause) + 1)
			vpause(Ubound(vpause)) = elapsed
			Call doc.ReplaceItemValue ("DTPause", vpause)
			
		End If
		Set item = doc.ReplaceItemValue("PauseStat",0)
	End If

Sprich ich müsste die Textinhalte in Zahlen umwandlen und dann zusammen rechnen...

Ich habe die letzten Tage soviel über Arrays gelesen, aber wirklich schlauer bin ich nicht.... brauche ich das überhaupt oder kann ich das schon in meiner Funktion im Querysave zusammen rechnen und das Feld nur mit einem Wert füllen?

Für Verbesserungsvorschläge bin ich offen, auch was meinen Code betrifft.
Bin mir nicht sicher ob das ganze in die Kategorie "Help" gehört, da es eigentlich eher eine allgemeine Frage zu Lotus Scrip ist.



P.S. Gibt es eigentlich zu Arrays irgendwie ein Best Practice hier im Forum??

Hoffe mein Anliegen ist klar genug geschieldert, sonst noch mal nachaken.

Was ich noch vergessen habe... diesen Start Stop kann man natürlich jederzeit und beliebig oft ausführen, daher kann ich das fest dimensionieren.
Titel: Re: Werte aus Array addieren
Beitrag von: Peter Klett am 10.10.12 - 12:21:32
Verstehe jetzt nicht ganz, was Du suchst. Geht es nur darum, die Werte in dem Array Pause zusammenzuzählen?

Dann kannst Du das so machen (in der Annahme, dass es sich um ganze Zahlen bis ca. 32.000 handelt)

Dim summe As Integer
summe = 0
Forall pause In doc.Pause
   If Isnumeric (pause) Then
      summe = summe + Cint (pause)
   End If
End Forall

Ansonsten gibt es noch Long und Clng, Double und Cdbl usw.
Titel: Re: Werte aus Array addieren
Beitrag von: Sommersprosse am 10.10.12 - 12:37:26
Hallo Peter,

Du hast das richtig verstanden, ich will einzig und allein die Werte aus dem Array Pause zusammen zählen.

Kann ich das eigentlich auch schon im Querysavew machen?

Titel: Re: Werte aus Array addieren
Beitrag von: Axel am 10.10.12 - 12:51:34

Was ich noch vergessen habe... diesen Start Stop kann man natürlich jederzeit und beliebig oft ausführen, daher kann ich das fest dimensionieren.


Eigentlich ist das doch ein Widerspruch: beliebig oft... und fest dimensionieren. Für "beliebig oft" bräuchte man doch ein dynamisches Array.

Oder hab ich das falsch verstanden?

Axel
Titel: Re: Werte aus Array addieren
Beitrag von: Peter Klett am 10.10.12 - 12:58:33
Kann ich das eigentlich auch schon im Querysave machen?
klar
Titel: Re: Werte aus Array addieren
Beitrag von: Fineas am 10.10.12 - 12:59:34
Wenn Du schon Mehrfachwerte hast UND es sich idealerweise um Zahlen handelt, dann nimm doch einfach ein zweites berechnetes Feld, das mit @SUM( MEHRFACHWERTEZAHLENFELD ) das Ergebnis bereitstellt. Das kannst Du dann mittels Script abgreifen ...

Ansonsten sollte es in Script doch kein Problem sein, mittels FORALL über die Feldinhalte zu gehen und eine temporäre Variable aufzusummieren.

Gruß, Heiko
Titel: Re: Werte aus Array addieren
Beitrag von: Sommersprosse am 10.10.12 - 13:03:15


Was ich noch vergessen habe... diesen Start Stop kann man natürlich jederzeit und beliebig oft ausführen, daher kann ich das fest dimensionieren.


Ich hab' mich schlicht und einfach verschrieben.... es muss dynamisch sein, klar, es sollte heißen nicht fest dimensionieren, sorry.

das Problem (vielleicht ist aber auch keines?) ist daß mein Feld aber vom Typ Text und nicht Zahl ist, oder seh ich das falsch. Dann ist pause eben nicht numeric?
Titel: Re: Werte aus Array addieren
Beitrag von: Peter Klett am 10.10.12 - 13:05:16
Isnumeric bedeutet nur, dass der Wert in eine Zahl umwandelbar ist, nicht, dass er schon eine Zahl ist.
Titel: Re: Werte aus Array addieren
Beitrag von: Sommersprosse am 10.10.12 - 13:09:46
Isnumeric bedeutet nur, dass der Wert in eine Zahl umwandelbar ist, nicht, dass er schon eine Zahl ist.

Hilfe lesen bildet  :)

Tests the value of an expression to determine whether it is numeric, or can be converted to a numeric value.

Danke für den Hinweis, werde das mal in mein Script einfügen und testen.
Titel: Re: Werte aus Array addieren
Beitrag von: Sommersprosse am 10.10.12 - 15:05:46
Es hat geklappt, danke für die Tipps.

Frage an die Experten wäre nur noch wie ich das noch optimieren, sprich zusammen fassen könnte. Kommt mir noch umständlich vor....

Code
If source.Document.PauseStat(0) ="2" Then
		
		Dim strdt1 As String 
		Dim strdt2 As String
		Dim vpause As Variant
		Dim sum_min As Integer
		Dim elapsed As String
		
		Set item = doc.GetFirstItem("DTPauseStart")
		strdt1 = item.text
		Set item = doc.GetFirstItem("DTPauseStop")
		strdt2 = item.text		
		elapsed = DTCalcpause.GetElapsedTime( strdt1, strdt2 )
		If source.Document.DTPause(0) = "" Then
			Call doc.ReplaceItemValue ("DTPause", elapsed)	
		Else
			
			vpause = doc.GetItemValue ("DTPause")
			Redim Preserve vpause(Ubound(vPause) + 1)
			vpause(Ubound(vpause)) = elapsed
			Call doc.ReplaceItemValue ("DTPause", vpause)
			
			sum_min = 0
			Forall pause In doc.DTpause
				If Isnumeric (pause) Then
					sum_min = sum_min + Cint (pause)
				End If
			End Forall		
			Call doc.ReplaceItemValue ("DTPause", sum_min)
		End If
		
		Set item = doc.ReplaceItemValue("PauseStat",0)
	End If


Kann das ganze noch irgendwie in das zusammenstellen des Arrays packen?
Titel: Re: Werte aus Array addieren
Beitrag von: Peter Klett am 10.10.12 - 15:37:10
Also ganz ehrlich verstehe ich Dein Script nicht. Erst baust Du Dir ein Array in DTPause auf, um es dann mit sum_min wieder plattzumachen. Was soll denn eigentlich am Ende herauskommen?
Titel: Re: Werte aus Array addieren
Beitrag von: Sommersprosse am 10.10.12 - 15:46:36
Das ist ja genau der Punkt... es kommt mir auch unlogisch vor....

Am Ende soll in DTPause ein Gesamtwert herauskommen. Mit dem eigentlichen ersten Teil meines Scripts werden Einzelwerte in mein Feld DTPause geschrieben.

Code
vpause = doc.GetItemValue ("DTPause")
			Redim Preserve vpause(Ubound(vPause) + 1)
			vpause(Ubound(vpause)) = elapsed
			Call doc.ReplaceItemValue ("DTPause", vpause)

Diese will ich als Summe haben.

Kann ich das einfach ersetzen durch den Teil?
Code
sum_min = 0
			Forall pause In doc.DTpause
				If Isnumeric (pause) Then
					sum_min = sum_min + Cint (pause)
				End If
			End Forall		
			Call doc.ReplaceItemValue ("DTPause", sum_min)
		End If

Nun Klar?
Titel: Re: Werte aus Array addieren
Beitrag von: Peter Klett am 10.10.12 - 15:51:18
Dann brauchst Du kein Forall, denn Du hast ja kein Array. DTPause kann auch ein Zahlenfeld sein.

If Not Isnumeric (doc.DTPause (0)) Then
   doc.DTPause = 0
End If
doc.DTPause = doc.DTPause (0) + elapsed

(unter der Annahme, dass elapsed eine Zahl ist)
Titel: Re: Werte aus Array addieren
Beitrag von: Sommersprosse am 10.10.12 - 16:48:01
Hallo Peter,

ich hatte Deinen Vorschlag mal probiert und wollte schon sagen geht nicht, aber....

es funktioniert, allerdings nur wenn ich das Feld DTPause wirklich als Zahlenfeld definiere, dann werden die Werte auch addiert und nicht nur angefügt.

Muss das jetzt noch an ein paar "Tickets" testen, aber sieht mal ganz gut aus.

So wird aus einem "großen" Script ein dreizeiler, echt klasse.

Danke.