Was this page helpful?

Trabalho de VISINFO manipulação de dados

    Conteúdo
    sem cabeçalhos

    A aplicação geradora de xml foi desenvolvida em Rails que é framework  para desenvolvimento web que usa lingugem de programação Ruby e possui vários padrões de projetos implementados em seu núcleo, usamos em sua versão beta4 e sistema operacional Linux, distribuição Debian. Não iremos abordar as dependências de instalação por não fazer parte do objetivo desse trabalho.

    Criação do projeto:

    $ rails new visinfo -d mysql

    Plugins necessários para páginação do registros, deve ser adicionado no arquivo Gemfile na raiz do Rails:

    gem "will_paginate", :git => "http://github.com/mislav/will_paginate.git", :branch => "rails3"

    Para instalação das gemas:

    bundle install

    Criando estrutura CRUD (Create, Read, Update, Delete):

    $ rails scaffold visinfodatas NR_MATRICULA:integer, ANO_INGRESSO:string, SEMESTRE_INGRESSO:integer, ID_OFERTA:integer, ID_DISCIPLINA:integer, NOME:string, NUCLEO:string, OBRIGATORIA:string, AREA:integer, CARGA_HORARIA:integer, ANO_OFERTA:string, SEMESTRE_OFERTA:string, PERIODO:integer, ID_DOCENTE:integer, NOTA:float, FREQUENCIA:integer, RESULTADO:string

    O Rails implementa o padrão MVC (Model, View, Controller), portanto nossa classe "app/controllers/visinfodatas_controller.rb" é a responsável pela definição dos objetos que estarão disponíveis nas "Views", as modificações são somente no método index confome abaixo:

    def index
        params[:per_page] ||= 10
        @visinfodatas = Visinfodata.paginate :page => params[:page], :per_page => params[:per_page], :order => 'id DESC'
        # Parametros para período a ser exibido na visualização
        if params[:periodo] == "ingresso"
          periodo = "concat(ANO_INGRESSO,'/',SEMESTRE_INGRESSO)"
        else
          periodo = "concat(ANO_OFERTA,'/',SEMESTRE_OFERTA)"
        end 
        # Ordenação do agrupamento dos dados
        if params[:ordem] == "nome"
          ordem = "nome"
        elsif params[:ordem] == "periodo"
          ordem = "ANO_OFERTA,SEMESTRE_OFERTA"
        elsif params[:ordem] == "ingresso"
          ordem = "ANO_INGRESSO,SEMESTRE_INGRESSO"
        elsif params[:ordem] == "taxa"
          ordem = "REPROVADOS desc"
        elsif params[:ordem] == "nucleo"
          ordem = "NUCLEO desc, REPROVADOS desc"
        end 
        # Filtro para disciplina sem reprovação
        if params[:todos]
          todos = ""
        else
          todos = "having REPROVADOS > 0"
        end 
        # Geração da objeto agrupado
        if params[:agrupar] == "professor"
          @visinfodatasxml = Visinfodata.find_by_sql("select ID_DOCENTE as ID,concat('Professor ',ID_DOCENTE) as NOME,NR_MATRICULA as ALUNOS,#{periodo} as ANO_SEM,NUCLEO,COUNT(IF(RESULTADO='RM',1,NULL)) as REPROVADOS from visinfodatas group by ID_DOCENTE,#{periodo} #{todos} order by #{ordem};")
        elsif params[:agrupar] == "disciplina"
          @visinfodatasxml = Visinfodata.find_by_sql("select ID_DISCIPLINA as ID,NOME,NR_MATRICULA as ALUNOS,#{periodo} as ANO_SEM,NUCLEO,COUNT(IF(RESULTADO='RM',1,NULL)) as REPROVADOS from visinfodatas group by ID_DISCIPLINA,#{periodo} #{todos} order by #{ordem};")
        elsif params[:agrupar] == "nucleo"
          @visinfodatasxml = Visinfodata.find_by_sql("select NUCLEO as ID,NUCLEO AS NOME,NR_MATRICULA as ALUNOS,#{periodo} as ANO_SEM,NUCLEO,COUNT(IF(RESULTADO='RM',1,NULL)) as REPROVADOS from visinfodatas group by NUCLEO,#{periodo} #{todos} order by #{ordem};")
        end
    respond_to do |format| format.html # index.html.erb format.xml { render :layout => '../visinfodatas/index.xml.builder', :content_type => 'application/xml' } end end

    O arquivo responsável pela construção do xml (index.xml.builder):

    xml.instruct! :xml, :version=>"1.0"
    
    periodos = []
    # Gera xml
    xml.dados do
      @visinfodatasxml.group_by(&:ID).each do |a,b|
        b.each{ |c| a = c } 
        xml.disciplinas do
          xml.disciplina :id => a.ID, :name => a.NOME, :abb => a.NOME.gsub(/^([a-zA-Z]{1})([a-zA-Z ]*)/,'\1'), :nucleo => a.NUCLEO do
            b.each do |dados|
              xml.periodo :value => dados.ANO_SEM, :alunos => dados.ALUNOS, :reprovados => dados.REPROVADOS
              periodos.push(dados.ANO_SEM)
            end 
          end 
        end 
      end
    # Vetor de períodos únicos
      periodos.uniq!
      periodos.sort!
      xml.periodos do
        periodos.each do |per|
          xml.periodo :value => per 
        end 
      end 
    end 

     Importando para mysql o arquivo csv

    LOAD DATA INFILE 'dados_curso-stringsemaspas.csv' into table visinfodatas FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' LINES TERMINATED BY '\n';
    

    Para acessar a interface CRUD http://200.137.222.231:3002/visinfodatas ou XML http://200.137.222.231:3002/visinfodatas.xml

    Was this page helpful?
    Marcadores (Editar marcadores)
    • No tags
    Estatísticas da página
    3944 view(s), 12 edit(s) and 5735 character(s)

    Comentários

    Faça o login para escrever um comentário.

    Anexar arquivo

    Anexos