发新话题
打印

关于报表模块工作的总结(转帖)

关于报表模块工作的总结(转帖)

本文是从网上搜到的帖子,可能是我们的一个用户(开发商)的日记,内容是如何扩展杰表的脚本。他扩展脚本的用意是,让最终用户可以在设计器中的类似excel的界面的单元格中填入脚本函数,达到让最终用户设计报表的目的。

原文 http://www.qqmay.com/qqblog/896007597/1247024743.htm




首先找到电厂联系人。
分发任务,对电气,汽机,锅炉专业的生产报表,日报表,月报表的需求进行了解。
根据他们提交的表单模板,计算公式。进行杰表模板的制作。
确认点名,探讨技术上能否实现。

进行代码的编写。
       代码编写过程中对日期的处理一定要小心。日报表中对第二天前几个小时值的计算。
      得到第二天的时间方法如下。
  public static string getnewday(string str) {
      dateformat df = new simpledateformat("yyyy-mm-dd");
      gregoriancalendar gc = new gregoriancalendar();
     date da = null;
     try {
         da = df.parse(str);
      } catch (parseexception e) {
         e.printstacktrace();
       }
    gc.settime(da);
    gc.add(5, 1);
    gc.set(gc.get(gc.year), gc.get(gc.month), gc.get(gc.date));
   return df.format(gc.gettime());
}
// 把日期变成两位数
public static string getsquecetimechangend(string date,string endtime)
  {
      if(integer.parseint(endtime)>=24)
      {
         date=getnewday(date);
         endtime=string.valueof(integer.parseint(endtime)-24);
   
       if(endtime.length()==1)
         {
          endtime="0"+endtime;
        }
      }
   endtime=endtime+":00:00";
   return (date+" "+endtime);
  }
//对日期还需要进行一个格式化
public static object formatdatem(string date) {
  dateformat df1 = new simpledateformat("yyyy-mm");
  dateformat df2 = new simpledateformat("yyyy年 mm月");
  try {
   date da = df1.parse(date);
   return df2.format(da);
  } catch (parseexception e) {
   // todo auto-generated catch block
   e.printstacktrace();
  }
  return "";
}
在对数据进行扩展的时候选择的map集合存储数据要比list,因为list是一个无序的集合,在扩展的过程中没办法控制其大小,和值是否准确,而杰表工具本身的扩展标签是不允许为null的,如果是null,则会爆出500错误,因此list不适合这个工具。而map采用键值对应的方式来存储数据,在日报表扩展的过程中一般采用,小时的值做键,在月报表中一般采用日的值来做键,这样方便于在扩展标签中扩展。
但是利用hibernate查询出来的集合是一个list,因此需要对list和map进行一个互换。
//list转换为map(日报表)
public static map listtomap(string date, list list,int rowsize) {
  map map = new hashmap();
  double all = 0.0;
  for (int i = 0; i < list.size(); i++) {
   string hour = "0";
   string time = ((pcommonhourvalue) list.get(i)).getperdatetime()
     .tostring();
   if (time.substring(11, 12).equals("0")) {
    hour = time.substring(12, 13);
   }
   if (time.substring(8, 10).equals(getnewday(date).substring(8, 10))) {
    hour = time.substring(12, 13);
    hour = string.valueof(integer.parseint(hour) + 24);
   }
   if (!time.substring(11, 12).equals("0")
     && !time.substring(8, 10).equals(
       getnewday(date).substring(8, 10))) {
    hour = time.substring(11, 13);
   }
   double d = ((pcommonhourvalue) list.get(i)).gethourvalue();
   all = all + d;
   map.put(integer.valueof(hour), string.valueof(d));
  }
  map.put(new integer(rowsize), string.valueof(all));
  return map;
}
//list转换为map(月报表)
public static map listtomapmonth(string date, list list, int rowsize) {
  map map = new hashmap();
  double all = 0.0;
  for (int i = 0; i < list.size(); i++) {
   string day="1";
   string time = ((pcommondayvalue) list.get(i)).getperdate()
     .tostring();
   if (time.substring(8, 9).equals("0")) {
    day = time.substring(9, 10);
   }
   else{
    day = time.substring(8, 10);
   }
   double d = ((pcommondayvalue) list.get(i)).getpointvalue();
   all = all + d;
   map.put(integer.valueof(day), string.valueof(d));
  }
  map.put(new integer(rowsize), string.valueof(all));
  return map;
}

在myscript.txt文件中编写杰表连接文件。
在此文件中首先要对杰表的几个系统函数做初始化
public  object sum(object arr) {
   return toolscript.sum(arr);
}
public  object average(object arr) {
   return toolscript.avg(arr);
}
public  object max(object arr) {
   return toolscript.max(arr);
}
public  object min(object arr) {
   return toolscript.min(arr);
}
在此文件中对调用项目session的方法,做个初始,和销毁的值。
在杰表加载事件中时初始化session,关闭事件中销毁session。
//初始数据库连接。
public static void inits(){
myscript.initsession();
}
//销毁数据库连接。
public static void dostorys(){
myscript.dostorysession();
}

在杰表中进行方法的调用。


总结,报表的编写是整个项目中工作量最大的一块。一个项目的报表最少五十多,多则百十张。需要大量的时间来完成。
注释要做详细。对hql编写要到位,在pc上的代码覆盖了服务器上的代码以后,重启tomcat,这里需要知道几个linux下的dos命令

telnet /ip地址  连接到服务器
cd  ../              返回到服务器的根目录下
cd /tomcate/bin目录
ls                   类似于windows下的dir
重启tomcat
退出的时候一定要exit,否则服务器将没办法释放权限。

TOP

发新话题