"M" nach hinten sortieren ? [erledigt]

Alle Fragen um die Programmierung, die sich sonst nicht kategorisieren lassen. Von Makro bis Codeblock, von IF bis ENDIF

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

"M" nach hinten sortieren ? [erledigt]

Beitrag 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
Zuletzt geändert von AUGE_OHR am So, 02. Okt 2016 23:06, insgesamt 1-mal geändert.
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: "M" nach hinten sortieren ?

Beitrag 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?
-------
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: "M" nach hinten sortieren ?

Beitrag 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 ?
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: "M" nach hinten sortieren ?

Beitrag 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
-------
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: "M" nach hinten sortieren ?

Beitrag 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.
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: "M" nach hinten sortieren ? [erledigt]

Beitrag von UliTs »

Gern geschehen :D .
-------
Mitglied XuG Cologne
Mitglied XuG Osnabrück
Antworten