SannyWMedlem sedan jan. 2003438 inlägg Försöker få till detta med subbar, men jag kan inte se vad som blir fel. Får inte något resultat i loopen, kommer alltså inte in i IF IsArray(arrRecords) THEN. Har uppenbarligen missförstått något och behöver en liten fingervisning.
Function getPortfolioSub()
' Hämtar getrows.
Dim Connect, strSQL
Set Connect = Server.CreateObject("ADODB.Connection")
Connect.Open = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Server.MapPath("../db.mdb")&";"
strSQL = "SELECT datum, rubrik FROM tbl_portfolio"
Set RecSet = Connect.Execute(strSQL)
IF NOT RecSet.EOF THEN arrRecords = RecSet.GetRows()
RecSet.Close
Set RecSet = Nothing
Connect.Close
Set Connect = Nothing
End Function
Sub displayPortfolioSub()
' Visar getrows.
Response.Write "hej/utanför"
IF IsArray(arrRecords) THEN
Response.Write "hej/innanför"
FOR i=0 to UBound(arrRecords,2)
field1 = arrRecords(0,i)
field2 = arrRecords(1,i)
Response.write "field1: " & field1 & "<br>field2: " & field2 & "<br>"
Next
End if
End Sub
GuffaMedlem sedan juni 2004533 inlägg Deklarerar du variabeln arrRecords globalt? Annars kommer det ju att vara en lokal variabel i respektive subrutin.
Det vore ju bättre om du skickade tillbaka arrayen som resultat av funktionen, nu har ju inte funktionen något returvärde alls.
SannyWMedlem sedan jan. 2003438 inlägg :)
Jag är ute på djup vatten.....
Går tillbaka ett steg, nedanstående är jag med på och det fungerar. Men hur kan man komma ifrån att behöva upprepa connect och close om man har flera frågor som skall placeras på olika ställen på sidan?
Sub displayPortfolioSub()
Set Connect = Server.CreateObject("ADODB.Connection")
Connect.Open = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Server.MapPath("../db.mdb")&";"
strSQL = "SELECT datum, rubrik FROM tbl_portfolio"
Set RecSet = Connect.Execute(strSQL)
IF NOT RecSet.EOF THEN arrRecords = RecSet.GetRows()
RecSet.Close
Set RecSet = Nothing
Connect.Close
Set Connect = Nothing
IF IsArray(arrRecords) THEN
Response.Write "hej/innanför"
FOR i=0 to UBound(arrRecords,2)
field1 = arrRecords(0,i)
field2 = arrRecords(1,i)
Response.write "field1: " & field1 & "<br>field2: " & field2 & "<br>"
Next
End if
End Sub
GuffaMedlem sedan juni 2004533 inlägg Separera datainsamlandet ifrån visningen. Öppna databaskopplingen, hämta den data du behöver för sidan, och stäng databaskopplingen. Sedan kan du börja skriva ut innehållet på sidan.
SannyWMedlem sedan jan. 2003438 inlägg Tack för svaren Guffa,
Försöker få grepp om detta med sub, men lyckas inte fixa till så att jag kan lägga just visningen i en separat sub. Hur jag än vänder och vrider så får jag icke med mig arrRecords.
Vill ju helst få fram en uppbyggnad så jag slipper repetera olika uppbyggnader, vill få fram så det går att anropa olika subbar får olika typer av utskrivning.
<%
Dim connect, strSQL
Sub db(strSQL)
Set connect = Server.CreateObject("adodb.connection")
connect.open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Server.MapPath("db.mdb")&";"
Set RecSet = connect.Execute(strSQL)
If not RecSet.EOF Then arrRecords = RecSet.GetRows()
connect.Close
Set connect = Nothing
IF IsArray(arrRecords) THEN
FOR i=0 to UBound(arrRecords,2)
field1 = arrRecords(0,i)
field2 = arrRecords(1,i)
Response.write "field1: " & field1 & "<br>field2: " & field2 & "<br>"
Next
End if
End Sub
Sub buildrows()
strSQL = "SELECT datum, rubrik FROM tbl_portfolio"
Call db(strSQL)
End Sub
%>
<% Call buildrows() %>
Jesper TMedlem sedan nov. 20017 144 inlägg Så här brukar jag göra:
'Declare global variables
Dim connection, rs
'Open database connection
Sub connOpen
set connection = server.createobject("adodb.connection")
connection.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Server.MapPath("db.mdb")
End Sub
'Close recordset
Sub rsClose
rs.close : set rs = nothing
End Sub
'Close database connection
Sub connClose
connection.close : set connection = nothing
End Sub
'Get datarows
Function GetRows(ByVal SQL)
Dim arrRecords
Call connOpen
Set rs = Connection.Execute(SQL)
If Not rs.BOF Or Not rs.EOF Then
arrRecords = rs.GetRows()
ELSE
arrRecords = ""
End If
rsClose : connClose
GetRows = arrRecords
End Function
Dim arrRecords
arrRecords = GetRows("SELECT datum, rubrik FROM tbl_portfolio")
If IsArray(arrRecords) THEN
FOR i=0 to UBound(arrRecords,2)
field1 = arrRecords(0,i)
field2 = arrRecords(1,i)
Response.write "field1: " & field1 & "<br>field2: " & field2 & "<br>"
Next
End if
Jesper TMedlem sedan nov. 20017 144 inlägg Lägger du alla funktioner och subbar i mitt exempel i en includerad fil så kan du återanvända dessa på alla dina sidor. Så behöver du bara ändra detta:
Dim arrRecords
arrRecords = GetRows("SELECT datum, rubrik FROM tbl_portfolio")
If IsArray(arrRecords) THEN
FOR i=0 to UBound(arrRecords,2)
field1 = arrRecords(0,i)
field2 = arrRecords(1,i)
Response.write "field1: " & field1 & "<br>field2: " & field2 & "<br>"
Next
End if
SannyWMedlem sedan jan. 2003438 inlägg Tack så mycket, antar att det är bättre att dela upp connect så att man kan öppna och stänga på ett effektivare sätt.
En fråga dyker dock upp och rsClose : connClose i functionen Getrows. Antar att detta är subbarna som anropas, varför behöver man inte call här?
Annars var det en super lösningen, placerade sen sista Dim arrRecords i en subb och kan på så vis anropa den var som helst på sida.
Jesper TMedlem sedan nov. 20017 144 inlägg Du behöver inte använda call överhuvudtaget.
Jag brukar göra det för att förtydliga att det är en sub/function det handlar om.
GuffaMedlem sedan juni 2004533 inlägg Man behöver aldrig Call, men man kan använda det vid alla anrop till subrutiner. Exempel:
Call objConnection.Open(strConnectionString)
Call Response.Write("Hejsan")
Call objRecordset.Close()
Call Response.End()
Jesper TMedlem sedan nov. 20017 144 inlägg mmm, och man behöver väl dessutom parenteser då.