Avatar billede nythjem Nybegynder
11. april 2008 - 14:29 Der er 7 kommentarer og
1 løsning

Avanceret udtræk fra database? (paginering + rekursiv)

Hej alle!

Jeg har et langhåret spørgsmål, som jeg ikke kan løse selv.. Snøft.

Jeg vil lave en slags rekursiv funktion kombineret med en paging.

Databasen har følgende struktur:

=============================
Id, Relation, Content
=============================

Eksempel på databasen
Id        Relation    Content
1        0            Hello world..
2        0            RE: Hello world..
3        0            RE: Hello world..
4        0            RE: Hello world..
5        0            RE: Hello world..
6        0            RE: Hello world..
7        0            RE: Hello world..
8        0            RE: Hello world..
9        0            RE: Hello world..
10        0            RE: Hello world..

11        0            RE: World Hello..
12        11            RE: World Hello..
13        11            RE: World Hello..
14        11            RE: World Hello..
15        11            RE: World Hello..
16        11            RE: World Hello..


Det jeg så gerne vil gøre er at trække alle overskrifter ud med Relation = 0, for hver overskrift vil jeg have undersøgt om der er nogle børn (hvis så udskriv).
Så vidt så godt - det skal så kombineres med en paging, altså skal der kune udskrives 10 resultater pr. side.


Jeg har kigget lidt på JOIN og GROUP, men synes ikke jeg kan se løsningen for mig.

Er der nogle der er friske på et bud? :o)

Michael





UNDERSTÅENDE SCRIPT TRÆKKER HELT ALMINDELIGT UD MED PAGINERING..
<%
intPage = Request("page")
If isNumeric(intPage) = False Or intPage < 1 Then
  intPage = 1
End If

Set rs = Server.CreateObject("ADODB.RecordSet")
strSQL = "SELECT * FROM Comments Order By Id"
strDSN = "DRIVER={Microsoft Access Driver (*.mdb)};DBQ=" & Server.MapPath("demo.mdb")

rs.Open strSQL, strDSN, 1

If Not (rs.BOF Or rs.EOF) Then

  rs.PageSize = 10
  rs.AbsolutePage = intPage
  intRecCount = rs.PageSize
  intPageCount = rs.PageCount
 
  Response.Write "<p><b>Side " & intPage & " af " & intPageCount & "</b></p>"
 
  Do While Not rs.EOF And intRecCount > 0
    Response.Write "<pre>" & rs("Id") & "/" & rs("Relation") & "<pre>"
  intRecCount = intRecCount - 1
  rs.MoveNext
  Loop
 
End If

rs.Close
Set rs = Nothing

'-- Paginering
Response.Write "<p>Gå til side "
For intNum = 1 To intPageCount
  Response.Write "<a href=test.asp?page=" & intNum & ">" & intNum & "</a> "
Next

Response.Write "<p>"
If Clng(intPage) > 1 Then
  Response.Write "<a href=test.asp?page=" & intPage - 1 & ">&lt;&lt;</a>"
Else
  Response.Write "&lt;&lt;"
End If

Response.Write "&nbsp;"

If Clng(intPage) < Clng(intPageCount) Then
  Response.Write "<a href=test.asp?page=" & intPage + 1 & ">&gt;&gt;</a> "
Else
  Response.Write "&gt;&gt;"
End If
%>
Avatar billede weis Nybegynder
13. april 2008 - 11:40 #1
Hvis det du søger er noget lig et forum, hvor du kan se hvilke indlæg som kommentere andre indlæg, så kan du se et eks på denne side http://www.html.dk/scripts/asp/00015/ det er en rekursiv funktion
Avatar billede nythjem Nybegynder
14. april 2008 - 13:11 #2
Hej Weis.

Tak for dit svar.

Jeg spørger jo på om man kan kombinere det i selve udtrækket, således at begrænsningen 10. pr. side kan opfølges. Det er jo desværre lidt problematisk, hvis man først skal trække det ud, så køre den rekursive funktion, dernæst lave opdelingen via paginering.

Men tak for forslaget..
Avatar billede solle Nybegynder
16. april 2008 - 12:10 #3
prøv det her:

intPage = Request("page")
If isNumeric(intPage) = False Or intPage < 1 Then
  intPage = 1
End If


CONST intPageSize = 10
intStartPage = CInt(0&Request.QueryString("page"))
intStartPost = intStartPage * intPageSize

Set Conn = Server.CreateObject("ADODB.Connection")
Conn.Open("DRIVER={Microsoft Access Driver (*.mdb)};DBQ=" & Server.MapPath("demo.mdb"))
set rs = Conn.Execute("SELECT * FROM Comments Order By Id")

if(NOT rs.EOF)then
    rs.MoveFirst
    arrayMyPosts = rs.GetRows()
    intPostCount = UBound(arrayMyPosts, 2)
    intPageCount = (intPostCount / intPageSize)
    intLeftOvers = intPageSize MOD intPostCount
    if(intLeftOvers>0)then intPageCount=intPageCount+1

    Response.Write "<p><b>Side "& intStartPage+1 &" af " & intPageCount & "</b></p>"

    for i=intStartPost to intStartPost+intPageSize
        Response.Write "<pre>" & arrayMyPosts(0, i) & "/" & arrayMyPosts(1, i) & "<pre>"
    next


'##Paging links...
    'Tilbage
    if(intStartPage>=1)then
        Response.Write("<a href=""test.asp?page=" & intStartPage-1 & """>Forrige side</a> | ")
    else
        Response.Write("Forrige side | ")
    end if

    'Side
    Response.Write "Gå til side: "
    For intNum = 0 To intPageCount
        Response.Write "<a href=test.asp?page=" & intNum & ">" & intNum+1 & "</a> "
    Next

    'Frem
    if(intStartPage<intPageCount)then
        Response.Write("<a href=""test.asp?page=" & intStartPage+1 & """>Næste side</a> | ")
    else
        Response.Write("| Næste side")
    end if

end if
Avatar billede solle Nybegynder
16. april 2008 - 12:12 #4
Du skal iøvrigt selv tilføje de checks for om relation=0 og om der er "børn".

Eventuelt rette
    set rs = Conn.Execute("SELECT * FROM Comments Order By Id")

til
    set rs = Conn.Execute("SELECT * FROM Comments WHERE Relation=0 Order By Id")

og så kun checke for børn
Avatar billede nythjem Nybegynder
16. april 2008 - 14:05 #5
Hej Solle.

Tak for dit svar - fornemt :o)

Umiddelbart synes jeg ikke scriptet gør andet en at trække de fortløbende 10 rækker ud.

Hvordan ville du kontrollere for børn - og samtidig sørge for at der kunne kommer 10 resultater ud pr. række i pagineringen?
Avatar billede solle Nybegynder
16. april 2008 - 23:43 #6
det min kode gør er at den tager samtlige data (Hver gang) og lægger i et array kaldet "arrayMyPosts".

så har jeg en løkke som løber fra en given start position, og 10 poster frem.

start: intStartPost = intStartPage * intPageSize
slut : intStartPost + intPageSize

reelt set er side 0 = side 1, og der skal vises 10 poster, dvs...
0*10 = 0 = start position på side 1
0+10 = 10 = slut position på side 1

1*10 = 10 = start position på side 2
10+10 = 20 = slut position på side 2
osv osv osv.

mht. til "børn" aner jeg ik hva du mener, eller hvordan den tabel ser ud?
Har det noget med "id" feltet at gøre eller?
Avatar billede nythjem Nybegynder
20. april 2008 - 15:02 #7
Hej Solle,

Tak fordi du brugte tid på løsningen :) Den har ikke explicit løst problemet, men den har gjort mig klogere, så det er jo super..

Rigtig god dag..
Avatar billede solle Nybegynder
21. april 2008 - 01:56 #8
Jamen, så kommer jeg med et lille gæt til din SQL..


select * FROM Tabel WHERE [Relation]=0 AND [Id] NOT IN (SELECT Relation FROM Tabel WHERE Relation>0)
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

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