一、表结构(ORACLE):

二、表数据
1、统计报表(TJBB),存储报表的基本信息。
1)、SQL语句:
select t.* from TJBB t
2)、执行结果:

2、统计报表明细(TJBBMX),存储报表的指标信息。
1)、SQL语句:
select t.* from TJBBMX t
2)、执行结果:

注意:TJLX字段为3位数字(0或1)组成。每位数字分别代表:今年,去年,同比。若为1,则显示该列。若为0,则不显示该列。即如果此列的值为:111,则此列需要显示:今年、去年、同比。如果此列的值为:101,则此列需要显示:今年、同比。(可结合下图,进行理解)。
三、根据上述列出的TJBB、TJBBMX的数据,动态生成如下图所示的表头。

四、使用JAVA实现功能,有两种方式。
1、通过JAVA代码实现对数据进行递归排序,并显示表头。
1)只截取代码中关键部分,进行说明。

2)根据SQL语句进行查询,结果数据如下图所示:
select a.bbmc, b.id, b.fid, b.mc, b.tjlx, b.tjsjdw, b.pxxh from tjbb a
inner join tjbbmx b on a.id = b.bbid where a.bbbm = '01'

注意:数据未排序。
3)通过JAVA代码对数据进行递归排序。
/**
* 递归遍历记录并排序
* @param list
* @param fmap
* @return
*/
public Map sortList(List list, Map fmap){
Map resultMap = new HashMap();
List resultList = new ArrayList();
String idTmp = fmap.containsKey("ID")?(String) fmap.get("ID"):"";//父记录的主键
BigDecimal fpxxh = fmap.containsKey("PXXH")?(BigDecimal) fmap.get("PXXH"):null;//父记录的排序序号
BigDecimal fcj = fmap.containsKey("CJ")?(BigDecimal) fmap.get("CJ"):null;//父记录的层级
BigDecimal zdcj = new BigDecimal(0);//最大层级
for(int i=0;i<list.size();i++){
Map map = (Map)list.get(i);
String fid = map.containsKey("FID")?(String) map.get("FID"):"";//父主键
String id = map.containsKey("ID")?(String) map.get("ID"):"";//主键
BigDecimal pxxh = map.containsKey("PXXH")?(BigDecimal) map.get("PXXH"):null;//排序序号
if(StringUtils.equals(fid, idTmp)){
map.put("FPXXH", fpxxh);//子记录存放父记录的排序序号
BigDecimal cj = new BigDecimal(fcj.intValue()+1);
map.put("CJ", cj);//子记录的层级
if(zdcj.intValue()<cj.intValue()||null==zdcj){
zdcj = cj;
}
Map resultMapTmp = sortList(list, map);//递归遍历
BigDecimal zdcjTmp = (BigDecimal)resultMapTmp.get("zdcj");
if(zdcj.intValue()<zdcjTmp.intValue()){
zdcj = zdcjTmp;
}
List sortListTmp = (List)resultMapTmp.get("sortList");
String sfyzjd = "0";//是否叶子节点
if(sortListTmp.size()==0){
sfyzjd = "1";
String tjlx = map.containsKey("TJLX")?(String)map.get("TJLX"):"";
int count = 0;
if(!StringUtils.isBlank(tjlx)){
for(int j=0;j<tjlx.length();j++){
String tjlxTmp = tjlx.substring(j, j+1);
if(StringUtils.equals("1", tjlxTmp)){
count++;
}
}
}
map.put("COLSPAN", new BigDecimal(count));//子记录的合并列
}
BigDecimal colspan = map.containsKey("COLSPAN")?(BigDecimal) map.get("COLSPAN"):null;
if(fmap.containsKey("COLSPAN")){
BigDecimal fcolspan = (BigDecimal) fmap.get("COLSPAN");
fmap.put("COLSPAN", new BigDecimal(fcolspan.intValue()+colspan.intValue()));//父记录的合并列
}else{
fmap.put("COLSPAN", colspan);//父记录的合并列
}
map.put("SFYZJD", sfyzjd);//SFYZJD:是否叶子节点
int indexTmp = 0;//存放索引
boolean flag = false;
for(int j=0;j<resultList.size();j++){
Map mapTmp = (Map)resultList.get(j);
BigDecimal pxxhTmp = mapTmp.containsKey("PXXH")?(BigDecimal) mapTmp.get("PXXH"):null;
if(null!=pxxhTmp&&null!=fpxxh&&pxxh.intValue()<pxxhTmp.intValue()){
indexTmp = j;
flag = true;
break;
}
}
if(!flag){
indexTmp = resultList.size();
}
resultList.add(indexTmp,map);
resultList.addAll(indexTmp+1,sortListTmp);
}
}
resultMap.put("zdcj", zdcj);//最大层级
resultMap.put("sortList", resultList);
return resultMap;
}
4)页面代码。
<%@ page language="java" contentType="t

这篇博客介绍如何根据ORACLE数据库中树形结构数据(TJBB和TJBBMX表)动态生成统计报表的表头。TJLX字段控制列的显示,1表示显示,0表示隐藏。文章探讨了两种方法:1)使用JAVA代码进行递归排序和表头生成,2)利用SQL的CONNECT BY语句进行排序。提供了完整的后台和前台代码示例,以及下载链接供参考。
最低0.47元/天 解锁文章
2836

被折叠的 条评论
为什么被折叠?



