ChinaExcel动态查询思路
报表统计中包含sql的定义,可以通过request请求传递到action,处理请求参数可以在request前,或者在request后(action中实现),部分代码思路参照【ChinaExcel报表平台搭建(二基本查询)】。参数的实现在定义报表的时候采用如下方式
动态查询的封装分为两类:
-
前台实现动态查询
- 传递参数值替换报表中定义的动态参数
替换函数的定义
函数的调用/** * 动态参数查询sql参数的替换 * * @param dValue * 参数值、数组类型 * @param index * 数据源索引号(从1开始) */ setQuerySql : function(dValue, index) { var strSQL; if (parseInt(index) != index || index < 1) { alert("index参数类型必须大于0且是整数"); return; } strSQL = this.getQuerySql(index); var result, re; // 声明变量。 re = new RegExp("{[a-zA-Z0-9-\u0391-\uFFE5]+}", "g"); // 创建正则表达式对象。 var i = 0; while ((result = re.exec(strSQL)) != null) { strSQL = strSQL.replace(result, dValue[i]); strSQL = strSQL.replace("$", ""); i++; } if (index == 1) { ChinaExcel.SetStatScriptItem("stat:data:sql", strSQL, 1); } else { ChinaExcel.SetStatScriptItem("nextrec" + (index - 1) + ":data:sql", strSQL, 1); } }
ChinaExcel.RestoreAfterCalculate(); //会重新加载计算之前的报表模板,确保可以重新计算 var dValue = [i1.val()]; chDbUtil.setQuerySql(dValue,1); chDbUtil.readTabFileData();
- 自定义sql实现动态查询方案
函数的定义
函数的调用/** * 用于在统计报表中传入动态取数参数 (sql1,sql2,index) * * @param sql1 * @param sql2 * @param index * 数据源索引号(从1开始) */ setDataSourceByIndex : function(sql1, sql2, index) { var strStatScript = ChinaExcel.GetStatScript(1); var jsonObject = this.createJosnObject(); var strQueryParameter = strQueryParameterUrl(); var dSQL1 = sql1; var dSQL2; this.initStatScript(strStatScript); // 主从报表有第二条SQL if (this.dtype[index] == 2) { dSQL2 = sql2; } var url = "RptFrmGet_getTabFileData"; var value = ""; jsonObject.func = "GetSqlResult"; jsonObject.dtype = this.dtype[index]; value = "?jsonObject=" + Ext.encode(jsonObject) + "&sql=" + encodeURIComponent(dSQL1) + "&sql2=" + encodeURIComponent(dSQL2); ChinaExcel.SetStatDataSource1(url + value, 2, this.dname[index]); // ChinaExcel.SetOnlyShowTipMessage(true); }
ChinaExcel.SetCanRefresh(false); ChinaExcel.RestoreAfterCalculate(); //会重新加载计算之前的报表模板,确保可以重新计算 var sql = "select * from company where industry = '"+ i1.val() +"'"; chDbUtil.setDataSourceByIndex(sql,"",1); // 根据数据源索引号设置sql chDbUtil.cal(); ChinaExcel.Refresh();
- 传递参数值替换报表中定义的动态参数
-
后台实现动态查询(报表内定义的sql语句在后台参数处理)
外部传递的参数统一封装进jsonObject对象,采用如下形式(extjs框架自带)
/**
* 对统计报表和所有公式全部进行查询前的验证
*/
srchCheck : function(obj) {
var jsonObject = this.createJosnObject();
Ext.apply(jsonObject, obj);
var isOk;
$.ajax({
url : 'RptFrmGet_srchCheck',
type : 'POST',
async:false,
data : {
jsonObject : Ext.encode(jsonObject)
},
dataType : 'json',
success : function(data) {
isOk = sucFn(data,false);
},
error : function(XMLHttpRequest, textStatus, errorThrown) {
isOk = errorFn(XMLHttpRequest, textStatus, errorThrown);
}
});
return isOk;
}
后台获取传递过来的 jsonObject对象【key/value】,sql语句可以进行特殊处理。
由于chinaexcel报表4.0.0.3用于jsp的开发时内部查询或级联查询请求的汉字参数值是乱码(报表bug,已经和官方确认)。若后台需要汉字参数值需要自己传递到后台或者在前台进行动态处理。(参数名可以正常获得)
补充说明:直接使用官方的ChinaExcel.ReplaceQueryParameter();也是会有问题的,因为调用该函数以后,内部查询的值改变以后不够再次发送查询请求,不调用该函数每次改变查询值都可以发送查询请求。(不能够多次的查询,只是可以查询第一次调用该函数的结果)
下一节将要介绍保存处理的代码实现,请期待。