Just nu i M3-nätverket
Gå till innehåll
geezer

Skapa ett eget forum, inte ladda hem ett befintligt!

Rekommendera Poster

Hur funkar detta med trådar? Jag tror att min tankebana är lite skev.

 

Jag skapar ett forum där du kan skapa dina egna trådar. Varje tråd kan sedan få svar.

 

Exempel:

 

Tråden

-svar på tråd

--svar på svar på tråd

---svar på svar på svar på tråd

-svar på tråd

--svar på svar på tråd

-svar på tråd

 

För att lista svaren efter vilket svar man svarar på så kan man göra följande.

 

Skriv vi ut alla svar på tråden

 

for each svar in tråden

skriv ut svaret

if svar has ett eget svar then call sub hämta svar(ett eget svar)

next

 

Med denna självkallande sub loopar vi igenom alla svar som finns, och vi kan gå hur långt som helst i djupled. Inte speciellt säkert då det kan pågå i en evighet.

 

sub hämta svar(ett eget svar)

for each svar in ett eget svar

skriv ut svaret

if ett eget svar has svar then call sub hämta svar()

next

 

Jag tror att detta med forum och hur man skapar ett forum med trådar måsta vara världen mest bevarade hemlighet. Har sökt efter svar på google hur länge som helst och kammat noll. Finns det någon bright stjärna som kan länka eller förklara för mig hur det egentligen går till när man skapar ett forum.

 

Dela detta inlägg


Länk till inlägg
Dela på andra webbplatser

Det finns väl olika lösningar men ett förslag är.

 

för varje sparat inlägg får två index fält ett för sig själv [index] och ett för vilket det tillhör [från tråd] (tex 0 vid en egen tråd).

 

sedan vid översikten plockar du bara fram de som har en egen tråd ([från tråd] = 0)

 

och sedan när du skall visa tex tråd nr 45:

skriv ut tråd 45.

anrop till hämtaTråd(45,...)

 

 

funktion hämtaTråd(trådnr,trådtext,...)

hämta [från tråd]=trådnr

från x=första till sista

Skriv ut tråd

hämta [från tråd]=x

om hittade: hämtaTråd(hämtade tråden)

(slut från)

(slut funktion)

 

 

Och det är väl ganska lika dina tankegångar

 

Dela detta inlägg


Länk till inlägg
Dela på andra webbplatser

Mycket likt mina tankebanor. Det enda jag är lite fundersam över är att det kommer och bli en massa hämtande från databasen, minst 2 för varje svar som finns. Tänk en diskussion som har 15 svar, minst 30 db querys plus det första för att hämta alla första-svar [från tråd]=0.

 

Jag skulle ju gärna vilja ha en översikt i toppen av diskussionen där man kan se hur alla svar hänger ihop. Liknande det som finns på detta forum.

Om jag gör samma fråga två ggr så blir det minst 60 querys(!).

Man skulle ju kunna skapa en variabel med hela sidans innehåll under queryn. Men jag vet att i ASP så ska man helst inte ha för mycket värden i variabler då detta tar prestanda från servern.

 

Jag har hört att Stored Procedures är ett alternativ för att snabba upp db querys. Dock är jag inte hemma på det området ännu.

 

Dela detta inlägg


Länk till inlägg
Dela på andra webbplatser

Jag är inte riktigt med på hur ni tänker, men jag ser inte att det behövs mer än en query.

 

Jag tror att detta med forum och hur man skapar ett forum med trådar måsta vara världen mest bevarade hemlighet

 

Nädå, inte så knepigt. Du är inne på rätt banor i ditt första inlägg, med den rekursiva metoden (att det skulle gå i evighet behöver du inte oroa dig över =)

 

Ett enkelt exempel:

 

Message

-------------

ThreadId

MessageId

ParentId

InDate

Message

 

Om ett svar ligger på toppnivå sätts ParentId till 0 annars till MessageId för det inlägg som det besvarar.

 

Den query du kör hämtar alla inlägg från aktuell ThreadId. Varje inlägg lägger du in i en Dictionary dictTree där MessageId används som Key och ParentId som Value. Denna struktur använder du för rekursionen.

 

Ett annat Dictionary-objekt använder du för att spara detaljinfon för varje meddelande (Key=MessageId, Value=Pekare till en instans av ett klassobjekt exempelvis som innehåller detaljdatan)

 

Det var iallafall en början

 

 

AnjunaMoon

____________________________________________________________

/* There is nothing more permanent than a temporary solution... */

Stoppa mjukvarupatenten nu! http://www.ffii.se/

 

Dela detta inlägg


Länk till inlägg
Dela på andra webbplatser

Om jag förstår detta rätt så ska jag skapa en array (är väl samma som en/ett dictionary?) med det unika id:et för varje inlägg i tråden, detta med rekursionen. För med rekursionen så skapas den korrekta strukturen.

 

Skapa class-object Set sqlQuery=[select * from posts]

 

Loopa igenom min array

 

Hämta datan från mitt class-object där jag pekar på det unika id:et som identifierare.

 

slut loop

 

Har jag förstått rätt, eller är jag helt ute och cyklar?

 

 

Jag är nog ute och cyklar...

[inlägget ändrat 2004-08-27 15:18:02 av geezer]

Dela detta inlägg


Länk till inlägg
Dela på andra webbplatser

Hej igen geezer. Som utlovat kommer här ett kodexempel på det jag pratade om tidigare i tråden. (Testlänk på http://81.26.253.111/EXAMPLES/ForumTree.asp)

 

 

[log]

<html><body >
[MÄRK]<%[/MÄRK]
[color="#0000ff"]Public[/color] oTree,oPosts
[color="#0000ff"]Class[/color] Post
[color="#0000ff"]Private[/color] sMess,sTitle

[color="#0000ff"]Public[/color] Property Get Message()
	Message=sMess
[color="#0000ff"]End[/color] Property
[color="#0000ff"]Public[/color] Property Let Message(strMess)
	sMess=strMess
[color="#0000ff"]End[/color] Property
[color="#0000ff"]Public[/color] Property Get Title()
	Title=sTitle
[color="#0000ff"]End[/color] Property
[color="#0000ff"]Public[/color] Property Let Title(strTitle)
	sTitle=strTitle
[color="#0000ff"]End[/color] Property
[color="#0000ff"]End[/color] [color="#0000ff"]Class[/color]

[color="#0000ff"]Sub[/color] LoadThread(nThreadId)
 [color="#0000ff"]Set[/color] oConn=[b]Server[/b].[color="#0000ff"]CreateObject[/color]([GRÅ]"ADODB.Connection"[/GRÅ])
 oConn.Open [GRÅ]"Driver={SQL Server};Server=xxxxx;Database=ValiBas;Uid=xxxx;Pwd=xxxxx;"[/GRÅ] 
 [color="#0000ff"]Set[/color] oRst=oConn.[color="#0000ff"]Execute[/color]([GRÅ]"SELECT * FROM Post WHERE ThreadId="[/GRÅ] & nThreadId)
 [color="#0000ff"]Set[/color] oTree = [color="#0000ff"]CreateObject[/color]([GRÅ]"Scripting.Dictionary"[/GRÅ])
 [color="#0000ff"]Set[/color] oPosts= [color="#0000ff"]CreateObject[/color]([GRÅ]"Scripting.Dictionary"[/GRÅ])
 [color="#0000ff"]Do[/color] [color="#0000ff"]While[/color] [color="#0000ff"]Not[/color] oRst.EOF
 	nMessId=oRst([GRÅ]"MessageId"[/GRÅ]):nParentId=oRst([GRÅ]"ParentId"[/GRÅ]):strTitle=oRst([GRÅ]"Title"[/GRÅ]):strMess=oRst([GRÅ]"Message"[/GRÅ])
	[color="#0000ff"]Set[/color] oPost=[color="#0000ff"]New[/color] Post
	oPost.Message=strMess
	oPost.Title=strTitle
 	oPosts.Add nMessId,oPost 
	oTree.Add nMessId,nParentId 
	oRst.MoveNext
 [color="#0000ff"]Loop[/color]
oRst.Close
oConn.Close
[color="#0000ff"]Set[/color] oConn=[color="#0000ff"]Nothing[/color]
[color="#0000ff"]Set[/color] oRst=[color="#0000ff"]Nothing[/color]
[color="#0000ff"]End[/color] [color="#0000ff"]Sub[/color]

[color="#0000ff"]Sub[/color] PrintRecursiveTree(nParent,nLevel) 
strIndent=[color="#0000ff"]String[/color](nLevel*5,[GRÅ]"."[/GRÅ])
[color="#0000ff"]For[/color] [color="#0000ff"]Each[/color] key [color="#0000ff"]In[/color] oTree.Keys
	[color="#0000ff"]If[/color] nParent=oTree(key) [color="#0000ff"]Then[/color]
		[b]Response[/b].write strIndent & key & [GRÅ]") "[/GRÅ] & oPosts(key).Title & [GRÅ]"<br>"[/GRÅ]
		PrintRecursiveTree key,nLevel+1
	[color="#0000ff"]End[/color] [color="#0000ff"]If[/color]
[color="#0000ff"]Next[/color]
[color="#0000ff"]End[/color] [color="#0000ff"]Sub[/color]

LoadThread 1
PrintRecursiveTree 0,0 
[MÄRK]%>[/MÄRK]
</body></html>

[/log]

 

AnjunaMoon

____________________________________________________________

/* There is nothing more permanent than a temporary solution... */

Stoppa mjukvarupatenten nu! http://www.ffii.se/

 

[inlägget ändrat 2004-08-28 20:15:46 av Anjuna Moon]

Dela detta inlägg


Länk till inlägg
Dela på andra webbplatser

Ser bra ut när du gör det.

 

Jag har nog ett problem med min tolk...

 

Microsoft VBScript compilation error [color="#006400"]'800a0401' [/color]

Expected [color="#0000ff"]End[/color] of statement 

/index.asp, line 6 

[color="#0000ff"]Public[/color] [color="#0000ff"]Property Get[/color] Message()
----------------^

 

Dela detta inlägg


Länk till inlägg
Dela på andra webbplatser

Jaha, den där låtsas-asp:n =) Visst kan du lösa det på andra sätt än med klasser, men om jag vore du skulle jag hellre ha tillgång till riktigt vbscript och asp (chili har ju tilloch med problem med så grundläggande saker som att kunna sätta ett korrekt LCID, så har du möjlighet så byt)

 

Mitt exempel var för övrigt egentligen bara till för att illustrera min tankegång kring trädstruktursfrågan.

 

Dela detta inlägg


Länk till inlägg
Dela på andra webbplatser

Ja, det blir väl lite pillande för min del nu då. Jag hänger iaf med i ditt resonemang med trädstrukturen. Tänkte aldrig på att skapa en klass och att loopa igenom oTree.keys går nog snabbare än att hämta från databasen hela tiden. CreateObject("Scripting.Dictionary") är ju snäppet vassare än en enkel array. Jag ska nog gå och låna VB för dummies och se hur mycket jag har missat :)

 

Tack för hjälpen.

 

Dela detta inlägg


Länk till inlägg
Dela på andra webbplatser

Det där såg väldigt fiffigt ut. Jag har en liknande sak, men det handlar om projekt och underprojekt som just nu är väldigt ooptimerad (är det ett ord?).

Jag ska lista ut en huvudprojekt som har null i parentID och sen lista ut alla projekt som har huvudprojektets id som parentID. Och under varje projekt ska det listas alla projektmedlemmar och till höger om dom alla timmar dom jobbat med ett projekt. Upplägget jag har idag funkar men det är ordentligt resurskrävande. Men jag vet inte hur jag ska få till det med Scripting.Directory. Någon som kan hjälpa mig?

 

[log]Sub DoTree(parentProjectID, level)

Dim sql, rs, i

'execString = "SELECT tblProject.ProjectID, tblProject.ProjectName, tblProject.StartDate FROM tblProject WHERE tblProject.ParentProjectID = "& parentProjectID &" AND tblProject.ProjectStatusID <> 2 ORDER BY tblProject.ProjectName"

execString = "spGetProjectChilds "& parentProjectID &", "& iPersonID

set rs = objConn.Execute(execString)

 

do while not rs.EOF

Response.Write "<tr><td colspan=""2"">"

for i = 0 to level * 4-1

Response.Write "&#160;" 'För indentering

next

Response.Write "<b>"& rs("ProjectName") &"</b></td><td colspan=""32"">&#160;</td></tr>"

execString = "spGetPersonsFromProject "& rs("ProjectID") &", "& iPersonID

'execString = "SELECT tblPerson.PersonID, tblPerson.FirstName+' '+tblPerson.LastName AS PersonName, tblProject.ProjectName FROM tblProject INNER JOIN tblProject_Person ON tblProject_Person.ProjectID = tblProject.ProjectID INNER JOIN tblPerson ON tblPerson.PersonID = tblProject_Person.PersonID WHERE tblProject.ProjectID = "& rs("ProjectID")

set rs2 = objConn.Execute(execString)

do while not rs2.EOF

Response.Write "<tr>"

Response.Write "<td colspan=""2"">"

for i = 0 to (level + 1) * 4-1

Response.Write "&#160;"

next

Response.Write rs2("PersonName") &"</td>"

'Rita ut personens datum

WriteProjectDates rs("ProjectID"), rs2("PersonID"), iYear, iMonth, rs("StartDate")

'Response.Write "<td colspan=""32"">&#160;</td>"

Response.Write "</tr>"

rs2.MoveNext

loop

DoTree rs("ProjectID"), level + 1

rs.MoveNext

loop

End Sub

 

'Skriver ut timmarna för en person

Sub WriteProjectDates(ProjectID, PersonID, dYear, dMonth, startDate)

dim arrReporting

if isnull(startDate) then startDate = CDate("1900-01-01")

'Response.Write "<script>alert('ProjectID: "& ProjectID &" PersonID: "& PersonID &"')</script>"

if sReportType = "forecast" then

execString = "spForeCastGetProjectDates "& ProjectID &", "& PersonID &", "& dYear &", "& dMonth

else

execString = "spGetProjectDates "& ProjectID &", "& PersonID &", "& dYear &", "& dMonth

end if

Set rs2 = objConn.Execute(execString)

if not rs2.eof then

arrReporting = rs2.GetRows()

 

for i = 1 to LastDateOfMonth

showhour = "&#160;"

currentDate = CDate(iYear &"-"& iMonth &"-"& CInt(i))

if sReportType = "timereport" then 'timereport

if currentDate => CDate(Year(Now) &"-"& Month(Now) &"-01") and currentDate <= Now() then

Response.Write "<td align=""center"" style=""background-color:lightgreen; cursor: hand;"" onclick=""window.open('edithours.asp?projectID="& ProjectID &"&personID="& PersonID &"&reportDate="& CDate(dYear &"-"& dMonth &"-"& i) &"&reportType="& sReportType &"', 'edithours', 'width=640,height=480')"">"

else

Response.Write "<td align=""center"" style=""background-color:orange;"">"

end if

else 'Prognos

if currentDate => Now() AND currentDate > startDate then

Response.Write "<td align=""center"" style=""background-color:lightgreen; cursor: hand;"" onclick=""window.open('edithours.asp?projectID="& ProjectID &"&personID="& PersonID &"&reportDate="& CDate(dYear &"-"& dMonth &"-"& i) &"&reportType="& sReportType &"', 'edithours', 'width=640,height=480')"">"

else

Response.Write "<td align=""center"" style=""background-color:orange;"">"

end if

end if

 

for o = 0 to UBound(arrReporting, 2)

reportingDate = CDate(arrReporting(1, o))

reportingHour = arrReporting(0, o)

reportingDay = Day(reportingDate)

endDate = arrReporting(3, o)

 

if reportingDate = currentDate then

showHour = reportingHour

exit for

end if

next

Response.Write showHour

Response.Write "</td>"

next

else

for i = 1 to LastDateOfMonth

currentDate = CDate(iYear &"-"& iMonth &"-"& CInt(i))

if sReportType = "timereport" then 'timereport

if currentDate => CDate(Year(Now) &"-"& Month(Now) &"-01") and currentDate <= Now() then

Response.Write "<td align=""center"" style=""background-color:lightgreen; cursor: hand;"" onclick=""window.open('edithours.asp?projectID="& ProjectID &"&personID="& PersonID &"&reportDate="& CDate(dYear &"-"& dMonth &"-"& i) &"&reportType="& sReportType &"', 'edithours', 'width=640,height=480')"">&#160;</td>"

else

Response.Write "<td align=""center"" style=""background-color:orange;"">&#160;"

end if

else 'prognos

if currentDate => Now() AND currentDate > startDate then

Response.Write "<td align=""center"" style=""background-color:lightgreen; cursor: hand;"" onclick=""window.open('edithours.asp?projectID="& ProjectID &"&personID="& PersonID &"&reportDate="& CDate(dYear &"-"& dMonth &"-"& i) &"&reportType="& sReportType &"', 'edithours', 'width=640,height=480')"">"

else

Response.Write "<td align=""center"" style=""background-color:orange;"">"

end if

end if

next

end if

End Sub

 

'Hämtar huvudprojektet

execString = "SELECT tblProject.ProjectID, tblProject.ProjectName, tblProject.StartDate FROM tblProject WHERE tblProject.ProjectID = "& iProjectID

set rs = objConn.Execute(execString)

if not rs.EOF then

Response.Write "<tr><td colspan=""2""><b>"& rs("ProjectName") &"</b></td><td colspan=""32"">&#160;</td></tr>"

execString = "spGetPersonsFromProject "& rs("ProjectID") &", "& iPersonID

set rsPerson = objConn.Execute(execString)

do while not rsPerson.EOF

Response.Write "<tr>"

Response.Write "<td colspan=""2"">"

for i = 0 to 3

Response.Write "&#160;"

next

Response.Write rsPerson("PersonName") &"</td>"

'Rita ut personens datum

WriteProjectDates rs("ProjectID"), rsPerson("PersonID"), iYear, iMonth, rs("StartDate")

'Response.Write "<td colspan=""32"">&#160;</td>"

Response.Write "</tr>"

rsPerson.MoveNext

loop

set rsPerson = nothing

DoTree rs("ProjectID"), 1

end if

set rs = nothing[/log]

 

Dela detta inlägg


Länk till inlägg
Dela på andra webbplatser
Men jag vet inte hur jag ska få till det med Scripting.Directory

Menar du Scripting.Dictionary?

 

Har inte haft tid att titta igenom din kod än, kanske får lite tid runt lunch till det.

Men jag kan tillsvidare rekommendera att läsa lite om en intressant feature i ADO 2.0 kallad Data Shaping, som ersätter joins på ett intressant sätt.

 

Ett exempel på hur du skulle skriva din query är:

 

SHAPE {[color="#0000ff"]Select[/color] ProfessorID, FirstName, LastName, PhoneNumber FROM Professor}
APPEND({[color="#0000ff"]Select[/color] ClassName, RefNumber, ProfessorID FROM [color="#0000ff"]Class[/color]} AS [color="#0000ff"]Class[/color]
RELATE ProfessorID [color="#0000ff"]To[/color] ProfessorID)

 

Det som returneras är ett recordset av recordsets. Varje post i första SELECT:en returneras i den primära RS. Denna post är en RS som innehåller de relaterade posterna från den andra SELECT:en.

 

Läs mer på:

http://www.4guysfromrolla.com/webtech/092599-1.shtml

 

AnjunaMoon

____________________________________________________________

/* There is nothing more permanent than a temporary solution... */

Stoppa mjukvarupatenten nu! http://www.ffii.se/

 

Dela detta inlägg


Länk till inlägg
Dela på andra webbplatser

Hehe, jo jag menade Scripting.Dictionary :)

 

Det verkar intressant men fungerar det att använda rekursivt? Och behöver man något särskilt för att köra ADO 2.0? Sidan jag jobbar med ligger på

Har tyvärr inte så jättemycket tid att lägga ner på detta utan om jag får mitt exempel att funka fast med lite optimering så är jag nöjd.

Men detta verkar vara intressant i alla fall!

 

Dela detta inlägg


Länk till inlägg
Dela på andra webbplatser

Jo exakt.

Jag anropar den med mitt startprojekts id och den ska lista upp alla projektets subprojekt och under varje projekt ska projektets medlemmar visas upp och sen lista deras tider till höger.

Just nu blir det en väldans massa databasanrop som du ser. Skulle helst vilja läsa ner dom till nån array eller Scripting.Dictionary och arbeta med dom därifrån men eftersom jag hämtar data från olika ställen är jag osäker på hur jag ska få ihop det.

 

Bifogar en bild på hur det ser ut nu..

616102_thumb.jpg

Dela detta inlägg


Länk till inlägg
Dela på andra webbplatser

Ok, några följdfrågor.

 

iPersonID - Gissar att det här är någon global för hela trädet? (typ ansvarig person eller nåt)

 

Har du varianter av dina sp som returnerar alla poster istf per projektID? Ex.

spGetProjectChilds personID - ger alla StartDate, ProjectID,ProjectName

spGetPersonsFromProject personID - ger alla PersonName,PersonID

 

Jag sätter ihop en variant där jag förutsätter att dessa sp finns iallafall.

 

Dela detta inlägg


Länk till inlägg
Dela på andra webbplatser

Hej, så här hade jag tänkt mig själva strukturerna som används i DoTree och laddningen av dem:

 

[log]

[color="#0000ff"]Public[/color] oTree,oProjects

[color="#0000ff"]Class[/color] Project
[color="#0000ff"]Private[/color] sName,oDate,oPersons,blHasPersons
[color="#0000ff"]Public[/color] [color="#0000ff"]Property Get[/color] Name()
	Name=sName
[color="#0000ff"]End[/color] Property
[color="#0000ff"]Public[/color] [color="#0000ff"]Property Let[/color] Name(strName)
	sName=strName
[color="#0000ff"]End[/color] Property
[color="#0000ff"]Public[/color] [color="#0000ff"]Property Get[/color] StartDate()
	StartDate=oDate
[color="#0000ff"]End[/color] Property
[color="#0000ff"]Public[/color] [color="#0000ff"]Property Let[/color] StartDate(objDate)
	oDate=objDate
[color="#0000ff"]End[/color] Property
[color="#0000ff"]Public[/color] [color="#0000ff"]Property Get[/color] Persons()
	Persons=oPersons
[color="#0000ff"]End[/color] Property
[color="#0000ff"]Public[/color] [color="#0000ff"]Property Set[/color] Persons(objPersons)
	oPersons=objPersons
	blHasPersons=[color="#0000ff"]True[/color]
[color="#0000ff"]End[/color] Property
[color="#0000ff"]Public[/color] [color="#0000ff"]Property Get[/color] HasPersons()
	HasPersons=[color="#0000ff"]CBool[/color](blHasPersons)
[color="#0000ff"]End[/color] Property
[color="#0000ff"]End[/color] [color="#0000ff"]Class[/color]

[color="#0000ff"]Class[/color] Person
[color="#0000ff"]Private[/color] sName,nId
[color="#0000ff"]Public[/color] [color="#0000ff"]Property Get[/color] Name()
	Name=sName
[color="#0000ff"]End[/color] Property
[color="#0000ff"]Public[/color] [color="#0000ff"]Property Let[/color] Name(strName)
	sName=strName
[color="#0000ff"]End[/color] Property
[color="#0000ff"]End[/color] [color="#0000ff"]Class[/color]

[color="#0000ff"]Sub[/color] LoadData(PersonID)
 [color="#0000ff"]Dim[/color] oProjectPersons,oTmp
 [color="#0000ff"]Set[/color] oTree = [color="#0000ff"]CreateObject[/color]([GRÅ]"Scripting.Dictionary"[/GRÅ])
 [color="#0000ff"]Set[/color] oProjects= [color="#0000ff"]CreateObject[/color]([GRÅ]"Scripting.Dictionary"[/GRÅ])
 [color="#0000ff"]Set[/color] oProjectPersons= [color="#0000ff"]CreateObject[/color]([GRÅ]"Scripting.Dictionary"[/GRÅ])

 execString = [GRÅ]"spGetPersons "[/GRÅ]& PersonID [color="#006400"]' Alla personer i databasen[/color]
 	 [color="#0000ff"]Set[/color] oRst = objConn.[color="#0000ff"]Execute[/color](execString)
 [color="#0000ff"]Do[/color] [color="#0000ff"]While[/color] [color="#0000ff"]Not[/color] oRst.EOF
 	nProjId=oRst([GRÅ]"ProjectID"[/GRÅ]):nPersonId=oRst([GRÅ]"PersonId"[/GRÅ]):strName=oRst([GRÅ]"PersonName"[/GRÅ])
	[color="#0000ff"]Set[/color] oPers=[color="#0000ff"]New[/color] Person
	oPers.Name=strName 
	[color="#0000ff"]If[/color] [color="#0000ff"]Not[/color] oProjectPersons.exists(nProjId) [color="#0000ff"]Then[/color]
		[color="#0000ff"]Set[/color] oTmp=[color="#0000ff"]CreateObject[/color]([GRÅ]"Scripting.Dictionary"[/GRÅ]
		oProjectPersons.Add nProjId,oTmp
	[color="#0000ff"]End[/color] [color="#0000ff"]If[/color]
	oProjectPersons(nProjId).Add key,oPers
	oRst.MoveNext
 [color="#0000ff"]Loop[/color]
oRst.Close

     execString = [GRÅ]"spGetProjects "[/GRÅ]& PersonID [color="#006400"]' Alla projekt/underprojekt i databasen[/color]
 	 [color="#0000ff"]Set[/color] oRst = objConn.[color="#0000ff"]Execute[/color](execString)
 [color="#0000ff"]Do[/color] [color="#0000ff"]While[/color] [color="#0000ff"]Not[/color] oRst.EOF
 	nProjId=oRst([GRÅ]"ProjectID"[/GRÅ]):nParentId=oRst([GRÅ]"ParentId"[/GRÅ]):strName=oRst([GRÅ]"ProjectName"[/GRÅ]):oDate=oRst([GRÅ]"StartDate"[/GRÅ])
	[color="#0000ff"]Set[/color] oProj=[color="#0000ff"]New[/color] Project 
	oProj.Name=strName 
	oProj.StartDate=oDate
	[color="#0000ff"]If[/color] oProjectPersons.Exists(nProjId) [color="#0000ff"]Then[/color]
		[color="#0000ff"]Set[/color] oProj.Persons=oProjectPersons(nProjId)
	[color="#0000ff"]End[/color] [color="#0000ff"]If[/color]
 	oProjects.Add nProjId,oProj
	oTree.Add nProjId,nParentId
	oRst.MoveNext
 [color="#0000ff"]Loop[/color]
oRst.Close
oConn.Close
[color="#0000ff"]Set[/color] oConn=[color="#0000ff"]Nothing[/color]
[color="#0000ff"]Set[/color] oRst=[color="#0000ff"]Nothing[/color]
[color="#0000ff"]End[/color] [color="#0000ff"]Sub[/color]

[/log]

 

Klassen Project innehåller då namn och startdatum, samt en eventuell pekare till en Dictionary, innehållande instanser av klassen Person

 

Dictionaryn oTree innehåller relationen mellan projekt och föräldraprojekt.

Dictionaryn oProjects innehåller projektinstanserna per projektid.

 

Kanske det kan vara till hjälp.

 

AnjunaMoon

____________________________________________________________

/* There is nothing more permanent than a temporary solution... */

Stoppa mjukvarupatenten nu! http://www.ffii.se/

 

Dela detta inlägg


Länk till inlägg
Dela på andra webbplatser

Jag skulle sen skriva om DoTree som följer:

 

[log]

[color="#0000ff"]Sub[/color] DoTree(parentProjectID, level)
[color="#0000ff"]Dim[/color] i
[color="#0000ff"]For[/color] [color="#0000ff"]Each[/color] key [color="#0000ff"]In[/color] oProjects
	oProj=oProjects(key)
	[color="#0000ff"]If[/color] key=parentProjectID [color="#0000ff"]Then[/color]
		[b]Response[/b].Write [GRÅ]"<tr><td colspan="[/GRÅ][GRÅ]"2"[/GRÅ][GRÅ]">"[/GRÅ]
		[color="#0000ff"]For[/color] i = 0 [color="#0000ff"]To[/color] level * 4-1
			[b]Response[/b].Write [GRÅ]"&#160;"[/GRÅ]
		[color="#0000ff"]Next[/color]
		[b]Response[/b].Write [GRÅ]"<b>"[/GRÅ]& oProj.Name &[GRÅ]"</b></td><td colspan="[/GRÅ][GRÅ]"32"[/GRÅ][GRÅ]">&#160;</td></tr>"[/GRÅ]
		[color="#0000ff"]If[/color] oProj.HasPersons [color="#0000ff"]Then[/color]
			[color="#0000ff"]Set[/color] oPersons=oProj.Persons
			[color="#0000ff"]For[/color] [color="#0000ff"]Each[/color] key2 [color="#0000ff"]In[/color] oPersons
				oPerson=oPersons(key2)
				[b]Response[/b].Write [GRÅ]"<tr>"[/GRÅ]
				[b]Response[/b].Write [GRÅ]"<td colspan="[/GRÅ][GRÅ]"2"[/GRÅ][GRÅ]">"[/GRÅ]
				[color="#0000ff"]For[/color] i = 0 [color="#0000ff"]To[/color] (level + 1) * 4-1
					[b]Response[/b].Write [GRÅ]"&#160;"[/GRÅ]
				[color="#0000ff"]Next[/color]
				[b]Response[/b].Write oPerson.Name &[GRÅ]"</td>"[/GRÅ]
				WriteProjectDates key, key2, iYear, iMonth, oProj.StartDate
				[b]Response[/b].Write [GRÅ]"</tr>"[/GRÅ]
				rs2.MoveNext
			[color="#0000ff"]Next[/color]
		[color="#0000ff"]End[/color] [color="#0000ff"]If[/color]	
		DoTree key, level + 1
	[color="#0000ff"]End[/color] [color="#0000ff"]If[/color]
[color="#0000ff"]Next[/color]
[color="#0000ff"]End[/color] [color="#0000ff"]Sub[/color] 

[/log]

 

Dela detta inlägg


Länk till inlägg
Dela på andra webbplatser

Börjar ge mig in på denna nu, verkligen tack för att du tog dig tid!!

 

Dessa rader under LoadData:

execString = "spGetPersons "& PersonID ' Alla personer i databasen

Set oRst = objConn.Execute(execString)

Do While Not oRst.EOF

nProjId=oRst("ProjectID"):nPersonId=oRst("PersonId"):strName=oRst("PersonName")

 

Vad är det den ska hämta? Projekt eller personer? För att man hämtar alltid ett projekt, det hämtar jag högst upp på sidan med iProjectID = Request.Form("selProject"). Så det händer aldrig att man hämtar alla projekt utan man hämtar alltid ett.

 

Dela detta inlägg


Länk till inlägg
Dela på andra webbplatser

Ok, det jag vill ha ut ur den är alla underprojekt på alla nivåer till ett visst huvudprojekt. Lättast att skriva den vore väl kanske att ha ett RootProjectId-fält i Projects-tabellen.

 

Dela detta inlägg


Länk till inlägg
Dela på andra webbplatser

Ska jag använda mig utav RootProjectID alltså, för det existerar ett sådant. Inte ParentID? Om man använder RootProjectID så blir det väl inte för alla nivåer?

 

Edit.

En till fundering på spGetPersons. Borde man inte skicka med det valda projektets id som parameter också?

Vill bara vara säker på att jag förstår vad du menar :)

[inlägget ändrat 2004-08-30 15:38:28 av Patrik Ahlberg]

Dela detta inlägg


Länk till inlägg
Dela på andra webbplatser

Skapa ett konto eller logga in för att kommentera

Du måste vara medlem för att kunna kommentera

Skapa ett konto

Skapa ett nytt konto på vårt forum. Det är lätt!

Registrera ett nytt konto

Logga in

Redan medlem? Logga in här.

Logga in nu



×
×
  • Skapa nytt...