场景说明:
客户的数据是使用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)
在这个方法实现数据获取和处理,并按照固定的格式返回数据即可在报表中展现出来。
数据处理:
- 完成数据的拆分用split("#")
- 完成数据的过滤,根据参数值过滤相应的数据。
- 完成数据的拼装。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查询对象新建数据集
用数据集创建报表
关键的地方
- getGridData()方法实现的时候数据拆分、筛选和组装是否难点,这个要根据报表的要求做处理。
- Redis取值,由于redis有好多中数据类型,这里只提供了两种,一种是去List的,一种是去Set的。
3、返回数据的格式:数据条数#数据1#数据2#数据3#......
例如:2#data1#data2
4、数据的拼装。这是一个二维数组,显示的字段数量不一样,数组的格式也不一样,请参考【多列的演示例子】。