Ireport gerando relátorio com chekbox

Java

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>
Roger Mendes

Roger Mendes

Curtidas 0

Respostas

Roger Mendes

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>


na classe o correto é competenciascomuns
GOSTEI 0
Davi Costa

Davi Costa

28/08/2012

Esses checkboxs são parametros para geração do seu relatório?

att Davi
GOSTEI 0
Roger Mendes

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

Davi Costa

28/08/2012

Então, esses checkbox, não podem ser passados como parametros?

att Davi
GOSTEI 0
Roger Mendes

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

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
GOSTEI 0
Roger Mendes

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

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
GOSTEI 0
Roger Mendes

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

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
GOSTEI 0
Roger Mendes

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.

    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

Davi Costa

28/08/2012

Onde está essa passagem da sua lista no java para o relatório?

att Davi
GOSTEI 0
Roger Mendes

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

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

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
GOSTEI 0
Davi Costa

Davi Costa

28/08/2012

Outra dica troca commandButton por comandLink

att Davi
GOSTEI 0
Roger Mendes

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.

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

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

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
GOSTEI 0
Roger Mendes

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" : "")
GOSTEI 0
Davi Costa

Davi Costa

28/08/2012

Manda um feedback, assim que possível.

att Davi
GOSTEI 0
Roger Mendes

Roger Mendes

28/08/2012

Davi onde eu mando o feedback ?. no aguardo.
GOSTEI 0
Davi Costa

Davi Costa

28/08/2012

Aqui mesmo diz se deu certo.. ;)

att Davi
GOSTEI 0
Roger Mendes

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.
GOSTEI 0
Davi Costa

Davi Costa

28/08/2012

Show cara!
O que precisar é só postar aqui.

att Davi
GOSTEI 0
POSTAR