Подотчеты в подотчете (IReport-JasperReports) - PullRequest
0 голосов
/ 21 марта 2009

У меня есть требование, которое должно иметь вложенный отчет в подчиненном отчете. Есть ли пример кода, на который я могу сослаться?

Заранее спасибо.

1 Ответ

3 голосов
/ 26 марта 2009

На самом деле вам вообще не нужен код для генерации вложенного отчета внутри вложенного отчета. Это можно сделать с помощью отчетов, которые не имеют динамических компонентов (ничего в полосе подробностей). Конечно, итоговый отчет не принесет много пользы для чего-либо интересного.

Если вам нужен более интересный отчет, чем этот, вам необходимо предоставить данные для отчета и / или подотчета. На этом этапе код будет зависеть от того, откуда поступают ваши данные. Если вы можете предоставить больше информации о том, что вы пытаетесь сделать, мы, возможно, сможем помочь вам.

Если подотчет содержит динамическое содержимое, вам необходимо передать ему доступ к объекту, который реализует 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;
    }
}
...