Динамически добавлять отчеты в виде вложенных отчетов в главный отчет в BIRT

Я разрабатываю приложение для создания отчетов, в котором пользователь может выбирать (и заказывать) отчеты из списка из 100 отчетов и запрашивать общий отчет. Этот главный отчет должен содержать все выбранные отчеты в точном порядке, с оглавлением, в котором перечислены (под) отчеты, включенные в главный отчет, и правильный номер страницы.

Как мне добиться этого - BIRT? Я использовал Pentaho до этого и смог сделать то же самое, добавив каждый выбранный пользователем отчет в качестве подотчета во время выполнения (то есть программно) в главный отчет, который на самом деле был отчетом-заполнителем.

Теперь я знаю, что BIRT имеет понятие подотчета, но я не могу понять, что BIRT DE API выполняет то, что ранее было сделано с Pentaho для создания основного отчета. Итак, как мне это сделать?

Из Как объединить несколько отчетов BIRT кажется, что это было невозможно с BIRT в 2008 году. Так ли это до сих пор? Могу ли я взять независимые отчеты и добавить их в качестве вложенных отчетов в другой отчет?


person Vineeth    schedule 23.03.2011    source источник


Ответы (2)


После некоторых проблем я понял, как этого добиться. По сути, мы должны программно извлекать все элементы отчета, наборы данных и т. Д. В каждом отчете и вставлять их в новый главный отчет. После каждого повторного открытия дочернего объекта я проверяю, вставлен ли разрыв страницы, чтобы следующий отчет появлялся на следующей странице. Примерный код для этого: -

public class ReportGen {
private static ReportDesignHandle reportDesignHandle;
private static ElementFactory elementFactory;
private static ReportDesignHandle reportDesignHandle1;

public static void main(String[] args) {
    executeReport();
}

public static void executeReport() {

    IReportEngine engine = null;
    EngineConfig config = null;

    try {
        config = new EngineConfig();
        config.setBIRTHome("/home/vineeth/Softwares/birt-runtime-2_6_2/ReportEngine");
        config.setLogConfig("/home/vineeth/Softwares", Level.FINEST);
        Platform.startup(config);
        IReportEngineFactory factory = (IReportEngineFactory) Platform
                .createFactoryObject(IReportEngineFactory.EXTENSION_REPORT_ENGINE_FACTORY);
        engine = factory.createReportEngine(config);

        IReportRunnable design = null;
        //Open the report design
        design = engine.openReportDesign("/home/vineeth/cash_flow_summary.rptdesign");
        SessionHandle sessionHandle = DesignEngine.newSession(null);
        reportDesignHandle = sessionHandle.createDesign();
        elementFactory = reportDesignHandle.getElementFactory();
        reportDesignHandle1 = (ReportDesignHandle) design.getDesignHandle();
        DesignElementHandle cashflow = reportDesignHandle1.findElement("cashflow");
        DesignElementHandle designElementHandle = reportDesignHandle1.getBody().get(0);
        if (designElementHandle instanceof ExtendedItemHandle) {
            ExtendedItemHandle itemHandle = (ExtendedItemHandle) designElementHandle;
            ExtendedItem item = (ExtendedItem) itemHandle.getElement();

            ExtendedItem newItem1 = (ExtendedItem) item.doClone(CopyForPastePolicy.getInstance());
            newItem1.setName("cf1");
            newItem1.setProperty(DesignChoiceConstants.CHOICE_PAGE_BREAK_AFTER, DesignChoiceConstants.PAGE_BREAK_AFTER_ALWAYS);
            ExtendedItemHandle newItemHandle1 = new ExtendedItemHandle(reportDesignHandle.getModule(), newItem1);
            reportDesignHandle.getBody().add(newItemHandle1);

            ExtendedItem newItem2 = (ExtendedItem) item.doClone(CopyForPastePolicy.getInstance());
            newItem2.setName("cf2");
            newItem2.setProperty(DesignChoiceConstants.CHOICE_PAGE_BREAK_AFTER, DesignChoiceConstants.PAGE_BREAK_AFTER_ALWAYS);
            ExtendedItemHandle newItemHandle2 = new ExtendedItemHandle(reportDesignHandle.getModule(), newItem2);
            reportDesignHandle.getBody().add(newItemHandle2);

            ExtendedItem newItem3 = (ExtendedItem) item.doClone(CopyForPastePolicy.getInstance());
            newItem3.setName("cf3");
            newItem3.setProperty(DesignChoiceConstants.CHOICE_PAGE_BREAK_AFTER, DesignChoiceConstants.PAGE_BREAK_AFTER_ALWAYS);
            ExtendedItemHandle newItemHandle3 = new ExtendedItemHandle(reportDesignHandle.getModule(), newItem3);
            reportDesignHandle.getBody().add(newItemHandle3);

            DataSourceHandle dataSourceHandle = (DataSourceHandle) reportDesignHandle1.getDataSources().get(0);
            DataSource ds = (DataSource) dataSourceHandle.copy();
            DataSourceHandle newDSHandle = null;
            if (ds instanceof OdaDataSource) {
                newDSHandle = new OdaDataSourceHandle(reportDesignHandle.getModule(), ds);
            }
            reportDesignHandle.getDataSources().add(newDSHandle);


            DataSetHandle dataSetHandle = (DataSetHandle) reportDesignHandle1.getDataSets().get(0);
            OdaDataSet copyDataSetHandle = (OdaDataSet) dataSetHandle.copy();
            DataSetHandle copyDSHandle = new OdaDataSetHandle(reportDesignHandle.getModule(), copyDataSetHandle);
            reportDesignHandle.getDataSets().add(copyDSHandle);
        }
        //reportDesignHandle.getBody().add(reportDesignHandle1.getBody().get(0));
        //reportDesignHandle.getBody().add(reportDesignHandle1.getBody().get(0));
        IReportRunnable newDesign = engine.openReportDesign(reportDesignHandle);
        IRunAndRenderTask task = engine.createRunAndRenderTask(newDesign);
        HTMLRenderOption options = new HTMLRenderOption();
        options.setOutputFileName("/home/vineeth/Softwares/out.html");
        options.setOutputFormat("html");
        task.setRenderOption(options);
        task.run();
        task.close();
        engine.destroy();
    } catch (Exception ex) {
        ex.printStackTrace();
    } finally {
        Platform.shutdown();
    }
}

}

person Vineeth    schedule 28.03.2011

Вместо того, чтобы пытаться динамически объединять отчеты во время выполнения, может быть проще создать главный отчет со всеми 100 компонентами в нем. Затем заполните свойство закладки каждого компонента (или подотчета) значением. Наконец, установите для свойства видимости каждого компонента значение «false» по умолчанию.

Во время выполнения, когда пользователь выбирает вложенные отчеты, которые они хотят видеть, вы можете передать желаемые вложенные отчеты в качестве параметра, после чего вы можете переключить свойство видимости, чтобы отображались только нужные вложенные отчеты.

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

Удачи!

person MystikSpiral    schedule 23.03.2011
comment
Сначала я думал об этом подходе, но отказался от него по двум причинам: - 1) он не удовлетворяет важному требованию создания отчетов в том порядке, в котором он был выбран пользователем, и 2) отчеты будут создаваться чаще всего. но не так технически люди. Такой подход значительно усложняет этап разработки отчета, чего я не хочу. Я готов поднять эту сложность в коде. - person Vineeth; 23.03.2011
comment
Не могли бы вы привести здесь пример - как создать сводный отчет с компонентами в нем? Например, как объединить все отчеты в один главный отчет без разрыва страницы? Я нигде не могу найти многостраничный отчет в образцах birt ... Спасибо !! - person Anna; 02.05.2012