Autor Thema: Werte aus Array addieren  (Gelesen 4103 mal)

Offline Sommersprosse

  • Senior Mitglied
  • ****
  • Beiträge: 296
  • Geschlecht: Weiblich
Werte aus Array addieren
« 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.
« Letzte Änderung: 10.10.12 - 16:48:21 von sommersprosse »
Gruß Ulli

Offline Peter Klett

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.713
  • Geschlecht: Männlich
Re: Werte aus Array addieren
« Antwort #1 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.

Offline Sommersprosse

  • Senior Mitglied
  • ****
  • Beiträge: 296
  • Geschlecht: Weiblich
Re: Werte aus Array addieren
« Antwort #2 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?

Gruß Ulli

Offline Axel

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 8.658
  • Geschlecht: Männlich
  • It's not a bug, it's Notes
Re: Werte aus Array addieren
« Antwort #3 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
Ohne Computer wären wir noch lange nicht hinterm Mond!

Offline Peter Klett

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.713
  • Geschlecht: Männlich
Re: Werte aus Array addieren
« Antwort #4 am: 10.10.12 - 12:58:33 »
Kann ich das eigentlich auch schon im Querysave machen?
klar

Offline Fineas

  • Aktives Mitglied
  • ***
  • Beiträge: 145
  • Geschlecht: Männlich
  • PCLP Dev/Admin 5,6,7,8
Re: Werte aus Array addieren
« Antwort #5 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

Offline Sommersprosse

  • Senior Mitglied
  • ****
  • Beiträge: 296
  • Geschlecht: Weiblich
Re: Werte aus Array addieren
« Antwort #6 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?
Gruß Ulli

Offline Peter Klett

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.713
  • Geschlecht: Männlich
Re: Werte aus Array addieren
« Antwort #7 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.

Offline Sommersprosse

  • Senior Mitglied
  • ****
  • Beiträge: 296
  • Geschlecht: Weiblich
Re: Werte aus Array addieren
« Antwort #8 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.
Gruß Ulli

Offline Sommersprosse

  • Senior Mitglied
  • ****
  • Beiträge: 296
  • Geschlecht: Weiblich
Re: Werte aus Array addieren
« Antwort #9 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?
Gruß Ulli

Offline Peter Klett

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.713
  • Geschlecht: Männlich
Re: Werte aus Array addieren
« Antwort #10 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?

Offline Sommersprosse

  • Senior Mitglied
  • ****
  • Beiträge: 296
  • Geschlecht: Weiblich
Re: Werte aus Array addieren
« Antwort #11 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?
Gruß Ulli

Offline Peter Klett

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.713
  • Geschlecht: Männlich
Re: Werte aus Array addieren
« Antwort #12 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)

Offline Sommersprosse

  • Senior Mitglied
  • ****
  • Beiträge: 296
  • Geschlecht: Weiblich
Re: Werte aus Array addieren
« Antwort #13 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.

« Letzte Änderung: 11.10.12 - 09:13:17 von sommersprosse »
Gruß Ulli

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz