Seite 1 von 1

Array auswerten

Verfasst: So, 20. Mär 2022 15:48
von Wolfgang_B
Hallo,
ich stelle mich wieder mal doof an ...
ich möchte ein Array nach Kontonummern auswerten. Es sollen die Summen der einzelnen Konten und die Kontobezeichnungen in ein neues Array ausgegeben werden.

Code: Alles auswählen

Bezeichnng	Konto	Betrag
Konto1		1000	10
Konto1		1000	2
Konto1		1000	399
Konto2		1010	34
Konto3		3000	2
Konto4		4000	6555
Konto5		8100	6
konto1		1000	34
Konto3		3000	77

Re: Array auswerten

Verfasst: So, 20. Mär 2022 16:56
von Martin Altmann
Dein Konto 1000 hat drei verschiedene Bezeichnungen. Sollen das alle aufsummiert werden und alle Bezeichnungen hintereinanderweg stehen?
Oder mit jeweils die, die sich dieselbe Bezeichnung haben? Dann hättest du drei Summen für die Konten mit der Nummer 1000.

Viele Grüße,
Martin

Re: Array auswerten

Verfasst: So, 20. Mär 2022 17:03
von Wolfgang_B
war Schreibfehler ... Die Kontobezeichnung ist je nach Kontonummer immer gleich. HAbs in der Tabelle korrigiert.

Re: Array auswerten

Verfasst: So, 20. Mär 2022 18:02
von georg
Hallo, Wolfgang -


wenn keine weiteren Vorgaben existieren, würde ich das Array nach Kontonummer sortieren, und das sortierte Array durchlaufen und bei jedem Wechsel der Kontonummer (Gruppenwechsel) {alte Kontonummer, Summe} an das neue Array anhängen.

Re: Array auswerten

Verfasst: So, 20. Mär 2022 18:10
von Wolfgang_B
Hallo Georg,
das probier ich schon die ganze Zeit. Funktioniert auch bis zurm letzten Step. Dann ist i um 1 größer als LEN(aKto) und da knallts ...

Code: Alles auswählen

	For i = 1 TO LEN(aKto )	
		
		nKto := aKto[i,1]	
		cKtoBez := aKto[i,3]
		
		DO WHILE nKto == aKto[i,1]
			nSum+=aKto[i,2]
			i++
		ENDDO
		
		AADD(aData, { nKto, nSum, cKtoBez, msgId })		
		nSum 		:= 0
		cKtoBez 	:= ""
	NEXt

Re: Array auswerten

Verfasst: So, 20. Mär 2022 18:37
von azzo
Hallo Wolfgang,
ich mache es immer so:

Code: Alles auswählen


function main()
	local aKtoSum := {}
	local ISeek := 0
	local I := 0
	local aKto := { ;
		{"Konto1   1000",	  10},;
		{"Konto1   1000",	   2},;
		{"Konto1   1000",	 399},;
		{"Konto2   1010",	  34},;
		{"Konto3   3000",	   2},;
		{"Konto4   4000",	6555},;
		{"Konto5   8100",	   6},;
		{"konto1   1000",	  34},;
		{"Konto3   3000",	  77 }}
	
	//xbrowse( aKto )
	
	
	FOR I := 1 to len(aKto)
	
	 ISeek := ASCAN( aKtoSum, {|aVal| aVal[1] == aKto[I,1] })
	      if ISeek  != 0
	         aKtoSum[ ISeek,2 ] +=  aKto[I,2]
	      else
	         aadd(aKtoSum,{  aKto[I,1], aKto[I,2] } )
	      endif
	
	NEXT
	//xbrowse( aKtoSum )

return nil



LG
Otto

Re: Array auswerten

Verfasst: So, 20. Mär 2022 18:46
von Wolfgang_B
Otto, vielen Dank! Funktioniert. Ich habe mir die letzten 3 Stunden hier einen abgebrochen ... :banghead:
Wahrscheinlichmüßte ich bei meiner Funktion mit 2 Variablen arbeiten. Deine Variante ist aber deutlich eleganter. :D

Re: Array auswerten

Verfasst: So, 20. Mär 2022 21:28
von azzo
Hallo Wolfgang,
fein. Seit einiger Zeit verwende ich vermehrt HASH Tables. Würde das bei dir auch funktionieren?

LG
Otto

Code: Alles auswählen


function main()
	local I := 0
	local aKto := { ;
		{"Konto1   1000",	  10},;
		{"Konto1   1000",	   2},;
		{"Konto1   1000",	 399},;
		{"Konto2   1010",	  34},;
		{"Konto3   3000",	   2},;
		{"Konto4   4000",	6555},;
		{"Konto5   8100",	   6},;
		{"Konto1   1000",	  34},;
		{"Konto3   3000",	  77 }}
	local hKto := {=>}
	? "mit HASH"
	FOR I := 1 to len(aKto)
		hKto[ aKto[I,1] ] := hb_HGetDef( hKto, aKto[I,1], 0 ) + aKto[I,2]
	NEXT
	//xbrowse( hKto, "HASH" )

return nil



Re: Array auswerten

Verfasst: Mo, 21. Mär 2022 10:02
von Frank Grossheinrich
Hallo Zusammen,

darf ich auch noch einen Lösungsvorschlag beisteuern?

Code: Alles auswählen

#include "Common.ch"
#include "dac.ch"

PROCEDURE Main()
        LOCAL aKtoSum := {}
        LOCAL aKto := { ;
                {"Konto1   1000",          10},;
                {"Konto1   1000",           2},;
                {"Konto1   1000",         399},;
                {"Konto2   1010",          34},;
                {"Konto3   3000",           2},;
                {"Konto4   4000",        6555},;
                {"Konto5   8100",           6},;
                {"konto1   1000",          34},;
                {"Konto3   3000",          77 }}

   SELECT field1 AS konto, SUM( field2 ) AS Summe FROM ( aKto ) GROUP BY konto ORDER BY Summe DESC INTO ARRAY aKtoSum
   ? aKtoSum
   WAIT

RETURN
Und? :)

Grüße,
Frank

Re: Array auswerten

Verfasst: Mo, 21. Mär 2022 11:56
von Wolfgang_B
@Frank - genial!!! :D :D Auf SQL bin ich noch gar nicht gekommen. Das eröffnet mir ja gewaltige Perspektiven. Funktioniert einwandfrei. Habe das Statement noch etwas erweitert, damit ich die restlichen Information in das Zielarray bekomme. Werde jetzt noch andere Stellen in meinem Programm mit SQL modifizieren.

Vielen Dank für die Anregung!!

@Otto - mit Hashtables habe ich bis jetzt noch nicht gearbeitet. Werde ich auch mal ausprobieren. Vielen Dank!

Re: Array auswerten

Verfasst: Mo, 21. Mär 2022 12:09
von Frank Grossheinrich
Hallo Wolfgang,

schön, wenn ich eine Anregung geben konnte.
Ja, wenn es um Arrays geht, kann man das mit (Xbase++) SQL sehr nett lösen.
Nie wieder dieses leidige hoch- und runterzählen von Variablen und Dergleichen. Dem Sortieren, dem Suchen, dem ...

Ich finde man kann den SQL Code auch ganz gut lesen.

Das geht übrigens auch bei DBF Tabellen :)

Schöne Grüße,
Frank

Re: Array auswerten

Verfasst: Mo, 21. Mär 2022 13:28
von Wolfgang_B
Hallo Frank, ich habe vor 20 Jahren mal mit SQL und Oracle-DB gearbeitet. Da muß ich nur mal meine SQL-Kenntnisse wieder rauskramen :D