程序数据集

编辑
  • 文档创建者:doreen0813
  • 浏览次数:5756次
  • 编辑次数:18次
  • 最近更新:doreen0813 于 2019-07-17
  • 1、描述

    上一节BI通过设计器远连接程服务器,以服务器数据集的形式来连接数据。这样其数据来源可以是数据库数据,还可以是其它任何类型的数据,因为BI是通过AbstractTableData抽象类来读取数据源的,而上述所有的数据来源都继承实现其抽象方法,因此BI可以用自定义类型的数据源了(程序数据集),BI引擎就能够读取定义的数据源作为报表数据源使用。下文讲述程序数据集的建立方法。

    注:2019.6.14之后的5.1版本对程序数据集的更新做了优化,从全量数据抽取到内存的方式改为了流式抽取,支持亿级数据量的抽取。

    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 = -3233073054624031382 L;
    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)和平台管理日志(OperateLog.class)的编译文件可在此直接下载使用。

    注:上面WEB-INF后面的可存放地址在BI目录中是没有的,需要自行创建。且该文件需要同时拷贝至FineReport对应目录,否则添加的程序数据集在设计器中无法展开显示字段信息。

    3.2 配置程序数据

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

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


    进入服务器数据集设置界面,选择+>程序数据集,如下图:


    点击选择之前放入目录的ExecuteLog.class,如下图:


    点击确定保存。则在服务器数据集下能看到我们刚刚添加的程序。(此处若想添加多个,可重复上述步骤选择OperateLog.class文件添加。)

    登录FineBI数据决策系统,选择数据准备,进入业务包选择添加表>数据库表,如下图:


    在服务器数据集下,可以看到我们刚刚在设计器中添加的程序数据集3,如下图:


    点击确定添加到业务包中即可使用。



    附件列表


    主题: 数据准备
    标签: 暂无标签
    如果您认为本文档还有待完善,请编辑

    文档内容仅供参考,如果你需要获取更多帮助,付费/准付费客户请咨询帆软技术支持
    关于技术问题,您还可以前往帆软社区,点击顶部搜索框旁边的提问按钮
    若您还有其他非技术类问题,可以联系帆软传说哥(qq:1745114201

    此页面有帮助吗?只是浏览 [ 去社区提问 ]