How to set a datasource for a BIRT report programmatically?

后端 未结 5 983
借酒劲吻你
借酒劲吻你 2021-02-04 08:46

I have a BIRT report which connects to our test database. In the productive environment I would like to supply a datasource which is provided by the container through jndi.

5条回答
  •  一生所求
    2021-02-04 09:22

    Look at following code you may get some help in providing data source at runtime.

    For my requirements it works fine.

    I got this from some site do not remember.

    import java.io.IOException;
    import java.util.ArrayList; 
    
    import org.eclipse.birt.core.framework.Platform;
    import org.eclipse.birt.report.model.api.CellHandle;
    import org.eclipse.birt.report.model.api.DataItemHandle;
    import org.eclipse.birt.report.model.api.DesignConfig; 
    import org.eclipse.birt.report.model.api.ElementFactory;
    import org.eclipse.birt.report.model.api.IDesignEngine;
    import org.eclipse.birt.report.model.api.IDesignEngineFactory;
    import org.eclipse.birt.report.model.api.LabelHandle;
    import org.eclipse.birt.report.model.api.OdaDataSetHandle;
    import org.eclipse.birt.report.model.api.OdaDataSourceHandle;
    import org.eclipse.birt.report.model.api.PropertyHandle;
    import org.eclipse.birt.report.model.api.ReportDesignHandle;
    import org.eclipse.birt.report.model.api.RowHandle;
    import org.eclipse.birt.report.model.api.SessionHandle;
    import org.eclipse.birt.report.model.api.StructureFactory;
    import org.eclipse.birt.report.model.api.TableHandle;
    import org.eclipse.birt.report.model.api.activity.SemanticException;
    import org.eclipse.birt.report.model.api.elements.structures.ComputedColumn;
    
    import com.ibm.icu.util.ULocale;
    
    /**
     * Dynamic Table BIRT Design Engine API (DEAPI) demo.
     */
    
    public class DECreateDynamicTable
    {
        ReportDesignHandle designHandle = null;
        ElementFactory designFactory = null;
        StructureFactory structFactory = null;  
    
        public static void main( String[] args )
        {
            try
            {
                DECreateDynamicTable de = new DECreateDynamicTable();
                ArrayList al = new ArrayList();
                al.add("USERNAME");
                al.add("COUNTRY");
                de.buildReport(al, "From GTM_REPORT_APP_USER" );
            }
            catch ( IOException e )
            {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            catch ( SemanticException e )
            {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    
        void buildDataSource( ) throws SemanticException
        {
    
            OdaDataSourceHandle dsHandle = designFactory.newOdaDataSource(
                    "Data Source", "org.eclipse.birt.report.data.oda.jdbc" );
            dsHandle.setProperty( "odaDriverClass",
                    "oracle.jdbc.driver.OracleDriver" );
            dsHandle.setProperty( "odaURL", "jdbc:oracle:thin:@xeon:1521:ora9i" );
            dsHandle.setProperty( "odaUser", "AIMS_GTMNE" );
            dsHandle.setProperty( "odaPassword", "AIMS_GTMNE" );
    
            designHandle.getDataSources( ).add( dsHandle );
    
        }
    
        void buildDataSet(ArrayList cols, String fromClause ) throws SemanticException
        {
    
            OdaDataSetHandle dsHandle = designFactory.newOdaDataSet( "ds",
                    "org.eclipse.birt.report.data.oda.jdbc.JdbcSelectDataSet" );
            dsHandle.setDataSource( "Data Source" );
            String qry = "Select ";
            for( int i=0; i < cols.size(); i++){
                qry += " " + cols.get(i);
                if( i != (cols.size() -1) ){
                    qry += ",";
                }
    
            }
            qry += " " + fromClause;
    
            dsHandle.setQueryText( qry );
    
            designHandle.getDataSets( ).add( dsHandle );
    
    
    
        }
        void buildReport(ArrayList cols, String fromClause ) throws IOException, SemanticException
        {
    
    
            //Configure the Engine and start the Platform
            DesignConfig config = new DesignConfig( );
    
            config.setProperty("BIRT_HOME", "D:/Softwares/Frame Works - APIs-Tools/birt-runtime-2_6_1/birt-runtime-2_6_1/ReportEngine");
    
            IDesignEngine engine = null;
            try{
    
    
                Platform.startup( config );
                IDesignEngineFactory factory = (IDesignEngineFactory) Platform.createFactoryObject( IDesignEngineFactory.EXTENSION_DESIGN_ENGINE_FACTORY );
                engine = factory.createDesignEngine( config );
    
            }catch( Exception ex){
                ex.printStackTrace();
            }       
    
    
            SessionHandle session = engine.newSessionHandle( ULocale.ENGLISH ) ;
    
    
    
            try{
                //open a design or a template
    
                designHandle = session.openDesign("D:/tempBirtReport/test.rptdesign");
    
                designFactory = designHandle.getElementFactory( );
    
                buildDataSource();
                buildDataSet(cols, fromClause);
    
                TableHandle table = designFactory.newTableItem( "table", cols.size() );
                table.setWidth( "100%" );
                table.setDataSet( designHandle.findDataSet( "ds" ) );
    
    
                PropertyHandle computedSet = table.getColumnBindings( ); 
                ComputedColumn  cs1 = null;
    
                for( int i=0; i < cols.size(); i++){
                    cs1 = StructureFactory.createComputedColumn();
                    cs1.setName((String)cols.get(i));
                    cs1.setExpression("dataSetRow[\"" + (String)cols.get(i) + "\"]");
                    computedSet.addItem(cs1);
                }
    
    
                // table header
                RowHandle tableheader = (RowHandle) table.getHeader( ).get( 0 );
    
    
                for( int i=0; i < cols.size(); i++){
                    LabelHandle label1 = designFactory.newLabel( (String)cols.get(i) ); 
                    label1.setText((String)cols.get(i));
                    CellHandle cell = (CellHandle) tableheader.getCells( ).get( i );
                    cell.getContent( ).add( label1 );
                }                           
    
                // table detail
                RowHandle tabledetail = (RowHandle) table.getDetail( ).get( 0 );
                for( int i=0; i < cols.size(); i++){
                    CellHandle cell = (CellHandle) tabledetail.getCells( ).get( i );
                    DataItemHandle data = designFactory.newDataItem( "data_"+(String)cols.get(i) );
                    data.setResultSetColumn( (String)cols.get(i));
                    cell.getContent( ).add( data );
                }
    
                designHandle.getBody( ).add( table );
    
                // Save the design and close it. 
    
                designHandle.saveAs( "D:/tempBirtReport/test.rptdesign" ); //$NON-NLS-1$
                designHandle.close( );
                System.out.println("Finished");
            }catch (Exception e){
                e.printStackTrace();
            }       
    
        }
     }
    

提交回复
热议问题