Percorrer Collection no Ireport

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

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

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

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.

É 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?

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.

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

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:

[quote=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[/quote]
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

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.

[quote=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.[/quote]
Cara, vou olhar aki…Tentar fazer a classe e qualqer coisa posto aí…Daki a poco já coloco o resultado…Vlw aí…

[quote=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[/quote]
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…

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?

[quote=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?[/quote]
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

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.

[quote=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.[/quote]

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??

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.

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

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…


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