Avatar billede innercitydk Nybegynder
21. januar 2007 - 15:17 Der er 22 kommentarer og
1 løsning

Korrekt sortering af objekter (3 kriterier)

Jeg har et bruger objekt med følgende attributter knyttet til sig:

Point (int)
HireDate (Dato)
Birthday (Dato)

Jeg har så en liste af brugere i en database. Jeg henter alle brugerobjekterne ind i en arrayliste sorteret efter point(ASC). Jeg skal bruge en kodestump der kan sortere listen korrekt når der er sammenfald i point og ansættelsesdato.

Lad os antage at point for de første 5 brugere er følgende:

10,20,20,20,30 //Point

Her skal der for de 3 brugere med point sammenfald sorteres efter HireDate(ASC). Hvis der så er sammenfald ved HireDate skal der ved de brugere hvor der er sammenfald sorteres efter Birthday.

Jeg ønsker altså hjælp til at lave en stump kode(C#) der kan klare denne hurdle. Spørg endelig hvis jeg ikke har udtrykt mig klart nok, eller der skal bruges yderligere info.

Venlig hilsen

Nicki
Avatar billede kalp Novice
21. januar 2007 - 15:26 #1
det er 1000 gange lettere at gøre det i sql'en når  du alligevel henter det der
Avatar billede kalp Novice
21. januar 2007 - 15:27 #2
SELECT * FROM dintabel ORDER BY point, hiredate ASC
Avatar billede dr_chaos Nybegynder
21. januar 2007 - 16:34 #3
Du skal bruge noget i denne stil:
http://codebetter.com/blogs/david.hayden/archive/2005/03/06/56584.aspx
I stedet for at vælge mellem forskellige typer skal gøre sådan at du kigger på om points er en og hvis de er det sorterer du på hiredate.
Derefter evt på birthdate.
Avatar billede innercitydk Nybegynder
22. januar 2007 - 07:33 #4
Kalp jeg har prøvet at sortere direkte i SQL, men da min HireDate og Birthday er strings gør den det ikke korrekt. Jeg laver disse om til datoer i koden (har altid haft probs med db dato kontra .net dato)

Dr_chaos det ser ud til at være sådan noget jeg skal bruge. Jeg vil kigge på det og vende tilbage.
Avatar billede dr_chaos Nybegynder
22. januar 2007 - 07:40 #5
ok helt fint.
hvis du vil bruge sql skal du sørge for at konverterer til dato i den select statement.
Så kan du sorterer på den.
Avatar billede innercitydk Nybegynder
22. januar 2007 - 07:50 #6
har du muligvis et eksempel på konverteringen i SQL chaos? Hvis det virker vil det klart være det letteste.

Min SQL ser således ud:

//
    // *getUsers Function* input: Department(int), Year(int) Output: ArrayList af Users
    //
    public ArrayList getUsers(int Department, int Year)
    {
        string sql = "SELECT * FROM Person, Contact, YearlyPoints WHERE Person.MANr=Contact.MAnr AND Contact.MAnr=YearlyPoints.MAnr AND Person.IsActive=true AND YearlyPoints.Year=2006 AND Person.Department=" + Department + " ORDER BY YearlyPoints.Points ASC, Person.HireDate ASC";
        Foundation foundation = new Foundation();
        ArrayList result = foundation.selectUsers(sql);
        return result;
    }
Avatar billede dr_chaos Nybegynder
22. januar 2007 - 07:54 #7
noget i denne stil:

string sql = "SELECT * FROM Person, Contact, YearlyPoints WHERE Person.MANr=Contact.MAnr AND Contact.MAnr=YearlyPoints.MAnr AND Person.IsActive=true AND YearlyPoints.Year=2006 AND Person.Department=" + Department + " ORDER BY YearlyPoints.Points ASC,  convert(DateTime,Person.HireDate,105) ASC";
Avatar billede dr_chaos Nybegynder
22. januar 2007 - 07:57 #8
du kan læse mere om convert her:
http://msdn2.microsoft.com/en-us/library/ms187928.aspx

Der kan du også se en liste over forskellige date styles angivet med de 105 som der står i convert sætningen.
Avatar billede innercitydk Nybegynder
22. januar 2007 - 07:59 #9
Jeg får følgende exception:

Exception Details: System.Data.OleDb.OleDbException: Der er en ikke-defineret funktion "Convert" i udtrykket.

Virker som om den ikke kan kende convert funktionen. Det er en access db jeg arbejder på?!
Avatar billede dr_chaos Nybegynder
22. januar 2007 - 08:00 #10
ah.
derfor 2 sec.
Troede at du arbejdede med sql server.
Avatar billede dr_chaos Nybegynder
22. januar 2007 - 08:14 #11
Nu er jeg pænt sagt ikke så god til access sql :)
Men prøv lige med:

noget i denne stil:

string sql = "SELECT * FROM Person, Contact, YearlyPoints WHERE Person.MANr=Contact.MAnr AND Contact.MAnr=YearlyPoints.MAnr AND Person.IsActive=true AND YearlyPoints.Year=2006 AND Person.Department=" + Department + " ORDER BY YearlyPoints.Points ASC, CDate(Format([Person.HireDate],"mm/dd/yyyy")) ASC";
Avatar billede dr_chaos Nybegynder
22. januar 2007 - 08:14 #12
"mm/dd/yyyy" angiver date formatet. men det ved du sikkert godt.
Avatar billede innercitydk Nybegynder
22. januar 2007 - 08:16 #13
Jeg er dybt imponeret!! Det virker sq.

Som altid en fornøjelse at få hjælp fra dig chaos.
Avatar billede kalp Novice
22. januar 2007 - 08:16 #14
for at konvertere string til en int skal du smide det i CInt(din string)
Avatar billede innercitydk Nybegynder
22. januar 2007 - 08:16 #15
Smid et svar
Avatar billede dr_chaos Nybegynder
22. januar 2007 - 08:17 #16
gerne :)
Avatar billede kalp Novice
22. januar 2007 - 08:21 #17
Point (int)
HireDate (Dato)
Birthday (Dato)

sorry.. hehe kan se formatterne her jo;O)

men til det oprindelige.. så har det hele tiden været det mest logiske at det skulle klares via. sql'en og ikke via. c# delen.
Avatar billede innercitydk Nybegynder
22. januar 2007 - 08:26 #18
Det her har simpelthen sparet mig for så meget tid at det forstår man jo slet ikke. Jeg havde overhovedet ikke overvejet at der var funktioner der kunne klare dette. Du skal også have lidt point Kalp. Det var trods alt dig der ledte os på sporet. Chaos var så bare den geniale der hurtigt kunne fikse en løsning, derfor har han også fået "en større kage" :)

http://www.eksperten.dk/spm/757592

Vh
Avatar billede dr_chaos Nybegynder
22. januar 2007 - 08:27 #19
innercity.
Han får points fra min kage.
Da du ikke må giver mere end 200 points for et spm.
Avatar billede innercitydk Nybegynder
22. januar 2007 - 08:28 #20
ok. troede godt jeg måtte når det er til forskellige brugere. my bad
Avatar billede dr_chaos Nybegynder
22. januar 2007 - 08:29 #21
Nope.
Ikke fordi jeg går så meget op i det.
Men det er bedst at følge reglerne :)
Avatar billede innercitydk Nybegynder
22. januar 2007 - 08:30 #22
Helt enig!
Avatar billede kalp Novice
22. januar 2007 - 09:18 #23
jeg behøver ikke point for min deltagelse i spørgsmålet... jeg kunne bare lade være med at sove længe;o)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester