1. java
  2. android
  3. c#
  4. .net
  5. javascript
  6. php
  7. jquery
  8. html
  9. sql

Lista de datas "virtual" no iReport

Olá.

Estou com um desafio aqui. Preciso fazer um relatório no iReport. Estou usando a versão 5. Uma parte do relatório precisa mostrar uma lista de datas, sempre do dia 15 de um certo mês até o dia 14 do mês imediatamente posterior. Essa lista de datas precisa identificar os sábados e domingos. O banco que alimenta o iReport é o Postgres.

Pelo pgAdmin consegui desenvolver o seguinte script que me devolve o que desejo e o iReport manipula:

SELECT
CAST(EXTRACT(DAY FROM data) AS Integer) AS "Dias",
(CASE
WHEN EXTRACT(DOW FROM data) = 6 THEN 'Sábado'
WHEN EXTRACT(DOW FROM data) = 0 THEN 'Domingo'
ELSE ''
END) AS "DiaSemana"
FROM (SELECT generate_series(0,30) + date '2014-02-15' AS data) AS mensal
WHERE data BETWEEN '2014-02-15' AND '2014-03-14'

Jogando isso no iReport fica assim:

SELECT
CAST(EXTRACT(DAY FROM data) AS Integer) AS "Dias",
(CASE
WHEN EXTRACT(DOW FROM data) = 6 THEN 'Sábado'
WHEN EXTRACT(DOW FROM data) = 0 THEN 'Domingo'
ELSE ''
END) AS "DiaSemana"
FROM (SELECT generate_series(0,30) + date $P!{strDataInicial} AS data) AS mensal
WHERE data BETWEEN $P{dataInicial} AND $P{dataFinal}

A minha questão é quanto ao parâmetro passado $P!{strDataInicial}. O relatório somente funcionou setando este parâmetro para string e com o "!" na frente. Gostaria de reduzir a quantidade de parâmetros necessárias passando somente dataInicial e dataFinal. Mas ao usar a dataInicial no lugar de strDataInicial, ocorre erro.

Alguém teria alguma sugestão melhor? Ou o iReport faz algo similar sem a necessidade de uma consulta no banco? ps. Precisarei de várias páginas com essa lista que estou pensando em inserir via subreport.

Obrigado.

@Planc Obrigado pela sugestão, porém essa foi minha primeira abordagem. Ao executar o relatório no iReport retorna o erro:

Error filling print... Error executing SQL statement for : FolhaFrequencia_ListaDias 
net.sf.jasperreports.engine.JRException: Error executing SQL statement for : FolhaFrequencia_ListaDias      at net.sf.jasperreports.engine.query.JRJdbcQueryExecuter.createDatasource(JRJdbcQueryExecuter.java:240)      at net.sf.jasperreports.engine.fill.JRFillDataset.createQueryDatasource(JRFillDataset.java:1086)      at net.sf.jasperreports.engine.fill.JRFillDataset.initDatasource(JRFillDataset.java:667)      at net.sf.jasperreports.engine.fill.JRBaseFiller.setParameters(JRBaseFiller.java:1258)      at net.sf.jasperreports.engine.fill.JRBaseFiller.fill(JRBaseFiller.java:877)      at net.sf.jasperreports.engine.fill.JRBaseFiller.fill(JRBaseFiller.java:822)      at net.sf.jasperreports.engine.fill.JRFiller.fill(JRFiller.java:61)      at net.sf.jasperreports.engine.JasperFillManager.fill(JasperFillManager.java:446)      at net.sf.jasperreports.engine.JasperFillManager.fill(JasperFillManager.java:276)      at net.sf.jasperreports.engine.JasperFillManager.fillReport(JasperFillManager.java:745)      at com.jaspersoft.ireport.designer.compiler.IReportCompiler.run(IReportCompiler.java:891)      at org.openide.util.RequestProcessor$Task.run(RequestProcessor.java:572)      at org.openide.util.RequestProcessor$Processor.run(RequestProcessor.java:997)  Caused by: org.postgresql.util.PSQLException: ERROR: syntax error at or near "$1"      at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:1592)      at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1327)      at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:192)      at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:451)      at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:350)      at org.postgresql.jdbc2.AbstractJdbc2Statement.executeQuery(AbstractJdbc2Statement.java:254)      at net.sf.jasperreports.engine.query.JRJdbcQueryExecuter.createDatasource(JRJdbcQueryExecuter.java:233)      ... 12 more  
Print not filled. Try to use an EmptyDataSource...

Somente consegui fazer a query funcionar passando uma string formatada no local junto à função generate_series. Pelo que consegui entender o iReport troca os parâmetros por variáveis ao executar a query, algo como $1, $2 ... O uso do ! na parte problemática evita que o iReport faça isso, e use o valor passado diretamente.

O relatório está funcionando passando a string mesmo, somente queria entender agora o por que de não aceitar uma data.

  1. Você vai ver essas setas em qualquer página de pergunta. Com elas, você pode dizer se uma pergunta ou uma resposta foram relevantes ou não.
  2. Edite sua pergunta ou resposta caso queira alterar ou adicionar detalhes.
  3. Caso haja alguma dúvida sobre a pergunta, adicione um comentário. O espaço de respostas deve ser utilizado apenas para responder a pergunta.
  4. Se o autor da pergunta marcar uma resposta como solucionada, esta marca aparecerá.
  5. Clique aqui para mais detalhes sobre o funcionamento do GUJ!

1 resposta

Não é a resposta que estava procurando? Procure outras perguntas com as tags ireport sql ou faça a sua própria pergunta.