2-Dim Array eine Spalte rauskopieren [erledigt]

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

Moderator: Moderatoren

Antworten
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

2-Dim Array eine Spalte rauskopieren [erledigt]

Beitrag von AUGE_OHR »

hi,

wenn ich mit DBSTRUC() ein Array habe wie ziehe ich mir nur die Spalte z.b. DBS_NAME raus ?

Code: Alles auswählen

aCopy := AEVAL(aDbstru,{|a,i| a := a[DBS_NAME],,,.T.})
gruss by OHR
Jimmy
UliTs
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2828
Registriert: Fr, 10. Feb 2006 9:51
Wohnort: Aachen
Hat sich bedankt: 259 Mal
Danksagung erhalten: 12 Mal
Kontaktdaten:

Re: 2-Dim Array eine Spalte rauskopieren [erledigt]

Beitrag von UliTs »

Hallo Jimmy,

Dein Code hat einen Schönheitsfehler: Du zerstörst dabe den Inhalt von aDbstru!
Probiere mal (ungetestet)

Code: Alles auswählen

aName := array( len(aBdbstru) )
AEVAL(aDbstru,{|a,i| aName[i] := a[DBS_NAME]})
Dann kannst Du auch mehrere Spalten extrahieren :-) .

Uli
-------
Mitglied XuG Cologne
Mitglied XuG Osnabrück
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: 2-Dim Array eine Spalte rauskopieren [erledigt]

Beitrag von AUGE_OHR »

UliTs hat geschrieben:Du zerstörst dabe den Inhalt von aDbstru!
dafür gibt es ACLONE() wenn man es nicht will was man "vorher" ja "sichern" kann.
UliTs hat geschrieben:Probiere mal (ungetestet)

Code: Alles auswählen

aName := array( len(aBdbstru) )
AEVAL(aDbstru,{|a,i| aName[i] := a[DBS_NAME]})
Dann kannst Du auch mehrere Spalten extrahieren :-) .
ich benötige nur die "Feld" Namen weil DBS_TYPE und DBS_LEN "so" unter PostgreSQL nicht existieren.
die Dbstruct.ch Konstante verwende ich hier nur aus Gewohnheit für ein solches Array
gruss by OHR
Jimmy
Sören
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 205
Registriert: Mo, 07. Aug 2006 10:18
Wohnort: Leipzig
Danksagung erhalten: 11 Mal

Re: 2-Dim Array eine Spalte rauskopieren [erledigt]

Beitrag von Sören »

Hallo Jimmy,

ich verwende dafür diese kleine Funktion (ist im Prizip das gleiche wie Ulis Ansatz):

Code: Alles auswählen

// - Spalte eines 2-dimensionalen Arrays als 1-dimensionales Array zurueckgeben
// - Bsp.:  a := { { "1A", "1B", "1C" }, { "2A", "2B", "2C" }, { "3A", "3B", "3C" } }
//          ACol( a, 2 ) --> { "1B", "2B", "3B" }
FUNCTION ACol( aArray, nColPos )
  LOCAL aCol := Array( Len( aArray ) )
  DEFAULT nColPos TO 1
  AEval( aArray, { |a,i| aCol[i] := a[nColPos] } )
RETURN aCol
Beste Grüße,
Sören
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: 2-Dim Array eine Spalte rauskopieren [erledigt]

Beitrag von brandelh »

AUGE_OHR hat geschrieben:hi,
wenn ich mit DBSTRUC() ein Array habe wie ziehe ich mir nur die Spalte z.b. DBS_NAME raus ?

Code: Alles auswählen

aCopy := AEVAL(aDbstru,{|a,i| a := a[DBS_NAME],,,.T.})
war das überhaupt als Frage gedacht ?
Wenn aDbstru nicht mehr gebraucht wird, könnte das als Lösung gedacht gewesen sein.
Gruß
Hubert
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: 2-Dim Array eine Spalte rauskopieren [erledigt]

Beitrag von AUGE_OHR »

brandelh hat geschrieben:war das überhaupt als Frage gedacht ?
Wenn aDbstru nicht mehr gebraucht wird, könnte das als Lösung gedacht gewesen sein.
zunächst war es ja eine Frage ... als ich eine Lösung gefunden hatte hat ich das Thema auf [erledigt] gesetzt.
damit nun nicht die Frage kommt : ja "wie" denn hab ich meine verwendetet Lösung gepostet.

Ulli Hinweis war richtig denn ich hätte 2 statt 1 Zeilen veröffentlichen sollen wo ein ACLONE() "irgendwo" davor schon vorhanden war.
gruss by OHR
Jimmy
UliTs
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2828
Registriert: Fr, 10. Feb 2006 9:51
Wohnort: Aachen
Hat sich bedankt: 259 Mal
Danksagung erhalten: 12 Mal
Kontaktdaten:

Re: 2-Dim Array eine Spalte rauskopieren [erledigt]

Beitrag von UliTs »

AUGE_OHR hat geschrieben:zunächst war es ja eine Frage ... als ich eine Lösung gefunden hatte hat ich das Thema auf [erledigt] gesetzt.
damit nun nicht die Frage kommt : ja "wie" denn hab ich meine verwendetet Lösung gepostet.
Besser 2 Antworten posten. Dann kann man es leichter verstehen :D
Uli
-------
Mitglied XuG Cologne
Mitglied XuG Osnabrück
UliTs
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2828
Registriert: Fr, 10. Feb 2006 9:51
Wohnort: Aachen
Hat sich bedankt: 259 Mal
Danksagung erhalten: 12 Mal
Kontaktdaten:

Re: 2-Dim Array eine Spalte rauskopieren [erledigt]

Beitrag von UliTs »

AUGE_OHR hat geschrieben:Uli's Hinweis war richtig denn ich hätte 2 statt 1 Zeilen veröffentlichen sollen wo ein ACLONE() "irgendwo" davor schon vorhanden war.
Warum es sich einfach machen, wenn es mit AClone() auch eine komplizierte, speicherintensivere und langsamere Lösung gibt? ;-)
Uli
-------
Mitglied XuG Cologne
Mitglied XuG Osnabrück
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: 2-Dim Array eine Spalte rauskopieren [erledigt]

Beitrag von AUGE_OHR »

UliTs hat geschrieben:
AUGE_OHR hat geschrieben:Uli's Hinweis war richtig denn ich hätte 2 statt 1 Zeilen veröffentlichen sollen wo ein ACLONE() "irgendwo" davor schon vorhanden war.
Warum es sich einfach machen, wenn es mit AClone() auch eine komplizierte, speicherintensivere und langsamere Lösung gibt? ;-)
weil ACLONE() in meinen Konzept schon vorher vorhanden war und das Problem hinterher entstand.

ich habe einen "Stack" wo ich die "originale" ablege z.b. vor dem "edit".
zum "arbeiten" nehme ich eine "Kopie" was in meiner Method per ACLONE() passiert.

da ich auch nicht "Gather()" mag, schon weil es "so" nicht netzwerkfähig ist, ergibt sich dieser Code

Code: Alles auswählen

   SELECT (::cAlias )
   IF NET_LOCK(nRec)
      iMax := LEN( ::aEditKopie )
      FOR i := 1 TO iMax
          IF ::aOriginal[i] <> ::aEditKopie[i]
             FieldPut( i , ::aEditKopie[i] )
          ENDIF
      NEXT
   ENDIF
somit ist ACLONE() ein Teil meines Konzept und ich kam nicht drauf, wenn ich mehrere Dimensionen habe, wie ich das "reduziere" und stelle die Anfrage.

p.s. wir reden hier von Arrays die man zum "editieren" eines "Record" von DBF oder Table benutzt also nicht viel RAM ... wenn man nicht Memo Type "V" verwendet ...
gruss by OHR
Jimmy
Antworten