根据树形(父子层级关系)的数据,使用JAVA语言动态生成表头。

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

一、表结构(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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值