实现动态统计报表,表头是调用数据库中的字段显示出来的。
来源:互联网 发布:mac安装jdk后如何配置 编辑:程序博客网 时间:2024/05/23 01:15
最近在项目中有这个需求,因此做了出来,分享给大家。
一、目的:实现动态统计报表,表头是调用数据库中的字段显示出来的。
二、实现效果:
其中:收入类、虚列收入、转移收入、多列收入、少列收入这些都是数据库中的字段。且收入类是上级分类,虚列收入、转移收入、多列收入的上级分类。
左边的审计类型是也是从数据库中调出来的。
三、实现思路:
1显示TABLE中的表头:表头分类两层,第一层:收入类,第二层:虚列收入、转移收入、多列收入、少列收入...调用数据实现。
2循环TR:通过显示审计分类列出循环。
3显示一行TR:审计类型+具体对应数据。
4合计:单独处理,利用SUM函数显示出来。
四、具体代码
/*
* 显示总体数据:审计项目汇总
* 查询条件:时间
*
*/
/*
* 思路:
* 1 获取参数
* 2编写时间查询语句
* 3画TABLE
* 4显示TABALE内数据
*/
@RequestMapping(value="/allTotalStandard", method=RequestMethod.GET)
public ModelAndView allTotalStandard(HttpServletRequest request,HttpServletResponse response) {
ModelAndView view = new ModelAndView("allTotalStandard", "message", "");
/*
* 0
* 获取par,组合成查询条件所需信息
* par:time
*/
//0.1time
String yearSelect = request.getParameter("yearSelect");
String stageSelect = request.getParameter("stageSelect");
String monthSelect = request.getParameter("monthSelect");
String startDateString = request.getParameter("startDate");
String endDateString = request.getParameter("endDate");
String startDate=null;
String endDate=null;
if(!("").equals(startDateString) && null!=startDateString)
{
startDate=startDateString;
}
else
{
startDate="";
}
if(!("").equals(endDateString) && null!=endDateString)
{
endDate=endDateString;
}
else
{
endDate="";
}
String firstPar,secondPar,datePar=null;//firstPar= year/startDate; secondPar=month/stage/endDate
if(!("").equals(yearSelect) && null!=yearSelect)
{
//month,stage,null
if(!("").equals(monthSelect) && null!=monthSelect)
{
//month
datePar=" and Month([adate]) ="+monthSelect+" and year([adate])="+yearSelect;
}
else if(!("").equals(stageSelect) && null!=stageSelect)
{
//stage
secondPar=stageSelect;
if(secondPar.equals("1"))
{
datePar=" and year([adate])="+yearSelect+" and ( Month([adate])=1 or month([adate])=2 or month([adate])=3 )" ;
}
if(secondPar.equals("2"))
{
datePar=" and year([adate])="+yearSelect+" and ( month([adate])=4 or month([adate])=5 or month([adate])=6 )" ;
}
if(secondPar.equals("3"))
{
datePar=" and year([adate])="+yearSelect+" and ( month([adate])=7 or month([adate])=8 or month([adate])=9 )" ;
}
if(secondPar.equals("4"))
{
datePar=" and year([adate])="+yearSelect+" and ( month([adate])=10 or month([adate])=11 or month([adate])=12 )" ;
}
}
else
{
//year
datePar=" and Year([adate]) ="+yearSelect;
}
}
else if(!("").equals(startDate) && !("").equals(endDate) )
{
//have startDate and endDate
firstPar=startDate;
secondPar=endDate;
datePar=" and main.adate between '"+startDate+"' and '"+ endDate+"'";
}
else
{
firstPar="";
secondPar="";
datePar="";
}
//画TABLE 显示表头
//1获取第一层的分类 收入类、成本类
List<BreakType> l = breakTypeService.getFirstLevel();
request.setAttribute("breakTypeFirstLists", l);//赋值第一层分类
//获取第一层下级分类的数值
for(BreakType breakType:l)
{
breakType.setNextTypeNum( Long.valueOf(breakTypeDao.getFirstLevelNumber(breakType.getBid()))*2 );
}
//2获取第二层的分类
List<BreakType> sl = breakTypeService.getSecondLevel();
request.setAttribute("breakTypeSecondLists", sl);//赋值第一层分类
request.setAttribute("breakTypeSecondListsSize", sl.size());//赋值第一层分类数字;目的是为了表格中的“审计发现问题”的项colspan符合要求
//3获取某层所属下级列表
List<Object> secondTypeList = new ArrayList();//secondTypeList数据格式[1,2,3,4,5,6]
//定义第二层的个数
int sumSecond=0;
for(int i=0;i<l.size();i++)
{
if(null!=l.get(i))
{
Long t=l.get(i).getBid();
//获取某一个的下级分类数组
secondTypeList.add(breakTypeDao.queryByHql("select name from BreakType where type=?",t+""));
if(sumSecond+secondTypeList.size()>0)
{
sumSecond=sumSecond+secondTypeList.size();
}
else
{
sumSecond=sumSecond;
}
}
else
{
sumSecond=sumSecond;
}
}
request.setAttribute("secondTypeList", secondTypeList);
//4获取 审计发现问题 中的总列数
int sum=sumSecond*2;
request.setAttribute("sum", sum);//赋值第一层分类数字;目的是为了表格中的“审计发现问题”的项colspan符合要求
//画TABLE 显示具体数据
//5显示具体数据
//具体思路:tr中的TD内容通过LIST封装显示出来。
//(1)遍历审计分类
//(2)显示审计分类
//(3)获取对应审计分类的具体 金额和项数
//(4)用<td></td>组装数据
//5.1显示tr中的循环
//具体思路:tr中的TD内容通过LIST封装显示出来。
//(1)遍历审计分类
//(2)显示审计分类
//(3)获取对应审计分类的具体 金额和项数
//(4)用<td></td>组装数据
//5.1显示tr中的循环
List<Object[]> audit=dictViewService.getDictByType("audit.type");//you xian de
List<Object> secondTypeListId = new ArrayList();//第一层问题分类所属下级分类
List<Object> allList = new ArrayList();//最终组合数据
//用signString 代替
List<Object> lineList = new ArrayList();//数据格式:【金额,项数】【金额,项数】【金额,项数】【金额,项数】【金额,项数】
//生成表格
for(int b=0;b<audit.size();b++)//遍历发现问题类型
{
StringBuilder lineArray= new StringBuilder("");
for(int i=0;i<l.size();i++)//遍历第一层分类
{
if(null!=l.get(i))
{
Long t=l.get(i).getBid();
//获得所有的breaktype 遍历第一层分类所属下级分类
secondTypeListId.add(breakTypeDao.queryByHql("select bid from BreakType where type=?",t+""));
//获取单个【金额,项数】,合并成:【金额,项数】【金额,项数】【金额,项数】【金额,项数】
for(int j=0;j<((List)(secondTypeListId.get(i))).size();j++)
{
//获取参数
String tempAudit= ((audit.get(b)))[1].toString() ;
StringBuilder tempType=new StringBuilder(((List)secondTypeListId.get(i)).get(j)+"");
// 获取【项数】【金额】,赋值给signString
StringBuilder signString=new StringBuilder( projectDetailService.numberDetailByAudit( tempAudit,tempType.toString(), datePar ) + projectDetailService.moneyDetailByAudit( tempAudit,tempType.toString(), datePar));
//这是用另一个方法调用,目前不能成功,等待调试
//StringBuilder signString = new StringBuilder(projectDetailService.sumDetailByDepart(tempDepart, tempType.toString()));
//组合数据,组合后的格式为:格式【金额,项数】【金额,项数】【金额,项数】【金额,项数】【金额,项数】
lineArray=lineArray.append(signString);
}
}
}
//将一列数据赋值给lineList
lineList.add(lineArray);
//组合最终列数据allList,格式为:虚列+部门+lineList
//把<td> </td> <td>departname</td> + <td>项数</td> <td>金额</td>=allList
//部门+ 项数、金额
allList.add("<td>"+((audit.get(b)))[1]+"</td>"+lineList.get(b));
}
request.setAttribute("allList", allList);
//6显示合计tr
//(1)遍历第一层
//(2)遍历第二层
//(3)填充<td></td>
List<Object> secondTypeListId2 = new ArrayList();//第一层所属第二层分类
StringBuilder lineArrayTotal= new StringBuilder("");//统计列
List<Object> allTotalList = new ArrayList();//最终组合数据
for(int i=0;i<l.size();i++)//遍历第一层分类
{
if(null!=l.get(i))
{
Long t=l.get(i).getBid();
//获得所有的breaktype 遍历第一层分类所属下级分类
secondTypeListId2.add(breakTypeDao.queryByHql("select bid from BreakType where type=?",t+""));
//拆开数组,赋值给numberList numberList格式【金额,项数】
for(int j=0;j<((List)(secondTypeListId2.get(i))).size();j++)
{
StringBuilder tempType=new StringBuilder(((List)secondTypeListId.get(i)).get(j)+"");
StringBuilder signString=new StringBuilder( projectDetailService.numberTotalDetailByDepart( tempType.toString(),"",datePar ) + projectDetailService.moneyTotalDetailByDepart( tempType.toString(),"",datePar ));
//组合数据,组合后的格式为:格式【金额,项数】【金额,项数】【金额,项数】【金额,项数】【金额,项数】
lineArrayTotal=lineArrayTotal.append(signString);
}
}
}
allTotalList.add("<td>合计</td>"+lineArrayTotal);
request.setAttribute("allTotalList", allTotalList);
return view;
}
- 实现动态统计报表,表头是调用数据库中的字段显示出来的。
- C#中实现动态隐藏/显示RDLC报表的表头(列)
- 如何实现动态获取数据库中的字段
- ListUI中增加了分录的字段后,query中的sql语句显示出来的是按照顺序显示出来的,而ListUI中显示出来的数据确实乱的
- 单链表显示的时候,链表头元素没有显示出来
- VC中通过动态读取数据库中数据集显示在ListView中且将将数据字段作为表头
- RDLC 报表 距阵空白区域显示表头并打印出来
- GDP是如何统计出来的
- 获取GridView控件表头中的列名称,等价于得到数据库中表的字段名称
- 报表表头每页显示
- ASP.NET2.0中将数据库字段中存储的文件显示出来
- Android通过iChartJs实现动态图表、报表的显示Demo
- 水晶报表中按页统计字段(即每页小计)最后合计,怎么实现的?
- GridView显示带有中国式报表表头的方法
- 今晚试验了好久,略有小成,可是还是不够理想。。没把数据库中的具体内容显示出来,只有那个表头。
- 报表中显示多个表的字段
- 学习小记:链接的文本是数据库中的字段值
- ASP.NET+JQuery+.Ashx实现+百度Echarts 实现动态柱状图数据图形报表的统计
- java获取web工程下文件的路径,如配置文件properties
- Developer Guide4——Trackables
- 你不知道的5个Web技术秘密!
- Java源码阅读的真实体会
- VC 获取IP host name
- 实现动态统计报表,表头是调用数据库中的字段显示出来的。
- JS 导出txt文本
- HDU1312 dfs
- 关于Intel无线网卡在ubuntu 12.04下无法连网的问题
- 选举算法
- Network Programming
- 求两个整数的最大公约数,算法原理辗转相除法 原理: GCD (x,y) = GCD(y,x%y)
- Bit与Byte的区别
- 以webService为客户端获取List泛型结果集