集智平台点击表头多字段排序
需求描述:通过点击表头进行该列的数据排序,并且可以点击多个表头进行顺序的多级排序。
问题难点:点击表头排序在润乾报表中可以很好的通过宏的方式实现,排序更有现成的函数中有排序字段,可是要做到多级的排序,就没有现成的函数可以使用了。
解决方案:原理当然也是要通过宏的形式来传递参数,不过是使用了数据库端的order by 在数据集中将数据排序后,在展现出来实现需求。
首先准备一张3层分组的报表:
增加一个宏macro1放在数据集的最后。
在每个表头增加一个html事件onclick=”order(‘表头名称‘)”,目的是通过出发js将该表头的条件拼成param串传给报表,并且保留上次点击的结果,例如点击客户ID后又点击货主城市,最终传给报表宏的就是”order by 客户ID,货主城市 “.
在调用报表的jsp中增加:
首先取到每次点击表头后的字段名称,会通过request传递回来,如果不为空,说明点击过表头,但是多次点击后每个表头名称中间会有逗号相隔,所以需要处理下。
String orderCols = request.getParameter(“orderCols”);
if(orderCols==null) orderCols=”";
while(orderCols.length()>0 && orderCols.charAt(0)==’,') {
orderCols = orderCols.substring(1);
}
然后加入js
<script type=”text/javascript”>
var orderColsName = ‘<%=orderCols%>’;
</script>
<script language=”JavaScript”>
var orderCols;
function order(colName){
orderCols = colName;
//window.alert(orderCols);
document.getElementById(“orderCols”).value = orderColsName+”,”+orderCols;
document.all(‘form1′).action=”";
document.all(‘form1′).submit();
}
function reset(){
document.getElementById(“orderCols”).value = ”;
document.all(‘form1′).action=”";
document.all(‘form1′).submit();
}
</script>
在js中获得传递过来的参数,将参数拼成多表头名称逗号分隔的形式,传递给jsp中的隐藏域。并且设置了提交方法,为了是将参数再传递回jsp。
<form action=”" name=”" id=”form1″ method=”post”>
<input type=hidden id=”orderCols” name=”orderCols” value=”">
</form>
接下来是进行报表宏的拼接方法:
String parasm = orderCols==null || “”.equals(orderCols) ? “” : “macro1=order by “+orderCols;
将多个字段拼接后的结果拼到宏里面形成name=value的形式传递给报表即可。
下面是直接浏览的效果
然后点击客户ID,再点击货主城市后的效果:
这样就实现了点击多表头进行排序。