1.6 API数据源的实现步骤
概述
API数据源即自定义数据源,是UniEAP Report产品中数据源的的扩展方式之一。用户通过实现约定的接口,自己写代码来获取或生成数据,理论上可以让任意来源的数据为报表所用。例如,编写查询数据库的代码,返回相应的数据,就可以替代SQL数据源、存储过程数据源。
实现步骤
1.实现com.neusoft.report.engine.dataset.executer.api. APIDataEntity接口,该接口又继承com.neusoft.report.engine.dataset.datasource. DataEntity接口。要实现的方法列表如下。
// 查询满足条件的数据
public void query(Map params, Map context);
// 如果数据实体中还有更多数据,则返回true,否则返回false。
public boolean hasNext();
// 返回数据实现中的下一个数据项
public Object[] next();
// 返回数据实体中数据项的个数
public int size();
// 返回数据实体的名称
public String getName();
// 返回对于数据实体的描述信息
public String getComments();
// 返回数据实体中所有域(字段)的名字集合
public String[] getFieldNames();
// 根据域名返回数据实体中的某个域
public Field getField(String name);
// 返回数据实体中所有域的集合
public Field[] getFields();
// 返回数据实体中域的个数
public int fieldSize();
// 返回数据实体的分类信息,例如直接返回”api”
public String getCategory();
几点说明:
a) com.neusoft.report.engine.dataset.datasource.Field,类似于关系型数据库中列的概念,是对列信息的描述,包含字段名称、字段类型和字段描述。本身是一个接口,其实现类的定义如下:
public class FieldImpl implements Serializable, Field {
private static final long serialVersionUID = 1308755359669685961L;
/** 字段名称 */
private String name;
/** 字段类型 */
private byte type;
/** 字段Comments */
private String comments;
public FieldImpl(String name, byte type, String comments ){
this.name = name;
this.type = type;
this.comments = comments;
}
public String getName() {
return this.name;
}
public byte getType() {
return this.type;
}
public String getComments(){
return this.comments;
}
}
type字段的取值可以使用com.neusoft.report.commonbase.datavalue.DataValue中的常量,以下为几种常用类型:
public static final byte STRING = 1;
public static final byte BOOLEAN = 2;
public static final byte INTEGER = 3;
public static final byte DECIMAL = 4;
public static final byte DATETIME = 5;
b) next()方法的返回值Object数组。相当于关系型数据库表中的一行,数组中的每个值分别对应一个字段(Field)。c) query()方法,它的params参数包含了各报表参数、系统变量的值,context参数包含了一些上下文信息,如报表id、用户id、本次访问报表的HTTP请求等。
在query()方法中获取报表参数的值,可以有两种方法。
(1) 通过params参数获取:
// 获取整型参数type的值
int type = DataValueUtil.intValue(((DataValue) params.get("type")));
// 获取字符串参数id的值
String id = DataValueUtil.stringValue(((DataValue) params.get("id")));
(2) 通过context获取HTTP请求对象,再取参数值。除报表参数外,这种方法也可用于获取其他的请求参数:
// 获取HTTP请求对象
HttpServletRequest req = (HttpServletRequest) context.get("HTTP_REQUEST");
// 获取整型参数type的值
int type = Integer.valueOf(req.getParameter("type"));
2.在\WEB-INF\conf\unieap\report\datasource.xml文件中添加API数据源的配置,例如:
<Category Name="api" Caption="自定义数据源"
SourceClass="com.neusoft.unieap.dataset.datasource.impl.APIDataSource"
QuerierClass="com.neusoft.unieap.dataset.executer.api.APIDataSetExecuter">
<DataSource Name="sample API" Caption="API 样例库">
<DataEntity Name="APIDataSetSample" Caption="products">
<Parameters>
<Param Name="classname" Value='com.neusoft.unieap.dataset.executer.api.APIDataSetSample />
</Parameters>
</DataEntity>
</DataSource>
</Category>
其中APIDataSetSample是自定义数据源的实现类,DataEntity的Caption属性可以取任意有一定意义的值。
创建API数据集
(1)在数据集管理菜单上,点击“+”按钮,选择Api数据集,如下图所示:
(2)选择配置好的数据源并添加标题名称,如下图所示:
(3)点击下方确定即成功创建数据集,如下图所示: