Hej vill göra det på riktigt sätt. recordset blir slöa. det kan vara många rader med mycket text och många kolumner..sortera om man har flera kolumner
Söker lite hjälp ang sortering (vb 6).
Quicksort funkar ju bra om man har en kolumn som skall sorteras.
Men säg att man har följande struktur
Patient Weight Height Name
4 60 1.45 Kalle
2 70 1.70 Bo
10 55 1.55 Maria
Då gäller att det finns ett inbördes förhållande mellan kolumnerna. Och detta är ju faktiskt mer vanligt än ovanligt. Använder jag quicksort så kan jag bara köra det på en kolumn i taget, och då uppstår ju fenomen som att patient 2 för vikten 55, höjden 1.45 och namnet Bo.
Jag söker efter en bra algoritm som sorterar x antal kolumner men ej kastar om inbördes förhållandet.
Jobbar mkt med sas, och där finns en procedur som heter proc sort
Synataxen hade i fallet ovan kanske blivit:
proc sort data=testdata;
by patient weight height name;
run;
eller varför inte
proc sort data=testdata;
by name patient;
run;
ja, ni fattar vad jag är ute efter; en motsvarande "procedur" i visual basic.
Jag har buffrat allt i minnet i form av dynamiska arrayer, så den bör ju kunna ta en array + sorteringordning (variabelnamn) + ascending eller descending etc som argument. Självklart måste missing värden och olika datatyper (text, numerisk) hanteras.
någon?
mvhSv:sortera om man har flera kolumner
det skall alltså vara så här att man skall kunna ge en sorteringsorder.
om vi tar exemplet
Age Initials
12 AL
12 AB
13 CG
så skall sortering ske på age och initial (alltså båda två, först age sen initial om det tillåter sortering)
dvs om andra sorteringsordningen tillåter inbördes sortering utan att första sorteringsordningen störs, så skall den sortera efter detta. det är alltså skillnad från att bara sortera på första ordningen och låta andra sort.ordningen "hänga med"
klassisk generall sortering alltså.Sv: sortera om man har flera kolumner
Function NewRecordset() As ADODB.Recordset
Dim rs As ADODB.Recordset
Set rs = New ADODB.Recordset
rs.Fields.Append "Age", adInteger
rs.Fields.Append "Initials", adVarChar, 5
rs.Open
Set NewRecordset = rs
End Function
Sub FillData(rs As ADODB.Recordset)
Dim I As Long
For I = 1 To 1000
rs.AddNew Array("Age", "Initials"), Array(I, CreateInitials)
Next
rs.MoveFirst
End Sub
Function CreateInitials() As String
CreateInitials = Chr(65 + Int(Rnd * 26)) + Chr(65 + Int(Rnd * 26))
End Function
Sub TestRecordset()
Dim rs As ADODB.Recordset
Set rs = NewRecordset
FillData rs
rs.Sort = "Initials, Age DESC"
Do Until rs.EOF
Debug.Print rs(0), rs(1)
rs.MoveNext
Loop
End Sub