页面树结构
转至元数据结尾
转至元数据起始

正在查看旧版本。 查看 当前版本.

与当前比较 查看页面历史

« 前一个 版本 3 下一个 »

场景说明:

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

解决方案:

  

Redis部署及启动

解压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、数据的拼装。这是一个二维数组,显示的字段数量不一样,数组的格式也不一样,请参考【多列的演示例子】。

  • 无标签