Dúvida em Crosstab no ireport

Pessoal, minha dúvida é a seguinte, não sei bem se o crosstab vai resolver meu problema, o que eu preciso na verdade é o seguinte:

Preciso exibir uma tabelinha com colunas dinâmicas, o número de linhas é igual a 2, ou seja é invariável.

As colunas variam entre 0 e 15 (incluindo o 0 e o 15).

Essa tabela, fica junto com um sub relatório que tenho.

Ela deve ficar configurada assim:

INDICE n n+1 n+2 … n+15 (onde n = 0)
VALOR 1 1 2 5 2 (esses valores variam seguindo uma fórmula que não vem ao caso agora, eles são calculados no Java e ficam armazenados em um atributo de uma classe)
VALOR 2 2 4 1 3 (esses valores variam seguindo uma fórmula que não vem ao caso agora, eles são calculados no Java e ficam armazenados em um atributo de uma classe)

Agora, isso tem que ser dinamico, não rola criar 16 colunas e ficar colocando expressão “imprimir quando” porque isso vai ficar uma solução extremamente PORCA.

Qual abordagem devo utilizar? Com crosstab, como eu faria? Lembrando que eu estou usando um datasource passado via parametro para o ireport, e não uma conexão direta com o banco de dados.

Não vejo porque ficaria uma “solução extremamente PORCA” criar 16 colunas, sendo que esse é um ótimo recurso do Jasper e pelo que você deixou a entender, a largura das colunas não precisa ser dinâmico (para ocupar a linha toda).

Normalmente eu crio uma classe que serve de interface para o relatório, isso facilita muito a manutenção e acredito, seja amelhor forma de se trabalhar com relatórios dinâmicos.

Agora imagine a situação, criar 16 rótulos, 16 métodos booleanos para verificar quando renderizar os rótulos e as colunas dinâmicas, 16 métodos “get” para retornar os valores, sem contar a lógica de verificar se a determinada coluna deve ou nao ser renderizada (logica implementada nos métodos booleanos).

Agora me diga se isso não fica “porco”? Isso não é dinamico. Se amanha eu precisar aumentar o tamanho das colunas, digo, para 32, 64, 50, terei que criar mais métodos, mais campos no relatório, e a manutenção vai por água a baixo!

Entendeu? Relatórios normalmente não são recursos que o cliente vai utilizar sempre no mesmo layout, temos vários casos na empresa onde o cliente solicita melhorias, adicionais, então trabalhamos de forma mais dinamica possível.

Essa agora é a minha duvida, como resolver esta tabela? Crosstabs ou subReport com preenchimento horizontal (essa solução até é viável… mas teria que ficar acertando o alinhamento dos rotulos com as informações do subReport, e também pode gerar problema futuro caso necessite aumentar o número de colunas.)

E ai, alguma dica? Como faço isso usando crosstab? Eu nunca usei crosstab antes. Todos tutoriais que vi eram relatórios simples com conexão direta com banco de dados.

Ae resolvido! Conseguir criar o crosstab com data source.

SOLUÇÃO UTILIZADA:
Criei uma classe para preenchimento do crosstab

public class CrossTabInfo{
   private String headers; //nomes das colunas
   private String rows; // nomes das colunas
   private Integer info; //informação a ser populada, no meu caso necessitava de informação do tipo inteiro.
    //getters e setters
}

Eu tinha uma classe que era minha interface para o relatório, nesta classe adicionei um atributo do tipo: List contagem = new ArrayList();

Para fins de teste populei da seguinte maneira a coleção:

for(int i=0; i<12; i++){
   contagem.add(new CrossTabInfo(i+"", "Linha0", i %2 == 0 ? 1 : 2)); 
   contagem.add(new CrossTabInfo(i+"", "Linha1", i %2 == 0 ? 2 : 1));
}

Meus headers foram: i+"", que gerou uma sequencia de 0 a 12.
Eu precisava de duas linhas, então eu passava dois valores, um para cada linha. Como segue no código.

Enfim, deu certo.

Aaaahhh, achei que você tinha 1 classe que apenas calculava os números e precisava chamar ela uma vez em cada linha de retorno da query, desculpe pelo mau entendido :slight_smile:

Legal seu exemplo, também não conhecia crosstab