3

I've a table called mytable in my SQL SERVER database that I want to show into my HTML table with ASP. here is rendered HTML table when I run SELECT * FROM mytable: enter image description here

from that database I want to group it and change the HTML table into like this: enter image description here I want to eliminate the duplicate value and merge the table with rowspan. how to loop it so it create the rowspan grouped HTML table ?

here is what I made so far:

<%
Set oConnection = Server.CreateObject("ADODB.Connection")
oConnection.Open Dsn

response.write "<table border='1' width='100%' cellpadding='5' cellspacing='0'>" &_
                    "<tr>" &_
                        "<td align='center' valign='middle' bgcolor='#CCCCCC'><strong>field1</strong></td>" &_
                        "<td align='center' valign='middle' bgcolor='#CCCCCC'><strong>field2</strong></td>" &_      
                        "<td align='center' valign='middle' bgcolor='#CCCCCC'><strong>field3</strong></td>" &_
                    "</tr>"

strselect = "select * from mytable"

set qdata = oConnection.execute(strselect)

If qdata.EOF then
    Response.write("NO DATA")   
Else    
    Do While Not qdata.EOF
    response.write  "<tr> " &_
                        "<td>" & trim(qdata("field1")) & "</td>"&_
                        "<td>" & trim(qdata("field2")) & "</td>"&_
                        "<td>" & trim(qdata("field3")) & "</td> " &_                            
                    "</tr>" 
    qdata.MoveNext
    Loop    
End If      

response.write "</table>"
oConnection.Close
Set oConnection = Nothing
%>
4
  • Is this a fixed or dynamic number of cells? Commented Aug 24, 2012 at 13:08
  • @BradBrening it's dinamic number of cells Commented Aug 27, 2012 at 0:54
  • 1
    @blankon91, I'm not fluent in ASP and don't have much time right now, but here's the general idea: Either get the counts before generating the table (e.g. loop through rows twice or get counts via db query) or add a placeholder (e.g. {rowspan-1}, {rowspan-2}, etc), update the count for each one in an array as you loop through the rows, and replace the placeholder text with the count after the fact (save the code to a variable, instead of using response.write each time). Commented Aug 27, 2012 at 4:29
  • okay, I'll try your idea and give my feedback :) thank you Commented Aug 27, 2012 at 9:50

1 Answer 1

2
+50

This would appear to be a good time to utilize the GetRows() method of the ADO RecordSet. GetRows() converts the recordset into a multidimensional array which is then fairly trivial to walk through to compare values - an important feature in this case.

The following code works with my test data:

' Assuming the connection and recordset have already been created previous to this point
Response.Write "<table border='1' width='100%' cellpadding='5' cellspacing='0'>"
' Uncomment below when using the recordset
' Response.Write GetHeaderHtml(qdata)

Response.Write "<tbody>"

' Uncomment below when using the recordset
' Dim rsArray : rsArray = qdata.GetRows
' qdata.Close
' oConnection.Close
' Set qdata = Nothing
' Set oConnection = Nothing

' FOR TESTING ONLY:
Dim rsArray(2, 9)
rsArray(0, 0) = "X1"
rsArray(0, 1) = "X1"
rsArray(0, 2) = "X1"
rsArray(0, 3) = "X1"
rsArray(0, 4) = "X1"
rsArray(0, 5) = "X2"
rsArray(0, 6) = "X2"
rsArray(0, 7) = "X2"
rsArray(0, 8) = "X2"
rsArray(0, 9) = "X2"

rsArray(1, 0) = "A"
rsArray(1, 1) = "A"
rsArray(1, 2) = "A"
rsArray(1, 3) = "B"
rsArray(1, 4) = "B"
rsArray(1, 5) = "A"
rsArray(1, 6) = "A"
rsArray(1, 7) = "B"
rsArray(1, 8) = "C"
rsArray(1, 9) = "C"

rsArray(2, 0) = "12"
rsArray(2, 1) = "332"
rsArray(2, 2) = "32"
rsArray(2, 3) = "14"
rsArray(2, 4) = "10"
rsArray(2, 5) = "155"
rsArray(2, 6) = "23"
rsArray(2, 7) = "25"
rsArray(2, 8) = "32"
rsArray(2, 9) = "38"
' END TESTING DATA

Dim rowHtml, occurances, row, col
For row = LBound(rsArray, 2) To UBound(rsArray, 2)    ' the second dimension is row
  rowHtml = "<tr>"
  For col = LBound(rsArray, 1) To UBound(rsArray, 1)  ' the first dimension is column
    If row > LBound(rsArray, 2) Then
      ' previous rows written, only write out the cell if it is different than the one above.
      If rsArray(col, row) <> rsArray(col, row - 1) Then
        occurances = CountColumnOccurances(col, row, rsArray)
        ' you could probably get away writing "rowspan='1'", but I'll test for it and omit if 1
        If occurances > 1 Then
          rowHtml = rowHtml & "<td rowspan='" & CountColumnOccurances(col, row, rsArray) & "'>"
        Else
          rowHtml = rowHtml & "<td>"
        End If
        rowHtml = rowHtml & Server.HTMLEncode(rsArray(col, row))
        rowHtml = rowHtml & "</td>"
      End If
    Else
      occurances = CountColumnOccurances(col, row, rsArray)
      ' you could probably get away writing "rowspan='1'", but I'll test for it and omit if 1
      If occurances > 1 Then
        rowHtml = rowHtml & "<td rowspan='" & CountColumnOccurances(col, row, rsArray) & "'>"
      Else
        rowHtml = rowHtml & "<td>"
      End If
      rowHtml = rowHtml & Server.HTMLEncode(rsArray(col, row))
      rowHtml = rowHtml & "</td>"
    End If
  Next ' col
  rowHtml = rowHtml & "</tr>" & vbCrlf

  Response.Write rowHtml
Next ' row
Response.Write "</tbody>"
Response.Write "</table>"

Function CountColumnOccurances(curCol, curRow, arr)
  Dim occurances  : occurances = 1                  ' how many repeats
  Dim examinedRow : examinedRow = curRow + 1        ' the row we're comparing to
  Dim curValue    : curValue = arr(curCol, curRow)  ' the value were using to compare

  Do While examinedRow <= UBound(arr, 2)            ' the second dimension is row
    If arr(curCol, examinedRow) = curValue Then     ' the next row has the same value
      occurances = occurances + 1
    Else                                            ' the next row is different
      Exit Do
    End If
    examinedRow = examinedRow + 1
  Loop

  CountColumnOccurances = occurances
End Function

Function GetHeaderHtml(rsData)
  Dim strHeaders : strHeaders = "<thead><tr>"
  Dim objField

  For Each objField In rsData.Fields
    strHeaders = strHeaders & "<th align='center' valign='middle' bgcolor='#CCCCCC'><strong>" & objField.Name & "</strong></th>"
  Next
  strHeaders = strHeaders & "</tr></thead>"

  GetHeaderHtml = strHeaders
End Function
Sign up to request clarification or add additional context in comments.

1 Comment

OK, I'll try this one, if it works, I will give my feedback and give the reward. Thank you :)

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.