Just nu i M3-nätverket
Jump to content

Trädstruktur


Jakob Nanneson

Recommended Posts

Jakob Nanneson

Jag har problem med att skapa en trädstruktur med asp. Problemet ligger i hur man löser det med så få loopar som möjligt.

 

Varje post ligger med information om vilken post den ska ligga under (parent). Allt startar på den post som heter "start".

 

Är det någon som har något bra tips på hur man ska bygga upp detta?

 

Förslagsvis ska man väl ha någon sträng som heter "Level" som förklarar hur långt in i trädet som sakerna finns osv.

 

Detta var klurigare än vad jag trodde...

 

Set rs1 = db.Execute("SELECT * FROM content WHERE domain = 1 AND parent LIKE 'start' ORDER BY sortby")
Do Until rs1.EOF
	Response.Write(rs1("name") & "<br>")
	Set rs2 = db.Execute("SELECT * FROM content WHERE domain = 1 AND parent LIKE '" & rs1("name") & "' ORDER BY sortby")
		Do Until rs2.EOF
		Response.Write("- " & rs2("name") & "<br>")
	rs2.MoveNext
	Loop
rs1.MoveNext
Loop

I exemplet övan går man ju igenom level 1-2, men hur bygger man upp detta för att klara alla nivåer. Måste ju gå på något vis!?

 

 

[inlägget ändrat 2002-10-17 21:27:59 av Jakob Nanneson]

Link to comment
Share on other sites

vore ju bättre att bara hämta all data en gåång.. sliper du massa nya kopplingar till databasen..

En enkel men säkerligen inte så effektiv metod kan vara att ha en kolumn i db som bestämmer vart o trädet grenen ligger, typ A för root AA för barn till roten AB för ett till barn ABA för barn till AB. När du tar ut data från DB så sorterar du på texen (A, AB osv). Sen skriver du ut med hjälp av detta..

Om du håller koll på den förra texten så jämför du med den nuvarande.. då vet du ju om den är på samam nivå utåt eller bakåt.. och om bakåt hur långt..

Ja något vimsig förklaring.. Men det funkar iaf..

 

 

 

 

Link to comment
Share on other sites

Jakob Nanneson

Jag kan inte ändra på utseendet av databasen. Och det är nog effektivare att ha angett vilken sida den ska ligga under. För om man byter plats på en "gren" följer ju resten efter. Med ditt exempel skulle det mest bli lösa "pinnar" om man inte uppdaterade hela vägen ut. Om du förstår.

 

Det kanske går att göra någon sortering av array på något vis så att man slipper kontakta databasen varje gång?

 

Fler förslag?

 

Detta är ju trots allt något som något proffs kan bita lite i. Inte enklaste saker att få till på ett bra sätt... eller!?

 

Link to comment
Share on other sites

Använd iterering då.. typ så här.. fast det där var bogus object pascal.. men du kan nog översätta det till ASP..

 

Procedure GetChild(Parent : string;Level : Ineteger);

var rs : recordset

begin

rs := recordset.create

rs.procedurename := 'SP_GetChild';

rs.paramter('Parent').value := Parent;

rs.open;

while not rs.eof do

begin

memo.lines.add('This is a child of' + parent + ' its name is ' + rs.field('Child').asstring);

Level := level + 1;

GetChild(rs.field('Child').asstring, level);

rs.next;

end;

rs.Close;

rs.free;

end;

 

 

Link to comment
Share on other sites

kanske så här..

 

 

sub GetChild(AParent, ALevel)

dim rs

set rs = db.execute("select * from content where domain = 1 and parent like " & AParent & " order by sortyby)

while not rs.eof

response.write rs.field("name") & "is a child of " & aparent & "and is on level" & alevel

level = level + 1

getchild(rs.field("name"), level)

rs.next

loop

end sub

 

 

-> i huvud koden

 

getchild "start", 0

 

 

sen vill du ju göra någon snygg grej för att visa hur de hänger ihop istället för att bara säga hur många steg ut det är..

 

 

 

Link to comment
Share on other sites

Jakob Nanneson

Verkar ju klokt att använda sig av funktioner/sub istället, kan nog fungera finfint det.

 

Några frågor bara:

 

Varför en sub istället för en function?

Varför while not istället för do until?

 

Link to comment
Share on other sites

för att jag är dålig på vb.. ,)

 

använd det du anser mes passande..

sub returnerar inget värde vilket en function skall göra.. annars är de lika.. så vitt jag kommer ihåg..

och om du ställer kollen innan (om rs.eof) så slipper du felmddelande om det inte finns något svar från databasen.. du skippar den ju bara den sattsen.. vilket är precis vad du vill..

 

Link to comment
Share on other sites

Jakob Nanneson

Om någon annan vill pröva sig på denna kod kan jag ju tipsa om att den är full med fel :( men idéen och tanken är ju där, helt klart.

 

Link to comment
Share on other sites

Jakob Nanneson

Det verkar som en level ökar för varje gång. Vart ska jag skriva in koden för att minska level för att allt ska bli rätt? Hänger du med?

 

 

Resultatet blir detta:

 

sak

-sak

sak

--sak

--sak

sak

---sak

---sak

 

Varför?

 

 

[inlägget ändrat 2002-10-18 00:21:51 av Jakob Nanneson]

Link to comment
Share on other sites

Archived

This topic is now archived and is closed to further replies.



×
×
  • Create New...