刷新
功能用途说明
“实时数据刷新”特殊效果,轻松实现在报表中局部刷新某块内容的动态效果。
配置项说明
名称
增强控件标识。与其他增强控件不同,允许多个单元插入刷新效果时使用相同的名称标识。这是因为,一个页面中可能存在若干个不连续区域需要实时刷新,但是这些不连续的区域又是从同一个数据来源获取数据,这种情况应将这多个区域同步刷新。请参考下文【示例1】。
此项为必填项。
行列数
行数、列数用于标记此刷新效果控制的区域,刷新区域的根坐标为当前单元格。例如,B4单元格设置刷新效果,行数为2,列数为3,此处定义为扩展前的行列数量,报表运算时会随着扩展复制行列。则[[B4,C4,D4],[B5,C5,D5]]几个单元格为一个刷新区域。请参考下文【示例1】
- 行数:刷新区域的行,默认为-1,表示从当前单元格之后的所有行。
- 列数:刷新区域的列,默认为-1,表示从当前单元格之后的所有列。
此项为必填项。
刷新频率
自动更新时间间隔,单位为毫秒。默认为0,不自动更新,仅在没加载完成时执行一次更新。
此项为必填项。
数据来源
刷新时,根据数据来源获取数据。
通过一个JSON字符串来描述数据来源信息。刷新时,通过这里配置的数据来源来获取数据。
首先,定义数据来源的类型。类型可选的值有:当前报表、其他报表、SQL查询、公有数据集、自定义。
然后,需要根据类型的不同设定附加其他配置:
-
类型为“当前报表”时,无需附加其他配置
-
类型为“其他报表”时,需要附加“报表”或者“报表文件路径”配置,二者选择其一即可。
-
类型为“SQL查询”时,需要附加“数据源名称(默认值为系统数据源,详细请参考【数据源管理】)”和“SQL语句”配置。除此,可以附加“字段”配置,对SQL语句执行的结果集进行二次选择。例如,“SQL语句”为“select * from demo_orders”,而实际上刷新时需要的是结果集中的“订单ID”、“订购日期”两列,则应配置为:;类型:"SQL查询", SQL语句:"select * from demo_orders", 字段:["订单ID", "订购日期"]。通常,我们建议直接通过SQL语句来选择需要的数据,而不是用这种二次选择的方式,除非是多区域共用数据来源的情况。
-
类型为公有数据集时,需要附加“数据源名称”和“数据集名称(这里必须是公有数据集名称,详细请参考【数据集管理】)”配置。与“SQL查询”类型相同,可以使用“字段”对数据集进行二次过滤。
-
类型为“自定义”时,需要附加“自定义类”配置。请参考下文【示例2】。
最后,添加“参数”配置。参数:用于为数据来源设置参数,不论是那种类型数据来源,都支持设置参数。例如:类型为“其他报表”时,可以附加“参数”:{area:"华北"},给报表传递参数,等效于访问报表时的URL参数。
参数值的取值有以下三种方式:
-
固定值,例如,100。
-
参数关联,语法为@paramName。例如,@param_test,请参考 参数。
-
单元格关联,语法为#cellName。例如,#A1,则自动关联A1单元格的值,会自动处理单元格的扩展关系。
示例1:
1)一个报表中多个刷新效果使用相同的名称
2)刷新行数和列数定义的区域
示例2:
数据来源设置为自定义类
{type:"custom", class:"com.test.RandomRefreshDataGenerator"}
实现自定义类(实现com.geezn.view.effects.IRefreshDataGenerator接口)
public class RandomRefreshDataGenerator implements IRefreshDataGenerator { public JSONObject generate(Map<String, Object> params) throws GeeznException {
JSONObject refreshDataObject=new JSONObject();
JSONObject cells = (JSONObject) params.get("cells");
String[] cellIDs = JSONObject.getNames(cells);
for (String cellID : cellIDs) {
try {
JSONObject source = cells.getJSONObject(cellID);
int rowCount = Integer.parseInt( source.has("row")?String.valueOf(source.get("row")):"1");// 随机数默认取一行
int colCount = Integer.parseInt(source.has("col")?String.valueOf(source.get("col")):"1"); // 随机数默认取一列
JSONArray colModel = source.has("colModel") ? source.getJSONArray("colModel") : new JSONArray();
Object[][] randomDataSet = new Object[rowCount][colCount]; // 数据。第一行为列名
for (int c = 0; c < colModel.length() && c<colCount; c++) {
JSONObject model = colModel.getJSONObject(c);
String name = model.getString("name");
String dataType = model.has("dataType") ? model.getString("dataType") : "number";
if("number".equalsIgnoreCase(dataType)){
// 数值类型:
int min = Integer.parseInt(model.has("min") ? model.getString("min") : "0");
int max = Integer.parseInt(model.has("max") ? model.getString("max") : "1");
int precision = Integer.parseInt(model.has("precision") ? model.getString("precision") : "2");
NumberFormat format = NumberFormat.getNumberInstance();
format.setMaximumFractionDigits(precision);
for (int r = 0; r < randomDataSet.length; r++) {
randomDataSet[r][c] = format.format(Math.random() * (max - min) + min);
}
}else if("string".equalsIgnoreCase(dataType)){
// 字符串类型:
JSONArray values = model.has("values") ? model.getJSONArray("values") : new JSONArray();
for (int r = 0; r < randomDataSet.length; r++) {
int randomIndex = Math.min((int) Math.round(Math.random() * values.length()), values.length()-1);
randomDataSet[r][c] = values.get(randomIndex);
}
}
}
JSONArray rows = new JSONArray();
for (int i = 0; i < randomDataSet.length; i++) {
JSONArray row = new JSONArray();
for (int j = 0; j < randomDataSet[i].length; j++) {
row.put(randomDataSet[i][j]);
}
rows.put(row);
}
refreshDataObject.put(cellID, rows);
} catch (NumberFormatException e) {
e.printStackTrace();
} catch (JSONException e) {
e.printStackTrace();
}
}
return refreshDataObject;
}
}
该实现类实现了一个生产随机数的功能。即刷新时的数据为随机数。