Nosso
Objetivo: Listar os resultados de uma consulta em ou mais colunas
Veja também : Listando por um número arbitrário de Colunas
Um colega visitando o site perguntou como resolver o seguinte problema : recuperar todos os resultados de uma consulta, separá-los por páginas, mas principalmente ele desejava listar os dados em mais de uma coluna, algo assim :
| registro 1 |
registro 5 |
| registro 2 |
registro 6 |
| registro 3 |
registro 7 |
| registro 4 |
registro 8 |
Um bom hábito deve ser tentar resolver um novo problema por partes e em passos sucessivos, a cada passo refinando e tornando a nossa solução mais geral, a questão da paginação já foi mostrada inúmeras vezes por aí, as das colunas nem tanto, mas é igualmente simples.
Observem que dado um número determinado de linhas da tabela o registro que fica na primeira linha da segunda coluna é igual ao número do primeiro registro acrescido do número de linhas escolhido, o segundo esse número mais e assim sucessivamente, então se o número de linhas de nossa tabela pode ser representado pela variável nLinhas o que temos que fazer é algo do tipo :
| num registro |
num registro + nLinhas |
| num registro + 1 |
num registro + 1 + nLinhas |
| num registro + 2 |
num registro + 2 + nLinhas |
| num registro + 3 |
num registro + 3 + nLinhas |
Fazer esse processo durante a leitura dos registros acessando diretamente o banco de dados seria altamente ineficiente e lento, a solução proposta passa por armazenar os resultados num vetor e aí sim com os resultados no vetor produzir a tabela.
O que faremos então é :
- recuperar todos os registros da consulta,
- colocá-los em vetor,
- contá-los, e
- fazer uma tabela que tenha um número de linhas que seja no mínimo a metade dos registros.
Vejam a primeira versão da solução, o arquivo de dados é o mesmo do meu primeiro site em ASP.
<%
'ListaEmpresaColunas.asp
' exemplo de como listar resultados de um query
' como colunas
' joão carlos www.mvirtual.com.br/jcanistrum
' 21/06/2008
Dim objConn, rs
recuperaDados()
listaDados()
encerraConexao()
'
'* SUB-ROTINAS ***********************************************************
'
Sub recuperaDados()
'cria objeto ASP de conexão
Set objConn = server.createobject("ADODB.Connection")
'cria string de conexão específica para um determinado banco de dados
strConn = "DBQ=" & server.mappath("graficasonline.mdb") & ";Driver={Microsoft Access Driver (*.mdb)}"
'conecta ao banco de dados
objConn.open strConn,3,3
'cria o recordset para executar uma consulta e retornar com os dados obtidos
Set rs= Server.CreateObject("ADODB.Recordset")
'texto do comando sql a ser executado
sql = "SELECT DISTINCT Empresa FROM Empresa ORDER BY Empresa"
' executa a consulta
rs.Open sql, strConn, 3, 3
End Sub
Sub listaDados()
%>
<table>
<%
'testa se foi ao final do arquivo sem encontrar nada e para
if ( rs.eof ) then
%>
<tr>
<td>
Não existem registros, encerrando!
</td>
</tr>
<%
else
' existem registros logo vamos listá-los
' carrega um vetor com nome das empresas
Dim empresas(200), nEmpresas
nEmpresas=1
do while not rs.eof
empresas(nEmpresas) = Ucase(trim(rs("empresa")))
nEmpresas = nEmpresas + 1
rs.movenext
loop
nEmpresas = nEmpresas - 1
response.write "<tr><td>Número de Empresas: " & nEmpresas & "</td><tr>"
' imprime os resultados em 2 colunas
nLinhas = int(nEmpresas/2) + 1
for i= 1 to nLinhas
response.write "<tr>"
response.write "<td>" & i & " " & empresas(i) & "</td>"
if ( i+nLinhas <= nEmpresas ) then
response.write "<td>" & i+nLinhas & " " & empresas(i+nLinhas) & "</td>"
else
response.write "<td> - </td>"
end if
response.write "<tr>"
next
end if
%>
</table>
<%
End Sub
Sub encerraConexao()
'importante .. fechar conexao e destruir objetos
set rs= nothing
objConn.close
set objConn = nothing
End Sub
%>
Que produz uma saída assim :

No trecho : nLinhas = int(nEmpresas/2) + 1
cabe uma pequena melhoria levando em conta se o nEmpresas é par ou ímpar, fica como exercício, aguardo sugestões.
O nosso próximo passo deve ser generalizar essa solução permitindo um número arbitrário de colunas sejam escolhidas.
Listando por um número arbitrário de Colunas
Nosso
Objetivo: Listar os resultados de uma consulta em ou mais colunas