Just nu i M3-nätverket
Jump to content

Knepigt med BOF or EOF


gelki

Recommended Posts

Problem:

Jag ska lista en trädstruktur från en databas, men får knepigt värre felmeddelande på BOF & EOF. Mitt problem löses ju naturligtvis inte via ref sidan: http://classicasp.aspfaq.com/general/why-do-i-get-bof-or-eof-errors.html eftersom jag redan har

if not RS.eof then
.

I databasen så har jag strukturen på följande sätt:

Kategori_id	Kategori_sub	Kategori_namn
1	0	huvudmeny
2	0	huvudmeny
11	8	sub
8	0	huvudmeny
10	2	sub
12	1	sub
13	1	sub
28	26	sub
15	1	sub
16	1	sub
17	1	sub
18	8	sub
19	2	sub
20	1	sub
21	1	sub
22	8	sub
23	22	sub
24	1	sub
25	1	sub
26	1	sub
27	1	sub
29	26	sub
30	24	sub
31	24	sub
32	25	sub
33	27	sub
34	27	sub
35	27	sub
36	27	sub
37	20	sub
42	1	sub

 

Koden för att lista menyn kommer här:

Function nodelist(x_sub)
SQLStmt = "SELECT Kategori_id, Kategori_sub, Kategori_namn FROM Kategori WHERE Kategori_sub like " & x_sub & " ORDER BY Kategori_id ASC"
Set RS = conn.Execute(SQLStmt)

if not RS.eof then 
Do While Not RS.EOF
	Do Until s = nodeindent
		tabs = tabs + 30
		s = s + 1
	Loop
	If IsEmpty(tabs) = True Then tabs = 0
	Response.Write "<IMG src=""trans.gif"" height=8 width=" & tabs & ">" & RS(2) & "<BR>" & vbCrLf
	xNodes = xNodes + 1		
	nodeindent = nodeindent + 1
	nodelist RS(0)
	nodeindent = nodeindent - 1
	If cint(xNodes) >= cint(nNodes) Then
		Exit Do
		Exit Function
	End If
	RS.MoveNext
Loop
end if 'if not RS.eof then
End Function



Dim nodeindent, nNodes

strsql = "SELECT Count(Kategori_id) AS nId FROM Kategori"
Set rs1 = conn.Execute(strsql)
nNodes = cint(rs1("nId"))
Set rs1 = Nothing

nodelist 0

 

Koden från början är inte min men i hans MDB fil såg posterna ut så här:

key	parent	text
1	0	About us
2	0	Products
3	0	Links
7	1	Address
8	1	Who we are
9	1	Mission
10	1	Figures
11	2	Content
12	2	Web
15	3	hotmail.com
16	3	cnn.com
22	11	Management
23	11	Users
24	11	Files
25	11	How to
26	11	FAQ
28	12	Graphics
29	12	Using
30	12	Browsers
31	12	3d parties
32	12	FAQ
54	25	New files
55	25	Save files

 

Link to comment
Share on other sites

Hmm. skulle nog göra det enklare, sen tror jag inte att du får ut annat än en siffra till funktionen.

 

SQL = ""

SQL = SQL & " SELECT K.Kategori_namn AS MainMenu, KS.Kategori_namn AS SubMenu"

SQL = SQL & " FROM Kategori K"

SQL = SQL & " Left Join Kategori KS ON K.Kategori_id = KS.Kategori_sub"

SQL = SQL & " Where K.Kategori_sub = 0"

 

Set rs = Conn.Execute(SQL)

 

DaHeader = ""

If NOT rs.EOF Then

While NOT rs.EOF

If DaHeader = rs("MainMenu") Then

Response.Write("&nbsp;&nbsp;&nbsp;" & rs("SubMenu") & "<br>")

Else

Response.Write(rs("MainMenu") & "<br>")

Response.Write("&nbsp;&nbsp;&nbsp;" & rs("SubMenu") & "<br>")

DaHeader = rs("MainMenu")

End if

rs.MoveNext

Wend

End If

 

Link to comment
Share on other sites

Tack Dieselmannen!

Funkar kanon om menyn eller trädsturkturen har en (1st) underkategori aka en sub. Den ytterst delikata problematiken här är att menyn kan ha obegränsat antal undermenyer. Kategori_sub kopplas ihop med Kategori_id. På så sätt kan man få oändligt antal undermenyer. man kopplar ihop produkter ihop med Kategori_id vid senare tillfälle. Situationen som uppstår är då att vissa Kategori_id innehåller bara kopplingen till en undermeny medans andra innehåller Kategori_id kopplat till produkter. Detta kan bara veta om man gör sökning i produkttabellen efter en specifik Kategori_id. Min fråga är hur kan man lista alla underkategorier i alla level inte bara i en. Sedan i den sista underkategori söka i produkttabellen efter Kategori_id så att rätt antal produkter visas under varie kategori.

 

om vi antar att produkttabellen har följande struktur och tabellen heter produkter. Där Produkter_kategori_ID innehåller kopplingen till kategori tabellens Kategori_id.

 

produkter_ID	Produkter_kategori_ID	Produkter_namn
64	11	produkt1
63	11	produkt2
62	11	produkt3
97	10	produkt4
54	19	produkt5
94	34	produkt6
85	33	produkt7
87	18	produkt8
88	18	produkt9
98	10	produkt10
o.s.v	o.s.v	o.s.v

 

Link to comment
Share on other sites

Ah ok, fattar jag rätt om det ser ut så här...?

 

Kategori1
 Underkat1
 Underkat2
Kategori2
 Underkat1till2
 Underkat1till2
 Underkat1till2
     Underkattillkat2
     Underkattillkat2
Kategori3

Osv osv...

 

[inlägget ändrat 2009-09-11 19:41:49 av Dieselmannen]

Link to comment
Share on other sites

japp! Exakt. Sorry att jag inte var ännu bättre på att visa detta.

Jag har kollat på: //eforum.idg.se/viewmsg.asp?entriesid=473531 vilket är nästan 100%. Men där läggs ju allting bara under varandra utan att visa "trappan". Använder man koden så bara listas allt under utan att man ser vad som tillhör vad. Därav min kompicerade funktion som skulle lägga till 30pixlar framför varje underkategori namn. På så sätt får man trädet eller trappan. :)

 

Link to comment
Share on other sites

Löste problemet till slut. Kolla Fullständiga koden och kommentaren. Det blev tillslut precis som jag velat!

Tack alla för ett gott försök att hjälpa mig!

<%
Set conn = Server.CreateObject("ADODB.Connection")
conn.Open xDb_Conn_Str


function getPost(iParent)
sSQL = "SELECT Kategori_namn, Kategori_id FROM Kategori WHERE Kategori_sub = " & iparent & " AND Kategori_Aktiv=1"
Set oRs = Conn.Execute(sSQL)

do until oRs.eof

'#-- Denna slinga behövs för att vi ska kunna "left padda div" bättre en att ha en transparent bilds width---#
Do Until s = nodeindent
tabs = tabs + 30 '30 motsvarar 30 pixlar... experimentera gärna.
s = s + 1
Loop

If IsEmpty(tabs) = True Then tabs = 0

'#-- Skriv ut trädet ! --#
response.write("<div style='padding: 0px 0px 0px "&tabs&"px;'>"&oRs.fields("Kategori_namn").value&"</div>")

xNodes = xNodes + 1
nodeindent = nodeindent + 1
getPost(oRs.fields("Kategori_id").value)
nodeindent = nodeindent - 1

'#-- Mycket viktigt att deklrera rätt taltyp i slingor --#
If cint(xNodes) >= cint(nNodes) Then
Exit Do
Exit Function
End If


oRs.movenext

loop

	oRs.Close
	Set oRs = nothing
end function

'#-- Denna behövs för att räkna antal poster ---#
Dim nodeindent, nNodes
'#-- denna sql talet är extremt viktigt och är svaret på varför man får ett EOF fel. I min förra kod räknade jag inte antal rader korrekt som första sql koden gjorde. Alias: sSQL Detta miss gjorde att huvudslingan körde slingan fler gånger en räknaren för sSQL1. Så sammafattningsvis så måste dessa båda sql frågor räkna och köra exakt samma rad antal, annars får man en bom!--#
sSQL1 = "select count(Kategori_id) AS nId FROM Kategori WHERE Kategori_Aktiv=1"
Set objRS = conn.Execute(sSQL1)
nNodes = objRS("nId")
Set objRS = Nothing

getPost(0)

%>

:)

 

Link to comment
Share on other sites

bra att du löste det.

Dock känns det lite onödigt att öka nodeindent med ett för att sedan dra av det igen.

 

xNodes = xNodes + 1
nodeindent = nodeindent + 1
getPost(oRs.fields("Kategori_id").value)
nodeindent = nodeindent - 1

 

Och gällande nNodes. Kan funktioner verkligen komma åt lokalt definierade variablar. Jag vet att så är fallet med Subs iaf.

 

 

Link to comment
Share on other sites

Archived

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

×
×
  • Create New...