Pentaho Reporting中如何查询外部DataFactory
How to query external DataFactory in Pentaho Reporting
我需要使用 java 在 Pentaho Reporting 中实现以下报告:
Student 1
- Calification 1
- Calification 2
Student 2
- Calification 1
- Calification 2
...
报表接收代码中的所有信息。它无权访问数据库。我正在使用子报表实现它。 (这个是简化的例子,我student里面还有其他字段,所以不能用分组)
我尝试了以下方法:
为 DataFactory 创建两个 Table 模型。
TypedTableModel model = new TypedTableModel();
model.addColumn("studentId", String.class);
model.addColumn("calification", String.class);
model.addRow("1", "10");
model.addRow("1", "10");
model.addRow("2", "5");
TypedTableModel model2 = new TypedTableModel();
model2.addColumn("studentId", String.class);
model2.addColumn("studentName", String.class);
model2.addRow("1", "Name 1");
model2.addRow("2", "Name 2");
TableDataFactory dataFactory = new TableDataFactory();
dataFactory.addTable("master-query", model2);
dataFactory.addTable("subreport-query", model);
然后,在主报告中,我设置 query.name = master-query
在子报表中,我设置 query.name = subreport-query
我得到的是:
Name 1
10
10
5
Name 2
10
10
5
在子报表中,我设法从主报表导入参数 "studentId"。我需要按 studentId 过滤 califications,以便仅显示每个学生的 califications。
我需要这个:
Name 1
10
10
Name 2
5
我怎样才能做到这一点?
我可以在 "subreport-query" 上执行查询吗?怎么样?
网络上的所有示例都使用 ${studentId} 查询 JDBC 连接,但我需要查询外部 DataFactory。
谢谢!
我用不同的方法解决了这个问题。
Java 数据工厂代码:
TypedTableModel cal1= new TypedTableModel();
cal1.addColumn("calification", String.class);
cal1.addRow("10");
cal1.addRow("10");
TypedTableModel cal2= new TypedTableModel();
cal2.addColumn("calification", String.class);
cal2.addRow("5");
TypedTableModel model = new TypedTableModel();
model.addColumn("studentId", String.class);
model.addColumn("studentName", String.class);
model.addColumn("califications", TypedTableModel.class);
model.addRow("1", "Name 1", cal1);
model.addRow("2", "Name 2", cal2);
TableDataFactory dataFactory = new TableDataFactory();
dataFactory.addTable("master-query", model);
Pentaho 子报表:
1) 导入名为 "califications" 的父参数。 (参数-导入参数)
2) 使用以下代码 (beanshell) 添加了一个可编写脚本的数据集:
return dataRow.get("califications");
3) 右键单击脚本查询 -> Select 查询
现在可以从子报表访问校准 TypedTableModel。
我需要使用 java 在 Pentaho Reporting 中实现以下报告:
Student 1
- Calification 1
- Calification 2
Student 2
- Calification 1
- Calification 2
...
报表接收代码中的所有信息。它无权访问数据库。我正在使用子报表实现它。 (这个是简化的例子,我student里面还有其他字段,所以不能用分组)
我尝试了以下方法:
为 DataFactory 创建两个 Table 模型。
TypedTableModel model = new TypedTableModel();
model.addColumn("studentId", String.class);
model.addColumn("calification", String.class);
model.addRow("1", "10");
model.addRow("1", "10");
model.addRow("2", "5");
TypedTableModel model2 = new TypedTableModel();
model2.addColumn("studentId", String.class);
model2.addColumn("studentName", String.class);
model2.addRow("1", "Name 1");
model2.addRow("2", "Name 2");
TableDataFactory dataFactory = new TableDataFactory();
dataFactory.addTable("master-query", model2);
dataFactory.addTable("subreport-query", model);
然后,在主报告中,我设置 query.name = master-query 在子报表中,我设置 query.name = subreport-query
我得到的是:
Name 1
10
10
5
Name 2
10
10
5
在子报表中,我设法从主报表导入参数 "studentId"。我需要按 studentId 过滤 califications,以便仅显示每个学生的 califications。 我需要这个:
Name 1
10
10
Name 2
5
我怎样才能做到这一点? 我可以在 "subreport-query" 上执行查询吗?怎么样?
网络上的所有示例都使用 ${studentId} 查询 JDBC 连接,但我需要查询外部 DataFactory。
谢谢!
我用不同的方法解决了这个问题。
Java 数据工厂代码:
TypedTableModel cal1= new TypedTableModel();
cal1.addColumn("calification", String.class);
cal1.addRow("10");
cal1.addRow("10");
TypedTableModel cal2= new TypedTableModel();
cal2.addColumn("calification", String.class);
cal2.addRow("5");
TypedTableModel model = new TypedTableModel();
model.addColumn("studentId", String.class);
model.addColumn("studentName", String.class);
model.addColumn("califications", TypedTableModel.class);
model.addRow("1", "Name 1", cal1);
model.addRow("2", "Name 2", cal2);
TableDataFactory dataFactory = new TableDataFactory();
dataFactory.addTable("master-query", model);
Pentaho 子报表:
1) 导入名为 "califications" 的父参数。 (参数-导入参数)
2) 使用以下代码 (beanshell) 添加了一个可编写脚本的数据集:
return dataRow.get("califications");
3) 右键单击脚本查询 -> Select 查询
现在可以从子报表访问校准 TypedTableModel。