Seite 1 von 1

3-Dim-Array sortieren und eine Dimension kopieren

Verfasst: Mi, 05. Apr 2017 10:54
von Daniel
Hallo

ich habe einen Array mit 3 Dimensionen.
Aus diesem möchte ich nur die 3. Dimension als Ganzes in einen andern Array kopieren.
- ACopy kopiert aber nur die 1. Dimension,
- bei AEval habe ich noch nicht rausgefunden, wie man die 3. Dim. richtig anspricht und wie man es in einen andern Array überträgt.
- Die Kombination von AAdd mit AEval hat bisher noch nicht zum Ziel geführt.
- die Beispiele von Array to ListBox mit AddItem oder von AEval mit Qout konnte ich auch nicht anwenden.

Aber bestimmt gibt es eine gute Lösung ... - bin dankbar für einen Tipp

Re: Eine Dimension aus Array kopieren

Verfasst: Mi, 05. Apr 2017 11:06
von Martin Altmann
Daniel,
zeige doch mal den Source, den Du bisher hast - macht die Sache einfacher in der Erklärung!

Viele Grüße,
Martin

Re: Eine Dimension aus Array kopieren

Verfasst: Mi, 05. Apr 2017 11:27
von brandelh
Ein Array (1. Dimension) kann auf ein anderes Array verweißen (2. Dimension) und aus diesem auf ein weiteres (3. Dimension).

ADim1[3] = wäre der Verweis auf des 3. Element der 1. Dimension
ADim1[3,6] = wäre der Verweis auf 6. Element der 2. Dimension innerhalb von dem 3. Element der 1. Dimension
Wenn nun ADim1[3,6] auf ein weiteres Array (3. Dimension) verweist, dann ist das auch die Adresse für dieses Array der 3. Dimension.
Wenn nun ADim1[3,6,1] wäre hingegen das 1. Element aus dem 6. Element aus dem 3. Element

AEval( aDim1 , ) würde alle Elemente der 1. Dimension abarbeiten ...

Ist es das was du meinst ?
Zeige doch mal die Daten (Array mit Daten) und denn was du genau vom einen im anderen willst.

PS: ich denke mit geschachtelten FOR NEXT Schleifen ist die Lösung am einfachsten zu verstehen und auch am flexibelsten umzusetzen.

Re: Eine Dimension aus Array kopieren

Verfasst: Mi, 05. Apr 2017 11:33
von Daniel
Hallo Martin

ja gut, viel ist es nicht, was das Problem selber betrifft.
aAbos ist der Array mit 3 Dimensionen. Die andern Dimensionen brauche ich zum Sortieren. Das scheint soweit zu funktionieren.

Code: Alles auswählen

   *aADD( aArray, AEval( aAbos, {|x,i| aAbos[i,3] } ) )   // übernimmt Alles, statt nur das 3. Elem.!
   aADD( aArray, AEval( aAbos, {|a| a[3] } ) )            // übernimmt Alles! // Bsp. AEval
- Danke, Hubert
- ich mach gleich noch ein besseres Beispiel mit Musterdaten.

Re: Eine Dimension aus Array kopieren

Verfasst: Mi, 05. Apr 2017 11:39
von Martin Altmann
Moin Daniel,
was Du da zeigst, ist kein Dreidimensinales Array - es ist ein Array, das weitere Arrays enthält (zweidimensional, wie ein Schachbrett).
Du möchtest scheinbar aus jeder Zeile des Arrays die dritte Spalte haben - ist das so richtig verstanden?

Viele Grüße,
Martin

Re: Eine Dimension aus Array kopieren

Verfasst: Mi, 05. Apr 2017 11:47
von Martin Altmann
Wenn die dritte Spalte jedoch als Element ein Array enthält, musst du dieses mit Aclone in das neue Zielarray übernehmen!

Viele Grüße,
Martin

Re: Eine Dimension aus Array kopieren

Verfasst: Mi, 05. Apr 2017 11:51
von Daniel
Also, ich habe folgende Daten aus einer DBF:
nSort1, nSort2, cString
cString ist aus mehreren Feldern zusammengesetzt.
Die Daten aus einer Selektion übernehme ich in einen Array aAbos:

Code: Alles auswählen

 DO WHILE KundenNr = nKunde
    aADD( aAbos, { str( nSort1,8), str( nSort2,1), cString }  ) 
    DbSkip()
 EndDO
 ASort( aAbos,,, {|aX,aY| aX[1] > aY[1] } )   // zuerst absteigend nach nSort1
 ASort( aAbos,,, {|aX,aY| aX[2] > aY[2] } )   // dann absteigend nach nSort2
Jetzt möchte ich die sortierten Daten von cString herauskopieren, um sie nachher anzuzeigen.

Re: Eine Dimension aus Array kopieren

Verfasst: Mi, 05. Apr 2017 11:59
von Martin Altmann
Probiere mal:

Code: Alles auswählen

AEval( aAbos, {|a| aADD( aArray, a[3] ) } ) 
Viele Grüße,
Martin

Re: Eine Dimension aus Array kopieren

Verfasst: Mi, 05. Apr 2017 12:44
von Daniel
Danke, Martin

Habe es probiert, und es scheint zu klappen.

Allerdings zeigt sich, dass das mit der doppelten Sortierung so nicht geht (habe ich fast befürchtet), weil die zweite Sortierung offenbar die erste aufhebt (?).
Vielleicht muss ich nach der ersten Sortierung den Array klonen?

- das läuft noch nicht auf Anhieb, ich probiere da noch weiter.

Re: Eine Dimension aus Array kopieren

Verfasst: Mi, 05. Apr 2017 13:01
von Martin Altmann
Sorry,
das hatte ich nicht für wichtig erachtet: Du musst innerhalb eines Schrittes sortieren und dabei prüfen, ob die Werte in der 1. Spalte identisch sind, dann wird nach der zweiten Spalte sortiert - sonst nach der ersten:

Code: Alles auswählen

asort( aAbos,,, {|aX,aY| iif( aX[ 1 ] <> aY[ 1 ], aX[ 1 ] > aY[ 1 ], aX[ 2 ] > aY[ 2 ] ) } )
Viele Grüße,
Martin

Re: Eine Dimension aus Array kopieren

Verfasst: Mi, 05. Apr 2017 13:09
von Tom
Das geht auch einfacher:

Code: Alles auswählen

ASort( aAbos,,, {|aX,aY| aX[1]+aX[2] > aY[1]+aY[2] } )
Sortiert wird dann nach Spalte 1, innerhalb von Spalte 1 aber nach Spalte 2.

Re: Eine Dimension aus Array kopieren

Verfasst: Mi, 05. Apr 2017 13:13
von Martin Altmann
Tom,
in dem Fall schon, da hast Du Recht.

Viele Grüße,
Martin

Re: 3-Dim-Array sortieren und eine Dimension kopieren

Verfasst: Mi, 05. Apr 2017 15:33
von Daniel
Prima, besten Dank Euch beiden!
Das läuft jetzt tipptopp.

Re: 3-Dim-Array sortieren und eine Dimension kopieren

Verfasst: Do, 06. Apr 2017 2:08
von AUGE_OHR
Daniel hat geschrieben:bei AEval habe ich noch nicht rausgefunden, wie man die 3. Dim. richtig anspricht und wie man es in einen andern Array überträgt.
angenommen du hast ein DbStruct() Array und willst nur die Feld Namen

Code: Alles auswählen

   // only Fieldnamen
   aArray := AEVAL( aStruc, {|a| a := a[F_NAME] },,, .T. )

   // Choise Fields
   aArray := PickList (oOwner, aArray, "Picklist Dialog" )

Re: 3-Dim-Array sortieren und eine Dimension kopieren

Verfasst: Do, 06. Apr 2017 10:53
von Daniel
hallo Jimmy

danke für den Tipp! Das ist interessant, die Picklist muss ich mal ausprobieren.