none
colocar os dados do banco em ordem alfabética, mas na vertical, como fazer?

    Pergunta

  • Olá pessoal,

     

    O meu ASP acima ele ler de forma horizontal os dados que vem do banco

    tipo:

    A B C D
    E F G H

    Assim estar certo, ok...Mas, queria que além de continuar na horizontal, como já estar, quero que ele conte em ordem alfabética mas na vertical e exibindo as informações na horizontal.

    Como ele já faz o processo na horizontal, só falta aí colocar em ordem alfabética na vertical, tipo:

    A D G
    B E H
    C F

    Percebeu?

     

    O código:

     

    SELECT * FROM convenios 
    
     
    
     
    
    <table border="0" cellpadding="0" cellspacing="0" style="border-collapse: collapse" bordercolor="#111111" width="100%" id="AutoNumber14">
    
          <tr>
    
           <% Dim contador 
    
      contador = 1
    
      maxcol =4
    
    do while not rsprincipal.eof%> 
    
    <% convenios= replace(rsprincipal("convenios"),chr(10),"<br>")
    
                 %>
    
      <%  
    
        if contador <= maxcol then %>
    
            <td >
    
            <table border="0" cellpadding="0" cellspacing="0" style="border-collapse: collapse" bordercolor="#111111" width="100%" id="AutoNumber15">
    
              <tr>
    
                <td width="100%">
    
                <font face="Arial Narrow" color="#616161" style="font-size: 11pt">
    
                <%=convenios%></font></td>
    
              </tr>
    
            </table>
    
            </td>
    
             <% 
    
        contador = contador + 1
    
      rsprincipal.movenext 
    
        else %> 
    
     
    
          </tr>
    
          <% 
    
      contador = 1
    
     
    
        end if 
    
    loop 
    
     
    
    do while contador <= maxcol %> 
    
    <%  contador = contador + 1 
    
    loop %>
    
        </table>
    
     
    
    

     

     

     

     

    ele conta em ordem alfabética na horizontal e gostaria que fosse na vertical.

     

    Tipo:

     

    Ele estar assim:

     

    A, B, C

    D, E, F

     

    E queria que ficasse assim:

    A D G

    B E

    C F

     

    A tabela acima, em ASP, faz ele contar em horizontal, mas a ordem alfabética não é em vertical e sim em horizontal também e quero na vertical, tem como?


    Enfim, quero ordenar a orderm alfabética verticalmente, mas mostrando os registros horizontalmente. Não quero colocar o registro na vertical, mas quero manter ele na horizontal e só ficando na vertical a ordem alfabética, entendeu?


    Desde já, agradeço

     

    Marcelo

     
    Marcelo Vinicius
    quarta-feira, 15 de abril de 2009 14:02

Respostas

  • Marcelo,
    o array é controlado por um índice numérico que já está configurado no código acima.
    Quando fecho a conexão e o recordset é porque o array já está populado com o seu recordset.

    O método GetRows do Recordset pegou todos os dados do recordset (linhas e colunas) e populou um array bidimensional.
    A partir do momento que o GetRows rodou você não precisa mais de recordset e nem de conexão. Seu RecordSet agora é o array.

    Um array pode ser bidimensional (ou multi) e pode simular uma tabela do banco de dados, contendo linhas e colunas.
    Para acessar o conteúdo do array, você deve acessar pelo índice. Ex.: arrConvenios(IndiceColuna, IndiceLinha).
    Lembrando que o array usa base 0 (zero) ou seja, a primeira coluna tem índice 0 (zero) a segunda índice 1 e assim por diante, e linhas também iniciam pelo 0 (zero)

    Note que dentro do segundo For nesta parte do código eu escrevo o índice da coluna como Zero e o da linha sendo a variável.:
        If registroAtual <= qtdRegistros Then
            'Aqui eu mando escrever o ÍNDICE DA COLUNA como 0 (zero), pois o select só retorna uma coluna, e o ÍNDICE DA LINHA na forma da variável
            'registroAtual.
            Response.Write(arrConvenio(0, registroAtual))
        Else
            Response.Write("&nbsp;")
        End If

    O código que eu escrevi faz a ordenação, mas tem que ser usado por completo e do jeito que está, se vc copiar só o Response.Write e ainda mudar o conteúdo não funciona mesmo !! rsrs
    Se está repetindo provavelmente são os dados, tente fazer um select distinct para preencher o recordset.

    Espero ter esclarecido !!
    Até mais.
    ***** Não esqueça de marcar o post se ele foi útil ... [], Elek
    • Editado Elek Guidolin terça-feira, 28 de abril de 2009 00:09 Esclarecimento método GetRows
    • Marcado como Resposta Marcelo Marvi terça-feira, 28 de abril de 2009 21:01
    segunda-feira, 27 de abril de 2009 23:56

Todas as Respostas

  • Ninguém sabe como resolver?? Fico grato!
    Marcelo Vinicius
    quarta-feira, 22 de abril de 2009 23:24
  • Marcelo, creio que a melhor maneira para você fazer isso é pegar do recordset e jogar para dentro de um array, com array você trabalhar de duas maneiras, uma com um array de uma dimensão e depois você só "organiza" o array e vai exibindo conforme sua necessidade, ou dependendo do que você quer você pode criar um array de 3 dimensões e popular com seu recordset, assim na hora de criar a tabela do maneira que você quer ficar mais fácil, com 2 while voc~e faz tranquilo.

    Abraço

    Estevam
    **** Se a reposta foi útil, então não esqueça de marca-lá. ***
    quinta-feira, 23 de abril de 2009 16:42
  • Luiz, você fala para organizar a orderm alfabética na vertical pelo array, dentro de um array e exibir as informações na horizontal pela programação ASP que eu já faço, isso?

    Poderia me dar um exemplo para ver como faço isso no array?

    Muito obrigado mesmo!

    Marcelo
    Marcelo Vinicius
    sexta-feira, 24 de abril de 2009 02:05
  • Olá Marcelo, vamos fazer como meu amigo Jack.

    Primeiro de tudo, tente sempre deixar o máximo de código ASP agrupado, sem abrir e fechar tags asp a todo momento.
    Cada vez que é aberta uma tag Asp o html para de ser executado e chama o ASP no servidor, que executa as linhas e
    volta para terminar de montar o html, isso gera um custo de processamento desnecessário ao servidor.

    Outra coisa é exatamente o que o Luiz falou. A melhor maneira de fazer esse tipo de tratamento é transformando seu
    recordset em Array para poder definir a posição do array que deseja manipular.

    E a última é que quanto mais tabelas você usa no seu html, mais pesado ele fica, portanto evite usar tantas tags table dentro de table ...
    Repare que foi utilizada apenas uma tabela e as tr's e td's foram sendo criadas conforme necessidade.

    Tentei fazer pelo RecordSet, mas não achei nenhuma solução, talvez até exista, mas não consegui enxergar uma.
    Claro que podem existir maneiras diferentes e até melhores de se fazer isso, mas essa foi a forma que encontrei de resolver a questão.

    Bom, então vamos lá, segue o código comentado para a solução.
    Qualquer dúvida posta aí ...

    Até mais !!

            <table border="1" style="border-collapse: collapse" bordercolor="#111111" width="100%" id="AutoNumber14">
                <%
                'Sempre declare todas as variáveis que for usar. Pode parecer que não, mas isso ajuda na performance.
                Dim objConn, rsPrincipal, arrConvenio
                Dim qtdColunas, qtdRegistros, qtdLinhas, registroAtual
                Dim Linha, Coluna

                'Abre conexão com o banco de dados
                Set objConn = Server.CreateObject("ADODB.Connection")
                Set rsPrincipal = Server.CreateObject("ADODB.RecordSet")
                objConn.Open strProvider 'Coloque o seu provider aqui !!

                'Adiciona ao RecordSet Principal os dados retornados e ao Contador, a quantidade de registros da tabela,
                'para saber a quantidade de linhas a serem criadas.
                Set rsPrincipal = objConn.Execute("Select * From Convenios")
                'Transforma o RecordSet em um Array, neste caso com apenas uma coluna arr(0, x), porém se a tabela tiver mais de uma coluna é possível
                'tratar a linha e coluna do array, ex.: arr(x, y)
                arrConvenio = rsPrincipal.GetRows
               
                'Destruindo objetos que não serão mais usados na página, a partir daqui tudo que é usado na página já está em memória e não depende mais
                ' do banco de dados
                rsPrincipal.Close
                objConn.Close
                Set rsPrincipal = Nothing
                Set objConn = Nothing
               
                'Define o máximo de colunas, atribui a quantidade de registros retornados, define a quantidade de linhas "tr's" que serão criadas.
                'Por padrão os arrays começam com índice 0, então, como queremos 4 colunas, o qtdColunas deve ser 3 e assim por diante.
                qtdColunas = 3
                qtdRegistros = UBound(arrConvenio, 2)
                qtdLinhas = CInt(qtdRegistros / (qtdColunas + 1))
                registroAtual = 0

                'Para cada linha até o máximo de linhas descoberto acima
                For Linha = 0 To qtdLinhas
                    'Atribui à variável de controle de posição o número da linha atual e escreve o início da linha
                    registroAtual = Linha
                    Response.Write("<tr>")
                    'Para cada coluna, começando do zero até o número de colunas indicados, testa e escreve o valor da célula
                    For Coluna = 0 To qtdColunas
                    %>
                        <td>
                            <font face="Arial Narrow" color="#616161" style="font-size: 11pt">
                                <%
                                    'Se o registro atual for menor ou igual a quantidade de registros, escreve o array na posição do registroAtual
                                    If registroAtual <= qtdRegistros Then
                                        Response.Write(arrConvenio(0, registroAtual))
                                    'Senão coloca um espaço em branco na célula
                                    Else
                                        Response.Write("&nbsp;")
                                    End If
                                %>
                            </font>
                        </td>
                    <%
                        'Acrescenta ao registro atual seu próprio valor mais a quantidade real de linhas para ser a nova posição do array.
                        'Dessa forma sempre o valor da posição do array será compatível com o numero de linhas.
                        registroAtual = registroAtual + (qtdLinhas + 1)
                    Next
                    Response.Write("</tr>")
                Next

                %>
            </table>


    ***** Não esqueça de marcar o post se ele foi útil ... [], Elek
    sexta-feira, 24 de abril de 2009 04:10
  • Tudo bem, entendi o processo sim, testei e rodou, mas veja que você fechou o banco lá em cima

    rsPrincipal.Close
                objConn.Close
                Set rsPrincipal = Nothing
                Set objConn = Nothing

    Como é que vou exibir em baixo as informações que vem do banco então? Tipo: rsprincipal("convenios") ou arrConvenio("convenios"), para imprimir na página?

    Aí que estar... mesmo assim coloque o close no fim da página e não imprimi do banco... acusando:

    0x800A0009)
    Subscrito fora do intervalo
    /labanalise/convenios.asp, line 94

    94: Response.Write(arrConvenio("convenios"))


    Eu tinha que fazer algo tipo arrConvenio1 = rsprincipal("convenios") e antes do arrConvenio = rsPrincipal.GetRow, senão, ele não permite e assim ele só exibie um nome do banco e não todos, fica repetido, tipo: CASSI, CASSI, CASSI... entende? Acho que tinha que ter um eof aí... não? Marcelo Vinicius
    sexta-feira, 24 de abril de 2009 22:09
  • Alguém?
    Marcelo Vinicius
    segunda-feira, 27 de abril de 2009 18:03
  • Marcelo,
    o array é controlado por um índice numérico que já está configurado no código acima.
    Quando fecho a conexão e o recordset é porque o array já está populado com o seu recordset.

    O método GetRows do Recordset pegou todos os dados do recordset (linhas e colunas) e populou um array bidimensional.
    A partir do momento que o GetRows rodou você não precisa mais de recordset e nem de conexão. Seu RecordSet agora é o array.

    Um array pode ser bidimensional (ou multi) e pode simular uma tabela do banco de dados, contendo linhas e colunas.
    Para acessar o conteúdo do array, você deve acessar pelo índice. Ex.: arrConvenios(IndiceColuna, IndiceLinha).
    Lembrando que o array usa base 0 (zero) ou seja, a primeira coluna tem índice 0 (zero) a segunda índice 1 e assim por diante, e linhas também iniciam pelo 0 (zero)

    Note que dentro do segundo For nesta parte do código eu escrevo o índice da coluna como Zero e o da linha sendo a variável.:
        If registroAtual <= qtdRegistros Then
            'Aqui eu mando escrever o ÍNDICE DA COLUNA como 0 (zero), pois o select só retorna uma coluna, e o ÍNDICE DA LINHA na forma da variável
            'registroAtual.
            Response.Write(arrConvenio(0, registroAtual))
        Else
            Response.Write("&nbsp;")
        End If

    O código que eu escrevi faz a ordenação, mas tem que ser usado por completo e do jeito que está, se vc copiar só o Response.Write e ainda mudar o conteúdo não funciona mesmo !! rsrs
    Se está repetindo provavelmente são os dados, tente fazer um select distinct para preencher o recordset.

    Espero ter esclarecido !!
    Até mais.
    ***** Não esqueça de marcar o post se ele foi útil ... [], Elek
    • Editado Elek Guidolin terça-feira, 28 de abril de 2009 00:09 Esclarecimento método GetRows
    • Marcado como Resposta Marcelo Marvi terça-feira, 28 de abril de 2009 21:01
    segunda-feira, 27 de abril de 2009 23:56
  • Agora entendi... esse método GetRows do Recordset pega as colunas e depois é controlada por 0, 1 ou mais, dependendo da quantidade de linhas e coluna no banco, mas iniciando do zero.

    Conseguir fazer então! Rodou bem e nunca conheci esse método GetRows do Recordset, bastante útil ele!

    Muito bom!

    Obrigado mesmo!
    Marcelo Vinicius
    terça-feira, 28 de abril de 2009 21:01