场景说明:

   客户的数据是使用redis数据库存储的,需要使用smartbi做数据分析,但是目前的smartbi是不支持redis数据取数的。

解决方案:

  

Redis部署及启动

参考资料

http://www.runoob.com/redis/redis-java.html

解压redis-64.3.0.503.zip



修改redis.windows.conf文件,设置登录密码

将redis.windows.conf文件的第386行改为如下:


密码设置为 manager

打开redis服务

进入到redis的安装目录


执行:redis-server.exe redis.windows.conf
启动成功后如下:

测试是否修改密码成功

步骤1:
重新使用 cmd命令打开windows命令窗口

步骤2:
进入到redis的安装目录并执行命令登录resis
执行的命令:redis-cli.exe -h 127.0.0.1 -p 6379 -a manager
登录成功如下图:


登录成功后,请不要关闭这两个命令窗口,否则redis服务被关闭后,会连接不上。

扩展包配置文件修改

实例扩展包下载:jiujiangyinhang.ext



用好压打开扩展包,然后找到对应的文件config.properties,然后修改覆盖回去即可:

Javascript数据源配置

登录smartbi系统并找到数据源的Session

创建java查询


实现JavaScript脚本的四个方法

字段与参数配置init()


若要配置多个参数或者字段,在数组中添加对应格式的json对象即可。

数据处理getGridData(paramValues, from, count)

在这个方法实现数据获取和处理,并按照固定的格式返回数据即可在报表中展现出来。
数据处理:

  1. 完成数据的拆分用split("#")
  2. 完成数据的过滤,根据参数值过滤相应的数据。
  3. 完成数据的拼装。return [[{value:data1}],[{value:data2}]]


这部分写起来比较复杂,各个要根据要制作的报表来修改里面数据处理逻辑,而且组装的数据根据字段的数量不同,组装的格式也不相同。

获取总行数getRowCount()

可以不管。

关闭查询对象close()

如:关闭数据库连接,文件流等,一般没有的话,不管它。

单列的演示的例子

importPackage(Packages.java.sql);
importPackage(Packages.smartbi.jjyh.module); 
/**
服务器先调用init初始化,获取参数与输出字段
返回参数与输出字段的声明对象
*/
function init() {
	return {
		//参数列表
		params: [{
			id: 'ParamId', //参数ID
			name: 'ParamName', //参数名称
			alias: 'ParamAlias', //参数别名
			desc: 'ParamDesc', //参数描述
			nullable: true, //参数是否允许是空
			valueType: 'STRING' //参数数据类型:INTEGER | DOUBLE | LONG | STRING | DATETIME
			}],
		//输出字段
		fields: [{
			id: 'FieldId', //字段ID
			name: 'FieldName', //字段名称
			alias: 'FieldAlias', //字段别名
			desc: 'FieldDesc', //字段描述
			valueType: 'STRING' //字段数据类型:INTEGER | DOUBLE | LONG | STRING | DATETIME
			}]
	};
} 
/**
获取数据,以二维数组返回。每个元素包含value属性
也可以返回smartbi.freequery.querydata.GridData对象
@param paramValues 参数值
@param from 开始行
@param count 返回的行数
@result 返回数据
*/
function getGridData(paramValues, from, count) {
	//通过 paramValues.get("参数ID") 获取参数值对象(包含value与displayValue属性)
	var val = paramValues.get("ParamId"); 
	//下面根据参数值取数
	//根据key取出它的值,并且key的value是一个集合
	var key = "categories"; //每个字段对应一个key
	var data = RedisService.getSet(key); 
	var dataAry = [];
	dataAry = data.split("#");
	var dataLen = dataAry.length; 
	var ret = [];
	for (var i = 1; i < dataLen; i++) {
		var tmp = [];
		var json = {
		value: dataAry[i]
		};
		if (val && val.value == dataAry[i]) {
			tmp.push(json);
			ret.push(tmp);
			}
	}
	if(ret.length == 0){
		ret = [[{}]];
	}
	return ret;
} 
/**
获取总行数,只在usePaging=true时会被调用,若无法获取总行数则不要定义这个方法
*/
/*
function getRowCount() {
	return 10000;
}
*/ 
/**
关闭查询对象
*/
function close() { 
}


多列的演示例子

importPackage(Packages.java.sql);
importPackage(Packages.smartbi.jjyh.module); 
/**
服务器先调用init初始化,获取参数与输出字段
返回参数与输出字段的声明对象
*/
function init() {
	return {
		//参数列表
		params: [{
			id: 'ParamId', //参数ID
			name: 'ParamName', //参数名称
			alias: 'ParamAlias', //参数别名
			desc: 'ParamDesc', //参数描述
			nullable: true, //参数是否允许是空
			valueType: 'STRING' //参数数据类型:INTEGER | DOUBLE | LONG | STRING | DATETIME
			}],
		//输出字段
		fields: [{
				id: 'FieldId', //字段ID
				name: 'FieldName', //字段名称
				alias: 'FieldAlias', //字段别名
				desc: 'FieldDesc', //字段描述
				valueType: 'STRING' //字段数据类型:INTEGER | DOUBLE | LONG | STRING | DATETIME
			}, {
				id: 'FieldId1', //字段ID
				name: 'FieldName1', //字段名称
				alias: 'FieldAlias1', //字段别名
				desc: 'FieldDesc1', //字段描述
				valueType: 'STRING' //字段数据类型:INTEGER | DOUBLE | LONG | STRING | DATETIME
			}]
	};
} 
/**
获取数据,以二维数组返回。每个元素包含value属性
也可以返回smartbi.freequery.querydata.GridData对象
@param paramValues 参数值
@param from 开始行
@param count 返回的行数
@result 返回数据
*/
function getGridData(paramValues, from, count) {
	//通过 paramValues.get("参数ID") 获取参数值对象(包含value与displayValue属性)
	var val = paramValues.get("ParamId"); 
	//下面根据参数值取数
	//根据key取出它的值,并且key的value是一个集合
	var key = "categories"; //每个字段对应一个key
	var key1 = "categories"; //每个字段对应一个key 
	var data = RedisService.getSet(key);
	var data1 = RedisService.getSet(key1);
	var dataAry = [];
	var dataAry1 = [];
	dataAry = data.split("#");
	dataAry1 = data1.split("#");
	var dataLen = dataAry.length;
	var dataLen1 = dataAry1.length;
	var len = 0;
	if(dataLen > dataLen1){//取长度最短的作为数据的条数,否则越界
		len = dataLen1; 
	}else{
		len = dataLen; 
	}
	var ret = []; 
	for (var i = 1; i < len; i++) {
	var tmp = [];
	var json = {
		value: dataAry[i]
	};
	var json1 = {
		value: dataAry1[i]
		};
	if(val && val.value == dataAry[i]){//数据筛选
		tmp.push(json);
		tmp.push(json1);
		ret.push(tmp);
		} 
	} 
	if(ret.length < 1) {
		return [
		[{}, {}]
		]
	}
	return ret;
} 
/**
获取总行数,只在usePaging=true时会被调用,若无法获取总行数则不要定义这个方法
*/
/*
function getRowCount() {
	return 10000;
}
*/ 
/**
关闭查询对象
*/
function close() { 
}

 

取数方法介绍

取redis中List

RedisService.getList(key)

取redis中Set集合

RedisService.getSet(key)


这里data返回的数据格式:数据条数#数据1#数据2#数据3#......
例如:2#data1#data2

使用新建的java查询对象新建数据集


用数据集创建报表



关键的地方

  1. getGridData()方法实现的时候数据拆分、筛选和组装是否难点,这个要根据报表的要求做处理。
  2. Redis取值,由于redis有好多中数据类型,这里只提供了两种,一种是去List的,一种是去Set的。

3、返回数据的格式:数据条数#数据1#数据2#数据3#......
例如:2#data1#data2
4、数据的拼装。这是一个二维数组,显示的字段数量不一样,数组的格式也不一样,请参考【多列的演示例子】。