HOME      QUASI-BLOG        CONTATO         
 
 
 


ASP Listando por Colunas  retornar

 

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 é :

  1. recuperar todos os registros da consulta,
  2. colocá-los em vetor,
  3. contá-los, e
  4. 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