历史版本3 :程序数据集 返回文档
编辑时间:
内容长度:图片数:目录数:
修改原因:
1、描述编辑
由上一节BI通过设计器远连接程服务器,以服务器数据集的形式来连接数据。这样其数据来源可以是数据库数据,还可以是其它任何类型的数据,因为BI是通过AbstractTableData抽象类来读取数据源的,而上述所有的数据来源都继承实现其抽象方法,因此BI可以用自定义类型的数据源了(程序数据集),BI引擎就能够读取定义的数据源作为报表数据源使用。下文讲述程序数据集的建立方法。
2、实现原理编辑
AbstractTableData抽象类主要有5个方法,如下:
//获取AbstractTableData的总列数
public int getColumnCount();
//获取AbstractTableData中第columnIndex列的列名
public String getColumnName(int columnIndex);
//判断是否存在第rowIndex行,这主要是用于处理超大数据时,完全遍历所有数据获取总行数相当困难,用这个方法来判断第rowIndex行是否存在,存在则可读取
public boolean hasRow(int rowIndex);
//获取AbstractTableData的总行数
public int getRowCount();
//获取AbstractTableData中第columnIndex列,第rowIndex行的数据
public Object getValueAt(int rowIndex, int columnIndex);
在某些应用场景中,需要在程序中对数据进行处理后再作为报表的数据源使用。
3、示例编辑
下面以模板执行日志作为示例,演示如何获取系统中的模板执行日志和平台管理日志。
package com.fr.log;
import com.fr.data.AbstractTableData;
import com.fr.decision.log.ExecuteMessage;
import com.fr.general.data.TableDataException;
import com.fr.intelli.record.MetricRegistry;
import com.fr.stable.query.QueryFactory;
import java.util.ArrayList;
import java.util.List;
/**
* Created by Zed on 2018/6/2.
*/
public class ExecuteLog extends AbstractTableData {
private static final long serialVersionUID = -3233073054624031382L;
private String[] columnNames = {
"tname",
"type",
"userrole",
"param",
"ip",
"username",
"consume",
"sql",
"browser",
"memory",
"time",
"reportId"};
private List<List<Object>> data = new ArrayList<List<Object>>();
public ExecuteLog() {
try {
List<ExecuteMessage> messages = MetricRegistry.getMetric().find(ExecuteMessage.class, QueryFactory.create()).getList();
if (messages != null && !messages.isEmpty()) {
for (ExecuteMessage message : messages) {
List<Object> objects = new ArrayList<Object>();
objects.add(message.getTemplate());
objects.add(message.getType());
objects.add(message.getUserrole());
objects.add(message.getParameters());
objects.add(message.getIp());
objects.add(message.getUsername());
objects.add(message.getConsume());
objects.add(message.getSql());
objects.add(message.getBrowser());
objects.add(message.getMemory());
objects.add(message.getTime());
objects.add(message.getReportId());
data.add(objects);
}
}
} catch (Exception e) {
FineLoggerFactory.getLogger().error(e.getMessage(), e);
}
}
@Override
public int getColumnCount() throws TableDataException {
return columnNames.length;
}
@Override
public String getColumnName(int i) throws TableDataException {
return columnNames[i];
}
@Override
public int getRowCount() throws TableDataException {
return data.size();
}
@Override
public Object getValueAt(int i, int i1) {
if (i < data.size()) {
List<Object> message = data.get(i);
if (i1 < message.size()) {
return message.get(i1);
}
}
return null;
}
}