Ireport aba Detail

13 respostas
E

Estou fazendo um relatorio em cima do exemplo so site abaixo.

Porém na parte do JavaBean Datasource, tenho varias entidades relacionadas, por exemplo tenho o select abaixo:

SELECT CONT.CODADMINISTRADORA, CONT.CODEMP, C.CODGUIA,C.STATUS, C.CODBENEF, NOMEUSU, DATAEMI, C.DATAINI, TIPOGUIA,
CODPROC, QTDEXEC
FROM CADGUIA AS C,
ITENSGUIA AS I,
CADUSU AS U,
CADCONT AS CONT
WHERE
U.CODTIT=CONT.CODTIT
AND I.CODGUIA=C.CODGUIA
AND U.CODBENEF=C.CODBENEF
ORDER BY
CONT.CODADMINISTRADORA,
CONT.CODEMP,
CODBENEF,
CODGUIA

Para resolver o meu problema, criei uma view com base do select acima, por hora deu certo, porém é viável fazer isso ???

Alguem pode me dar uma opinião???

Obrigado

Evandro

13 Respostas

drsmachado

Mas está usando java beans como data source ou o select direto do iReport?

E

Estou usando java beans como data source, dá certo usar select direto no ireport ???

drsmachado

Não.
Se você está usando o java beans, você já mandará todos os dados preenchidos do java para o jasper, não usa-se o select no iReport.

E

entao é recomendável do jeito que eu fiz???

drsmachado

Não.
Olha só, quando você usa o JRBeanCollectionDataSource como fonte de dados, você sequer passa um Connection como argumento, logo, a query que você criou, caso esteja no jasper/jrxml se torna inútil.
O que você precisa ter é uma coleção (lista, set, collection) de objetos cujos atributos sejam representados pelos $F{} que estão no teu relatório. Por exemplo, se o relatório possui os campos $F{codigo}, $F{pessoa.nome}, $F{pessoa.idade}~, a coleção deverá conter beans com os atributos código e pessoa. Por sua vez, pessoa deve possuir nome e idade.
Entendeu?

E

Tentei somente usar o Report Query do ireport, e adicionei os fields no relatorio, no meu java fiz a rotina abaixo no método.

FacesContext context = FacesContext.getCurrentInstance();
        HttpServletResponse response = (HttpServletResponse) context.getExternalContext().getResponse();
        InputStream reportStream = context.getExternalContext()
                .getResourceAsStream("/relatorios/relatorioguiaatend.jasper");
       
        List<Object> objectList = servico.relatorioendrealizados("");
        Iterator iterator = objectList.iterator();
        Map record = null;
        List dados = new ArrayList();

        while (iterator.hasNext()) {
         Object[] obj = (Object[]) iterator.next();
         record = new HashMap();
         record.put("codadministradora", (Integer) obj[0]);
         record.put("codemp", (String) obj[1]);
         record.put("codguia", (Integer) obj[2]);
         dados.add(record);
         }
 JRBeanCollectionDataSource fonteDados = new JRBeanCollectionDataSource(dados);
        Map<String, Object> map = new HashMap<String, Object>();
        HttpSession sessao = (HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(false);

        File logoFile = new File(sessao.getServletContext().getRealPath(System.getProperty("file.separator") + "resources" + System.getProperty("file.separator") + "images" + System.getProperty("file.separator") + "logo_unimedfb1.jpg"));
        String caminho = logoFile.getAbsolutePath();
        InputStream inputStreamDaImagem = null;
        try {
            File file = new File(caminho);
            if (file.exists())//testa se imagem existe  
            {
                inputStreamDaImagem = new FileInputStream(file);
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
/////////////////// carrega o logo do relatorio   

        map.put("nroans", "ANS - n.º " + (String) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("codans"));
        map.put("caminhologo", caminho);
        map.put("empresa", (String) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("cidade"));

        ServicoUtils.startrelatorio(reportStream, response, map, fonteDados);

Porem, aparece varias paginas com o conteudo null, consegui resolver apenas usando o JavaBean Datasource.

Obrigado



drsmachado

Você está fazendo uma mistura e uma bagunça desnecessárias.
1 - Para criar um relatório, prefira usar o blank template
2 - Crie cada field isolado e manualmente
3 - Não use uma List de Map, crie um bean que contenha os atributos (ou um helper)
4 - No lugar de System.getProperty(“file.separator”), use File.separator

E

Poderia me passar um exemplo por favor do item

3 - Não use uma List de Map, crie um bean que contenha os atributos (ou um helper)

drsmachado

Não sabe o que é um bean? Aquele tipo de classe, também conhecida como POJO, que fica na camada model da tua aplicação. Um helper é um bean, mas que está na camada view…

public class Dados{
    private Integer codAdministradora;
    private String codEmp;
    private Integer codGuia;
    
    public Dados(){}

    //getters e setters
}

Só lembrando que se você colocar o nome do atributo em acordo com a especificação javaBeans (camelCase) como eu fiz no exemplo, os field do iReport devem seguir a mesma escrita.

E

Bean eu sei que é, mas vou ter fazer um select que vai me trazer uma LIST de dados da minha tabela e essa lista vou ter que mostrar no relatorio,

O que eu não estou entendendo como iria mostrar isso no relatorio sem usar um List de Map,

Desculpe minha ignorância.

drsmachado

É que você não deixou claro na tua dúvida.
O funcionamento é semelhante ao que você está tendo atualmente, a diferença é que você usa um java bean para substituir cada um dos maps que está usando atualmente.
Se cada atributo do java bean tiver o mesmo nome de um $F{} que consta no teu .jasper, tudo irá ocorrer de forma natural. Por exemplo, se você tem um atributo “nome” no bean, o relatório, obrigatoriamente, deve conter um $F{nome} para representar este dado.

E

drsmachado,

Isso que você me explicou acima, tinha entendido, porém o que ainda não esta claro ainda foi isso que vc escreveu.

O que não “caiu a ficha” ainda como mostrar os dados sem usar uma List de Map,

Obs. a rotina acima, foi criado em um Bean.

Desculpe.

drsmachado

Fez? Se não fez, faça. Aí você vai entender.

Criado 12 de setembro de 2013
Ultima resposta 13 de set. de 2013
Respostas 13
Participantes 2