Hej, jag har en funktion som skapar en dynamisk tabell utifrån data (ett dokumentbibliotek) som hämtas i en databas (mySQL). För varje post i databasen skapas 2 rader, en rad med bild och text och en rad under med en ikon (download). Jag har löst problemet nu och lägger ut lösningen om någon skulle vara intresserad. Tack för att du publicerade lösningen, det tillför alltid ett mervärde!Få denna loop att skapa tabell med kolumner horisontellt istället för vertikalt
Anledningen till att jag behöver 2 rader/post är att via css fungerar det inte att positionera en ikon (position: absolute; bottom: 0) till botten av en td-cell (det är faktiskt bara Firefox som inte accepterar detta, i alla andra webbläsare, ex. IE v6 - 9, Opera, Safari, Google Chrome fungerar det problemfritt). Min första lösning fick jag alltså ge upp och har nu tragglat med denna nya funktion ett bra tag och börjar bli lite less på att jag inte fixar att lösa problemet med att få tabellen att skapa kolumnerna horisontellt :-)
Funktionen jag har skapar allt så som jag vill ha det, förutom att loopen skapar posterna vertikalt istället för horisontellt (jag vill kunna sortera på t.ex. title eller position och när posterna skrivs ut vertikalt blir allt helt fel)
Undrar om det är någon som kan och är villig :-) att peka mig i rätt riktning för hur jag ska göra för att få funktionen att skriva ut posterna i tabellen horisontellt istället för vertikalt. Skulle bli oerhört tacksam för hjälp :-)
Jag anropar funktionen så här
<code>
response.write(getDocCategory(1, 3)) 'där 1 är kategorin för de poster jag vill hämta och 3 är antal kolumner tabellen ska skriva ut.
</code>
Funktionen ser ut så här (och innehåller förklarande kommentarer - på engelska):
<code>
' ****************************************************************************
' Function getDocCategory(catId, numColumns)
' Descr: Gets documents in selected category from tbl_docs
' ****************************************************************************
Function getDocCategory(catId, numColumns)
' Declare variables
Dim arrDocs, RowCounter, ColCounter, NumRows, NumRecords, tdWidth
Dim strTitle, strContent, strPhoto, strDocLink, iPos
Dim tblStart, tblEnd
Dim s, x, y
' Init variables
tdWidth = 100\NumColumns
tblStart = vbCrLf & "<table style=""width: 100%; border-collapse: collapse;"">" & vbCrLf & vbCrLf
tblEnd = "</table>"
' Open connection to db
Set adoConn=Server.CreateObject("ADODB.Connection")
adoConn.Open strConn
sql = "SELECT title, content, photo, doc_link, pos FROM tbl_docs where cat_id=" & catId & " order by pos asc;"
' Open the rs
Set rs = adoConn.execute(sql)
If Not rs.EOF Then
arrDocs = rs.getrows ' get rs into array
' close rs and adoConn
rs.close
Set rs = nothing
adoConn.close
Set adoConn = Nothing
' Find out how many records are in the array (Add 1 since array coordinate starts at 0)
NumRecords = ubound(arrDocs,2) + 1
' Calculates how many rows there should be based on the specified number of columns
' The last column will always the the short column if there is one
If NumRecords mod NumColumns = 0 then
NumRows = NumRecords\NumColumns
Else
NumRows = NumRecords\NumColumns + 1
End if
' The outher loop walks down the rows
For RowCounter = 1 to NumRows
s = "<tr>" & vbCrLf
x = "<tr>" & vbCrLf
' The inner loop steps across the columns
For ColCounter = 0 to NumColumns-1
If RowCounter + ColCounter * NumRows <= NumRecords then
' Build the variable names from the arrDocs-fields
strTitle= arrDocs(0, RowCounter + ColCounter * NumRows-1)
strContent = arrDocs(1, RowCounter + ColCounter * NumRows-1)
strPhoto = arrDocs(2, RowCounter + ColCounter * NumRows-1)
strDocLink = arrDocs(3, RowCounter + ColCounter * NumRows-1)
iPos = arrDocs(4, RowCounter + ColCounter * NumRows-1)
If strPhoto = "" Or IsNull(strPhoto) Then
strPhoto = "<img src=""/images/bibliotek/bild-saknas.png"">"
Else
strPhoto = "<img src=""" & strPhoto & """>"
End If
' Create output
s = s & "<td style=""width:" & tdWidth & "%"">"
s = s & strPhoto
s = s & "<b>" & strTitle & "</b><br>"
s = s & strContent & "<br>(" & iPos & ")"
s = s & "</td>" & vbCrLf
' Create the extra row with the download icon
x = x & "<td style=""width:" & tdWidth & "%"">"
x = x & ""
x = x & "</td>" & vbCrLf
Else
' This condition takes care of the case where your last column has fewer rows than the first one
s = s & "<td style=""width:" & tdWidth & "%""> </td>" & vbCrLf
x = x & "<td style=""width:" & tdWidth & "%""> </td>" & vbCrLf
End If
Next ' end inner loop
y = y & s & "</tr>" & vbCrLf & vbCrLf
y = y & x & "</tr>" & vbCrLf & vbCrLf
Next ' end outher loop
getDocCategory = tblStart & y & tblEnd
Else
getDocCategory = "Biblioteket borttaget."
End If ' rs.EOF
End Function
</code>Sv: Få denna loop att skapa tabell med kolumner horisontellt istället för vertik
Funktionen anropas så här
<code>
Dim myResult
Call getDocCategory(1,3,myResult)
response.write(myResult)
</code>
Och funktionen ser ut så här
<code>
' ****************************************************************************
' Function getDocCategory(catId, numColumns, ret_string)
' Descr: Returns documents in selected category from tbl_docs
' Parameters:
' catId = document category, ex. 1
' numColumns = number of columns (td) the table should display, ex. 3 columns
' ret_string = the result returned
' ****************************************************************************
Function getDocCategory(catId, numColumns, ret_string)
Dim arrDocs
Dim RowCounter, ColCounter, NumRows, NumRecords, s
Dim tblStart, tblEnd
Dim tdWidth, x, y, z
Dim strTitle, strContent, strPhoto, strDocLink, iPos
' init variables
tblStart = "<table style=""width: 700px"">"
tblEnd = "</table>"
x = 1 ' init x to 1
tdWidth = 100\numColumns ' td-width in percent, the integer division operator \ (strips off decimals)
sql = "SELECT title, content, photo, doc_link, pos FROM tbl_docs where cat_id=" & catId & " order by pos asc;"
' Open connection to db
Set adoConn=Server.CreateObject("ADODB.Connection")
adoConn.Open strConn
' Open the rs
Set rs = adoConn.execute(sql)
If Not rs.EOF Then
arrDocs = rs.getRows ' get rs into array
' close rs and adoConn
rs.close
Set rs = nothing
adoConn.close
Set adoConn = Nothing
' Find out how many records there are in the array (add 1 since array coordinate starts at 0)
numRecords = UBound(arrDocs,2) + 1
' Calculate how many rows there should be based on the specified number of columns, last column always the short
If NumRecords mod NumColumns = 0 then
NumRows = NumRecords\NumColumns ' using the integer division operator \ - strips off decimals
Else
NumRows = (NumRecords\NumColumns) + 1 ' last short column
End if
For rowCounter = 1 To numRows ' begin outer loop
s = "<tr>" & vbCrLf ' creates the first row with the data
z = "<tr>" & vbCrLf ' creates second row, with the download link
For ColCounter = 0 to NumColumns-1 ' begin inner loop
If ColCounter + x <= NumRecords Then
' Build the variable names from the arrDocs-fields
strTitle = arrDocs(0, colCounter+(x-1))
strContent = arrDocs(1, colCounter+(x-1))
strPhoto = arrDocs(2, colCounter+(x-1))
strDocLink = arrDocs(3, colCounter+(x-1))
If strPhoto = "" Or IsNull(strPhoto) Then
strPhoto = "<img src=""/images/bibliotek/bild-saknas.png"" style=""margin-bottom: 7px;""><br>"
Else
strPhoto = "<img src=""" & strPhoto & """ style=""width: 75px; border: 1px solid #333; margin-bottom: 7px; clear: left;""><br>"
End If
s = s & "<td style=""width: " & tdWidth & "%"">"
s = s & "" & strPhoto & "<br>"
s = s & "<b>" & strTitle & "</b><br>"
s = s & strContent & "<br>"
s = s & "</td>" & vbCrLf
' build extra row for download link img
z = z & "<td style=""width: " & tdWidth & "%"">"
z = z & ""
z = z & "</td>"
Else ' print out remaining empty cells
s = s & "<td> </td>" & vbCrLf
z = z & "<td> </td>" & vbCrLf
End If
Next ' inner loop
x = x + colCounter
y = y & s & "</tr>" & vbCrLf & vbCrLf
y = y & z & "</tr>" & vbCrLf
Next ' outer loop
ret_string = tblStart & y & tblEnd
Else ' rs.EOF
ret_string = "Biblioteket borttaget."
End If
End Function
</code>Sv:Få denna loop att skapa tabell med kolumner horisontellt istället för vertik