润乾报表中对时间的自动计算和合法性校验
报表提供了自动计算和合法性校验,但是有些用户不太清楚怎么使用,本文用了一个例子给大家介绍一下如何使用快逸报表实现自动计算和合法性校验的功能。
第一步需要设计一张简单的填报表。
首先新建一张空白的报表,设置报表属性为可以填报。然后在各单元格里填入如下图所示的表达式,报表的具体样式如下图所示。
其中B2和C2单元格里利用mid()函数将订货日期和发货日期转换成字符串的形式,以便在后续的步骤中去这个字符串中的某些位,拼凑成JS中校验的时间,并且设置B2和C2单元格的编辑风格为下拉日历,取值类型为“年月 日”,设置B2和C2单元格的显示格式为“yyyy-mm-dd”。报表预览后的样式如下图所示。
第二步要实现在E2单元格里自动计算出发货日期和订货日期之间的时间差。
随着在填报过程中B2和C2的日期发生变化,在E2单元格里的时间差也会自动变化。在快逸报表中,自动计算可以通过JavaScript函数来实现,所以我们选择E2单元格的填报属性,在常规选项卡中写入JavaScript函数来自动计算出C2和B2两个单元格的日期差,写入的JS函数如下:(newDate(${C2}.substr(0,4)+"/"+${C2}.substr(5,7)).getTime()-newDate(${B2}.substr(0,4)+"/"+${B2}.substr(5,7)).getTime())/1000/3600/24。这段JS函数的含义是取C2和B2单元格里的字符串,取前4位和第6、7位,然后在前4位和6、7位之间加上字符“/”,拼成一个完整的字符串,然后用getTime()方法将B2和C2单元格中拼成的字符串转换成时间,然后做差,这时候计算出来的是两个日期之间相差的毫秒数,再将这个毫秒数”/1000/3600/24”,转换成天数。
写JS函数的具体的样式如下图所示:
接下来我们用快逸报表集成的tomcat发布这张填报表,就可以看到在时间差对应的列里能显示出发货日期跟订货日期之间的天数差,随着B2和C2单元格中的日期发生改变,时间差列里面的天数会自动的改变,效果图如图三和图四所示。
第三步设置合法性校验。
在数据校验的时候,要先定义校验js,然后在校验的编辑框中调用js,所以在利用JSP发布报表的时候,需要在JSP里写出校验的函数,并在校验的表达式中调用。我们这里设定如果发货日期小于订货日期则输入的数据不符合实际,提示输入的数据不合法,并在页面上显示是哪些订单对应的数据不合法。
首先我们要写一个普通的发布报表的简单的JSP文件,JSP文件的内容如图五所示。然后在JSP的<html>后面加入如下一段代码:
<SCRIPTLANGUAGE="JavaScript">
function Timer(name,first,second){
var mark=true;
varyear1=first.substring(0,4);
varmonth1=first.substring(5,7);
varday1=first.substring(8,10);
var a=new Date(year1+"/"+month1+"/"+day1);
varyear2=second.substring(0,4);
varmonth2=second.substring(5,7);
varday2=second.substring(8,10);
var b=newDate(year2+"/"+month2+"/"+day2);
varn=(b.getTime()-a.getTime())/1000/3600/24;
if(n<0){
document.getElementById("warning").innerHTML="定单ID:"+name+"发货日期小于订购日期";
mark=false;
} else{
mark=true
}
return mark;
}
</SCRIPT>
这段代码的作用就是计算日期差并判断日期差是不是小于0,如果小于0就提示出错,并在网页上显示出是哪个订单出错,计算日期差的方法与D2单元格里使用JS函数自动计算的方法相同。JSP文件的代码如下面所示:
<%@ pagecontentType="text/html;charset=GBK" %>
<%@ tagliburi="/WEB-INF/runqianReport4.tld" prefix="report" %>
<% //这里为两种方法准备图片连接的公共部分
String appmap =request.getContextPath();
String printImage = "<img alt=打印 src='" + appmap +"/images/print.gif' border=no style='vertical-align:middle'>";
String wordImage = "<img alt=导出Word src='" + appmap+ "/images/doc.gif' border=no style='vertical-align:middle'>";
String excelImage = "<img alt=导出excel src='" + appmap+ "/images/excel.gif' border=no style='vertical-align:middle'>";
String pdfImage = "<img alt=导出PDF文件 src='" + appmap + "/images/pdf.gif' border=nostyle='vertical-align:middle'>";
String firstPageImage = "<imgsrc='" + appmap + "/images/firstpage.gif' border=nostyle='vertical-align:middle'>";
String lastPageImage = "<imgsrc='" + appmap + "/images/lastpage.gif' border=nostyle='vertical-align:middle'>";
String nextPageImage = "<imgsrc='" + appmap + "/images/nextpage.gif' border=no style='vertical-align:middle'>";
String prevPageImage = "<imgsrc='" + appmap + "/images/prevpage.gif' border=nostyle='vertical-align:middle'>";
String submitImage = "<imgalt=保存到数据库 src='" +appmap + "/images/savedata.gif' border=nostyle='vertical-align:middle'>";
String importExcelImage ="<img alt=导入Excel文件 src='" + appmap +"/images/importExcel.gif' border=nostyle='vertical-align:middle'>";
%>
<html>
<SCRIPTLANGUAGE="JavaScript">
function Timer(name,first,second){
var mark=true;
var year1=first.substring(0,4);
var month1=first.substring(5,7);
var day1=first.substring(8,10);
var a=newDate(year1+"/"+month1+"/"+day1);
var year2=second.substring(0,4);
varmonth2=second.substring(5,7);
var day2=second.substring(8,10);
var b=newDate(year2+"/"+month2+"/"+day2);
varn=(b.getTime()-a.getTime())/1000/3600/24;
if(n<0){
document.getElementById("warning").innerHTML="定单ID:"+name+"发货日期小于订购日期";
mark=false;
}else if(n>30){
document.getElementById("warning").innerHTML="定单ID:"+name+"订购日期与发货日期相差超过了30天";
mark=false;
}else{
mark=true
}
return mark;
}
</SCRIPT>
<table align=center>
<tr>
<td> <span id="warning" style="color: black"></span>
</td>
</tr>
<tr>
<td>
<report:html name="report1" reportFileName="2.raq"
funcBarLocation="top" needPageMark="yes" generateParamForm="no"
width="-1" exceptionPage="/reportJsp/myError2.jsp"
needSaveAsWord="yes"
needSaveAsPdf="yes"
needSaveAsExcel="yes"
needImportExcel="yes"
wordLabel="<%=wordImage%>"
pdfLabel="<%=pdfImage%>"
submit="<%=submitImage%>"
excelLabel="<%=excelImage%>"
importExcelLabel="<%=importExcelImage%>"
/>
</td>
</tr>
</table>
</html>
接下来需要选择D2单元格的填报属性,选择校验选项卡,增加一个校验,在校验的表达式里输入以下表达式:Timer(${A2},${B2}.toString(),${C2}.toString()),作用是调用JSP里面的Timer()方法,然后在错误提示里写入数据不合法,具体的形式如图七示。
这样我们的这张报表设计就都完成了,现在我们用自己写的JSP发布报表就可以看到我们想要的效果了,效果如下图所示。
完成以上步骤我们就可以实现对录入数据的校验以及对错误信息动态提示的功能了,如果某项数据有问题就会在页面的上方显示出来,还会显示出是具体出错的原因是什么,方便了操作者对出错数据的检查,在一定程度上减少了工作量。
报表提供了自动计算和合法性校验,但是有些用户不太清楚怎么使用,本文用了一个例子给大家介绍一下如何使用快逸报表实现自动计算和合法性校验的功能。
第一步需要设计一张简单的填报表。
首先新建一张空白的报表,设置报表属性为可以填报。然后在各单元格里填入如下图所示的表达式,报表的具体样式如下图所示。
其中B2和C2单元格里利用mid()函数将订货日期和发货日期转换成字符串的形式,以便在后续的步骤中去这个字符串中的某些位,拼凑成JS中校验的时间,并且设置B2和C2单元格的编辑风格为下拉日历,取值类型为“年月 日”,设置B2和C2单元格的显示格式为“yyyy-mm-dd”。报表预览后的样式如下图所示。
第二步要实现在E2单元格里自动计算出发货日期和订货日期之间的时间差。
随着在填报过程中B2和C2的日期发生变化,在E2单元格里的时间差也会自动变化。在快逸报表中,自动计算可以通过JavaScript函数来实现,所以我们选择E2单元格的填报属性,在常规选项卡中写入JavaScript函数来自动计算出C2和B2两个单元格的日期差,写入的JS函数如下:(newDate(${C2}.substr(0,4)+"/"+${C2}.substr(5,7)).getTime()-newDate(${B2}.substr(0,4)+"/"+${B2}.substr(5,7)).getTime())/1000/3600/24。这段JS函数的含义是取C2和B2单元格里的字符串,取前4位和第6、7位,然后在前4位和6、7位之间加上字符“/”,拼成一个完整的字符串,然后用getTime()方法将B2和C2单元格中拼成的字符串转换成时间,然后做差,这时候计算出来的是两个日期之间相差的毫秒数,再将这个毫秒数”/1000/3600/24”,转换成天数。
写JS函数的具体的样式如下图所示:
接下来我们用快逸报表集成的tomcat发布这张填报表,就可以看到在时间差对应的列里能显示出发货日期跟订货日期之间的天数差,随着B2和C2单元格中的日期发生改变,时间差列里面的天数会自动的改变,效果图如图三和图四所示。
第三步设置合法性校验。
在数据校验的时候,要先定义校验js,然后在校验的编辑框中调用js,所以在利用JSP发布报表的时候,需要在JSP里写出校验的函数,并在校验的表达式中调用。我们这里设定如果发货日期小于订货日期则输入的数据不符合实际,提示输入的数据不合法,并在页面上显示是哪些订单对应的数据不合法。
首先我们要写一个普通的发布报表的简单的JSP文件,JSP文件的内容如图五所示。然后在JSP的<html>后面加入如下一段代码:
<SCRIPTLANGUAGE="JavaScript">
function Timer(name,first,second){
var mark=true;
varyear1=first.substring(0,4);
varmonth1=first.substring(5,7);
varday1=first.substring(8,10);
var a=new Date(year1+"/"+month1+"/"+day1);
varyear2=second.substring(0,4);
varmonth2=second.substring(5,7);
varday2=second.substring(8,10);
var b=newDate(year2+"/"+month2+"/"+day2);
varn=(b.getTime()-a.getTime())/1000/3600/24;
if(n<0){
document.getElementById("warning").innerHTML="定单ID:"+name+"发货日期小于订购日期";
mark=false;
} else{
mark=true
}
return mark;
}
</SCRIPT>
这段代码的作用就是计算日期差并判断日期差是不是小于0,如果小于0就提示出错,并在网页上显示出是哪个订单出错,计算日期差的方法与D2单元格里使用JS函数自动计算的方法相同。JSP文件的代码如下面所示:
<%@ pagecontentType="text/html;charset=GBK" %>
<%@ tagliburi="/WEB-INF/runqianReport4.tld" prefix="report" %>
<% //这里为两种方法准备图片连接的公共部分
String appmap =request.getContextPath();
String printImage = "<img alt=打印 src='" + appmap +"/images/print.gif' border=no style='vertical-align:middle'>";
String wordImage = "<img alt=导出Word src='" + appmap+ "/images/doc.gif' border=no style='vertical-align:middle'>";
String excelImage = "<img alt=导出excel src='" + appmap+ "/images/excel.gif' border=no style='vertical-align:middle'>";
String pdfImage = "<img alt=导出PDF文件 src='" + appmap + "/images/pdf.gif' border=nostyle='vertical-align:middle'>";
String firstPageImage = "<imgsrc='" + appmap + "/images/firstpage.gif' border=nostyle='vertical-align:middle'>";
String lastPageImage = "<imgsrc='" + appmap + "/images/lastpage.gif' border=nostyle='vertical-align:middle'>";
String nextPageImage = "<imgsrc='" + appmap + "/images/nextpage.gif' border=no style='vertical-align:middle'>";
String prevPageImage = "<imgsrc='" + appmap + "/images/prevpage.gif' border=nostyle='vertical-align:middle'>";
String submitImage = "<imgalt=保存到数据库 src='" +appmap + "/images/savedata.gif' border=nostyle='vertical-align:middle'>";
String importExcelImage ="<img alt=导入Excel文件 src='" + appmap +"/images/importExcel.gif' border=nostyle='vertical-align:middle'>";
%>
<html>
<SCRIPTLANGUAGE="JavaScript">
function Timer(name,first,second){
var mark=true;
var year1=first.substring(0,4);
var month1=first.substring(5,7);
var day1=first.substring(8,10);
var a=newDate(year1+"/"+month1+"/"+day1);
var year2=second.substring(0,4);
varmonth2=second.substring(5,7);
var day2=second.substring(8,10);
var b=newDate(year2+"/"+month2+"/"+day2);
varn=(b.getTime()-a.getTime())/1000/3600/24;
if(n<0){
document.getElementById("warning").innerHTML="定单ID:"+name+"发货日期小于订购日期";
mark=false;
}else if(n>30){
document.getElementById("warning").innerHTML="定单ID:"+name+"订购日期与发货日期相差超过了30天";
mark=false;
}else{
mark=true
}
return mark;
}
</SCRIPT>
<table align=center>
<tr>
<td> <span id="warning" style="color: black"></span>
</td>
</tr>
<tr>
<td>
<report:html name="report1" reportFileName="2.raq"
funcBarLocation="top" needPageMark="yes" generateParamForm="no"
width="-1" exceptionPage="/reportJsp/myError2.jsp"
needSaveAsWord="yes"
needSaveAsPdf="yes"
needSaveAsExcel="yes"
needImportExcel="yes"
wordLabel="<%=wordImage%>"
pdfLabel="<%=pdfImage%>"
submit="<%=submitImage%>"
excelLabel="<%=excelImage%>"
importExcelLabel="<%=importExcelImage%>"
/>
</td>
</tr>
</table>
</html>
接下来需要选择D2单元格的填报属性,选择校验选项卡,增加一个校验,在校验的表达式里输入以下表达式:Timer(${A2},${B2}.toString(),${C2}.toString()),作用是调用JSP里面的Timer()方法,然后在错误提示里写入数据不合法,具体的形式如图七示。
这样我们的这张报表设计就都完成了,现在我们用自己写的JSP发布报表就可以看到我们想要的效果了,效果如下图所示。
完成以上步骤我们就可以实现对录入数据的校验以及对错误信息动态提示的功能了,如果某项数据有问题就会在页面的上方显示出来,还会显示出是具体出错的原因是什么,方便了操作者对出错数据的检查,在一定程度上减少了工作量。