"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

"M" nach hinten sortieren ? [erledigt]

Beitragvon AUGE_OHR » So, 02. Okt 2016 5:02

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
Benutzeravatar
AUGE_OHR
Marvin
Marvin
 
Beiträge: 10284
Registriert: Do, 16. Mär 2006 8:55
Wohnort: Hamburg

Re: "M" nach hinten sortieren ?

Beitragvon UliTs » So, 02. Okt 2016 8:08

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
UliTs
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
 
Beiträge: 2373
Registriert: Fr, 10. Feb 2006 10:51
Wohnort: Aachen

Re: "M" nach hinten sortieren ?

Beitragvon AUGE_OHR » So, 02. Okt 2016 17:22

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
Benutzeravatar
AUGE_OHR
Marvin
Marvin
 
Beiträge: 10284
Registriert: Do, 16. Mär 2006 8:55
Wohnort: Hamburg

Re: "M" nach hinten sortieren ?

Beitragvon UliTs » So, 02. Okt 2016 21:10

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
UliTs
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
 
Beiträge: 2373
Registriert: Fr, 10. Feb 2006 10:51
Wohnort: Aachen

Re: "M" nach hinten sortieren ?

Beitragvon AUGE_OHR » So, 02. Okt 2016 23:05

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
Benutzeravatar
AUGE_OHR
Marvin
Marvin
 
Beiträge: 10284
Registriert: Do, 16. Mär 2006 8:55
Wohnort: Hamburg

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

Beitragvon UliTs » So, 02. Okt 2016 23:19

Gern geschehen :D .
-------
Mitglied XuG Cologne
Mitglied XuG Osnabrück
UliTs
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
 
Beiträge: 2373
Registriert: Fr, 10. Feb 2006 10:51
Wohnort: Aachen


Zurück zu Programmierung allgemein

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 3 Gäste