Percorrer Collection no Ireport

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

Isso ordena do jeito que você queria?

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…

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

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…

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?

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

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

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

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…

Assim não funciona?

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

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

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

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

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


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

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 é…

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

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;

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

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?

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