Динамическое добавление отчетов в качестве вложенных отчетов в основной отчет в BIRT - PullRequest
2 голосов
/ 23 марта 2011

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

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

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

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

Ответы [ 2 ]

5 голосов
/ 28 марта 2011

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

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();
    }
}

}

1 голос
/ 23 марта 2011

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

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

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

Удачи!

...