报表中下拉列表框动态刷新值
润乾报表提供有动态过滤功能, 即两个下拉框的数据是存在业务联系的,例如一个是省份的下拉数据集,另一个是城市的下拉数据集,当省份的下拉数据集选择山东时,城市的下拉数据集只有选择山东省的城市,才是合理的数据,否则会出现错误。那么如果有类似城市中只有一个值的情况,比如如何根据下拉选择各类产品对应的唯一单价呢?
下面就分析找出问题的解决思路:
既然动态过滤实现不了,但我们可以想到报表本身提供有自动计算功能,自动计算又支持自定义js函数,js函数本身还可以引用ajax方式,于是我们就可以得出,利用自定义js函数(ajax)异步获取下拉列表产品中对应的数据库中的单价。
以下内容将介绍具体的实现过程:
一、数据准备
建表语句:
CREATE TABLE productdemo (
productName varchar(10) default NULL,
price float default NULL
);
初始化数据:
insert into productdemo (productName, price) values(‘无机酸’,’300′);
insert into productdemo (productName, price) values(‘氧化锌’,’128′);
insert into productdemo (productName, price) values(‘氮肥’,’100′);
insert into productdemo (productName, price) values(‘乙二醇’,’245′);
二、填报表设计
数据集:SELECT productdemo.productName,productdemo.price FROM productdemo
A2:填报风格–下拉数据集
B2:自动计算设置函数 genResName(A2)
三、JS函数定义
var xhr;
function genResName(str1){
//item1_A3
var sss = document.getElementById(‘report1_A2′).value;
// alert(sss);
if (document.XMLHttpRequest) {
xhr = new XMLHttpRequest();
} else {
xhr = new ActiveXObject(“Microsoft.XMLHTTP”);
}
//获取查询到的单价值
xhr.open(‘GET’,'<%=request.getContextPath()%>/wbAjax1.do?val=’+sss);
//设置回调函数
xhr.onreadystatechange = function(){
var ready = xhr.readyState;
if (ready == 4){
parseCompletedResponse(xhr);
}
};
xhr.send(”);
}
function parseCompletedResponse(xhr)
{
var str = xhr.responseText;
//修改单价值
document.getElementById(‘report1_B2′).innerHTML = str;
}
四、获取单价值处理类
主要代码如下:
String val = request.getParameter(“val”);
String res = “”;
//Context ctx = new Context();
DBAccess dba = new DBAccess();
Connection conn = dba.getConnectionFromDBA();
PreparedStatement ps = null;
ResultSet rs = null;
//String sql = “select res_type_name from t_res_type where res_type_id=?”;
String sql = “select price from productdemo where productname=?”;
ps = conn.prepareStatement(sql);
ps.setString(1, val);
rs = ps.executeQuery();
while (rs.next()) {
//获取单价值
res = rs.getString(“price”);
}
PrintWriter out = response.getWriter();
//返回单价值
out.print(res);
五、配置文件修改web.xml
增加如下,
<servlet>
<servlet-name>WBajax1</servlet-name>
<servlet-class>example.WBajax1</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>WBajax1</servlet-name>
<url-pattern>/wbAjax1.do</url-pattern>
</servlet-mapping>
六、测试结果
通过以上几步即可完成描述中的功能,附件是实现的例子,可参考例子了解具体的实现过程。