本文是从网上搜到的帖子,可能是我们的一个用户(开发商)的日记,内容是如何扩展杰表的脚本。他扩展脚本的用意是,让最终用户可以在设计器中的类似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,否则服务器将没办法释放权限。