2009-03-21 6 views

Répondre

3

Vous n'avez besoin d'aucun code pour générer un sous-rapport dans un sous-rapport. Cela peut être fait avec des rapports qui n'ont pas de composants dynamiques (rien dans la bande de détails). Bien sûr, le rapport qui en résultera ne servira à rien d'intéressant.

Si vous souhaitez un rapport plus intéressant que celui-ci, vous devez fournir des données pour le rapport et/ou le sous-rapport. À ce stade, le code variera en fonction de l'origine de vos données. Si vous pouvez fournir plus d'informations sur ce que vous essayez de faire, nous pouvons peut-être vous aider davantage.

Si le sous-rapport a un contenu dynamique, vous devrez lui passer l'accès à un objet qui implémente JRDataSource. Par exemple, j'ai récemment créé un rapport d'une page contenant plusieurs «clauses». Pour simplifier ma vie, j'ai stocké les clauses dans une carte et j'ai dérivé l'objet JRDataSource en utilisant le code suivant. Les objets JRDataSource ont ensuite été transmis en tant que champ pour le rapport principal.

private static class ListMapDataSource implements JRRewindableDataSource { 

    private Map currentMap = null; 
    private int currentRow; 
    private int numberOfMoveFirsts = 0; 
    private List<Map<String, ? extends Object>> rowList; 

    ListMapDataSource(List<Map<String, ? extends Object>> rowList) { 
     this.rowList = rowList; 
     moveFirst(); 
    } 

    ListMapDataSource(Map<String, ? extends Object> singleRow) { 
     this.rowList = new ArrayList<Map<String, ? extends Object>>(1); 
     this.rowList.add(singleRow); 
     moveFirst(); 
    } 

    public boolean next() throws JRException { 
     if (currentRow >= rowList.size() - 1) { 
      return false; 
     } 

     currentRow++; 
     currentMap = rowList.get(currentRow); 

     return true; 
    } 

    public Object getFieldValue(JRField jrField) throws JRException { 
     String name = jrField.getName(); 
     Class valueClass = jrField.getValueClass(); 

     if (JasperReport.class.isAssignableFrom(valueClass)) { 
     } 

     return currentMap.get(name); 
    } 

    public void moveFirst() { 
     numberOfMoveFirsts++; 

     if (numberOfMoveFirsts > 10) { 
      System.out.println("Exceeded 10 moveFirst() calls. Aborting."); 
      System.exit(1); 
     } 

     currentRow = - 1; 
     currentMap = null; 
    } 
} 
Questions connexes