Avatar billede cyberkox Nybegynder
21. februar 2006 - 17:59 Der er 48 kommentarer og
2 løsninger

Lave grupperede udtræk fra DB

Hey

Jeg har en database indeholdene:

| ID | dag | måned | år | emne |

Jeg vil gerne ha at at udtrækket kommer til at se ud:

Måned 1
-----------
Dag1: Emne
Dag2: Emne
Dag3: Emne

Måned2
-----------
Dag1: Emne
Dag2: Emne
Dag3: Emne

Osv osv?

Kan i hjælpe mig ?
Avatar billede nielle Nybegynder
21. februar 2006 - 18:41 #1
Noget i denne stil:

sql = "SELECT måned, dag, emne FROM dinTabel ORDER BY år ASC, måned ASC, dag ASC"
Set rs = Conn.Execute(sql)

pervMonth = ""
Do While Not rs.EoF
    If rs("måned") <> "pervMonth" Then
        If pervMonth <> "" Then Response.Write "<br>"
        Response.Write rs("måned") & "<br>
        Response.Write "-----------<br>"
        pervMonth = rs("måned")
    End If

    Response.Write rs("dag") & ": " & rs("emne") & "<br>"

    rs.MoveNext
Loop
Avatar billede nielle Nybegynder
21. februar 2006 - 18:42 #2
"pervMonth" burde nok rettes til "prevMonth" (Previous Month = Forrige Måned).
Avatar billede cyberkox Nybegynder
21. februar 2006 - 19:22 #3
Joe, det er noget nær det som du skriver, men udtrækket kommer til at se sådan ud så:

Måned 1
-----------
Dag1: Emne

Måned 1
-----------
Dag2: Emne

Måned 1
-----------
Dag3: Emne

Måned2
-----------
Dag1: Emne

osv osv..?

Hva gør vi så ?
Avatar billede nielle Nybegynder
21. februar 2006 - 19:31 #4
Det skulel den da ikke helst gøre... Hvordan ser din kode ud?
Avatar billede eagleeye Praktikant
21. februar 2006 - 19:32 #5
Du skal havde fjerne " omkring pervMonth eller prevMonth alt efter hvad du kalder variablen i denne if sætning:

  If rs("måned") <> "pervMonth" Then

Så det bliver:

  If rs("måned") <> pervMonth Then
Avatar billede cyberkox Nybegynder
21. februar 2006 - 19:34 #6
Med hjælp fra Eagleeye virker det :)

Smider i lidt svar begge to ?
Avatar billede nielle Nybegynder
21. februar 2006 - 19:39 #7
Doh! Gad vide hvorfor de kom der?!
Avatar billede eagleeye Praktikant
21. februar 2006 - 19:41 #8
Du kan give dem til nielle der jo lavede svaret, der var bare en lille skrive fejl i ;-)
Avatar billede nielle Nybegynder
21. februar 2006 - 19:46 #9
Jeg deler da ellers gerne - tror at jeg kunne have ledt efter den der fejl i laaang tid!
Avatar billede eagleeye Praktikant
21. februar 2006 - 19:50 #10
Ok så er her svar, så det op til cyberkox at dele dem :)
Avatar billede cyberkox Nybegynder
21. februar 2006 - 20:03 #11
Hehe, jamen det vil jeg da så overveje lidt hvordan jeg ska fordele dem ;)

Kan Access godt finde ud af af sotere Januar, Februar, Marts i rigtigt rækkefølge?
Avatar billede eagleeye Praktikant
21. februar 2006 - 20:10 #12
Hvis måned er en tekst kolonne vil den sortere dem i alfabetisk rækkefølge.
Skal den sortere dem som "dato" skal måned gemmen som et tal.

Så kan man lave tallet om til måneds navn men et array eller funktionen MonthName(tal)
Avatar billede eagleeye Praktikant
21. februar 2006 - 20:11 #13
Det bedste ville være at gemme datoen i en dato/tids kolonne, og overføre datoer via SQL i formatet yyyy-mm-dd
Avatar billede nielle Nybegynder
21. februar 2006 - 20:24 #14
Enig. Man bør altid så vidt som mulig bruge de felttyper som svare bedst til dattypen. På den måde kommer man længst, og behøver ikke at opfinde snedige løsninger fof simple ting (så som at sortere efter dato-orden).
Avatar billede cyberkox Nybegynder
21. februar 2006 - 20:38 #15
Jo, det ville vel også være en del nemmere?

Men hvordan skiller man så datoen op i måneder, dage og år?
Avatar billede eagleeye Praktikant
21. februar 2006 - 20:44 #16
Det kan du med funktionerne year, month, og day
år = Year(dato)
måned = Month(dato)
dagen =  Day(dto)


Navnet på måneden kan findes sådan her monthname(month(dato))
Avatar billede nielle Nybegynder
21. februar 2006 - 20:44 #17
Noget i denne stil:

SELECT Day(datoFelt), Month(dataFelt), Year(datoFelt) FROM dinTabel ORDER BY datoFelt ASC"
Avatar billede cyberkox Nybegynder
21. februar 2006 - 20:47 #18
Jeg er ikk helt med?

Hvad skal felterne i databasen indeholde så?
Avatar billede eagleeye Praktikant
21. februar 2006 - 20:56 #19
Jeg vil anbefale at du har en kolonne som indeholder datoen og typen op feltet er Dato/klokkeslæt. Når du så vil hente data ud kan du som nielle har vist lave en SQL sætning som og lave nogle alias felter som indeholder år, måned, og dag.

Hvis du vil beholde 3 kolonne bør du lave måned om til en tal kolonne og srkive tallet for måneden .


Hvis du helt vil undgå at rette og du bruger access og det er en DK udgave kan du prøve sådan her, funktionen CDate kan godt læst tekst måneder sådan her:

SQL = "SELECT måned, dag, år FROM dinTabel ORDER BY cdate(dag & "-" & måned & "-" & .år)"
Avatar billede cyberkox Nybegynder
21. februar 2006 - 21:03 #20
Jeg er først kun lige startet, så jeg vil såmænd gerne have lavet det på den mest smarteste og nemmeste måde. Lige nu har jeg jo som sagt 3 kolonner og i dem er månederne skrevet i tal og blir lavet om bagefter i asp.

Men hvordan er det smarteste siger i?
Avatar billede nielle Nybegynder
21. februar 2006 - 21:07 #21
Blot at have dem som et felt - et datofelt.
Avatar billede cyberkox Nybegynder
21. februar 2006 - 21:10 #22
Jo, men hvordan får man så delt datoen op, så man kan lave udtrækket ?
Avatar billede eagleeye Praktikant
21. februar 2006 - 21:12 #23
Man kan bruger Alias kolonner direkte i SQL sætningen sådan din SQL sætning passer med koden som er vist her:

sql = "SELECT month(datoFelt) as måned, day(datoFelt) as dag, emne FROM dinTabel ORDER BY datoFelt ASC"
Avatar billede cyberkox Nybegynder
21. februar 2006 - 21:20 #24
Hvad gør jeg forkert ?

sql = "SELECT month(dato) as maaned, day(dato) as dag, emne FROM kalender ORDER BY dato ASC"
Set rs = Conn.Execute(sql)

prevMonth = ""
Do While Not rs.EoF
    If maaned <> prevMonth Then
        If pervMonth <> "" Then Response.Write "<br>"
        Response.Write "<br><b>" & maaned & "</B><br>"
        Response.Write "-----------<br>"
        prevMonth = maaned
    End If

    Response.Write dag & ": " & rs("emne") & "<br>"

    rs.MoveNext
Loop
Avatar billede eagleeye Praktikant
21. februar 2006 - 21:28 #25
Du har ikke rs omkring kolonnenavnet maaned og dag så prøv sådan her:

sql = "SELECT month(dato) as maaned, day(dato) as dag, emne FROM kalender ORDER BY dato ASC"
Set rs = Conn.Execute(sql)

prevMonth = ""
Do While Not rs.EoF
    If rs("maaned") <> prevMonth Then
        If pervMonth <> "" Then Response.Write "<br>"
        Response.Write "<br><b>" & rs("maaned") & "</B><br>"
        Response.Write "-----------<br>"
        prevMonth = rs("maaned")
    End If

    Response.Write rs("dag") & ": " & rs("emne") & "<br>"

    rs.MoveNext
Loop
Avatar billede cyberkox Nybegynder
21. februar 2006 - 21:34 #26
Ahh, så virker det..

Men hvorfor virker det her ikke:

      mon = rs("maaned")
     
      mon = Replace(mon, "1", "Januar")
      mon = Replace(mon, "2", "Februar")
      mon = Replace(mon, "3", "Marts")
      mon = Replace(mon, "4", "April")
      mon = Replace(mon, "5", "Maj")
      mon = Replace(mon, "6", "Juni")
      mon = Replace(mon, "7", "Juli")
      mon = Replace(mon, "8", "August")
      mon = Replace(mon, "9", "September")
      mon = Replace(mon, "10", "Oktober")
      mon = Replace(mon, "11", "November")
      mon = Replace(mon, "12", "December")
Avatar billede eagleeye Praktikant
21. februar 2006 - 21:40 #27
problemet er hvis eksempelvis måned er 12 vi den replace 1 med Januar så der står: "Januar2"

Du kan evt. prøve om monthname i SQL sætningen ikke virker.:

sql = "SELECT MonthName(month(dato)) as maaned, day(dato) as dag, emne FROM kalender ORDER BY dato ASC"



Alternativt, kan du lave et array med måned navne:

maanedArray = split("Januar,Februar,Marts,April,Maj,Juni,Juli,August,September,Oktober,November,December")
mon = rs("maaned")
mon = maanedArray(int(mon)-1)
Avatar billede cyberkox Nybegynder
21. februar 2006 - 21:48 #28
sql = "SELECT MonthName(month(dato)) as maaned, day(dato) as dag, emne FROM kalender ORDER BY dato ASC"

Der er en ikke-defineret funktion "MonthName" i udtrykket.

Hvordan fungerer det med arrayet ?
Avatar billede eagleeye Praktikant
21. februar 2006 - 21:55 #29
Det variable som man kan tilgå med et index. Så kan der gemmen en streng for hvert index:

maanedArray(0) = "Januar"
maanedArray(1) = "Februar"
maanedArray(..) = "..."
maanedArray(12) = "December"

Arrays starter fra index 0 så enten kan man lave en "dummy" værdi på index 0 eller trække en fra det tal man har hvis det start fra 1. Måned er 1 til 12.

Hvis man så skrive maanedArray(month(dato)-1) vil den finde den tekst som høre til det index.  Hvis det er datoen i dag vil den give Februar. Funktionen split bruges til at split'te en streng til at array. Der kan også angives hvilken karakter split skal bruge som dele karakter, så linien vist før bør være:

maanedArray = split("Januar,Februar,Marts,April,Maj,Juni,Juli,August,September,Oktober,November,December", ",")
Avatar billede cyberkox Nybegynder
21. februar 2006 - 22:08 #30
Hmm, den skriver Januar over hele linjen ?
Avatar billede eagleeye Praktikant
21. februar 2006 - 22:11 #31
Så prøv at vise koden her.
Avatar billede cyberkox Nybegynder
21. februar 2006 - 22:12 #32
sql = "SELECT month(dato) as maaned, day(dato) as dag, emne FROM kalender ORDER BY dato ASC"
Set rs = Conn.Execute(sql)

maanedArray = split("Januar,Februar,Marts,April,Maj,Juni,Juli,August,September,Oktober,November,December", ",")
maaned = rs("maaned")
maaned = maanedArray(int(maaned)-1)

prevMonth = ""
Do While Not rs.EoF
    If rs("maaned") <> prevMonth Then
        If pervMonth <> "" Then Response.Write "<br>"
        Response.Write "<br><b>" & maaned & "</B><br>"
        Response.Write "-----------<br>"
        prevMonth = rs("maaned")
    End If

    Response.Write rs("dag") & ": " & rs("emne") & "<br>"

    rs.MoveNext
Loop
Avatar billede eagleeye Praktikant
21. februar 2006 - 22:15 #33
Det er fordi koden sætter viablen maaned uden for loop'et og dermed vil den altid indeholde måned for den første post så prøv sådan her så maaned får en værdi ved hver post i databasen:

maanedArray = split("Januar,Februar,Marts,April,Maj,Juni,Juli,August,September,Oktober,November,December", ",")

prevMonth = ""
Do While Not rs.EoF
    maaned = rs("maaned")
    maaned = maanedArray(int(maaned)-1)
    If rs("maaned") <> prevMonth Then
        If pervMonth <> "" Then Response.Write "<br>"
        Response.Write "<br><b>" & maaned & "</B><br>"
        Response.Write "-----------<br>"
        prevMonth = rs("maaned")
    End If

    Response.Write rs("dag") & ": " & rs("emne") & "<br>"

    rs.MoveNext
Loop
Avatar billede nielle Nybegynder
21. februar 2006 - 22:17 #34
maaned = maanedArray(int(maaned)-1)

- skal vel kige ændres til:

maaned = maanedArray(CInt(maaned)-1)
Avatar billede cyberkox Nybegynder
21. februar 2006 - 22:33 #35
Hva er forskellen på Cint og int ?
Avatar billede nielle Nybegynder
21. februar 2006 - 22:39 #36
Jeg er slet ikke sikker på at der er noget som hedder Int i ASP - CInt betyder Convert/Cast til Integer.
Avatar billede eagleeye Praktikant
21. februar 2006 - 22:42 #37
Jeg vil bruge int da Cint ikke kan håndtere tal størrer end 32767 uden at give en fejl. Int kan håndtere op til maximun tal. Hvis man runder komma tal af er der lidt forskel på hvornår de runder op eller ned.
Avatar billede nielle Nybegynder
21. februar 2006 - 22:43 #38
Nu skulle tallet da vist helst holde sig i intervallet 1-12 i dette tilfælde :^)
Avatar billede cyberkox Nybegynder
22. februar 2006 - 12:49 #39
Hehe, jo nu virker det. Næsten! :D

I hvilket format skal jeg overføre datoene til min access. Jeg har prøvet med

dd-mm-åååå, åååå-mm-dd, dd/mm/åååå, osv.. Men intet virker?
Avatar billede nielle Nybegynder
22. februar 2006 - 13:00 #40
åååå-mm-dd burde fungere, men ellers prøv med åååå/mm/dd.

Du skal i øvrigt omgive datoen med #-tegn:

INSERT INTO dinTabel (datoFelt) VALUES (#2006-02-22#)

- og:

UPDATE dinTabel SET datoFelt = #2006-02-22# WHERE ditId = 42
Avatar billede cyberkox Nybegynder
22. februar 2006 - 13:09 #41
Ahh, ups, nej, det var min fejl. Jeg havde sagt

......dato = '" & Request("dato") & "'"

og ' ', blev derfor tilføjet i databasen, hvilket jo ikke er en dato ;)

Lige på falderebet, hvad hedder sql sætningen for at hente de 3 nyeste i et sæt ?
Avatar billede nielle Nybegynder
22. februar 2006 - 13:31 #42
SELECT TOP 3 * FROM dinTabel ORDER BY ditId DESC
Avatar billede cyberkox Nybegynder
22. februar 2006 - 13:34 #43
Jeg ska bare have delt datoen op som før, men dette virker ikke:

select top 3 month(dato) as maaned, day(dato) as dag, emne from kalender order by dato
Avatar billede nielle Nybegynder
22. februar 2006 - 13:42 #44
select top 3 month(dato) as maaned, day(dato) as dag, emne from kalender order by dato DESC

... og ellers må du uddybe lidt mere hvad du mener med at det ikke virker.
Avatar billede cyberkox Nybegynder
22. februar 2006 - 13:44 #45
Ahh, nej, den smider bar alle data i tabellen ud, og ikk blot de 3 nyeste
Avatar billede eagleeye Praktikant
22. februar 2006 - 14:12 #46
Det kan være nødvendigt også at tilføje autonummer kolonnen i order by:

select top 3 month(dato) as maaned, day(dato) as dag, emne from kalender order by dato DESC, id
Avatar billede nielle Nybegynder
22. februar 2006 - 15:24 #47
Nå, for ellers får man alle de felter som svare til samme dato (5 felter med samme sato svare til "en post").
Avatar billede nielle Nybegynder
22. februar 2006 - 15:56 #48
"Nå, ..." skulle have været "Nå ja, ..." :^)
Avatar billede cyberkox Nybegynder
24. februar 2006 - 16:26 #49
Så er der delt point ud. Jeg takker jer begge to for hjælpen :)
Avatar billede nielle Nybegynder
24. februar 2006 - 17:27 #50
Takker for point :^)
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