Avatar billede tatsudoshi Nybegynder
19. august 2005 - 22:27 Der er 35 kommentarer og
1 løsning

asp og et recordset

Jeg har en access database i 2003 format og en JET driver til forbindelsen. Jeg har to tabeller hvor den ene tabel er til nyheder og den anden til opdateringer til nyhederne. Grunden til to tabeller er pga normaliseringsreglerne.

Okay, problemet er altså når jeg har flere opdateringer på en nyhed. Det jeg skal bruge, er en måde hvorpå jeg kan tjekke om en opdatering er den sidste i rækken.

Jeg skal gerne poste kildekoden hvis der bliver brug for det. Men kort fortalt har ser det sådan ud:

DB
-----
tbNews
  aNewsId[auto;stigende;heltal]
  + andre

tbUpdates
aNewsId[tal;heltal]
+ andre
-----

ASP (Pseudo)
-----
Do While Not rsNews.EOF
Response.Write rsNews("aNewsContent")
If rsNews("aNewsId") = rsUpdates("aNewsId") Then
  Do While Not (rsUpdates.EOF)
  Reponse.Write rsUpdates("aUpdateContent")
  Loop
Loop
-----

Men problemet er at hvis der er flere opdateringer pr nyhed, skal jeg kunne vide hvornår den sidste vises, da den skal udskrives med en anden id end de andre, da den skal afslutte en nyhedsbox.
Avatar billede nielle Nybegynder
19. august 2005 - 22:29 #1
Det lyder som om at du skal bruge ORDER BY i din SQL-sætning.
Avatar billede nielle Nybegynder
19. august 2005 - 22:31 #2
SELECT FROM tbUpdates WHERE aNewsId=ditNyhedsID ORDER BY aUpdateId DESC
Avatar billede nielle Nybegynder
19. august 2005 - 22:33 #3
... eller noget i den stil. Dermed skulle du få den nyeste update som den første post. Hvis du i stedet skal bruge den, som den sidste, bruger du ASC i stedet for DESC.

ASC = Acceding = Stigende
DESC = Decending = Faldende
Avatar billede tatsudoshi Nybegynder
19. august 2005 - 22:34 #4
Jeg kan ikke se hvordan det løser noget.
Avatar billede tatsudoshi Nybegynder
19. august 2005 - 22:35 #5
Det har intet med mit problem at gøre. Undskyld jeg siger det, men det virker ikke som om du har læst mit spørgsmål færdigt.
Avatar billede tatsudoshi Nybegynder
19. august 2005 - 22:37 #6
Do While Not rsNews.EOF
                If strDate <> rsNews("aDate") Then
                    Response.Write "<h1 id='news'>"& rsNews("aDate") &"</h1>"
                End If
                    Response.Write "<h2 id='news'>"& rsNews("aTitle") &"</h2>"
                    Response.Write "<h3 id='news'>by "& rsNews("aUser") &" &#172; "& rsNews("aTime") &"</h3>"
                    rsUpdates.MoveFirst

                    Do While Not rsUpdates.EOF
                        If rsNews("aNewsId") = rsUpdates("aNewsId") Then
                            If strNewsWritten = False Then
                                Response.Write "<p id='newsNoBorder'>"& FormatText(rsNews("aContent")) &"</p>"
                                strNewsWritten = True
                            End If
                            Response.Write "<h4 id='news'>Update <span id='news'>&#172 "& rsUpdates("aTime") &"</span></h4>"
                            If Not (rsUpdates.EOF) Then
                                Response.Write "<p id='updateNoBorder'>"& FormatText(rsUpdates("aContent")) &"</p>"
                            Else
                                Response.Write "<p id='news'>"& FormatText(rsUpdates("aContent")) &"</p>"
                            End If
                        ElseIf strNewsWritten = False Then
                            Response.Write "<p id='news'>"& FormatText(rsNews("aContent")) &"</p>"
                            strNewsWritten = True
                        End If
                        rsUpdates.MoveNext
                    Loop

                strNewsWritten = False
                strDate = rsNews("aDate")
                rsNews.MoveNext
            Loop
Avatar billede nielle Nybegynder
19. august 2005 - 22:37 #7
Jeg har nu tribbel-læst dit spørgsmål, og hvis mit forslag ikke løser dit problem så er jeg bange for at jeg ikke fatter hvad det er du ønsker at blive i stand til at gøre. Hvis du kunne uddybe lidt mere... ?
Avatar billede erikjacobsen Ekspert
19. august 2005 - 22:38 #8
Det er nu nærmere som om du ikke præciserer dit spørgsmål ;) Prøv lige at forklare lidt mere.
Avatar billede tatsudoshi Nybegynder
19. august 2005 - 22:41 #9
Okay.. hmm.. det er jo svært :)
Jeg skal lige rette siden til, så smider jeg et link så I kan se det..
Avatar billede nielle Nybegynder
19. august 2005 - 22:42 #10
Du må meget gerne inkludere dine to SQL-kald.
Avatar billede tatsudoshi Nybegynder
19. august 2005 - 22:45 #11
http://test.criion.net
Som I kan se bliver hver box afsluttet med en vandret streg. Men i boxen med flere updates, kan jeg ikke afslutte boxen fordi jeg ikke ved hvornår den bliver vist.
Avatar billede tatsudoshi Nybegynder
19. august 2005 - 22:46 #12
mine SQL kald har ikke noget med det at gøre... men her da:

    strSQL = "SELECT tbNews.aNewsId, tbNews.aDate, tbNews.aTime, tbNews.aTitle, tbNews.aContent, "
    strSQL = strSQL &"tbUsers.aUser "
    strSQL = strSQL &"FROM tbNews "
    strSQL = strSQL &"INNER JOIN tbUsers "
    strSQL = strSQL &"ON tbNews.aUserId = tbUsers.aUserId "
    strSQL = strSQL &"WHERE tbNews.aDate LIKE '%"& Year(Date) &"' "
    strSQL = strSQL &"ORDER BY tbNews.aNewsId DESC"
    Set rsNews = Conn.Execute(strSQL)

    strSQL = "SELECT tbUpdates.aTime, tbUpdates.aContent, tbUpdates.aNewsId "
    strSQL = strSQL &"FROM tbUpdates "
    strSQL = strSQL &"ORDER BY tbUpdates.aTime DESC"
    Set rsUpdates = Conn.Execute(strSQL)
Avatar billede tatsudoshi Nybegynder
19. august 2005 - 22:51 #13
Er det til at finde rundt i?
Avatar billede nielle Nybegynder
19. august 2005 - 22:52 #14
Hvis du først laver en count(*) på din tabel så ved du hvormange rækker der kommer ud. Derefter kan du lave en tæller som du opdatere med 1 for hvert gennemløb af din "Do While Not rsUpdates.EOF"-løkke. På den måde kan du finde hvornår at du er nået til den sidste post og dermed gøre noget andet ved den end ved de foregående poster.
Avatar billede tatsudoshi Nybegynder
19. august 2005 - 22:54 #15
ja det havde jeg også håbet på, men hvor laver jeg count'en henne? Det er mest der jeg er lost..
Avatar billede softspot Forsker
19. august 2005 - 22:57 #16
Kan du ikke bare kyle en div omkring hver nyhed, så kan du vel styre border på den måde... eller er det ikke en acceptabel måde at strukturere dit indhold på?
Avatar billede tatsudoshi Nybegynder
19. august 2005 - 22:58 #17
tjo det kunne jeg jo godt, men så kan jeg ikke opdele kanten på den måde jeg gør nu..
Avatar billede softspot Forsker
19. august 2005 - 23:02 #18
Hvilken kant (sorry, men jeg kan ikke helt gennemskue hvordan det burde se ud)?

Du behøver vel ikke sætte andet end border i bunden af den div du sætter omkring...?
Avatar billede tatsudoshi Nybegynder
19. august 2005 - 23:04 #19
næh det er sandt..
kunne være jeg bare skulle gøre sådan :)
lyder som det letteste.
selvom det er lidt irriterende ikke at kunne udføre en simpel logisk udregning
Avatar billede erikjacobsen Ekspert
19. august 2005 - 23:06 #20
Jeg kan heller ikke helt følge med ... Kan du give et eksempel med data i tabellerne?
Avatar billede tatsudoshi Nybegynder
19. august 2005 - 23:13 #21
Hvad tænker du på mht et eksempel?
Du kan kigge på min side.. under nyheden "Test nyhed" er der 3 opdateringer.
Opdateringer er i en tabel og nyheder i en anden..

tbNews
  aNewsId[auto;stigende;heltal]
  aContent[notat]

tbUpdates
  aUpdateId[auto;random;heltal]
  aContent[notat]
  aNewsId[tbNews(fremmednøgle);tal;heltal]

ved ikke hvad ellers du mener..
Avatar billede nielle Nybegynder
19. august 2005 - 23:15 #22
Jeg må tilstå at jeg synes, at der et et eller andet fuldstændigt bagvendt ved den måde du hiver dine data ud af tabellene – du hiver f.eks. data ud af tbUpdates uden at binde til nyhederne. Denne binding ligger i den første SQL-sætning. Umiddelbart er dette så årsagen til at du ikke ikke kan bestemme, hvornår at du er ved den sidste update til en given nyhed – simpethen fordi at du får updates i en lang køre.

Jeg vil foreslå at du laver din kode over denne skabelon:

SQL1 = "SELECT aNewsId, aDate, aTime, aTitle, aContent FROM tbNews ORDER BY aNewsId DESC"
Set rsNews = Conn.Execute(SQL1)

Do While Not rsNews.EOF
    ' Her udskrives selve nyheden...

    SQL2 = "SELECT aTime, aContent FROM tbUpdates WHERE aNewsId=" & rsNews("aNewsId") & " ORDER BY aTime DESC"
    Set rsUpdates = Conn.Execute(SQL2)

    Do While Not rsUpdates.EOF
        ' Her skrives updates til den enkelte nyhed...

        rsUpdates.MoveNext
    Loop

    rsNews.MoveNext
Loop
Avatar billede erikjacobsen Ekspert
19. august 2005 - 23:18 #23
Jeg er enig med nielle, men vil dog foreslå en anden løsning: læs de relevante data ind i arrays, og lav dit output på det grundlag - så har du alle oplysninger umiddelbart tilgængelig.
Avatar billede tatsudoshi Nybegynder
19. august 2005 - 23:20 #24
Hmm en god idé! På den måde kan jeg styre hvilke opdateringer der kommer ud når jeg vil det... arrays.. dem glemmer man altid eller? :/
Avatar billede tatsudoshi Nybegynder
19. august 2005 - 23:25 #25
nielle: Jeg skal gerne tilstå at SQL ikke min stærkeste side, men i din SQL2 sætning, hvad godt gør det at kun vælge de opdateringer hvis newsId er lig rsNews("aNewsId")?

Ahh du laver en SQL INDE i løkken!! Det vidste jeg ikke man kunde!!!
Avatar billede tatsudoshi Nybegynder
19. august 2005 - 23:25 #26
*kunne* omg staveplade til mig *:/
Avatar billede tatsudoshi Nybegynder
19. august 2005 - 23:27 #27
I har alle givet gode råd, dog er nielle's den der kommet tættest på en reel løsning. Men jeg giver gerne til alle der vil have, dog for nielle 50%, altså 30 points, hvis han vil altså :)
Meen ska lige se om det virker først ;)
Avatar billede softspot Forsker
19. august 2005 - 23:30 #28
Ingen point til mig på dette spm. hvis nielle kommer med den løsning du benytter... ellers tak :)
Avatar billede nielle Nybegynder
19. august 2005 - 23:31 #29
Det er spørgeren som suverænt bestemmer point-fordelingen (og jeg deler da i øvrigt gerne :^)

... et svar :^)
Avatar billede erikjacobsen Ekspert
19. august 2005 - 23:31 #30
Ingen point til mig, tak. En god ting ved at proppe ting i arrays er muligheden for at adskille "sql-delen" fra "html-delen".
Avatar billede tatsudoshi Nybegynder
19. august 2005 - 23:42 #31
nielle: hvordan laver jeg den der count? Nu hvor jeg kan isolere mine updates pr nyhed, skal jeg bare kunne tælle på dem, så kan jeg lave en For løkke der udskriver alle minus 1.
Avatar billede nielle Nybegynder
19. august 2005 - 23:51 #32
Noget i stil med dette:

SQL1 = "SELECT aNewsId, aDate, aTime, aTitle, aContent FROM tbNews ORDER BY aNewsId DESC"
Set rsNews = Conn.Execute(SQL1)

Do While Not rsNews.EOF
    ' Her udskrives selve nyheden...

    SQL2 = "SELECT count(*) AS antalUpdates WHERE aNewsId=" & rsNews("aNewsId")
    Set rsUpdates = Conn.Execute(SQL2)
    AntalUpdates = rsUpdates("antalUpdates")

    SQL2 = "SELECT aTime, aContent FROM tbUpdates WHERE aNewsId=" & rsNews("aNewsId") & " ORDER BY aTime DESC"
    Set rsUpdates = Conn.Execute(SQL2)

    UpdateNr = 0
    Do While Not rsUpdates.EOF
        UpdateNr = UpdateNr+1
        If UpdateNr = AntalUpdates Then
            ' Du er ved den sidste update
            ' Her skrives updates til den enkelte nyhed...
        Else
            ' Der kommer flere updates efter denne.
            ' Her skrives updates til den enkelte nyhed...
        End If       

        rsUpdates.MoveNext
    Loop

    rsNews.MoveNext
Loop
Avatar billede tatsudoshi Nybegynder
20. august 2005 - 00:00 #33
Okay.. mange tak da :)
Du er en handy ting at have på denne tid af aftenen!
Avatar billede nielle Nybegynder
20. august 2005 - 00:01 #34
Nu er jeg nu godt nok også på vej i seng ... hvis der er mere du skal have afklaret så fortsætter vi da bare i morgen :^)
Avatar billede tatsudoshi Nybegynder
20. august 2005 - 00:05 #35
Kanon! Du en guttermand der :)
Men nn da..
Avatar billede tatsudoshi Nybegynder
20. august 2005 - 08:14 #36
Til alle der kunne bruge det her i en endelig tilstand, vil der kunne downloades en skabelon på mit site gratis, samt andre scripts, man kunne finde brugbare og små tutorials på brugen af disse.
Site: http://www.criion.net
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