webForumDet fria alternativet

Forum: Trädstrukturs loop?

24 svar · 309 visningar · startad av Lukaspojken

LukaspojkenMedlem sedan maj 20011 312 inlägg
#1

Jag vet hur jag ska upptäcka det första länk-skiktet till huvudinläggen men jag vet inte hur jag ska skriva ut det resterande skick...dvs

Huvudinlägg
Re: inlägg (Första länk-skiktet)
Re: Re: inlägg (Andra länk-skiktet)
etc.

Koden för att loopa fram första länk-skiktet är

Visa = "SELECT * FROM forum WHERE msgUnderId=" & HuvudInlagg
RecSet.Open Visa, Connect, 3, 3 

Do While Not RecSet.EOF

<a ref="forum.asp?&Inlagg=<% =RecSet("msgId") %>"><% =RecSet("msgTopic")%></a>

RecSet.MoveNext
Loop

msgUnderId värdet har dess förälder msgID...nån???

VideMedlem sedan dec. 19998 577 inlägg
#2

Du får först skapa en funktion som hämta inlägget beroende på vilket id du skickar med, och den funktionen så anropar du på samma funktion med "barnens" id, på så sätt kommer det att bli trådat. Men du skall akta dig för att loopa rekursivt (som det heter), det kan lätt loopas till oändlighet om man kodat fel.

Function getMess(id)
'massa kod som hämtar inlägget
'Om det finns "barn" till inlägget så anropar du denna funktionen igen med barnets värde
End Function

------------------
Vide rox = new Vide();
rox.learn("C#");

webeye.nu

LukaspojkenMedlem sedan maj 20011 312 inlägg
#3

Jag ser det inte riktigt framför mig Víde...försöker vända och vrida på det men ser inte riktigt hur koden skulle se ut...grr..svårt...

LukaspojkenMedlem sedan maj 20011 312 inlägg
#4

Vad tror du om denna struktur Vide?

[Tabell:forum]
msgID
Thread_ID
Thread_Parent
Thread_Level
msgText
etc.

Dvs att man lägger till de tre kolumnerna Thread...idag har jag i princip bara Thread_Parent som är msgUnderId?

JanspeedMedlem sedan jan. 2001510 inlägg
#5

Du kan ju kanske också prova att lägga dina recordsets i en matris och på så sätt ordna dina inlägg i rätt ordning?

Man måste ju inte sortera allt genom SQL-frågan. :)

/JANspeed

LukaspojkenMedlem sedan maj 20011 312 inlägg
#6

vad innebär det med matris Janspeed...har aldrig hört talas om att man kan sortera på det sättet...hur gör man?

jepsOMedlem sedan mars 2001484 inlägg
#7

Om ni tar en titt på bwsm.cjb.net och forumet där så kan jag beskriva lite kort hur jag gjorde:

Istället för att använda en rekursiv funkion använder jag ReplyOrder och Level.
ReplyOrder anger i vilken ordning svaret ska visas under första inlägget i tråden. Om man svarar på ett inlägg med ReplyOrder = 3 får det nya inlägget ReplyOrder = 4 och alla med ReplyOrder >= 4 får sitt värde ökat med 1.
Level anger hur stort indraget ska vara. Det är inte svårare än att man kontrollerar vilket värde Level har på inlägget man svarar på och sätter det till Level = Level + 1. Indraget gör jag sedan såhär:

<div style="padding-left:<%=rs("Level")*15%>">text</div>

Tanken var att jag skulle lägga upp koden till forumet under wF Script, men jag har haft det lite körigt på sistone samt varit lat ;).

------------------
/ jeps0

LukaspojkenMedlem sedan maj 20011 312 inlägg
#8

Det var väldigt smart men hur vet du att ett inlägg ska vara under ett annat?

VideMedlem sedan dec. 19998 577 inlägg
#9

Jag skulle bara använt ett fält för id, och ett fält för parent_id.

Och när man skapar inlägget så lägger man ju in vilket inlägg man svara på, och det id:t lägger man i fältet "parent_id".

------------------
Vide rox = new Vide();
rox.learn("C#");

webeye.nu

[Redigerat av Vide den 19 jun 2001]

jepsOMedlem sedan mars 2001484 inlägg
#10

Alla svar har ett startID som anger vilken tråd de tillhör. För att sedan lista inläggsträden tog jag råd av min ASP-gud Bill Wilkinsons artikel.
Dock måste hans SQL-sats modifieras en smula för att passa forumet. Annars visas inte inlägg utan svar.
Hans SQL-sats:

SQL = "SELECT * FROM Teams, Players " _
        & "WHERE Players.TeamID = Teams.TeamID " _
        & "ORDER BY Teams.TeamName, Players.PlayerName"

Skriv istället såhär (och anpassa till forumet):

SQL = "SELECT * FROM Teams LEFT JOIN Players " _
       & "ON Players.TeamID = Teams.TeamID " _
       & "ORDER BY Teams.TeamName, Players.PlayerName"

------------------
/ jeps0

LukaspojkenMedlem sedan maj 20011 312 inlägg
#11

Vide > Det är så jag gjort idag...men jag förstår inte hur jag ska skapa trädet? får bara fram första skiktet...

jepsO > Varför kör du join? Hur skulle sql-uttrycket se ut med följande tabell?

[Tabell:forum]
msgID
Thread_ID
Thread_Parent
Thread_Level
msgText
etc.

jepsOMedlem sedan mars 2001484 inlägg
#12

För att det ska fungera måste du ha en tabell för nya inlägg och en för svar. Jag kallar mina Newthreads och Replies.

Newthreads:
newID (räknare)
övriga fält (rubrik, inlägg, datum etc)

Replies:
repID (räknare)
threadID (anger vilken tråd svaret tillhör)
lvl (beskrevs ovan)
ReplyOrder (beskrevs ovan)
övriga fält

SQL-sats: (på ett ungefär)

SQL = "SELECT * FROM Newthreads LEFT JOIN Replies " _
& "ON Newthreads.newID = Replies.threadID " _
& "ORDER BY Newthreads.newID DESC, Replies.ReplyOrder"

Trixa på :)

------------------
/ jeps0

LukaspojkenMedlem sedan maj 20011 312 inlägg
#13

Man behöver väl inte två tabeller för det...vad är fördelen med det egentligen?

jepsOMedlem sedan mars 2001484 inlägg
#14

Tveksamt om du kan fixa trädstrukturen annars... Kolla Bill Wilkinsons artikel, den jag utgick ifrån. JOIN-satsen krävs som sagt för att visa inlägg utan svar, dvs motsvarande "tomma lag" i artikeln.

Går på lunch nu, så tänk ut lite frågor tills jag kommer tillbaka ;)

------------------
/ jeps0

LukaspojkenMedlem sedan maj 20011 312 inlägg
#15

Jag har sett trädstruktur med en tabell...så det egentligen borde det vara helt onödigt med två tabeller...vad är syftet...vad är det man kan uppnå med det istället för att använda två tabeller...jag definierar alla huvudinlägg i fältet msgUnderId som 0...och på så sätt borde man kunna köra en tabell...

Men som sagt...jag ser fortfarande inte riktigt hur den sql-satsen du gav skulle kunna skapa en trädstruktur...

jepsOMedlem sedan mars 2001484 inlägg
#16

Den i sig kan inte skapa trädstrukturen. Koden för detta står i artikeln.

------------------
/ jeps0

LukaspojkenMedlem sedan maj 20011 312 inlägg
#17

"ReplyOrder anger i vilken ordning svaret ska visas under första inlägget i tråden. Om man svarar på ett inlägg med ReplyOrder = 3 får det nya inlägget ReplyOrder = 4 och alla med ReplyOrder >= 4 får sitt värde ökat med 1."

Jag tror jag fått lite aha-upplevelse...kan du bara förklara det med ReplyOrder igen. Förstår inte riktigt det sista du sa "alla med ReplyOrder >= 4 får sitt värde ökat med 1.".

jepsOMedlem sedan mars 2001484 inlägg
#18

Säg att du har följande inlägg. ro = ReplyOrder, lvl = indrag.

-Hejsan på er (ro = 0, lvl = 0)
-----Re: Hejsan på er (ro = 1, lvl = 1)
-----------Re: Re: Hejsan på er (ro = 2, lvl = 2)
-----Hej på dig med (ro = 3, lvl = 1)
-----Re: Hejsan på er (ro = 4, lvl = 1)

-Första inlägget! (ro = 0, lvl = 0)

Det enda du använder för att bestämma ordningen på svaren är ReplyOrder.

Vad jag menade med öka med 1 där ReplyOrder >= 4: Säg att du svarar på svaret "Hej på dig med" (ro = 3, lvl = 1). Svaret till detta meddelande får ro = 4, lvl = 2. Alla underliggande svar får sin ro ökad med 1, dvs "Re: Hejsan på er" (ro = 4, lvl = 1) får sin ro ökad till 5.

Comprendre? :)

------------------
/ jeps0

LukaspojkenMedlem sedan maj 20011 312 inlägg
#19

ok...det var också väldigt smart...men hur ökar jag alla replyorder med ett utan att det går in på andra inlägg en de ska...

jepsOMedlem sedan mars 2001484 inlägg
#20

Något i stil med följande:

UPDATE Replies SET ReplyOrder = ReplyOrder + 1 WHERE ReplyOrder >= 4 AND threadID = 2

Självklart ersätts 4 och 2 med variabler, men det är ovanstående princip som gäller.

------------------
/ jeps0

258 ms totalt · 3 externa anrop · v20260731065814-full.fb544a5a
133 ms — hämta forumlista (db)
122 ms — hämta statistik (db)
130 ms — hämta tråd, inlägg och bilagor (db)