BIRT-创建一个临时表

时间:2018-07-23 06:25:29

标签: postgresql birt

我正在基于动态表构建BIRT报告。我有一个函数需要返回一个具有不同类型的可变列数的表,因此我们决定该函数将创建一个临时表并仅返回其名称。 因此,在BIRT beforeFactory中,我正在运行调用此函数的查询,然后尝试从返回名称的表中读取数据,并根据列和类型的数量动态创建报告表。两个问题:
1.是否有更好的方法返回具有可变列数的表? (这不可能是我以后过滤的所有可能的列,因为那会超出允许的最大列数)?
2.如何让Birt看到我的临时表?这是我在beforeFactory中运行的代码。显然,调用第二个查询时该表不存在。

importPackage(Packages.java.lang);
importPackage(Packages.org.eclipse.birt.report.data.adapter);
importPackage(Packages.org.eclipse.birt.report.data.adapter.api);
importPackage(Packages.org.eclipse.birt.report.data.adapter.impl);
importPackage(Packages.org.eclipse.birt.report.model.api);
importPackage(Packages.org.eclipse.birt.data.engine.api.querydefn);

//Get Data Source
var dataSource = 
reportContext.getDesignHandle().getDesign().findDataSource("mydb");

//Create Data Set for data table name
var elementFactory = 
reportContext.getReportRunnable().designHandle.getElementFactory();
var dataSet = elementFactory.newOdaDataSet("tableName", 
"org.eclipse.birt.report.data.oda.jdbc.JdbcSelectDataSet");
dataSet.setDataSource(dataSource.getName());
dataSet.setQueryText("select table_name from my_export_function('str1', 
'str2');");

reportContext.getDesignHandle().getDataSets( ).add(dataSet);

//Create Data Session
var myconfig = 
reportContext.getReportRunnable().getReportEngine().getConfig();
var des = DataRequestSession.newSession(myconfig, new DataSessionContext(3));
var dset = reportContext.getDesignHandle().findDataSet("tableName");

des.defineDataSource(des.getModelAdaptor()
.adaptDataSource(reportContext.getDesig nHandle()
.findDataSource("mydb")));

des.defineDataSet(des.getModelAdaptor()
.adaptDataSet(reportContext.getDesignHandle()
.findDataSet("tableName")));

//Query Definition
queryDefinition = new QueryDefinition();
queryDefinition.setDataSetName(dataSet.getName());
queryDefinition.setAutoBinding(true);

var pq = des.prepare(queryDefinition);
var qr = pq.execute(null);
var ri = qr.getResultIterator(); 
var tableName = "";
while (ri.next()) { 
 tableName = ri.getString("table_name");
}

var dataSet2 = elementFactory.newOdaDataSet("reportData", 
"org.eclipse.birt.report.data.oda.jdbc.JdbcSelectDataSet");
dataSet2.setDataSource(dataSource.getName());
dataSet2.setQueryText("select * from " + tableName + ";");
System.out.println("TTTT: " + dataSet2.getQueryText());
reportContext.getDesignHandle().getDataSets( ).add(dataSet2);


//Query Definition
queryDefinition2 = new QueryDefinition();
queryDefinition2.setDataSetName(dataSet2.getName());
queryDefinition2.setAutoBinding(true);

var pq2 = des.prepare(queryDefinition2);
var qr2 = pq2.execute(null);
var ri2 = qr2.getResultIterator( ); 
var cc = ri2.getResultMetaData().getColumnCount();
System.out.println("col_01_name: " + 
  ri2.getResultMetaData().getColumnLabel(1));
System.out.println("Count: " + cc);

while (ri2.next()) { 
    System.out.println("Table:  "+ ri2);
    System.out.println("col_01: "+ ri2.getValue("col_01"));
}

ri.close();
qr.close();
ri2.close();
qr2.close();
des.close();

1 个答案:

答案 0 :(得分:0)

我设法使代码正常工作。以下几行解决了第二个查询的问题:

var pq2 = des2.prepare(queryDefinition2);

然后:

if not exists

我们还更改了返回查询的功能,而不是创建临时表。