3-Dim-Array sortieren und eine Dimension kopieren

Zugriff, Engines, Konvertierung. Von ADS über DBF bis zu SQL.

Moderator: Moderatoren

Antworten
Daniel

3-Dim-Array sortieren und eine Dimension kopieren

Beitrag 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
Zuletzt geändert von Daniel am Mi, 05. Apr 2017 15:28, insgesamt 1-mal geändert.
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16502
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Re: Eine Dimension aus Array kopieren

Beitrag 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
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Eine Dimension aus Array kopieren

Beitrag 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.
Gruß
Hubert
Daniel

Re: Eine Dimension aus Array kopieren

Beitrag 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.
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16502
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Re: Eine Dimension aus Array kopieren

Beitrag 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
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16502
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Re: Eine Dimension aus Array kopieren

Beitrag 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
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Daniel

Re: Eine Dimension aus Array kopieren

Beitrag 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.
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16502
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Re: Eine Dimension aus Array kopieren

Beitrag von Martin Altmann »

Probiere mal:

Code: Alles auswählen

AEval( aAbos, {|a| aADD( aArray, a[3] ) } ) 
Viele Grüße,
Martin
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Daniel

Re: Eine Dimension aus Array kopieren

Beitrag 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.
Zuletzt geändert von Daniel am Mi, 05. Apr 2017 13:06, insgesamt 1-mal geändert.
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16502
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Re: Eine Dimension aus Array kopieren

Beitrag 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
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9345
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Re: Eine Dimension aus Array kopieren

Beitrag 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.
Herzlich,
Tom
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16502
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Re: Eine Dimension aus Array kopieren

Beitrag von Martin Altmann »

Tom,
in dem Fall schon, da hast Du Recht.

Viele Grüße,
Martin
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Daniel

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

Beitrag von Daniel »

Prima, besten Dank Euch beiden!
Das läuft jetzt tipptopp.
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

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

Beitrag 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" )
gruss by OHR
Jimmy
Daniel

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

Beitrag von Daniel »

hallo Jimmy

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