Avatar billede jesperwerge Nybegynder
05. juni 2005 - 13:51 Der er 16 kommentarer og
1 løsning

Sorter over 3 felter

Hej eksperter,

jeg har en access databse, med tre felter: StadeNr, StadeNr_1, StadeNr_2.

De indeholder alle numre og kan indeholde alt fra 0 - 67 default er 0, hvis andet ikke er valgt.

jeg skal vise en liste med alle tal fra de tre felter, men sorteret (ORDER BY) ASC, med komma som seperator.

udtrækket er enkelt, men sorteringen er ikke så nem.

Min Ide er at samle alle felter i en streng, og så sortere strengen inden jeg laver min Response.write.

Har i et andet forslag.

/Jesper

KODE:

<%
    Dim strDatoValgt
    StrDatoValgt = strDato
if request.querystring("AutoID")<>"NewRecord" then
SQL = "SELECT Dato,StadeNr,StadeNr_1,StadeNr_2 from [main] WHERE Cdate(Dato)='" & strDatoValgt & "' "
        set oRS8 = oDB.Execute(SQL)
        oRS8.Movefirst
            do while not oRS8.EOF
            IF oRS8("StadeNr") OR oRS8("StadeNr_1") OR oRS8("StadeNr_2")<> 0 then strTotalStader = oRS8("StadeNr") & "," & + oRS8("StadeNr_1") & "," & + oRS8("StadeNr_2") end if
        response.write strTotalStader
        oRS8.Movenext
          Loop
    End IF
        oDB.Close
          set oRS8 = Nothing
%>
Avatar billede jesperwerge Nybegynder
05. juni 2005 - 13:53 #1
er godt klar over at jeg ikke helt gør det jeg beskrive i min Ide, men...
Avatar billede nielle Nybegynder
05. juni 2005 - 21:32 #2
Den simple løsning er:

SQL = "SELECT Dato, StadeNr, StadeNr_1, StadeNr_2 from [main] WHERE Cdate(Dato)='" & strDatoValgt & "' ORDER BY StadeNr ASC, StadeNr_1 ASC, StadeNr_2 ASC"

Hvis du skal til at kombinere Stade, StadeNr_1 og StadeNr_2 til en streng først, så kan dette også gøres. Løsningen bliver dog noget mere besværligt og syntaksen afhænger af hvilken database du bruger (nedenstående eksempel er for MS Access):

InnerSQL = "SELECT StadeNr & '-' & StadeNr_1 & '-' & StadeNr_2 AS StadeID, Dato, StadeNr, StadeNr_1, StadeNr_2 from [main] WHERE Cdate(Dato)='" & strDatoValgt & "'"

OuterSQL = "SELECT * FROM (" & InnerSQL & ") ORDER BY OrderID"

Endvidere skal du være klar over at sorteringen nu bliver leksikografisk (dvs. den samme som i et leksikon):

1
10
2
3
30
4
Avatar billede jesperwerge Nybegynder
06. juni 2005 - 12:54 #3
Hej Nielle

tak for din response.

jeg bruger en MS Access database, og har førsøgt med dit 2. forslag med innerSQL og outerSQL - dog kan jeg ikke gennemskue hva du gør først i SQl select statementet? - Du selecter alle 3 felter med et bindestreg i mellem som et felt StadeID og så dato flett samt de første tre felter igen??? eller misforstår jeg dit forslag?

/Jesper
Avatar billede nielle Nybegynder
06. juni 2005 - 14:59 #4
Det er korrekt forstået. Der er nu ingen hemmelig grund til at jeg gør det på lige den måde - det var bare den hurtigste måde at lave en demo ud fra dit eget kodeeksempel. Du skal selvfølgelig kun SELECTe det som du vil have.

Lidt om min StadeID... Det var dig selv som startede med at nævne noget med "at samle alle felter i en streng", og det er det som jeg så gør med StadeID; Jeg laver en streng på formen "7-9-13". Hvis du salv vil have et andet format kan du bare gøre det. Aller helst ville jeg have lavet et eksempel hvor det kunne gøres med en samlet SQL, men det viste sig at man ikke umiddelbart kunne sortere med ORDER BY på StadeID:

SQL = "SELECT StadeNr & '-' & StadeNr_1 & '-' & StadeNr_2 AS StadeID, Dato, StadeNr, StadeNr_1, StadeNr_2 from [main] WHERE Cdate(Dato)='" & strDatoValgt & "' ORDER BY StadeID"

I stedet bruger jeg altså en subquery:

"SELECT * FROM (SELECT StadeNr & '-' & StadeNr_1 & '-' & StadeNr_2 AS StadeID, Dato, StadeNr, StadeNr_1, StadeNr_2 from [main] WHERE Cdate(Dato)='" & strDatoValgt & "') ORDER BY StadeID"

- og, for at strukturen skulle være mere synlig, delte jeg denne i en InnerSQL og en OuterSQL.
Avatar billede jesperwerge Nybegynder
06. juni 2005 - 15:22 #5
Hej igen,

jeg har fået dit forslag til at virke og forstår nu hvad du gør, men det hjælper mig ikke rigtig. desværre. det er lidt vigtigt at tallene fra de tre felter står i den rigtige rækkefølge ellers bliver det for besværligt at overskue, og da jeg har en masse "0" i felterne som jeg gerne vil sortere fra, så giver det lidt problemer. kan du hjælpe mig med den løsning med en streng eller et Array måske?

/Jesper
Avatar billede jesperwerge Nybegynder
06. juni 2005 - 15:26 #6
hej igen igen

glem min ovenstånede kommentar, det er før jeg har læst dit svar, sorry

jeg har forsøgt at lægge en where ind i outerSQl sætningen, kan man det?

/Jesper
Avatar billede jesperwerge Nybegynder
06. juni 2005 - 15:28 #7
testede lige din nye forslag og det virker også.

ville stadig gerne kunne tage alle 0 ud af de tre felter, har du en ide omkirng dette?
Avatar billede jesperwerge Nybegynder
06. juni 2005 - 15:41 #8
nu spørger jeg lige om et andet spørgsmål osm måske ville være lettere end denne løsningen jeg leder efter her.

det er selvfølgelig flere points hvis du mener det er lettere eller løsningen er lettere at skrive.

Spørgsmål: udgangspunkt i felterne som før beskrevet, 3 felter med tal i max 67 pr. felt. I en anden tabel har jeg alle nr, fra 1-67 og hvis jeg vil pare disse to tabeller, så jeg kun for de tal som ikke er i begge tabeller??

/Jesper
Avatar billede nielle Nybegynder
06. juni 2005 - 18:58 #9
Du skriver at du ikke vil have 0’er med. Betyder det at rækker, hvor bare en af søjlerne StadeNr, StadeNr_1 eller StadeNr_2 er 0, slet ikke skal med? Eller betyder det rækken skal med, men at 0’et bare ikke skal med i output?

Kan du ikke lige give mig en typisk samling af inddata og så fortælle mig hvordan output skal se ud? Så kan vi tage den derfra.
Avatar billede jesperwerge Nybegynder
06. juni 2005 - 19:16 #10
jo selvfølgelig - hvis feltet indeholder 0 skal det ikke med i listen

input:

felt1,felt2,felt3
1,0,0
78,0,0
5,67,0
2,4,5
10,9,0
7,0,0
17,0,0
Avatar billede nielle Nybegynder
06. juni 2005 - 20:34 #11
Hvordan skal output se ud med det indput?
Avatar billede jesperwerge Nybegynder
06. juni 2005 - 20:57 #12
1,2,3,4,5,6,7,9,..10,..17,...78,...,
Avatar billede nielle Nybegynder
06. juni 2005 - 21:19 #13
SQL1 = "SELECT StadeNr FROM [main] WHERE Cdate(Dato)='" & strDatoValgt & "'"
SQL2 = "SELECT StadeNr_1 AS StadeNr FROM [main] WHERE Cdate(Dato)='" & strDatoValgt & "'"
SQL3 = "SELECT StadeNr_2 AS StadeNr FROM [main] WHERE Cdate(Dato)='" & strDatoValgt & "'"

SQL = "SELECT StadeNr FROM ((" & SQL1 & ") UNION (" & SQL2 & ") UNION (" & SQL3 & ")) WHERE StadeNr<>0"
Avatar billede jesperwerge Nybegynder
06. juni 2005 - 21:43 #14
Jeg for en JOIN fejl på scriptet, du kan se min test her:

http://www.horsholmloppemarked.dk/admin/test.asp

kan du se hvorfor?
Avatar billede jesperwerge Nybegynder
06. juni 2005 - 21:51 #15
Koden ser således ud:

<% Session.LCID = 1030 %>
<%

    Set oDB = Server.CreateObject("ADODB.connection")
            oDB.Open "DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=" & Server.MapPath("../../db/lop_2005.mdb")
   
    Dim strDatoValgt
    StrDatoValgt = "05-06-2005"
    if request.querystring("AutoID")<>"NewRecord" then
        SQL1 = "SELECT StadeNr FROM [main] WHERE Cdate(Dato)='" & strDatoValgt & "'"
        SQL2 = "SELECT StadeNr_1 AS StadeNr FROM [main] WHERE Cdate(Dato)='" & strDatoValgt & "'"
        SQL3 = "SELECT StadeNr_2 AS StadeNr FROM [main] WHERE Cdate(Dato)='" & strDatoValgt & "'"

        SQL = "SELECT StadeNr FROM ((" & SQL1 & ") UNION (" & SQL2 & ") UNION (" & SQL3 & "))WHERE StadeNR<>0"
       
        set oRS = oDB.Execute(SQL)
            oRS.Movefirst
            do while not oRS.EOF
                response.write oRS("StadeNr") & ","
            oRS.Movenext
          Loop
    End IF   
        oDB.Close
          set oRS = Nothing
%>
Avatar billede jesperwerge Nybegynder
06. juni 2005 - 22:36 #16
Hej nielle,

jeg har brugt din metode, men har omskrevet den til en SQL sætning:

SQL = "SELECT Dato,StadeNr FROM (SELECT Dato,StadeNr FROM main UNION ALL SELECT Dato,StadeNr_1 AS StadeNr FROM main UNION ALL SELECT Dato,StadeNr_2 AS StadeNr FROM main) WHERE StadeNr<>0 AND Cdate(Dato)='" & strDatoValgt & "' ORDER BY StadeNr"

Det virker,

Smid lige et svar, så du kan få point.

Tak for hjælpen, jeg har sat pris på den.

/Jesper
Avatar billede nielle Nybegynder
06. juni 2005 - 22:46 #17
Cool :^)
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
Kurser inden for grundlæggende programmering

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