none
Como fazer Tabela de Disciplinas X Notas em ASP RRS feed

  • 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.

     

    domingo, 13 de maio de 2007 15:11

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)
      next

     

    Lembre-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 = retorno

    end 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 = retorno

    end 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 %>  &nbsp;</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 )%>  &nbsp;</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

     

     

     

     

     

     

     

     

    sexta-feira, 25 de maio de 2007 18:58

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)
      next

     

    Lembre-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 = retorno

    end 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 = retorno

    end 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 %>  &nbsp;</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 )%>  &nbsp;</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

     

     

     

     

     

     

     

     

    sexta-feira, 25 de maio de 2007 18:58
  • Olá Anderson!

     

    Uau! Nossa, muito obrigada mesmo pela ajuda.

    De fato, eu resolvi usando arrays, isso mesmo, como vc fez no exemplo, com algumas diferenças. É que eu esqueci de encerrar o tópico

    Mas valeu pela ajuda.

     

    []s Luciana.

     

     

     

    sábado, 26 de maio de 2007 20:57