Ireport gerando relátorio com chekbox
bom dia,
Estou com uma grande dúvida, antes de gerar o relatório, na pagina xhtml é mostrado uma previa do que será gerado, e nesta pagina tenho um checkbox, conforme código abaixo.
Preciso gerar um relatório que tambem seja mostrado os dados salvo no banco dos checkboxs escolhidos, tentei um subreport mas não estou conseguindo fazer.
CLASSE.
public class RPPoi implements Serializable{
...
private String[] competenciasespecificas;
...
}
CONTROLLER
public class RPPoiController {
...
private Map<String, Object> competenciascomunsItens;
public RPPoiController() {
competenciascomunsItens = new LinkedHashMap<String, Object>();
competenciascomunsItens.put("Orientação para clientes", "ORIENTACAOCLIENTES");
competenciascomunsItens.put("Orientação para mudanças", "ORIENTACAOMUDANCAS");
}
...
//uma pequena parte que gera o relatório.
@SuppressWarnings( { "unchecked" })
public void executarRelatorio(ActionEvent action) throws ParseException, Exception {
List dados = new ArrayList();
Map record = null;
record = new HashMap();
...
record.put("competenciascomuns", rppoi.getCompetenciascomuns());
// adiciona o List dados
dados.add(record);
JRBeanCollectionDataSource fonteDados1 = new JRBeanCollectionDataSource(dados);
...
}
PAGINA.XTHML
<t:selectManyCheckbox style=" width: 676px;" id="competenciascomuns" layoutWidth="3"
disabled="false"
layout="lineDirection"
value="#{rppoiController.rppoi.competenciascomuns}">
<f:selectItems value="#{rppoiController.competenciascomunsItens}"/>
</t:selectManyCheckbox>
Estou com uma grande dúvida, antes de gerar o relatório, na pagina xhtml é mostrado uma previa do que será gerado, e nesta pagina tenho um checkbox, conforme código abaixo.
Preciso gerar um relatório que tambem seja mostrado os dados salvo no banco dos checkboxs escolhidos, tentei um subreport mas não estou conseguindo fazer.
CLASSE.
public class RPPoi implements Serializable{
...
private String[] competenciasespecificas;
...
}
CONTROLLER
public class RPPoiController {
...
private Map<String, Object> competenciascomunsItens;
public RPPoiController() {
competenciascomunsItens = new LinkedHashMap<String, Object>();
competenciascomunsItens.put("Orientação para clientes", "ORIENTACAOCLIENTES");
competenciascomunsItens.put("Orientação para mudanças", "ORIENTACAOMUDANCAS");
}
...
//uma pequena parte que gera o relatório.
@SuppressWarnings( { "unchecked" })
public void executarRelatorio(ActionEvent action) throws ParseException, Exception {
List dados = new ArrayList();
Map record = null;
record = new HashMap();
...
record.put("competenciascomuns", rppoi.getCompetenciascomuns());
// adiciona o List dados
dados.add(record);
JRBeanCollectionDataSource fonteDados1 = new JRBeanCollectionDataSource(dados);
...
}
PAGINA.XTHML
<t:selectManyCheckbox style=" width: 676px;" id="competenciascomuns" layoutWidth="3"
disabled="false"
layout="lineDirection"
value="#{rppoiController.rppoi.competenciascomuns}">
<f:selectItems value="#{rppoiController.competenciascomunsItens}"/>
</t:selectManyCheckbox>
Roger Mendes
Curtidas 0
Respostas
Roger Mendes
28/08/2012
bom dia,
estou com uma grande dúvida, antes de gerar o relatório, na pagina xhtml é mostrado uma previa do que será gerado, e nesta pagina tenho um checkbox, conforme código abaixo.
preciso gerar um relatório que tambem seja mostrado os dados salvo no banco dos checkboxs escolhidos, tentei um subreport mas não estou conseguindo fazer.
classe.
public class rppoi implements serializable{
...
private string[] competenciasespecificas;
...
}
controller
public class rppoicontroller {
...
private map<string, object> competenciascomunsitens;
public rppoicontroller() {
competenciascomunsitens = new linkedhashmap<string, object>();
competenciascomunsitens.put("orientação para clientes", "orientacaoclientes");
competenciascomunsitens.put("orientação para mudanças", "orientacaomudancas");
}
...
//uma pequena parte que gera o relatório.
@suppresswarnings( { "unchecked" })
public void executarrelatorio(actionevent action) throws parseexception, exception {
list dados = new arraylist();
map record = null;
record = new hashmap();
...
record.put("competenciascomuns", rppoi.getcompetenciascomuns());
// adiciona o list dados
dados.add(record);
jrbeancollectiondatasource fontedados1 = new jrbeancollectiondatasource(dados);
...
}
pagina.xthml
<t:selectmanycheckbox style=" width: 676px;" id="competenciascomuns" layoutwidth="3"
disabled="false"
layout="linedirection"
value="#{rppoicontroller.rppoi.competenciascomuns}">
<f:selectitems value="#{rppoicontroller.competenciascomunsitens}"/>
</t:selectmanycheckbox>
estou com uma grande dúvida, antes de gerar o relatório, na pagina xhtml é mostrado uma previa do que será gerado, e nesta pagina tenho um checkbox, conforme código abaixo.
preciso gerar um relatório que tambem seja mostrado os dados salvo no banco dos checkboxs escolhidos, tentei um subreport mas não estou conseguindo fazer.
classe.
public class rppoi implements serializable{
...
private string[] competenciasespecificas;
...
}
controller
public class rppoicontroller {
...
private map<string, object> competenciascomunsitens;
public rppoicontroller() {
competenciascomunsitens = new linkedhashmap<string, object>();
competenciascomunsitens.put("orientação para clientes", "orientacaoclientes");
competenciascomunsitens.put("orientação para mudanças", "orientacaomudancas");
}
...
//uma pequena parte que gera o relatório.
@suppresswarnings( { "unchecked" })
public void executarrelatorio(actionevent action) throws parseexception, exception {
list dados = new arraylist();
map record = null;
record = new hashmap();
...
record.put("competenciascomuns", rppoi.getcompetenciascomuns());
// adiciona o list dados
dados.add(record);
jrbeancollectiondatasource fontedados1 = new jrbeancollectiondatasource(dados);
...
}
pagina.xthml
<t:selectmanycheckbox style=" width: 676px;" id="competenciascomuns" layoutwidth="3"
disabled="false"
layout="linedirection"
value="#{rppoicontroller.rppoi.competenciascomuns}">
<f:selectitems value="#{rppoicontroller.competenciascomunsitens}"/>
</t:selectmanycheckbox>
na classe o correto é competenciascomuns
GOSTEI 0
Davi Costa
28/08/2012
Esses checkboxs são parametros para geração do seu relatório?
att Davi
att Davi
GOSTEI 0
Roger Mendes
28/08/2012
Davi, não entendi sua pergunta... o formulário impresso precisa emitir o conteúdo salvo no banco. conforme código acima.
GOSTEI 0
Davi Costa
28/08/2012
Então, esses checkbox, não podem ser passados como parametros?
att Davi
att Davi
GOSTEI 0
Roger Mendes
28/08/2012
Esqueci de mencionar, estou utilizando o IREPORT, gerando relatório em pdf jasperreports, utilizando nenhuma consulta do banco no IREPORT, estou utilizando JRBeanCollectionDataSource fonteDados1 = new JRBeanCollectionDataSource(dados);.
GOSTEI 0
Davi Costa
28/08/2012
Mesmo sem executar select no ireport, vc pde passar parametrs sem problemas, e ainda mais esse parametros tem vários tipos inclusive listas do java =)
att Davi
att Davi
GOSTEI 0
Roger Mendes
28/08/2012
Davi, coloquei parametros de list ele retorna null. o código acima mostra como estou desenvolvendo.
GOSTEI 0
Davi Costa
28/08/2012
Não vi em nenhum momento nos seus fontes vc passar parametros para o jasper.
Aquele record que vc monta não é o recurso de passagem de parametros do jasper.
att Davi
Aquele record que vc monta não é o recurso de passagem de parametros do jasper.
att Davi
GOSTEI 0
Roger Mendes
28/08/2012
nos códigos acima eu resumi para mostrar a lógica que estou utilizando. segue abaixo o código completo, este exemplo é igual os exemplos que visualizei no portal devmedia.
// executa o relatório através de um JRBeanCollectionDataSource em pdf
public static void executarRelatorio1(String caminhoRelatorio, Map<String, Object> parametros, String nomeRel,
JRBeanCollectionDataSource fonteDados) throws ParseException, JRException {
FacesContext context = FacesContext.getCurrentInstance();
HttpServletResponse response = (HttpServletResponse) context.getExternalContext().getResponse();
// pega o caminho do arquivo .jasper da aplicação
InputStream reportStream = context.getExternalContext().getResourceAsStream(caminhoRelatorio);
response.setHeader("Content-Disposition", "attachment; filename=" + nomeRel + ".pdf");
// response.setContentType("application/download");
response.setContentType("application/pdf");
response.setHeader("Pragma", "no-cache");
try {
ServletOutputStream servletOutputStream = response.getOutputStream();
// envia parametros para o relatório
if (parametros == null) {
parametros = new HashMap<String, Object>();
}
// envia para o navegador o PDF gerado
JasperRunManager.runReportToPdfStream(reportStream, servletOutputStream, parametros, fonteDados);
servletOutputStream.flush();
servletOutputStream.close();
} catch (JRException e) {
e.printStackTrace();
//throw new Exception("Um erro ocorreu quando o relatório estava sendo executado.");
} catch (IOException e) {
e.printStackTrace();
//throw new JRException(ERRO_MENSAGEM_REPORT);
} finally {
context.responseComplete();
}
}
@SuppressWarnings( { "unchecked" })
public void executarRelatorio(ActionEvent action) throws ParseException, Exception {
List dados = new ArrayList();
Map record = null;
record = new HashMap();
// coloca em um Map cada um dos campos criados
// manualmente pelo relatorio
record.put("id",String.valueOf(rppoi.getId()));
record.put("competenciascomuns", rppoi.getCompetenciascomuns());
// adiciona o List dados
dados.add(record);
// cria uma fonte de dados para coleções
JRBeanCollectionDataSource fonteDados1 = new JRBeanCollectionDataSource(dados);
Map<String, Object> parametros1 = new HashMap<String, Object>();
executarRelatorio1("/relatorios/formularioRP.jasper", parametros1,"RP Nº:"+rppoi.getId(), fonteDados1);
}
GOSTEI 0
Davi Costa
28/08/2012
Vc não setou nada nos parametros só instanciou:
Map<String, Object> parametros1 = new HashMap<String, Object>();
Oque vc precisa fazer é criar no jasper o parametro que vc quer receber (vai ter a lisat de tipos que vc pode passar) e depois no java passar esse parametro para o jasper.
No layout do seu relatório vc pode usar esse parâmetro.
Pesquisa um ouco na internet como fazer isso, qualquer dúvida só postar.
att Davi
Map<String, Object> parametros1 = new HashMap<String, Object>();
Oque vc precisa fazer é criar no jasper o parametro que vc quer receber (vai ter a lisat de tipos que vc pode passar) e depois no java passar esse parametro para o jasper.
No layout do seu relatório vc pode usar esse parâmetro.
Pesquisa um ouco na internet como fazer isso, qualquer dúvida só postar.
att Davi
GOSTEI 0
Roger Mendes
28/08/2012
Davi, entendi como funciona agora o parâmetro conforme vc mencionou, porém este parametro1, é o titulo do projeto, quando eu enviei o código eu retirei pois estava comentando e para teste retirei, mas foi interessante vc ter me explicado, porém descobri o problema antes de chegar na etapa do emitir o relatório e veja que agora é dúvida de java, mas gostaria da sua ajuda.
já tentei de várias formas, mas minha array de string, private String[] competenciascomuns;, esta null, e o engraçado é que no formulário ele puxa do banco os checkbox, certinhO tudo que tinha salvo no banco e ainda fica marcado, conforme código baixo.
PAGINA.XHTML
tentei criando uma variável do tipo String[] teste;
e setei para ele enviar o dados quando clicar no botão gerar pdf, para ver quando dado ele setava ele continua null.
Map<String, Object> parametros1 = new HashMap<String, Object>();
parametros1.put("PARAMETRO_TITULO_RELATORIO","RELATÓRIO DE UNIDADES");
já tentei de várias formas, mas minha array de string, private String[] competenciascomuns;, esta null, e o engraçado é que no formulário ele puxa do banco os checkbox, certinhO tudo que tinha salvo no banco e ainda fica marcado, conforme código baixo.
PAGINA.XHTML
<t:selectManyCheckbox enabledOnUserRole="true" style=" width: 676px;" id="competenciascomuns" layoutWidth="3"
disabled="false"
layout="lineDirection"
value="#{rppoiController.rppoi.competenciascomuns}">
<f:selectItems value="#{rppoiController.competenciascomunsItens}"/>
</t:selectManyCheckbox>
@Controller("rppoiController")
@Scope("session")
public class RPPoiController {
.........
public RPPoiController() {
// mostrar erro por não inicializar
competenciascomunsItens = new LinkedHashMap<String, Object>();
competenciascomunsItens.put("Orientação para o negócio com foco em resultados", "ORIENTACAORESULTADOS");
competenciascomunsItens.put("Orientação para clientes", "ORIENTACAOCLIENTES");
competenciascomunsItens.put("Orientação para mudanças", "ORIENTACAOMUDANCAS");
}
......
}
tentei criando uma variável do tipo String[] teste;
e setei para ele enviar o dados quando clicar no botão gerar pdf, para ver quando dado ele setava ele continua null.
<h:commandButton value="Gerar Poi's" actionListener="#{rppoiController.executarRelatorio}">
<f:setPropertyActionListener target="#{rppoiController.teste}" value="#{rppoiController.rppoi.competenciascomuns}"/>
</h:commandButton>
GOSTEI 0
Davi Costa
28/08/2012
Onde está essa passagem da sua lista no java para o relatório?
att Davi
att Davi
GOSTEI 0
Roger Mendes
28/08/2012
Então, eu estava passando assim record.put("competenciascomuns", rppoi.getCompetenciascomuns()); e no ireport fazendo assim.. $F, ai como vc mencinou acima tenho que criar no parametro então criei assim,..
Mas não consigo testar pois conforme mencionei por ultimo, o array de string esta retornando null, para que eu possa converte-lo para lista e passar o parametros1 ao ireport.
Map<String, Object> parametros1 = new HashMap<String, Object>();
..
parametros1.put("competenciascomuns",rppoi.getCompetenciascomuns());
Mas não consigo testar pois conforme mencionei por ultimo, o array de string esta retornando null, para que eu possa converte-lo para lista e passar o parametros1 ao ireport.
GOSTEI 0
Davi Costa
28/08/2012
Como no seu managed bean vc passou rppoi para a chamada do relatório?
Pq ai já está null, queria realmente ver o ponto que se perde
att Davi
Pq ai já está null, queria realmente ver o ponto que se perde
att Davi
GOSTEI 0
Davi Costa
28/08/2012
Outra dica troca commandButton por comandLink
att Davi
att Davi
GOSTEI 0
Roger Mendes
28/08/2012
Davi,
Consegui resolver o problema do null, mas acho muito estranho ele vir null, pois os demais campos todos possui dados menos o vetor de string[], ai resolver fiz da seguinte forma. ele pesquisou novamente o que já tinha, no codigo eu passo como parametro o rppoi.getId(), ou seja ele possui dados, já carregado quando eu clico em gerar o formulário, deveria ter tambem dados no rppoi.getCompetenciascomuns(). Não é o correto mas funcionou.
GEROU O PDF COM A LISTA usando os parametros que vc me alertou, ok, resolvido, agora para concluir, como eu faço para colocar um chekbox, com quadradinho marcado no IREPORT, vc sabe informar ?.
Consegui resolver o problema do null, mas acho muito estranho ele vir null, pois os demais campos todos possui dados menos o vetor de string[], ai resolver fiz da seguinte forma. ele pesquisou novamente o que já tinha, no codigo eu passo como parametro o rppoi.getId(), ou seja ele possui dados, já carregado quando eu clico em gerar o formulário, deveria ter tambem dados no rppoi.getCompetenciascomuns(). Não é o correto mas funcionou.
// verifica a existência de uma RP e o retorna
private RPPoi verificaRP(Long codigo) {
String query = "SELECT rp FROM RPPoi rp WHERE rp.id=:codigo";
Map<String, Object> params = new HashMap<String, Object>();
params.put("codigo", codigo);
return rppoiDao.pesqParam(query, params);
}
String[] teste = verificaRP(rppoi.getId()).getCompetenciascomuns();
List lista = Arrays.asList(teste);
Map<String, Object> parametros1 = new HashMap<String, Object>();
parametros1.put("competenciascomuns",lista);
GEROU O PDF COM A LISTA usando os parametros que vc me alertou, ok, resolvido, agora para concluir, como eu faço para colocar um chekbox, com quadradinho marcado no IREPORT, vc sabe informar ?.
GOSTEI 0
Roger Mendes
28/08/2012
Para ficar mais original seria ideal ficar igual o formulario.xhtl, com os quadrinho do checkbox marcados e os não marcados. isso gerado no pdf.
GOSTEI 0
Davi Costa
28/08/2012
vai ter que brincar com imagens, se determinado condição for atendida coloca a imagem da caixinha marcada senão coloca desmarcada.
Seguinte, vc testou com ccomandLink, pesquisei aki nos meus exemplos e percebi que sempre iusei link pq estava c esse mesmo problema.
Outra questão, usa tomahawk, se usar pode usar essa tag:
<t:saveState value="#{seuBean.seuAtributo}"/>
que ai o seu objeto vai se manter durante todo ciclo de vida do jsf.
att Davi
Seguinte, vc testou com ccomandLink, pesquisei aki nos meus exemplos e percebi que sempre iusei link pq estava c esse mesmo problema.
Outra questão, usa tomahawk, se usar pode usar essa tag:
<t:saveState value="#{seuBean.seuAtributo}"/>
que ai o seu objeto vai se manter durante todo ciclo de vida do jsf.
att Davi
GOSTEI 0
Roger Mendes
28/08/2012
Davi, obrigado pelas dicas, foram importantes para conseguir prosseguir com meu projeto, vou sim tentar trabalhar com as imagens, vi um código parecido com isso, vou tentar implementar.
exemplo:
($F.equals(true) ? "X" : "")
exemplo:
($F.equals(true) ? "X" : "")
GOSTEI 0
Davi Costa
28/08/2012
Manda um feedback, assim que possível.
att Davi
att Davi
GOSTEI 0
Roger Mendes
28/08/2012
Davi onde eu mando o feedback ?. no aguardo.
GOSTEI 0
Davi Costa
28/08/2012
Aqui mesmo diz se deu certo.. ;)
att Davi
att Davi
GOSTEI 0
Roger Mendes
28/08/2012
Deu certo sim, o formulário em pdf está perfeito, foi aprovado a informar no pdf sem checkbox, apenas os dados da lista.
Obrigado a equipe do devmedia pelo apoio.
Obrigado a equipe do devmedia pelo apoio.
GOSTEI 0
Davi Costa
28/08/2012
Show cara!
O que precisar é só postar aqui.
att Davi
O que precisar é só postar aqui.
att Davi
GOSTEI 0