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 ...
Wahrscheinlichmüßte ich bei meiner Funktion mit 2 Variablen arbeiten. Deine Variante ist aber deutlich eleganter.
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!!!
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