На самом деле вам вообще не нужен код для генерации вложенного отчета внутри вложенного отчета. Это можно сделать с помощью отчетов, которые не имеют динамических компонентов (ничего в полосе подробностей). Конечно, итоговый отчет не принесет много пользы для чего-либо интересного.
Если вам нужен более интересный отчет, чем этот, вам необходимо предоставить данные для отчета и / или подотчета. На этом этапе код будет зависеть от того, откуда поступают ваши данные. Если вы можете предоставить больше информации о том, что вы пытаетесь сделать, мы, возможно, сможем помочь вам.
Если подотчет содержит динамическое содержимое, вам необходимо передать ему доступ к объекту, который реализует JRDataSource.
Например, я недавно создал одностраничный отчет с несколькими «предложениями». Чтобы упростить свою жизнь, я сохранил предложения на карте и извлек объект JRDataSource с помощью следующего кода. Затем объекты JRDataSource были переданы в качестве поля для основного отчета.
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;
}
}