19. august 2005 - 22:27Der 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.
... 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.
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") &" ¬ "& 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'>¬ "& 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
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... ?
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.
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.
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å?
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
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..
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...
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.
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!!!
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 ;)
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.
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
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
Synes godt om
Ny brugerNybegynder
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.