---
title: "Sub+getrows"
type: "forum-thread"
url: "https://www.webforum.nu/amne/asp/130252-sub-getrows"
topic: "ASP"
topic_url: "https://www.webforum.nu/amne/asp"
author: "SannyW"
published: "2005-06-18T22:53:18.000Z"
updated: "2005-06-19T18:14:34.000Z"
replies: 10
views: 306
page: 1
pages: 1
language: "sv-SE"
site: "webForum — webforum.nu"
rights: "Upphovsrätten till varje inlägg tillhör dess författare."
attribution: "Citera som: webForum, https://www.webforum.nu/amne/asp/130252-sub-getrows"
---

# Sub+getrows

## #1 — SannyW, 2005-06-18T22:53Z

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

Permalänk: https://www.webforum.nu/p/130252

## #2 — Guffa, 2005-06-18T23:30Z

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.

Permalänk: https://www.webforum.nu/p/1631958

## #3 — SannyW, 2005-06-19T00:29Z

:) 
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
```

Permalänk: https://www.webforum.nu/p/1631964

## #4 — Guffa, 2005-06-19T00:40Z

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.

Permalänk: https://www.webforum.nu/p/1631965

## #5 — SannyW, 2005-06-19T17:06Z

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() %>
```

Permalänk: https://www.webforum.nu/p/1632068

## #6 — Jesper T, 2005-06-19T17:29Z

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

Permalänk: https://www.webforum.nu/p/1632075

## #7 — Jesper T, 2005-06-19T17:31Z

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

Permalänk: https://www.webforum.nu/p/1632076

## #8 — SannyW, 2005-06-19T18:02Z

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.

Permalänk: https://www.webforum.nu/p/1632084

## #9 — Jesper T, 2005-06-19T18:07Z

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.

Permalänk: https://www.webforum.nu/p/1632087

## #10 — Guffa, 2005-06-19T18:11Z

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()
```

Permalänk: https://www.webforum.nu/p/1632090

## #11 — Jesper T, 2005-06-19T18:14Z

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

Permalänk: https://www.webforum.nu/p/1632091

---

Tråden på webben: https://www.webforum.nu/amne/asp/130252-sub-getrows
