webForumDet fria alternativet

Sub+getrows

10 svar · 290 visningar · startad av SannyW

SannyWMedlem sedan jan. 2003438 inlägg
#1

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
#2

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
#3

:)
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
#4

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
#5

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
#6

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

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
#8

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
#9

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
#10

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
#11

mmm, och man behöver väl dessutom parenteser då.

129 ms totalt · 3 externa anrop · v20260731065814-full.3ab8d573
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
126 ms — hämta tråd, inlägg och bilagor (db)