历史版本5 :程序数据集 返回文档
编辑时间: 内容长度:图片数:目录数: 修改原因:

目录:

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、示例编辑

3.1 定义数据源程序

下面以模板执行日志作为示例,演示如何通过程序数据集获取系统中的模板执行日志。

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; } }

编译生成ExecuteLog.class并将其拷贝到/webapps/webroot/WEB-INF/classes/com/fr/log下,此时该程序数据源便定义好了。

ExecuteLog.class与

注:上面WEB-INF后面的可存放地址在BI目录中是没有的,需要自行创建。  

3.2 配置程序数据

首先我们要将设计器远程连接到FineBI服务器上。此处详见设计器远程到BI服务器上

打开设计器,选择服务器>服务器数据集,如下图: