Seite 1 von 1

"M" nach hinten sortieren ? [erledigt]

Verfasst: So, 02. Okt 2016 5:02
von AUGE_OHR
ich habe ein Array von DbStruct(). ich möchte die "M"emo Felder ans Ende sortieren.

das sortiert mir das "M" nach oben :?:

Code: Alles auswählen

 aSort := ASORT( aFelder,,, {|c1,c2| IF(c1[DBS_TYPE]="M",.T.,.F.) } ) 
und das sortiert zwar ans Ende

Code: Alles auswählen

 aSort := ASORT( aFelder,,, {|c1,c2| IF(c1[DBS_TYPE]="M",.F.,.T.) } ) 
aber die anderen Element sind "durcheinander" :?:

hier mal Test Code, DBF wird erstellt

Code: Alles auswählen

#include "Dbstruct.ch"

PROCEDURE MAIN
LOCAL aStru

   if !file("MEMODBF.DBF")
      C_MEMODBF("MEMODBF.DBF")
   endif

   use MEMODBF
   aStru := DbStruct()
   msgbox(VAR2CHAR(aStru),"original")

   // "M" ans Ende
   // sonstige Reihen folge nicht verändern
   ASORT(aStru,,, {|x,y| x[DBS_TYPE] <> "M" })

   // soll werden :
   // C N D L
   // Notiz1 - Notiz4
   msgbox(VAR2CHAR(aStru),"<>")

RETURN

FUNCTION C_MEMODBF(datei,alias,id)
LOCAL p,field_list:={}

  if valtype(datei)!="C"
    datei="MEMODBF.DBF"
  endif
  if valtype(alias)!="C"
    p=at(".",datei)
    alias=if(p>0,substr(datei,1,p-1),datei)
  endif
  if valtype(id)!="N"
    id=0
  endif
  select (id)
  if !file(datei)
    aadd(field_list,{"TEST"  ,"C",10,0})
    aadd(field_list,{"NOTIZ1","M",10,0})
    aadd(field_list,{"NUM"   ,"N",10,0})
    aadd(field_list,{"NOTIZ2","M",10,0})
    aadd(field_list,{"DATUM" ,"D" ,8,0})
    aadd(field_list,{"NOTIZ3","M",10,0})
    aadd(field_list,{"LOGIK" ,"L", 1,0})
    aadd(field_list,{"NOTIZ4","M",10,0})
    dbcreate(datei,field_list)
  endif

RETURN(.t.)
wie macht man das richtig ? :-k

Re: "M" nach hinten sortieren ?

Verfasst: So, 02. Okt 2016 8:08
von UliTs
Hallo Jimmy,

ich vermute mal, du möchtest die anderen Elemente ebenfalls nach dem Feldtypen sortieren?
Dann mach es am besten mit einer "Reihenfolge-Funktion":

Code: Alles auswählen

STATIC FUNCTION SortierReihenfolge( cFieldType )
RETURN(  IIF( cFieldType=="M",1,;
         IIF( cFieldType=="N",2,;
         IIF( cFieldType=="C",3,;
         IIF( cFieldType=="D",4,;
         IIF( cFieldType=="L",5,;
                              99 )))));  // Unbekannt an's Ende setzen
      )
Dann kannst Du die Sortierung ganz leicht wie folgt vornehmen (ungetestet):

Code: Alles auswählen

 aSort := ASORT( aFelder,,, {|c1,c2| SortierReihenfolge(c1)>SortierReihenfolge(c2) } )
Ist es das, was Du wolltest?

Re: "M" nach hinten sortieren ?

Verfasst: So, 02. Okt 2016 17:22
von AUGE_OHR
hi,

Danke für deine Antwort.

die "M"emo Felder sollen zum editieren am Ende des Scroll-Dialog auftauchen da ich Problem beim platzieren in einer FOR / NEXT Schleife habe. die restlichen Felder sollten in der Reihenfolge bleiben wie der User es ausgewählt hat.

die DBF könnte 1 oder 100 Memo Felder haben, deshalb wird dein Vorschlag "so" nicht reichen.

z.Z. gehe ich in einer Schleife durch das DbStruct() Array und erstelle 2 neue Arrays.
alles ausser Type "M" wird im 1st Array aufgenommen. die "M" Typen im 2nd Array werden dann an das 1st Array angehängt.

---

wenn ich von Directory() ein Array erhalte kann ich die "D"irectorys "nach vorne" sortieren

Code: Alles auswählen

      // sort Directory 1st
      ASORT(aDir,,, {|x,y| "D" $ x[LV_ATTR] })
      AEVAL(aDir,   {|x,i| nStartAt := IF("D" $ x[LV_ATTR], i, nStartAt) })
      // Rest start here 
      ASORT(aDir,1,nStartAt,{|x,y|  UPPER(x[LV_NAME]) < UPPER(y[LV_NAME]) })
wie müsste es aussehen wenn man die Directory "nach hinten" sortieren möchte ?

Re: "M" nach hinten sortieren ?

Verfasst: So, 02. Okt 2016 21:10
von UliTs
AUGE_OHR hat geschrieben:...
die "M"emo Felder sollen zum editieren am Ende des Scroll-Dialog auftauchen da ich Problem beim platzieren in einer FOR / NEXT Schleife habe. die restlichen Felder sollten in der Reihenfolge bleiben wie der User es ausgewählt hat.

die DBF könnte 1 oder 100 Memo Felder haben, deshalb wird dein Vorschlag "so" nicht reichen.
Obige Lösung war (natürlich) ganz unabhängig von der Anzahl der Memo-Felder.
Ich habe mal versucht, das Ganze mit dem Rückgabewert von DbStruct() (steht in aFelder) umzusetzen und die Funktion Sortierreihenfolge entsprechend anzupassen):

Code: Alles auswählen

STATIC FUNCTION SortierReihenfolge( cFieldType )
RETURN(  IIF( cFieldType=="M",1,;
                              99 );  // Sonst an's Ende/Anfang setzen
      )
Dann kannst Du die Sortierung ganz leicht wie folgt vornehmen (ungetestet):

Code: Alles auswählen

 aSort := ASORT( aFelder,,, {|aFeld1,aFeld2| SortierReihenfolge( aFeld1[DBS_TYPE]/*cFieldType*/ ) >= SortierReihenfolge(aFeld2[DBS_TYPE]/*cFieldType*/) } )
Ich meine, durch das ">=" bleibt die Reihenfolge bei identischem Wert erhalten.
Ist es das, was Du wolltest?

Dann hast Du noch eine zweite Sortierung von Verzeichnissen angesprochen. Die geht entsprechend genauso einfach. Bekommst Du das hin?

Uli

Re: "M" nach hinten sortieren ?

Verfasst: So, 02. Okt 2016 23:05
von AUGE_OHR
UliTs hat geschrieben:

Code: Alles auswählen

STATIC FUNCTION SortierReihenfolge( cFieldType )
RETURN(  IIF( cFieldType=="M",1,;
                              99 );  // Sonst an's Ende/Anfang setzen
      )
Dann kannst Du die Sortierung ganz leicht wie folgt vornehmen (ungetestet):

Code: Alles auswählen

 aSort := ASORT( aFelder,,, {|aFeld1,aFeld2| SortierReihenfolge( aFeld1[DBS_TYPE]/*cFieldType*/ ) >= SortierReihenfolge(aFeld2[DBS_TYPE]/*cFieldType*/) } )
Ich meine, durch das ">=" bleibt die Reihenfolge bei identischem Wert erhalten.
Ist es das, was Du wolltest?
YUP =D>

DANKE, das ist die Lösung die ich haben wollte, nur die 99 hab ich auf 255 angehoben.

Re: "M" nach hinten sortieren ? [erledigt]

Verfasst: So, 02. Okt 2016 23:19
von UliTs
Gern geschehen :D .