Usuário com melhor resposta
Como fazer Tabela de Disciplinas X Notas em ASP

Pergunta
-
Olá colegas!
Estou tentando montar uma tabela no asp, cujos dados estão armazenados no banco de dados conforme abaixo. Dentro do meu loop, já montei array, dei split... enfim, já fiz de tudo e nada do resultado ficar como o desejado.
É como uma dessas tabelas de notas de aluno, vc tem algunas linhas com as disciplinas, umas colunas com os meses do ano e no interior da tabela, as notas.
Alguém já fez algo parecido?
A tabela está no banco de dados da seguinte forma:
prioridade qtde mes alta 10 200601 baixa 20 200601 media 25 200601 emergencial 15 200601 alta 2 200602 baixa 6 200602 media 8 200610 emergencial 4 200612 alta 7 200701 baixa 3 200701 media 2 200702 emergencial 4 200702 O resultado esperado seria:
200601 200602 200603 200604 200605 200606 200607 200608 200609 200610 200611 200612 200701 200702 emergencial 15 4 4 alta 10 2 7 média 25 8 2 baixa 20 6 3 Será que alguém poderia me ajudar?
[]s Luciana.
Respostas
-
Olá Luciana, como vai?
imagino q ja tenha ate resolvido o problema, porem, vou passar a minha solucao, q pode te servir em outros casos ate... ;-)
trabalhar com "grids cruzados" em asp, eu gosto de usar as arrays! ou seja, uma tabela do bd q vai cruzar com ela mesma na hora de exibir. ( visto q a coluna MES do bd, vira colunas na hora de exibir. e a coluna PRIORIDADE, vira linhas na hora de exibir. Daí,o termo "cruzado" ).
O q eu faria: pegue o resultado do seu recordset, retornado pelo EXECUTE ( resposta da consulta ao BD ), e jogue numa array. O getRows do vb ja faz isso.
Caso nao saiba, vai um exemplo abaixo:
set rs = conexao.execute("SELECT PRIORIDADE, QTDE, MES FROM NOTAS")
minhaArray = rs.getRows
viu q facil?? p.s. usar arrays para trabalhar os dados na pagina tem um ganho de 70% de performance, comparado a usar o DO WHILE para o RECORSET convencional..
agora vem o segredo. Apos jogar na array, vc vai pegar estes dados desta array e "tabulá-los" dentro da sua array de exibicao dos dados. Ou seja, jogar cada coluna do BD em uma dimensao da nova array tabulada.
Assim...
dim arrayNotas ( 5, 13, 2050 )
for i = 0 to ubound( minhaArray,2 )
arrayNotas( minhaArray(0,i) , minhaArray(2,i) , minhaArray(2,i) ) = dados(1,i)
nextLembre-se: minhaArray(x,y) armazena 1 celula do BD, sendo x a coluna, e y a linha.
ao chamar minhaArray(2,13), vc está chamando o valor gravado na coluna 2 da linha 13 do recorset retornado pelo SELECT.
Entao, armazeno nos parâmetros da array arrayNotas, o ID da prioridade, o nr do mes, e o nr do ano. E para cada unidade desta array, armazeno o valor da nota. Eh como se vc indexasse as notas em tabulacoes identificadas por ser mês, ano e prioridade.
Depois, faço um looping para cada prioridade, mes e ano, construindo uma tabela. E para cada item deste looping sobre looping, eu chamo a nota, através da array arrayNotas, passando os parametros. Bom, eh mais facil ver codigo do q entender texto, mas precisando, eh so falar...
function codigoPrioridade( prior )
select case prior
case "ALTA" retorno = 1
case "MEDIA" retorno = 2
case "BAIXA" retorno = 3
case "EMERGENCIAL" retorno = 4
case else retorno = 0
end select
codigoPrioridade = retornoend function
function descricaoPrioridade( cod )
select case cod
case 1 retorno = "ALTA"
case 2 retorno = "MEDIA"
case 3 retorno = "BAIXA"
case 4 retorno = "EMERGENCIAL"
case else retorno = "[nao identificado]"
end select
descricaoPrioridade = retornoend function
Set cn = Server.CreateObject("ADODB.Connection")
sConnection = "SQLOLEDB.1;Password=SENHA;Persit Security Info=True;User ID=USUARIO_BD;Initial Catalog=BANCO_DE_DADOS;Data Source=SERVIDOR_DE_BD"
cn.Open(sConnection)
set rs = cn.execute("SELECT PRIORIDADE, QTDE, MES, ANO")minhaArray = rs.getrows()
dim arrayNotas(5, 13, 2050)
for i = 0 to ubound(dados,2)
arrayNotas( codigoPrioridade(minhaArray(0,i)), minhaArray(2,i), minhaArray (2,i) ) = minhaArray(1,i)
next
%>
<table width="75" border="1" cellspacing="1" cellpadding="1">
<tr style="border:1px;">
<td>prioridade</td>
<% for ano = 2006 to 2006 %>
<% for mes = 1 to 12 %>
<td><%=mes & "/" & ano %> </td>
<% next %>
<% next %>
</tr>
<% for prior = 1 to 4 %>
<tr style="border:1px;">
<td><%=descricaoPrioridade(prior) %></td>
<% for ano = 2006 to 2006 %>
<% for mes = 1 to 12 %>
<td><%=notas( prior, mes, ano )%> </td>
<% next %>
<% next %>
</tr>
<% next %>
</table>repare que eu criei 2 funcoes para traduzir o codigo/nome da PRIORIDADE. Afinal, nao posso passar para o indice da array arrayNotas uma string, e sim um numero. O codigo em si eh mto simples, a estrategia ta na hora q vc pega a array resultante do getrows() e a tabula na arrayNotas. E claro, o looping sobre looping.
dica: se fosse vc, eu separava na tabela do BD o mes do ano.
atcs
anderson
Todas as Respostas
-
Olá Luciana, como vai?
imagino q ja tenha ate resolvido o problema, porem, vou passar a minha solucao, q pode te servir em outros casos ate... ;-)
trabalhar com "grids cruzados" em asp, eu gosto de usar as arrays! ou seja, uma tabela do bd q vai cruzar com ela mesma na hora de exibir. ( visto q a coluna MES do bd, vira colunas na hora de exibir. e a coluna PRIORIDADE, vira linhas na hora de exibir. Daí,o termo "cruzado" ).
O q eu faria: pegue o resultado do seu recordset, retornado pelo EXECUTE ( resposta da consulta ao BD ), e jogue numa array. O getRows do vb ja faz isso.
Caso nao saiba, vai um exemplo abaixo:
set rs = conexao.execute("SELECT PRIORIDADE, QTDE, MES FROM NOTAS")
minhaArray = rs.getRows
viu q facil?? p.s. usar arrays para trabalhar os dados na pagina tem um ganho de 70% de performance, comparado a usar o DO WHILE para o RECORSET convencional..
agora vem o segredo. Apos jogar na array, vc vai pegar estes dados desta array e "tabulá-los" dentro da sua array de exibicao dos dados. Ou seja, jogar cada coluna do BD em uma dimensao da nova array tabulada.
Assim...
dim arrayNotas ( 5, 13, 2050 )
for i = 0 to ubound( minhaArray,2 )
arrayNotas( minhaArray(0,i) , minhaArray(2,i) , minhaArray(2,i) ) = dados(1,i)
nextLembre-se: minhaArray(x,y) armazena 1 celula do BD, sendo x a coluna, e y a linha.
ao chamar minhaArray(2,13), vc está chamando o valor gravado na coluna 2 da linha 13 do recorset retornado pelo SELECT.
Entao, armazeno nos parâmetros da array arrayNotas, o ID da prioridade, o nr do mes, e o nr do ano. E para cada unidade desta array, armazeno o valor da nota. Eh como se vc indexasse as notas em tabulacoes identificadas por ser mês, ano e prioridade.
Depois, faço um looping para cada prioridade, mes e ano, construindo uma tabela. E para cada item deste looping sobre looping, eu chamo a nota, através da array arrayNotas, passando os parametros. Bom, eh mais facil ver codigo do q entender texto, mas precisando, eh so falar...
function codigoPrioridade( prior )
select case prior
case "ALTA" retorno = 1
case "MEDIA" retorno = 2
case "BAIXA" retorno = 3
case "EMERGENCIAL" retorno = 4
case else retorno = 0
end select
codigoPrioridade = retornoend function
function descricaoPrioridade( cod )
select case cod
case 1 retorno = "ALTA"
case 2 retorno = "MEDIA"
case 3 retorno = "BAIXA"
case 4 retorno = "EMERGENCIAL"
case else retorno = "[nao identificado]"
end select
descricaoPrioridade = retornoend function
Set cn = Server.CreateObject("ADODB.Connection")
sConnection = "SQLOLEDB.1;Password=SENHA;Persit Security Info=True;User ID=USUARIO_BD;Initial Catalog=BANCO_DE_DADOS;Data Source=SERVIDOR_DE_BD"
cn.Open(sConnection)
set rs = cn.execute("SELECT PRIORIDADE, QTDE, MES, ANO")minhaArray = rs.getrows()
dim arrayNotas(5, 13, 2050)
for i = 0 to ubound(dados,2)
arrayNotas( codigoPrioridade(minhaArray(0,i)), minhaArray(2,i), minhaArray (2,i) ) = minhaArray(1,i)
next
%>
<table width="75" border="1" cellspacing="1" cellpadding="1">
<tr style="border:1px;">
<td>prioridade</td>
<% for ano = 2006 to 2006 %>
<% for mes = 1 to 12 %>
<td><%=mes & "/" & ano %> </td>
<% next %>
<% next %>
</tr>
<% for prior = 1 to 4 %>
<tr style="border:1px;">
<td><%=descricaoPrioridade(prior) %></td>
<% for ano = 2006 to 2006 %>
<% for mes = 1 to 12 %>
<td><%=notas( prior, mes, ano )%> </td>
<% next %>
<% next %>
</tr>
<% next %>
</table>repare que eu criei 2 funcoes para traduzir o codigo/nome da PRIORIDADE. Afinal, nao posso passar para o indice da array arrayNotas uma string, e sim um numero. O codigo em si eh mto simples, a estrategia ta na hora q vc pega a array resultante do getrows() e a tabula na arrayNotas. E claro, o looping sobre looping.
dica: se fosse vc, eu separava na tabela do BD o mes do ano.
atcs
anderson
-