Percorrer Collection no Ireport

74 respostas
R

Boa tarde galera, tdo certo? Bem, estou fazendo um relatório de Boletim escolar apartir de uma lista de notas, abaixo o metodo:

public void geraRelatorioBoletim(boolean isPDF) {
        String parametroRelatorioVazio;
        List<Nota> listaRelatorio = ns.listaBoletimSimple(montaParametros());
        Map<String, String> parametros = new HashMap<String, String>();
        if (listaRelatorio.isEmpty()) {
            parametroRelatorioVazio = "Não há dados para exibir.";
        } else {
            parametroRelatorioVazio = "";
        }
        parametros.put("parametroRelatorioVazio", parametroRelatorioVazio);
        parametros.put("nomeRelatorio", RelatorioTitulo.BOLETIM_ESCOLAR);
        //      parametros.put("gradeCollection", etapa.getGradeCollection()); collection...
        RelatorioUtil.geraRelatorioPDF(listaRelatorio, RelatorioJasper.BOLETIM, parametros);
    }

Ele está funcionado blz. Lista em um crosstab as disciplinas, nota de cada disciplina de cada período ( 1º trimestre, 2º trimestre, 3º trimestre, etc),. Só que eu estou querendo ordenar as disciplinas que possuo no crosstab apartir de uma collection, ou passar as disciplinas na collection. Estou pesquisando e tal, mas não estou conseguindo…Não tenho como fazer com subreport pois não tenho caminho para pegar as notas dos alunos daí…
Passei o parâmetro que está comentado acima com um iterator, só que daí ele pega osmente a primeira disciplina de 10 disciplinas que tenho por exemplo…Tentei passar etapa.getGradeCollection().tosString e daí ele lista a lista bem certo de disciplinas, só que uma ao lado da outra, ao invés de separ elas por objeto, por exemplo…
Abaixo como o relatório está saindo hoje:
O relat 36 é como ele está saindo hoje, e o outro é a lista na ordem que eu estou tentando fazer com que saia passando a collection…Se algúem puder ajudar ou der alguma sugestão de como posso fazer para organizar as disciplinas de tal forma, fico mto grato…Vlw

74 Respostas

R

Porque você não ordena sua lista antes de mandar para o relatório?

R

Boa tarde Roselito…Eu estou fazendo da seguinte forma:
No bean, mais precisamente dentro do metodo que chamo o relatorio:

.
.
.
   List<Nota> listaRelatorio = ns.listaBoletimSimple(montaParametros());
.
.
.

No service:

public static final String PREFIXO_OBJETO = "n";
    private static final String QUERY_NOTAS = "select distinct n from Nota n left join fetch n.turma "
            + "left join fetch n.escola left join fetch n.disciplina.gradeCollection g left join fetch n.aluno";

 @TransactionAttribute(TransactionAttributeType.NEVER)
    public List<Nota> listaBoletimSimple(Map<String, Object> parametros) {
        String orderBy = ServiceUtil.montaOrderBy("aluno.nome, g.ordem", true, PREFIXO_OBJETO);
        return crudService.executeQuery(QUERY_NOTAS, orderBy, criaFiltros(parametros));
    }

public static String montaOrderBy(String sortField, boolean sortOrder, String prefixoObjetoQuery) {
        String orderBy = "";
        if (sortField != null) {
            String strAscDesc = sortOrder ? " ASC " : " DESC ";
            orderBy = String.format(" order by %s.%s %s ", prefixoObjetoQuery, sortField, strAscDesc);
        }
        return orderBy;
    }

Não sei se devo fazer o order by exp. dentro do crosstab mesmo, ou lago do tipo…Tentei mta coisa até agora e infelizmente não consegui cara…Em anexo o .jasper:
Se puder dar uma mão aí, agradeço mto cara…Vlw

R

Já que você passa a lista (listaRelatorio) diretamente para o relatório, eu acho que você deveria ordená-la antes com Collections.sort - você pode até definir seu próprio método de ordenação. Eu uso bastante, é muito rápido e evita acessos desnecessários ao Banco de Dados.

R

É tipo uma classe ou algo similar a isso? Se eu fazer da maneira que mencionou, não tem a necessidade de passar a collection para o relatório?

R

Não é isso. Você ordena a lista com o método sort da classe Collections antes de passar pro relatório. Dá uma pesquisada em Collections.sort pra ver se serve para o seu caso.

R

Ok, entendi a lógica. Mas, ( desculpe a ignorância) como ele vai se comportar se no row groups do meu crosstab eu passar o field que tenho ( no caso disciplina) ?? E se eu passar a collection como parâmetro, teria como eu percorrer ela no row groups para ele listar as disciplinas no estilo do relatório qe mencionei no início? Anteriormente, mandei o .jasper . Se puder dar uma olhada lá, agradeço mto…Vlw

R

Minha versão do iReports não abriu seu arquivo. Mas sugiro o seguinte: faça seu relatório funcionar, mesmo que fique fora de ordem. Depois que tudo estiver funcionando, veja as soluções posíveis da comunidade neste link:

R

Roselito Fávero da Silva:
Minha versão do iReports não abriu seu arquivo. Mas sugiro o seguinte: faça seu relatório funcionar, mesmo que fique fora de ordem. Depois que tudo estiver funcionando, veja as soluções posíveis da comunidade neste link:

http://community.jaspersoft.com/wiki/custom-crosstab-ordering-ireport-designer


Ele tá funcionando blz Roselito. Só queria orderar ele de uma maneira diferente com relação a apresentação das disciplinas que aparecem no crosstab…Tipo, tem a possibilidade de ascending e descending no row groups…Tentei usar o compartor exp. e o order by exp… Só que em ambos dá o seguinte erro por exemplo: field not found: nomeDoField
Saberia me dizer o pq?? Se puder continuar ajudando agradeço mtoo cara. Obrigado por estar dando uma força até agora aí cara…Vlw msm

R

Não estou conseguindo encontrar uma solução rápida, sem analisar toda a sua aplicação. Mas olhe ssse link:

http://www.google.com.br/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&ved=0CDAQFjAA&url=http%3A%2F%2Fwww.furutani.com.br%2Fa%2Ftutorial_crosstab.pdf&ei=h0uKUq6HDNTekQfHjYCIBA&usg=AFQjCNHCUIJicAjQF7kdDre6QEBbjX1awg&sig2=9JtXGLwCc0hUnDLYED-9fA&bvm=bv.56643336,d.eW0&cad=rja

No finalzinho da página 10, o Furutani mostra como ordenar o s meses do relatório dele. Talvez esclareça onde está seu erro.

R

Roselito Fávero da Silva:
Não estou conseguindo encontrar uma solução rápida, sem analisar toda a sua aplicação. Mas olhe ssse link:

http://www.google.com.br/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&ved=0CDAQFjAA&url=http%3A%2F%2Fwww.furutani.com.br%2Fa%2Ftutorial_crosstab.pdf&ei=h0uKUq6HDNTekQfHjYCIBA&usg=AFQjCNHCUIJicAjQF7kdDre6QEBbjX1awg&sig2=9JtXGLwCc0hUnDLYED-9fA&bvm=bv.56643336,d.eW0&cad=rja

No finalzinho da página 10, o Furutani mostra como ordenar o s meses do relatório dele. Talvez esclareça onde está seu erro.


Cara, vou olhar aki…Tentar fazer a classe e qualqer coisa posto aí…Daki a poco já coloco o resultado…Vlw aí…

R

Roselito Fávero da Silva:
Minha versão do iReports não abriu seu arquivo. Mas sugiro o seguinte: faça seu relatório funcionar, mesmo que fique fora de ordem. Depois que tudo estiver funcionando, veja as soluções posíveis da comunidade neste link:

http://community.jaspersoft.com/wiki/custom-crosstab-ordering-ireport-designer


Cara, to usando a versão 4.7.0… Se puder dar uma olhada no relatório agradeceria mto… To a vários dias já tentando fazer esse negócio aki… Se puder continuar ajudando agradeço… Não to conseguindo fazer a classe comparator…

R

Parente,

Posso te ajudar a fazer a classe Comparator, que é bem simples. Quais os tipos dos objetos e quais os atributos deles que tem que ser comparados?

R

Roselito Fávero da Silva:
Parente,

Posso te ajudar a fazer a classe Comparator, que é bem simples. Quais os tipos dos objetos e quais os atributos deles que tem que ser comparados?


Bom dia cara, tdo certo? Bem, estou fazendo o relatório apartir da classe Nota e preciso comparar ( no caso pretendo ordenar ) apartir da minha classe Grade. Abaixo minha classe Nota:

@Table(name = "EDU_NOTAS")
public class Nota implements Serializable, Auditable {

    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "gen_nota")
    @SequenceGenerator(name = "gen_nota", sequenceName = "GEN_NOTA", allocationSize = 1, initialValue = 1)
    @Column(name = "NOT_CODIGO")
    private Integer codigo;
    @Column(name = "NOT_ANO")
    private Integer ano;
    @Column(name = "NOT_PERIODO")
    private Integer periodo;
    @Column(name = "NOT_NOTA")
    private BigDecimal nota;
    @Column(name = "NOT_PERCFALTAS")
    private BigDecimal percFaltas;
    @Column(name = "NOT_NOTAPARCIAL")
    private BigDecimal notaParcial;
    @Column(name = "NOT_CONCEITO")
    private String conceito;
    @Column(name = "NOT_NROFALTAS")
    private Integer nroFaltas;
//    @Column(name = "NOT_NROAULAS")
//    private Integer nroAulas;
    @Column(name = "NOT_NOTAREC")
    private BigDecimal notaRecuperacao;
    @JoinColumn(name = "NOT_CODMATRICULA", referencedColumnName = "MAT_CODIGO")
    @ManyToOne
    private Matricula matriculas;
    @JoinColumn(name = "NOT_CODDISCIPLINA", referencedColumnName = "DIS_CODIGO")
    @ManyToOne
    private Disciplina disciplina;
    @JoinColumn(name = "NOT_CODALUNO", referencedColumnName = "ALU_CODIGO")
    @ManyToOne
    private Aluno aluno;
    @JoinColumn(name = "NOT_CODESCOLA", referencedColumnName = "ESC_CODIGO")
    @ManyToOne
    private Escola escola;
    @JoinColumn(name = "NOT_CODTURMA", referencedColumnName = "TUR_CODIGO")
    @ManyToOne
    private Turma turma;
    @JoinColumn(name = "NOT_CODETAPA", referencedColumnName = "ETA_CODIGO")
    @ManyToOne
    private Etapa etapa;
    @JoinColumn(name = "NOT_CODAVALICAO", referencedColumnName = "AVA_CODIGO")
    @ManyToOne
    private Avaliacoes avaliacoes;
    @JoinColumn(name = "NOT_CODPARECER", referencedColumnName = "PAR_CODIGO")
    @ManyToOne
    private Parecer codParecer;
    @Column(name = "NOT_STATUS")
    private String status;
    @Column(name = "NOT_PARECER")
    private String parecer;
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "nota")
    private Collection<AvaliacaoObjetiva> avaliacaoObjetiva;

// getters e setter

Para chegar na classe da grade vou através da disciplina…

@Entity
@Table(name = "EDU_DISCIPLINAS")
public class Disciplina implements Serializable, Auditable {

    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "gen_disciplinas")
    @SequenceGenerator(name = "gen_disciplina", sequenceName = "GEN_DISCIPLINAS",
            allocationSize = 1, initialValue = 1)
    @Column(name = "DIS_CODIGO")
    private Integer codigo;
    @Column(name = "DIS_DESCRICAO")
    private String descricao;
    @Column(name = "DIS_ABREVIATURA")
    private String abreviatura;
    @JoinColumn(name = "DIS_CODAREA", referencedColumnName = "ARE_CODIGO")
    @ManyToOne
    private AreaDisciplina areaDisciplina;
    @JoinColumn(name = "DIS_CODDISMEC", referencedColumnName = "DISC_CODIGO")
    @ManyToOne
    private DisciplinasMec disciplinasMec;
    @OneToMany(mappedBy = "avaCoddisciplina")
    private Collection<Avaliacoes> eduAvaliacoesCollection;
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "disciplina")
    @OrderBy("ordem ASC") // Ordena a coleção pela ordem
    private Collection<Grade> gradeCollection;

Deu pra entender +/- ?? Nunca fui mto bom com explicações…Mas posso melhorar se necessário… No caso, se eu fosse para o relatório, passaria por parâmetro da seguinte maneira: //parametros.put(“gradeCollection”, etapa.getGradeCollection());
A minha classe grade é o seguinte:

@Table(name = "EDU_GRADE")
public class Grade implements Serializable, Auditable {

    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "gen_grade")
    @SequenceGenerator(name = "gen_grade", sequenceName = "GEN_GRADE", allocationSize = 1, initialValue = 1)
    @Column(name = "GRA_CODIGO")
    private Integer codigo;
    @Column(name = "GRA_QTPERIODOS")
    private Integer qntPeriodos;
    @Column(name = "GRA_CARGAHOR")
    private Integer cargaHoraria;
    @Column(name = "GRA_ORDEM")
    private Integer ordem;
    @JoinColumn(name = "GRA_CODETAPA", referencedColumnName = "ETA_CODIGO")
    @ManyToOne
    private Etapa etapa;
    @JoinColumn(name = "GRA_CODDISC", referencedColumnName = "DIS_CODIGO")
    @ManyToOne
    private Disciplina disciplina;

No caso, resumindo: tenho que ordenar as disciplinas que aparecerão no relatório de boletim apartir de uma lista de notas pela ORDEM DAS DISCIPLINAS que estão na Etapa daquela Grade…Se puder ajudar, agradeço muito cara, de fé mesmo. Vlw

R

Então vamos lá: como criar um comparator para a classe grade, comparando por descrição da disciplina (certo)?

Comparator cmpGrade = new Comparator() {
            @Override
            public int compare(Object o1, Object o2) {
                if (o1 != null && o2 != null) {
                    Grade g1 = (Grade) o1;
                    Grade g2 = (Grade) o2;
                    if (g1.getDisciplina() != null && g2.getDisciplina() != null) {
                       return g1.getDisciplina().getDescricao().compareToIgnoreCase(g2.getDisciplina().getDescricao());
                    }
                }
                return 0;
            }
        };

Confira os atributos e veja se com esse comparator você consegue resolver. Como eu havia dito no início da discussão, tem até como ordenar a lista usando esse comparator antes de mandar pro relatório.

R

Roselito Fávero da Silva:
Então vamos lá: como criar um comparator para a classe grade, comparando por descrição da disciplina (certo)?

Comparator cmpGrade = new Comparator() {
            @Override
            public int compare(Object o1, Object o2) {
                if (o1 != null && o2 != null) {
                    Grade g1 = (Grade) o1;
                    Grade g2 = (Grade) o2;
                    if (g1.getDisciplina() != null && g2.getDisciplina() != null) {
                       return g1.getDisciplina().getDescricao().compareToIgnoreCase(g2.getDisciplina().getDescricao());
                    }
                }
                return 0;
            }

        };

Confira os atributos e veja se com esse comparator você consegue resolver. Como eu havia dito no início da discussão, tem até como ordenar a lista usando esse comparator antes de mandar pro relatório.

Certo, mas vou conseguir ordenar a lista que possuo nas notas?? No caso:

public void geraRelatorioBoletim(boolean isPDF) {
        String parametroRelatorioVazio;
        List<Nota> listaRelatorio = ns.listaBoletimSimple(montaParametros()); // vou conseguir ordenar essa lista aki???
        Map<String, String> parametros = new HashMap<String, String>();
        if (listaRelatorio.isEmpty()) {
            parametroRelatorioVazio = "Não há dados para exibir.";
        } else {
            parametroRelatorioVazio = "";
        }
        parametros.put("parametroRelatorioVazio", parametroRelatorioVazio);
        parametros.put("nomeRelatorio", RelatorioTitulo.BOLETIM_ESCOLAR);
        //parametros.put("gradeCollection", etapa.getGradeCollection());
        RelatorioUtil.geraRelatorioPDF(listaRelatorio, RelatorioJasper.BOLETIM, parametros);
    }

Pq o problema tá na ordem que está passando as disciplinas para o relatório…Pois lá no relatório pego as disciplinas apartir da Disciplina disciplina que tneho na classe Nota. Entendeu??

R

Opa, tá clareando mais… perceba que sua classe Nota também tem um atributo disciplina. Então o comparator é quase igual ao que eu passei, mas trocando a classe Grade pela classe Nota. Então crie um comparator cmpNota para a classe Nota, faça um Collections.sort(listaRelatorio,cmpNota) antes de RelatorioUtil.geraRelatorioPDF(listaRelatorio, RelatorioJasper.BOLETIM, parametros) e veja se resolve.

R

Blz cara… Mas lembrando que devo ordenar pelas disciplinas que estão na grade, certo?? Vlw por estar ajudando cara…Mto obrigado mesmo cara!!

R

Cara, fiz da seguinte maneira:

public void geraRelatorioBoletim(boolean isPDF) {
        String parametroRelatorioVazio;
        List<Nota> listaRelatorio = ns.listaBoletimSimple(montaParametros()); // vou conseguir ordenar essa lista aki???
        Collections.sort(listaRelatorio, cmpNota);
        Map<String, String> parametros = new HashMap<String, String>();
        if (listaRelatorio.isEmpty()) {
            parametroRelatorioVazio = "Não há dados para exibir.";
        } else {
            parametroRelatorioVazio = "";
        }
        parametros.put("parametroRelatorioVazio", parametroRelatorioVazio);
        parametros.put("nomeRelatorio", RelatorioTitulo.BOLETIM_ESCOLAR);
        //parametros.put("gradeCollection", etapa.getGradeCollection());
        RelatorioUtil.geraRelatorioPDF(listaRelatorio, RelatorioJasper.BOLETIM, parametros);
    }
    Comparator cmpNota = new Comparator() {
        @Override
        public int compare(Object o1, Object o2) {
            if (o1 != null && o2 != null) {
                Nota g1 = (Nota) o1;
                Nota g2 = (Nota) o2;
                if (g1.getDisciplina() != null && g2.getDisciplina() != null) {
                    return g1.getDisciplina().getDescricao().compareToIgnoreCase(g2.getDisciplina().getDescricao());
                }
            }
            return 0;
        }
    };

Só que ele não ordenou da maneira que tem que ordenar… Tipo, no crosstab do relatório tenho as disciplinas mais precisamente no row groups e lá tem o compartor exp que não tem nda, o order que está em ascending, o order by exp. que não tem nada.
Será que o furo da bala não está no relatório??? Pq afinal de contas ele não deve ordenar as disciplinas ascending ou descending e sim pela ordem que está na grade…Certo? Alguma luz aí?? Aki
to com num eclipse faz tempo cara…
O relatório 64 é como ele está hoje…Está com o order lá no crosstab em ascending…A imagem é como ele deveria ordenar…


R

Então eu acho que você deve fazer um comparator para a classe Grade, e usar o que o Furutani fez na pagina 11 do link que eu te passei ontem… e preencher a propriedade do comparator no relatório com um new seu_pacote.cmpGrade()

R

Criei o seguinte:

package com.systempro.sapiweb.util;

import com.systempro.sapiweb.dominio.Grade;
import java.util.Comparator;

/**
 *
 * @author prog16
 */
public class ComparatorUtil implements Comparator<Grade> {

    @Override
    public int compare(Grade o1, Grade o2) {
        if (o1 != null && o2 != null) {
            Grade g1 = (Grade) o1;
            Grade g2 = (Grade) o2;
            if (g1.getDisciplina() != null && g2.getDisciplina() != null) {
                return g1.getDisciplina().getDescricao().compareToIgnoreCase(g2.getDisciplina().getDescricao());
            }
        }
        return 0;
    }
}

No pacote com.systempro.sapiweb.util mas dá erro no relatório…Abaixo a imagem:


R

Não é no order by exp., é no Comparator exp.

R

Infelizmente tá dando o mesmo erro cara. Sério, to chegando a conclusão que não vou conseguir fazer :frowning:

R

E você colocou o caminho da classe do comparador no classpath do iReport?

R

Infelizmente não… Nunca mexi nisso exatamente…Ao menos acredito que não;.

R

Cara, não sei mais oke fazer…Abaixo a imagem do classpath…Poderia dar mais alguma ideia aí? Se puder continuar a fazer esse trem funcionar, agradeço mtoo cara…Pq já to nas últimas tentativas aki…Vlw


R

Acrescente aí no classpath a pasta onde está o arquivo .class correspondente ao seu comparator.

R

Cara, acabei de add a pasta e tals, mas nao tem jeito…


R

Cara, tá errado. Você deve adicionar a pasta onde fica o arquivo .class - no caso, você adicionou o arquivo .java - reveja isso aí.

R

Desculpe pela ignorância…To meio perdido aki…Seguinte: então esse arquivo que criei deve ser .class e não .java??

R

Cara, n to conseguindo pelo jeito…Poderia dar uma mão aí…??? Tá dando o mesmo erro. Se puder ajudar a fazer isso funcionar fico mto agradecido…Vlw cara…Abc!!

R

O arquivo .class você não cria - ele é gerado quando você compila seu projeto. Localize a pasta dele e acerte o classpath, colocando o caminho da pasta e não do arquivo.

R

Bom dia Roselito, tdo certo ? Cara, fiquei pensando no seguinte essa noite:
1º Não sei se dá pra se encaixar nesse tópico mas fiquei com dúvida no seguinte:
Quando crio um subreport dentro do “relatório pai” geralmente passo um field do tipo List no relatório pai e no Data Source Expression do SuBREPORT passo o seguinte, por exemplo:

new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($F{lista})

Sendo que a lista nda mais é do que ( no caso a description): aluno.matriculaCollection. Então a dúvida é a seguinte: Não teria como eu declarar uma list em um relatório qualquer e não criar um subrelatorio, mas sim, passar num field qualquer new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($F{lista}) para pegar algo de dentro da Matrícula nesse caso??? Se puder dar uma ideia aí, fico mto agradecido cara…Vlw

R

Ricardo,

Acredito que isso não seja possível. Você não teria como percorrer a lista sem ser por meio de um subreport. As alternativas para isto são justamente os componentes, como a crossTable.

R

Roselito Fávero da Silva:
Ricardo,

Acredito que isso não seja possível. Você não teria como percorrer a lista sem ser por meio de um subreport. As alternativas para isto são justamente os componentes, como a crossTable.


É que preciso colocar um campo dentro de um relatório que está também dentro da collection…Porém, eu teria que colocar ele dentro do crosstab… É que vi esse tópico, ( http://www.guj.com.br/java/210247-duvidas-para-gerar-relatorio-no-ireport-resolvido#1628774 )daí achei que seria possível, poderia dar mais uma mão aí?? Pq o ordenar aí por enquanto deixei de lado…Vlww

R

Olha, a única maneira que vejo pra você fazer algo do tipo é passar uma coleção HashMap pra dentro do seu relatório, aí você poderia usar o get do HashMap para obter um valor dele a partir de uma chave. Mas é bem complicado fazer isso.

R

Pela madrugada!!! Tipo, no método que chamo o relatório vc diz ou fazer dentro do jasper msm???

R

Dentro do jasper. Você pode colocar um hashmap transient na sua entidade e acessá-lo como se fosse um campo, dentro do jasper.

R

Pelo jeito não é tãoo facil…hehehe…Pode dar uma mão aí? Em anexo o relatorio…

R

Ricardo, instalei um iReport mais recente aqui e agora consigo abrir seus relatórios (boletim e presencaDisciplina). Me explique novamente o que você precisa pra ver se eu consigo alguma solução aqui.

R

Naquele relatório de boletim, vá em Row Groups -> disciplina e coloque no Order by exp.:

Isso ordena do jeito que você queria?

R

Bhá cara, primeiro mto obrigado pela disponibilidade em me ajudar que está dando aí. Além de muita paciência, é claro. Bem, no presencaDisciplina eu preciso colocar um campo status que tenho dentro da classe matrícula. Para chegar na classe matrícula vou no objeto aluno e pego no aluno a collection de matrícula…Abaixo a classe Presenca

public class Presenca implements Serializable, Auditable {

    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "gen_presenca")
    @SequenceGenerator(name = "gen_presenca", sequenceName = "GEN_PRESENCA", allocationSize = 1, initialValue = 1)
    @Column(name = "PRE_CODIGO")
    private Integer codigo;
    @Column(name = "PRE_STATUS")
    private String status;
    @JoinColumn(name = "PRE_CODREGAULA", referencedColumnName = "AUL_CODIGO")
    @ManyToOne
    private RegistroAula registroAula;
    @JoinColumn(name = "PRE_CODALUNO", referencedColumnName = "ALU_CODIGO")
    @ManyToOne
    private Aluno aluno;

E em aluno:

@OneToMany(mappedBy = "aluno")
    @OrderBy("dataMatricula DESC")
    private Collection<Matricula> matriculaCollection;

Tenho um relatório de presencaAluno, e nele daí peguei e criei um subrelatorio e passo nele uma list ( que no caso é a collection), pois o agrupamento é por aluno e não por disciplinas, daí fica da seguinte forma: O campo que estou tentando colocar dentro do crosstab, mais precisamente ao lado do nome do aluno é akele que aparece ao lado do nome de um dos alunos…Exemplo: aluno transferido…entendeu??Qler dúvida, qlquer mesmo, só pedir que vou procurar explicar da melhor forma possível…

R

Um aluno pode ter várias matrículas? Se sim, qual matricula.getStatus() você quer colocar no crosstab, o último?

R

Pode ter várias sim, só que o seguinte: o aluno é matriculado uma única vez naquela turma e em uma única etapa ( série) . Então deve pegar automaticamente a matricula daquela turma e daquela etapa. Coloca o último para vermos se bate os resultados…

R

Não tenho como fazer isso… você deve criar um método na sua classe Aluno, anotado com @Transient, digamos getStatus().

Você deve fazer esse método retornar o status que você quer. Depois fica fácil chamar o método lá no campo do jasper. Faça o método e poste pra gente conferir. Você chegou a ver um post anterior onde eu sugeri como ordenar o boletim?

R

Roselito Fávero da Silva:
Não tenho como fazer isso… você deve criar um método na sua classe Aluno, anotado com @Transient, digamos getStatus().

Você deve fazer esse método retornar o status que você quer. Depois fica fácil chamar o método lá no campo do jasper. Faça o método e poste pra gente conferir. Você chegou a ver um post anterior onde eu sugeri como ordenar o boletim?


Ok, vou fazer. Bem, com relação ao boletim, hoje de manha fui fazer outras coisas e não mexi mais nelee. Mas no negócio do boletim é o seguinte: tenho que ordenar as disciplinas que aparecem no crosstab apartir da coleção que eu tenho dentro do Objeto etapa ou disciplina ( no caso gradeCollection.ordem)…Mas infelizmente não mexi mais com relação ao comparador e tals…

R

Roselito Fávero da Silva:
Não tenho como fazer isso… você deve criar um método na sua classe Aluno, anotado com @Transient, digamos getStatus().

Você deve fazer esse método retornar o status que você quer. Depois fica fácil chamar o método lá no campo do jasper. Faça o método e poste pra gente conferir. Você chegou a ver um post anterior onde eu sugeri como ordenar o boletim?


Parente, fiz o seguinte: Na classe aluno criei:

@Transient
    private String statusDaMatricula;

    public String getStatusDaMatricula() {
        String mat = matriculaCollection.iterator().next().getStatusCompleto();
        statusDaMatricula = mat;
        return statusDaMatricula;
    }

    public void setStatusDaMatricula(String statusDaMatricula) {
        this.statusDaMatricula = statusDaMatricula;
    }

E no relatorio chamei daí…A princípio funfou…Mto obrigadoo pelas ideiass caraaa… Mto obrigado mesmo…Agora, se não for pedir demais…Pode dar uma mão nequele boletim :smiley: sahusahusa
( o cara oferece a mão e o outro já quer o braço né)…Mas enfim…Será que dá pra ordenar ??

R

Já respondi um pouco antes - dá uma olhada pra ver se funciona.

R

To testando exatamente da mesma forma que vc falou pra fazer com o status…Criei um ordem na Classe Disciplina apartir da gradeCollection que tenho em Disciplina…Vamos ver no que vai dar…Já posto resultados…

R

Assim não funciona?

Naquele relatório de boletim, vá em Row Groups -> disciplina e coloque no Order by exp.:

R

[quote=Roselito Fávero da Silva]Assim não funciona?

Naquele relatório de boletim, vá em Row Groups -> disciplina e coloque no Order by exp.:

Não funciona, Dá o seguinte erro: field not found:disciplina.

R

Eu escrevi errado o nome do campo - ficou “dfisciplina”. Confere lá porque o campo existe, sim. Faça pelo assistente dele e escreva só a parte do getDescricao().

R

Cara, sl oke tá acontecendo, sei dizer que no meu quando compila o relatório ( no martelinho lá) dá esse erro. Mas eu escrevi certo disciplina e tals, e somente adicionei o getDescricao()
O teu aí compila??

R

Fiz da seguinte forma, na classe Disciplina criei o método:

public Integer getOrdenaDisciplinas() {
        Integer ordem = gradeCollection.iterator().next().getOrdem();
        ordenaDisciplinas = ordem;
        return ordenaDisciplinas;
    }

    public void setOrdenaDisciplinas(Integer ordenaDisciplinas) {
        this.ordenaDisciplinas = ordenaDisciplinas;
    }

Só que está retornando somente duas disciplinas com código, sendo que uma delas tá com o código errado…Em anexo os relatórios e a imagem de como deveria vir as disciplinas no crosstab…Poderia dar uma mão aí… Cara, se não levar a mal, agora tenho que ir pra faculdade…Abc…Mto obrigado pela ajuda de hj véio…Mto obrigado msmm


R

Bom dia cara, tdo certo?? Pode dar uma ajuda aí?? VLw

R

Eu sugiro algo do tipo:

public Integer getOrdenaDisciplinas() {  
       Integer retorno = 0;
       for (Grade g : gradeCollection) {
          if (g.getDisciplina().getDescricao().equals(this.descricao) {
             retorno = g.getOrdem();
             break;
          }
       }
       return retorno;
   }

Não sei se estou fazendo certo, não tenho domínio sobre suas classes, mas tenta algo assim, você tem que retornar o valor correspondente ao valor atual da sua entidade (Disciplina). Do jeito que você fez, ele está pegando o próximo valor sabe-se lá qual é…

R

Roselito Fávero da Silva:
Eu sugiro algo do tipo:

public Integer getOrdenaDisciplinas() {  
       Integer retorno = 0;
       for (Grade g : gradeCollection) {
          if (g.getDisciplina().getDescricao().equals(this.descricao) {
             retorno = g.getOrdem();
             break;
          }
       }
       return retorno;
   }

Não sei se estou fazendo certo, não tenho domínio sobre suas classes, mas tenta algo assim, você tem que retornar o valor correspondente ao valor atual da sua entidade (Disciplina). Do jeito que você fez, ele está pegando o próximo valor sabe-se lá qual é…

Bom dia Roselito, tudo certo cara… Bem… a classe Grade:

public class Grade implements Serializable, Auditable {

    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "gen_grade")
    @SequenceGenerator(name = "gen_grade", sequenceName = "GEN_GRADE", allocationSize = 1, initialValue = 1)
    @Column(name = "GRA_CODIGO")
    private Integer codigo;
    @Column(name = "GRA_QTPERIODOS")
    private Integer qntPeriodos;
    @Column(name = "GRA_CARGAHOR")
    private Integer cargaHoraria;
    @Column(name = "GRA_ORDEM")
    private Integer ordem;
    @JoinColumn(name = "GRA_CODETAPA", referencedColumnName = "ETA_CODIGO")
    @ManyToOne
    private Etapa etapa;
    @JoinColumn(name = "GRA_CODDISC", referencedColumnName = "DIS_CODIGO")
    @ManyToOne
    private Disciplina disciplina;

//getters e setters

A classe disciplina:

public class Disciplina implements Serializable, Auditable {

    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "gen_disciplinas")
    @SequenceGenerator(name = "gen_disciplina", sequenceName = "GEN_DISCIPLINAS",
            allocationSize = 1, initialValue = 1)
    @Column(name = "DIS_CODIGO")
    private Integer codigo;
    @Column(name = "DIS_DESCRICAO")
    private String descricao;
    @Column(name = "DIS_ABREVIATURA")
    private String abreviatura;
    @JoinColumn(name = "DIS_CODAREA", referencedColumnName = "ARE_CODIGO")
    @ManyToOne
    private AreaDisciplina areaDisciplina;
    @JoinColumn(name = "DIS_CODDISMEC", referencedColumnName = "DISC_CODIGO")
    @ManyToOne
    private DisciplinasMec disciplinasMec;
    @OneToMany(mappedBy = "avaCoddisciplina")
    private Collection<Avaliacoes> eduAvaliacoesCollection;
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "disciplina")
    @OrderBy("ordem ASC") // Ordena a coleção pela ordem
    private Collection<Grade> gradeCollection;
R

Roselito Fávero da Silva:
Eu sugiro algo do tipo:

public Integer getOrdenaDisciplinas() {  
       Integer retorno = 0;
       for (Grade g : gradeCollection) {
          if (g.getDisciplina().getDescricao().equals(this.descricao) {
             retorno = g.getOrdem();
             break;
          }
       }
       return retorno;
   }

Não sei se estou fazendo certo, não tenho domínio sobre suas classes, mas tenta algo assim, você tem que retornar o valor correspondente ao valor atual da sua entidade (Disciplina). Do jeito que você fez, ele está pegando o próximo valor sabe-se lá qual é…


Cara, se eu deixar assim dá problema por causa do break…

public String getOrdenaDisciplinas() {
        Integer retorno = 0;
        for (Grade g : gradeCollection) {
            if (g.getDisciplina().getDescricao().equals(this.descricao)) {
                retorno = g.getOrdem();
                break;
            }
        }
        ordenaDisciplinas = retorno.toString();
        return ordenaDisciplinas;
    }

Tirei o break, e ele até imprime no relatório, porém, imprime uns número fora do contexto…Segue em anexo o relatório…Ontem, postei a imagem de como deveria imprimir a ordem…Se possível, olha lá por favor…Foi o último post se não me engano…Se puder continuar ajudando, agradeceria mto…Vlw

R

O break é necessário porque senão ele retorna sempre a última, certo?

E essa comparação da linha 4, é isso mesmo que tem que ser feito?

R

Roselito Fávero da Silva:
O break é necessário porque senão ele retorna sempre a última, certo?

E essa comparação da linha 4, é isso mesmo que tem que ser feito?


Cara, enfim…Chegue a conclusão de que eu estava fazendo o negócio no lugar errado. Pois a é na Classe Etapa que devo fazer o teste, pelo seguinte motivo: na etapa que estou tem uma coleção de grades que possui as disciplinas somente daquela etapa…Entendeu +/- ??
Enfim, só que daí o seguinte: sem o break ele pega a última ordem…Com o break ele pega a primeira…
Abaixo a classe Etapa:

public class Etapa implements Serializable, Auditable {

    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "gen_etapas")
    @SequenceGenerator(name = "gen_etapas", sequenceName = "GEN_ETAPAS", allocationSize = 1, initialValue = 1)
    @Column(name = "ETA_CODIGO")
    private Integer codigo;
    @Basic(optional = false)
    @NotEmpty(message = "Informe a Descrição da Etapa.")
    @Size(min = 1, max = 80)
    @Column(name = "ETA_DESCRICAO")
    private String descricao;
    @Size(max = 10)
    @Column(name = "ETA_ABREVIATURA")
    private String abreviatura;
    @JoinColumn(name = "ETA_CODFORMAVAL", referencedColumnName = "AVA_CODIGO")
    @ManyToOne
    private FormaAvaliacao formaAvaliacao;
    @JoinColumn(name = "ETA_CODCURSO", referencedColumnName = "CUR_CODIGO")
    @ManyToOne
    private Curso curso;
    @JoinColumn(name = "ETA_CODETAPMEC", referencedColumnName = "ETAM_CODIGO")
    @ManyToOne
    private EtapasMec etapaMec;
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "etapa")
    @OrderBy("ordem ASC") // Ordena a coleção pela ordem
    private Collection<Grade> gradeCollection;
    @JoinTable(name = "EDU_TURXETAPAS", joinColumns = {
        @JoinColumn(name = "TUXET_CODETAPA", referencedColumnName = "ETA_CODIGO")}, inverseJoinColumns = {
        @JoinColumn(name = "TUXET_CODTURMA", referencedColumnName = "TUR_CODIGO")})
    @ManyToMany
    private Collection<Turma> turmaCollection;
    @OneToMany(mappedBy = "avaCodetapa")
    private Collection<Avaliacoes> eduAvaliacoesCollection;
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "etapa")
    private Collection<Horario> horarioCollection;
    @Transient
    private String ordenaDisciplinas;

//getters e setters

public String getOrdenaDisciplinas() {
        Integer retorno = 0;
        for (Grade g : gradeCollection) {
            if (g.getEtapa().getCodigo() == (this.codigo)) {
                retorno = g.getOrdem();
                break;
            }
            System.err.println(g.getOrdem());
        }
        ordenaDisciplinas = retorno.toString();
        return ordenaDisciplinas;
    }

set....
R

Melhore a sua comparação dentro do if… pode ser que você esteja comparando objetos e não valores - compare usando intValue ou compareTo e veja se funciona.

R

Blz, vou testar aki e já retorno…Vlw

R

Fiz da seguinte maneira, mas n tem jeito cara…Sl oke tá acontecendo…

public String getOrdenaDisciplinas() {
        Integer retorno = 0;
        for (Grade g : gradeCollection) {
            if (g.getEtapa().getCodigo().toString().equalsIgnoreCase(this.codigo.toString())) {
                retorno = g.getOrdem();
                break;
            }
            System.err.println(g.getOrdem());
        }
        ordenaDisciplinas = retorno.toString();
        return ordenaDisciplinas;
    }

Testei da maneira abaixo:

public String getOrdenaDisciplinas() {
        Integer retorno = 0;
        for (Grade g : gradeCollection) {
            if (g.getEtapa().getCodigo().toString().equalsIgnoreCase(this.codigo.toString())) {
                retorno = g.getOrdem();
            }
            System.err.println(g.getOrdem() + g.getDisciplina().getDescricao());
        }
        ordenaDisciplinas = retorno.toString();
        return ordenaDisciplinas;
    }

    public void setOrdenaDisciplinas(String ordenaDisciplinas) {
        this.ordenaDisciplinas = ordenaDisciplinas;
    }

E no System.err imprimiu o seguinte, Bem certo, como o pretendido…

Grave:   2Ciências
Grave:   3Educação Física
Grave:   4Matemática
Grave:   5Lingua Portuguesa
Grave:   6Educação Artística
Grave:   7Ensino Religioso
Grave:   8Geografia
Grave:   9História

Poderia dar uma mão aí?? Vlw…

R

Manda imprimir dentro e fora do if, ANTES do break, o getOrdem(), o this.codigo e veja se está parando no momento certo em que a comparacão deveria funcionar…

R

Editei o post anterior…Era isso ???

R

Testei assim:

public String getOrdenaDisciplinas() {
        Integer retorno = 0;
        for (Grade g : gradeCollection) {
            if (g.getEtapa().getCodigo().toString().equalsIgnoreCase(this.codigo.toString())) {
                retorno = g.getOrdem();
                System.err.println(g.getOrdem() + " - " + g.getDisciplina().getDescricao());
                break;
            }
            System.err.println(g.getOrdem() + g.getDisciplina().getDescricao());
        }
        ordenaDisciplinas = retorno.toString();
        return ordenaDisciplinas;
    }

    public void setOrdenaDisciplinas(String ordenaDisciplinas) {
        this.ordenaDisciplinas = ordenaDisciplinas;
    }

E ele imprimiu da seguinte maneira:

Grave:   2 - Ciências
Grave:   2 - Ciências
Grave:   2 - Ciências
Grave:   2 - Ciências
Grave:   2 - Ciências
Grave:   2 - Ciências
Grave:   2 - Ciências
Grave:   2 - Ciências
Grave:   2 - Ciências
Grave:   2 - Ciências
Grave:   2 - Ciências
Grave:   2 - Ciências
Grave:   2 - Ciências
Grave:   2 - Ciências
Grave:   2 - Ciências
Grave:   2 - Ciências
Grave:   2 - Ciências
Grave:   2 - Ciências
Grave:   2 - Ciências
Grave:   2 - Ciências
Grave:   2 - Ciências
Grave:   2 - Ciências
Grave:   2 - Ciências
Grave:   2 - Ciências
Grave:   2 - Ciências
Grave:   2 - Ciências
Grave:   2 - Ciências
Grave:   2 - Ciências
Grave:   2 - Ciências
Grave:   2 - Ciências
Grave:   2 - Ciências
Grave:   2 - Ciências

Não sei oke está acontecendo…

R

Imprime o this.codigo, também.

R

Imprimiu somente o código dessa etapa que estou…

Grave:   2 - Ciências - CodEtapa - 103
Grave:   2 - Ciências - CodEtapa - 103
Grave:   2 - Ciências - CodEtapa - 103
Grave:   2 - Ciências - CodEtapa - 103
Grave:   2 - Ciências - CodEtapa - 103
Grave:   2 - Ciências - CodEtapa - 103
Grave:   2 - Ciências - CodEtapa - 103
Grave:   2 - Ciências - CodEtapa - 103
Grave:   2 - Ciências - CodEtapa - 103
Grave:   2 - Ciências - CodEtapa - 103
Grave:   2 - Ciências - CodEtapa - 103
Grave:   2 - Ciências - CodEtapa - 103
Grave:   2 - Ciências - CodEtapa - 103
Grave:   2 - Ciências - CodEtapa - 103
Grave:   2 - Ciências - CodEtapa - 103
Grave:   2 - Ciências - CodEtapa - 103
Grave:   2 - Ciências - CodEtapa - 103
Grave:   2 - Ciências - CodEtapa - 103
Grave:   2 - Ciências - CodEtapa - 103
Grave:   2 - Ciências - CodEtapa - 103
Grave:   2 - Ciências - CodEtapa - 103
Grave:   2 - Ciências - CodEtapa - 103
Grave:   2 - Ciências - CodEtapa - 103
Grave:   2 - Ciências - CodEtapa - 103
Grave:   2 - Ciências - CodEtapa - 103
Grave:   2 - Ciências - CodEtapa - 103
Grave:   2 - Ciências - CodEtapa - 103
Grave:   2 - Ciências - CodEtapa - 103
Grave:   2 - Ciências - CodEtapa - 103
Grave:   2 - Ciências - CodEtapa - 103
Grave:   2 - Ciências - CodEtapa - 103
Grave:   2 - Ciências - CodEtapa - 103

Alguma ideia com relação ao laço de repetição ou algo do tipo??

R

E aí, conseguiu finalizar a ordenação?

R

Boa tarde cara. Infelizmente não, não tive mais ideia do que pode estar ocorrendo…

R

Tipo, ou ele tá pegando o último elemento da ordem ou o primeiro. Não sei oke fazer a respeito…Poderia dar uma ajuda aí…Vlw

R

Olha, ainda acho que a ordenação deveria funcionar preenchendo a propriedade “Order by exp.”. Mas para isso funcionar, seu parâmetro gradeCollection deveria ser uma lista de entidades, e percebi que no relatório consta como String… Acho que esse é o motivo porque ele não reconhece quando você escolhe o campo descrição para ordenar.

R

Boa tarde cara, tdo certo ?? Bem, voltei a mexer na ordenação. Poderia dar uma ajuda aí??

public String getOrdenaDisciplinas() {
        Integer retorno = 0;
        for (Grade g : gradeCollection) {
            if (g.getEtapa().getCodigo().toString().equalsIgnoreCase(this.codigo.toString())) {
                retorno = g.getOrdem();
                System.err.println(g.getOrdem() + " - " + g.getDisciplina().getDescricao() + " - CodEtapa - " + this.codigo);
                break;
            }
            System.err.println(g.getOrdem() + g.getDisciplina().getDescricao() + " - CodEtapa - " + this.codigo);
        }
        ordenaDisciplinas = retorno.toString();
        return ordenaDisciplinas;
    }

Devo trocar algo aí do método?? Em anexo, relatorio…Devo trocar o que exatamente dentro do relatório?? Se puder ajudar Roselito, agradeceria mto…Vlw

R

E aí, parente?

Preciso ver um livro que tenho sobre o iReports, mas não estou com ele no momento. Acho que à noite consigo ver como foi feito oalgo parecido nele e retorno…

R

Roselito Fávero da Silva:
E aí, parente?

Preciso ver um livro que tenho sobre o iReports, mas não estou com ele no momento. Acho que à noite consigo ver como foi feito oalgo parecido nele e retorno…


Blz cara, se puder dar uma juda nisso daí gicaria mtoo, mas mto agradecido msm!!! E se conseguirmos resolver, fico mais feliz ainda…Enquanto isso, vou vendo aki… Vlw…

Criado 18 de novembro de 2013
Ultima resposta 27 de nov. de 2013
Respostas 74
Participantes 2