Simple Union Dataset

micajblock
edited February 11, 2022 in Analytics #1
This example uses the Classic Models database as it's source. The design is build in BIRT 4.2, but it should work in 3.7 also (Probably earlier versions as well). The trick is to execute the 2 datasets needed fro the union in code.<br />
<br />
This is open event:<br />
importPackage(Packages.java.lang);
importPackage(Packages.java.util);
importPackage(Packages.org.eclipse.birt.data.engine.api);
importPackage(Packages.org.eclipse.birt.report.model.api);
importPackage(Packages.org.eclipse.birt.report.model.api.elements);
importPackage(Packages.org.eclipse.birt.data.engine.api.querydefn);
importPackage(Packages.org.eclipse.birt.data.engine.core);


var myconfig = reportContext.getReportRunnable().getReportEngine().getConfig();
de = DataEngine.newDataEngine( myconfig, null );


var dsrc = reportContext.getDesignHandle().findDataSource("Classic Models Data Source");
var dset1 = reportContext.getDesignHandle().findDataSet("Productline1 Data Set");
var dset2 = reportContext.getDesignHandle().findDataSet("Productline2 Data Set");


var CMDataSource = new OdaDataSourceDesign( "CM Data Source" );


CMDataSource.setExtensionID( "org.eclipse.birt.report.data.oda.jdbc" );
CMDataSource.addPublicProperty( "odaDriverClass", dsrc.getProperty("odaDriverClass").toString() );
CMDataSource.addPublicProperty( "odaURL", dsrc.getProperty("odaURL").toString() );
CMDataSource.addPublicProperty( "odaUser", dsrc.getProperty("odaUser").toString() );


var productLine1DataSet = new OdaDataSetDesign( "P1 Data Set" );
productLine1DataSet.setDataSource( CMDataSource.getName( ) );
productLine1DataSet.setExtensionID( "org.eclipse.birt.report.data.oda.jdbc.JdbcSelectDataSet" );
productLine1DataSet.setQueryText( dset1.getQueryText() );


var productLine2DataSet = new OdaDataSetDesign( "P2 Data Set" );
productLine2DataSet.setDataSource( CMDataSource.getName( ) );
productLine2DataSet.setExtensionID( "org.eclipse.birt.report.data.oda.jdbc.JdbcSelectDataSet" );
productLine2DataSet.setQueryText( dset2.getQueryText() ); 


de.defineDataSource( CMDataSource );
de.defineDataSet( productLine1DataSet );
de.defineDataSet( productLine2DataSet );


queryDefinition1 = new QueryDefinition( );
queryDefinition1.setDataSetName( productLine1DataSet.getName() );
queryDefinition1.setAutoBinding(true);


queryDefinition2 = new QueryDefinition( );
queryDefinition2.setDataSetName( productLine2DataSet.getName() );
queryDefinition2.setAutoBinding(true);


var pq1 = de.prepare( queryDefinition1 );
qr1 = pq1.execute( null );


recordsIterator1 = qr1.getResultIterator( );


var pq2 = de.prepare( queryDefinition2 );
qr2 = pq2.execute( null );


recordsIterator2 = qr2.getResultIterator( );
<br />
This is the fetch event<br />
if (recordsIterator1.next()) {
row&#91;"Productline"] = recordsIterator1.getValue("PRODUCTLINE");
return true;
}
if (recordsIterator2.next()) {
row&#91;"Productline"] = recordsIterator2.getValue("PRODUCTLINE");
return true;
}
else {return false}
<br />
Lastly this is the close event:<br />
recordsIterator1.close( );
qr1.close( );
recordsIterator2.close( );
qr2.close( );
de.shutdown( );