我有一个BIRT报告,其中包含两个数据集和两个绑定到每个数据集的表。我只希望根据“替代”数据集的内容一次显示一个表。因此,如果datset2不为空,则将table1可见性设置为隐藏,反之亦然。
可以/我如何编写脚本?
非常感谢提前
答案 0 :(得分:1)
您可以在beforeFactory脚本中调用BIRT数据引擎API来检查第二个表的数据集,看它是否有值以及它是否从报告中删除了第一个表。
//check if table 2 has data. If it does drop table 1
importPackage( Packages.org.eclipse.birt.report.model.api );
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.data.engine.api.querydefn);
importPackage(Packages.org.eclipse.birt.data.engine.core);
var myconfig = reportContext.getReportRunnable().getReportEngine().getConfig();
var de = DataEngine.newDataEngine( myconfig, null );
var dsrc = reportContext.getDesignHandle().findDataSource("Data Source");
var dset = reportContext.getDesignHandle().findDataSet("Data Set2");
var odaDataSource = new OdaDataSourceDesign( "Test Data Source" );
odaDataSource.setExtensionID( "org.eclipse.birt.report.data.oda.jdbc" );
odaDataSource.addPublicProperty( "odaURL", dsrc.getProperty("odaURL").toString() );
odaDataSource.addPublicProperty( "odaDriverClass", dsrc.getProperty("odaDriverClass").toString());
odaDataSource.addPublicProperty( "odaUser", dsrc.getProperty("odaUser").toString() );
odaDataSource.addPublicProperty( "odaPassword", "" );
var odaDataSet = new OdaDataSetDesign( "Test Data Set" );
odaDataSet.setDataSource( odaDataSource.getName( ) );
odaDataSet.setExtensionID( "org.eclipse.birt.report.data.oda.jdbc.JdbcSelectDataSet" );
odaDataSet.setQueryText( dset.getQueryText() );
de.defineDataSource( odaDataSource );
de.defineDataSet( odaDataSet );
queryDefinition = new QueryDefinition( );
queryDefinition.setDataSetName( odaDataSet.getName() );
queryDefinition.setAutoBinding(true);
var pq = de.prepare( queryDefinition );
var qr = pq.execute( null );
rowcount=0;
var ri = qr.getResultIterator( );
while ( ri.next( ) )
{
rowcount++
}
ri.close( );
qr.close( );
de.shutdown( );
if( rowcount > 0 ){
reportContext.getDesignHandle().findElement("Table1").drop();
}
请注意,在此示例中,表1必须命名为Table1。这可以在表的常规属性中完成。完整示例可在此处http://www.birt-exchange.org/org/devshare/designing-birt-reports/1542-data-engine-api-to-check-data-set-values/
答案 1 :(得分:1)
对不起,为时已晚,这可能对其他人有所帮助
您应该使用数据集中的列值(计数列,主列...)进行测试,然后在表Visibility properties
中,检查Hide Element
和For all outputs
,按fx
编写此代码:
if (row["yourTestColumn"] == null){
true /* when you want to hide your table *
} else{
false
}
我希望这会有助于其他人
答案 2 :(得分:0)
保持一个标志。基于该标志加载您的数据集,以便您可以根据该标志同时在表中的数据选择您的表可见性。
答案 3 :(得分:0)
以下代码对我有用: (将其放在' beforeFactory '脚本中)
if (params["show"].value == 'N')
{
reportContext.getDesignHandle().findDataSet("MyDataSet").drop();
reportContext.getDesignHandle().findElement("MyChart").drop();
}