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

Nästlingsproblem

Rekommendera Poster

Hej

Jag har skapat ett menysystem i flera nivåer.

Meny1_nivå_1

Meny2_nivå_1

+ Meny1_nivå_2

+ Meny2_nivå_2

+ Meny3_nivå_2

+ + Meny1_nivå_3

+ + Meny2_nivå_3

 

Genom att kolla på Parent för var o en kan man se i vilken nivå de olika menyer hör hemma.

Men om vill bygga på ännu fler nivåer (rent teoretiskt) så blir det mycket krångligt.

 

Nu bygger jag SQL-satserna så här:

under=[GRÅ]"SELECT * FROM Huvudmeny WHERE Parent="[/GRÅ]&rs([GRÅ]"Id"[/GRÅ])&[GRÅ]""[/GRÅ]
rs2.Open under, Conn, 0, 3
[color="#0000ff"]While[/color] [color="#0000ff"]Not[/color] rs2.Eof
[b]Response[/b].Write [GRÅ]""[/GRÅ]&rs2([GRÅ]"Meny"[/GRÅ])&[GRÅ]"<br>"[/GRÅ]
	under=[GRÅ]"SELECT * FROM Huvudmeny WHERE Parent = "[/GRÅ]&rs2([GRÅ]"Id"[/GRÅ])&[GRÅ]""[/GRÅ]
	rs3.Open under, Conn, 0, 3
	[color="#0000ff"]While[/color] [color="#0000ff"]Not[/color] rs3.Eof
		[b]Response[/b].Write [GRÅ]"   "[/GRÅ]&rs3([GRÅ]"Meny"[/GRÅ])&[GRÅ]"<br>"[/GRÅ]
			under=[GRÅ]"SELECT * FROM Huvudmeny WHERE Parent = "[/GRÅ]&rs3([GRÅ]"Id"[/GRÅ])&[GRÅ]""[/GRÅ]
			rs4.Open under, Conn, 0, 3
			[color="#0000ff"]While[/color] [color="#0000ff"]Not[/color] rs4.Eof
				[b]Response[/b].Write [GRÅ]"     "[/GRÅ]&rs4([GRÅ]"Meny"[/GRÅ])&[GRÅ]"<br>"[/GRÅ]
			rs4.MoveNext
			[color="#0000ff"]Wend[/color]
			rs4.Close
	rs3.MoveNext
	[color="#0000ff"]Wend[/color]
	rs3.Close
rs2.MoveNext
[color="#0000ff"]Wend[/color]
rs2.Close

 

Jag vet att man kan göra den mycket mindre med lite smarta koder, men hur?

Tack

 

[inlägget ändrat 2004-10-24 19:48:21 av Admini]

Dela detta inlägg


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

Helt otestat.

 

[color="#0000ff"]Dim[/color] level
level=1
under=[GRÅ]"SELECT * FROM Huvudmeny WHERE Parent="[/GRÅ]&rs([GRÅ]"Id"[/GRÅ])&[GRÅ]""[/GRÅ]
rs2.Open under, Conn, 0, 3
[color="#0000ff"]While[/color] [color="#0000ff"]Not[/color] rs2.Eof
[b]Response[/b].Write [GRÅ]""[/GRÅ]&rs2([GRÅ]"Meny"[/GRÅ])&[GRÅ]"<br>"[/GRÅ]
WriteMenu(rs2([GRÅ]"id"[/GRÅ]),level)
rs2.MoveNext
[color="#0000ff"]Wend[/color]
rs2.Close

[color="#0000ff"]Function[/color] WriteMenu(id,level)
[color="#0000ff"]Dim[/color] rs
[color="#0000ff"]Dim[/color] under
level=level+1
under=[GRÅ]"SELECT * FROM Huvudmeny WHERE Parent="[/GRÅ]&id&[GRÅ]""[/GRÅ]
rs.Open under, Conn, 0, 3
[color="#0000ff"]While[/color] [color="#0000ff"]Not[/color] rs.Eof
[b]Response[/b].Write [color="#0000ff"]String[/color](level+2,[GRÅ]" "[/GRÅ])&rs([GRÅ]"Meny"[/GRÅ])&[GRÅ]"<br>"[/GRÅ]
WriteMenu(rs([GRÅ]"id"[/GRÅ]),level)
rs.MoveNext
[color="#0000ff"]Wend[/color]
rs.Close
[color="#0000ff"]End[/color] [color="#0000ff"]Function[/color]

 

Dela detta inlägg


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

Måste man inte skriva Call här:

Call WriteMenu(rs2("id"),level)

 

För jag får kompileringsfel:

Det går inte att använda parenteser när en Sub anropas.

form5.asp, line 71, column 26

WriteMenu(rs2("id"),level)

-------------------------^

 

Dela detta inlägg


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

När du anropar en sub i VBScript ska du inte sätta parenteser kring parametrarna. Alltså skriver du så här:

 

WriteMenu rs2([GRÅ]"id"[/GRÅ]),level

 

(WriteMenu är förvisso definierad som en funktion, men då inget returneras behandlas den som en subrutin)

[inlägget ändrat 2004-10-24 21:11:05 av Anjuna Moon]

Dela detta inlägg


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

Nej det går inte med den här functionen.

Jag tror egentligen jag behöver en nästlande SQL-sats.

För förr eller senare kommer den till en punkt där han måste öppna en ny RS igen!

Det bör funka oavsätt hur många nivåer man än har.

Tackar på förhand

 

Dela detta inlägg


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

Att hålla på och köra en query per nod är väldigt (!) ineffektivt. Lägg istället in hela tabellinnehållet i en collection och använd sedan denna för att skriva ut trädet:

 

[log]

[color="#006400"]' KLASS FÖR MENYNODER[/color]
[color="#0000ff"]Class[/color] MenuItem
[color="#0000ff"]Private[/color] sName,nParentId

[color="#0000ff"]Public[/color] Property Get Name()
	Name=sName
[color="#0000ff"]End[/color] Property
[color="#0000ff"]Public[/color] Property Let Name(name_)
	sName=name_
[color="#0000ff"]End[/color] Property
[color="#0000ff"]Public[/color] Property Get ParentId()
	ParentId=nParentId
[color="#0000ff"]End[/color] Property
[color="#0000ff"]Public[/color] Property Let ParentId(id_)
	nParentId=id_
[color="#0000ff"]End[/color] Property
[color="#0000ff"]End[/color] [color="#0000ff"]Class[/color]

[color="#006400"]' SKAPA EN LOKAL KOPIA AV TABELLINNEHÅLLET[/color]
[color="#0000ff"]Set[/color] oMenuItems = [color="#0000ff"]CreateObject[/color]([GRÅ]"Scripting.Dictionary"[/GRÅ])
sQuery=[GRÅ]"SELECT * FROM Huvudmeny"[/GRÅ]
[color="#0000ff"]Set[/color] oRst=Conn.[color="#0000ff"]Execute[/color](sQuery)
[color="#0000ff"]Do[/color] [color="#0000ff"]While[/color] [color="#0000ff"]Not[/color] oRst.EOF
id=oRst([GRÅ]"Id"[/GRÅ]):pid=[color="#0000ff"]CLng[/color](oRst([GRÅ]"Parent"[/GRÅ])):name=oRst([GRÅ]"Meny"[/GRÅ])
[color="#0000ff"]Set[/color] oItem=[color="#0000ff"]New[/color] MenuItem
oItem.ParentId=pid
oItem.Name=name
oMenuItems.Add(id,oItem)
oRst.MoveNext
[color="#0000ff"]Loop[/color]

[color="#006400"]' SKRIV UT TRÄDET[/color]
[color="#0000ff"]Sub[/color] CreateTree(nParentId,nLevel)
[color="#0000ff"]For[/color] [color="#0000ff"]Each[/color] Key [color="#0000ff"]In[/color] oMenuItems
	[color="#0000ff"]If[/color] [color="#0000ff"]CLng[/color](oTree(Key))=[color="#0000ff"]CLng[/color](nParentId) [color="#0000ff"]Then[/color]
		[color="#0000ff"]Set[/color] oItem=oMenuItems(Key)
		[b]Response[/b].write [color="#0000ff"]String[/color](nLevel,[GRÅ]"-"[/GRÅ]) & oItem.Name & [GRÅ]"<br>"[/GRÅ]
		CreateTree Key,nLevel+1
	[color="#0000ff"]End[/color] [color="#0000ff"]If[/color]
[color="#0000ff"]Next[/color]
[color="#0000ff"]End[/color] [color="#0000ff"]Sub[/color]

[color="#006400"]' SKRIV UT TRÄDET - TOPPNODER FÖRMODAS HAR PARENT=0[/color]
CreateTree 0,1

[/log]

 

AnjunaMoon

____________________________________________________________

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

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

[inlägget ändrat 2004-10-24 23:25:19 av Anjuna Moon]

Dela detta inlägg


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

om JAG har för gammal version av VBScript?

Jag vet inte VAD jag har ... jag har IE6

Windows 2000p med alla uppdateringar.

går det att anpassa det efter dem?

 

Dela detta inlägg


Länk till inlägg
Dela på andra webbplatser
Du kan hämta version 5.6 här

Men ... om jag hämtar den nya versionen, ska alla användare över internet göra det också?

Jag menar när jag har installerat det på en webserver.

 

Dela detta inlägg


Länk till inlägg
Dela på andra webbplatser
Men ... om jag hämtar den nya versionen, ska alla användare över internet göra det också?

 

Nope, det är som sagt bara på webbservern den ska ligga.

 

Dela detta inlägg


Länk till inlägg
Dela på andra webbplatser
Så du menar alla moderna (och mindre moderna) webserver har den installerat redan?

 

Ja det tror jag, men säker är jag inte. Bäst är att titta på versionen av filen som jag beskrev i inlägget innan. Kör du på webbhotell får du nog ringa och fråga.

 

Dela detta inlägg


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

Ok , nu har installerat och omstartat mashinen men samma fel:

Kompileringsfel i Microsoft VBScript (0x800A03EA)
Syntaxfel
/form5.asp, line 55
[color="#0000ff"]Class[/color] MenuItem

 

Dela detta inlägg


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

Vad ligger på raderna innan? (45-55)

 

Enklast är nog att lägga hela meny-koden i en separat fil (exempelvis "menu.asp"), och inkludera den i början av koden, och sedan bara köra "CreateTree 0,1" när du vill skapa menyn.

 

Ciao,

Anders

 

 

Dela detta inlägg


Länk till inlägg
Dela på andra webbplatser
Vad ligger på raderna innan? (45-55)

 

<body>
<table align=[GRÅ]"center"[/GRÅ] border=[GRÅ]"0"[/GRÅ] cellspacing=[GRÅ]"10"[/GRÅ] cellpadding=[GRÅ]"0"[/GRÅ]>
<tr>
	<td valign=[GRÅ]"top"[/GRÅ]>
		<table align=[GRÅ]"center"[/GRÅ] border=[GRÅ]"0"[/GRÅ] cellspacing=[GRÅ]"0"[/GRÅ] cellpadding=[GRÅ]"0"[/GRÅ]>
			<tr>
				<td valign=[GRÅ]"top"[/GRÅ]>

 

Dela detta inlägg


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

Har fixat ett par fel i koden, dock inget som ger ditt felmeddelande. Följande kod fungerar perfekt för mig:

 

[log]

[color="#0000ff"]Class[/color] MenuItem
[color="#0000ff"]Private[/color] sName,nParentId

[color="#0000ff"]Public[/color] Property Get Name()
	Name=sName
[color="#0000ff"]End[/color] Property
[color="#0000ff"]Public[/color] Property Let Name(name_)
	sName=name_
[color="#0000ff"]End[/color] Property
[color="#0000ff"]Public[/color] Property Get ParentId()
	ParentId=nParentId
[color="#0000ff"]End[/color] Property
[color="#0000ff"]Public[/color] Property Let ParentId(id_)
	nParentId=id_
[color="#0000ff"]End[/color] Property
[color="#0000ff"]End[/color] [color="#0000ff"]Class[/color]

[color="#0000ff"]Set[/color] oMenuItems = [color="#0000ff"]CreateObject[/color]([GRÅ]"Scripting.Dictionary"[/GRÅ])
sQuery=[GRÅ]"SELECT * FROM Huvudmeny"[/GRÅ]
[color="#0000ff"]Set[/color] oRst=Conn.[color="#0000ff"]Execute[/color](sQuery)
[color="#0000ff"]Do[/color] [color="#0000ff"]While[/color] [color="#0000ff"]Not[/color] oRst.EOF
id=oRst([GRÅ]"Id"[/GRÅ]):pid=[color="#0000ff"]CLng[/color](oRst([GRÅ]"Parent"[/GRÅ])):name=oRst([GRÅ]"Meny"[/GRÅ])
[color="#0000ff"]Set[/color] oItem=[color="#0000ff"]New[/color] MenuItem
oItem.ParentId=pid
oItem.Name=name
oMenuItems.Add id,oItem
oRst.MoveNext
[color="#0000ff"]Loop[/color]

[color="#0000ff"]Sub[/color] CreateTree(nParentId,nLevel)
[color="#0000ff"]For[/color] [color="#0000ff"]Each[/color] Key [color="#0000ff"]In[/color] oMenuItems
	[color="#0000ff"]Set[/color] oItem=oMenuItems(Key)
	[color="#0000ff"]If[/color] oItem.ParentId=nParentId [color="#0000ff"]Then[/color]
		[b]Response[/b].write [color="#0000ff"]String[/color](nLevel,[GRÅ]"-"[/GRÅ]) & oItem.Name & [GRÅ]"<br>"[/GRÅ]
		CreateTree Key,nLevel+1
	[color="#0000ff"]End[/color] [color="#0000ff"]If[/color]
[color="#0000ff"]Next[/color]
[color="#0000ff"]End[/color] [color="#0000ff"]Sub[/color]
CreateTree 0,1

[/log]

 

 

[inlägget ändrat 2004-10-25 00:02:35 av Anjuna Moon]

Dela detta inlägg


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

Jag bytte ut som du sa och inkluderade filen så här:

<!-- #include file="menu.asp" -->

Men jag får samma fel

 

 

Dela detta inlägg


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

Det funkar nu, koden ligger i början av sidan.

Men den radar alla poster efter varandra vertikalt.

 

Jag måste ha dem i 5(eller mer) olika grupper(kolumner), i vilka står de 5 "överhuvuden" (med Parent=0) överst på varje grupp.

Sedan kommer undermeny_1(nivå_1) vilken kan ha eller inte ha sin egen undergrupp med ev. undermenyer osv.

 

Undermenyer är kopplade till varsin förälder genom att:

(barnets Parent = förälderns Id)

 

Vilken grupp(kolumn) de tillhör bestäms av Status(en kolumn av typen tal)

 

Inbördes ordning bestäms av en annan kolumn(Ordning)

 

Allihop tillsammans bildar en 3d matrix

 

Ge mig lite hjälp för hur jag ändrar och justerar i koden för att få önskad effekt.

TACK!

 

[inlägget ändrat 2004-10-25 10:26:30 av Admini]

Dela detta inlägg


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

Hej

Här är en bild på slutresultat.

Vanudå ... jag kan inte skicka bild...

kommer bara till en inloggningssida!?

[inlägget ändrat 2004-10-25 20:07:19 av Admini]

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...