需求描述:
润乾报表采用APPLET打印,能够实现对报表展现页面的精确打印控制。但是报表只能打印当前页面运算展现的数据,对于填报表,如果用户在报表展现之后填报数据,而这些数据并没有提交入库,那么这些数据就没有保存,也不可能出现在打印页面里。
用户对想利用润乾报表的精确打印功能来实现对单据的精确打印控制,而单据中的数据无须提交入库,只需要即时填写即时打印。本文就利用了传参的方法将用户填写的临时数据从填报表传递至打印页面,实现了对非入库型填报数据的打印功能。
解决思路:
从填报表展现页面传递当前报表的填报单元格及填报值至报表打印预览页面(打印模式发布报表模板),报表打印页面的报表解析传递来的参数,并在相应单元格中利用参数填充,这时打印预览页面中的报表就含有用户填写的非入库提交的临时数据了。
实现步骤:
报表模板设计:input.raq,填报页面报表模板
该报表为填报表,其中B2,B3,B4为可写单元格。
inputPrint.raq,打印预览页面报表模板
该报表模板样式和上面统一,报表参数pvalue,字符串型,用于接收从填报页面传递来的参数。传递的参数形如:”B2:aaaa;B3:bbbb;B4:cccc;”
表达式:
B2:=mid(pvalue,pos(pvalue,’B2′)+3,pos(pvalue,’;',pos(pvalue,’B2′)))
B3:=mid(pvalue,pos(pvalue,’B3′)+3,pos(pvalue,’;',pos(pvalue,’B3′)))
B4:=mid(pvalue,pos(pvalue,’B4′)+3,pos(pvalue,’;',pos(pvalue,’B4′)))
解析表达式可以看出,该表达式截取pvalue中对应单元格名冒号后的值在对应单元格中进行展现。用到函数mid(),pos(),详见润乾函数帮助。
报表填报页面inputPrint.jsp
部分代码说明:
//javascript实现将当前页面的单元格数据传递给打印预览页面print1.jsp
<script type=”text/javascript”>
function getPvalue(celllist){
var cellArray=new Array();
cellArray=celllist.split(‘,’);
var pvalue=”";
//根据单元格列表(B2,B3,B4)构建数组,循环遍历数组,得到单元格值,并将其拼接成”单元格名1:单元格填报值1;单元格名2:单元格填报值2;……”的形式
for(i = 0; i < cellArray.length; i++)
var rid=’report1_’+cellArray[i];
pvalue=pvalue+cellArray[i]+”:”+document.getElementById (rid).value+”;”;
//alert(pvalue);
return pvalue;
}//打开打印预览页面,并传递参数pvalue
function show_print(obj){
var returnvalue=getPvalue(obj);
//var strurl=”http://baidu.com”;
var strurl=”/demo/jsp/print1.jsp?raq=/inputPrint.raq&pvalue=’”+returnvalue+”‘”;
window.open(strurl,”_blank”,” Width=800 ,Height=1000,top=100,left=100″);
//Response.Redirect()
</script>
//利用userFuncBarElements自定义功能按钮建立链接按钮,调用javascript打开打印预览页面。
<table align=”center” width=”100%” height=”100%”>
<tr><td>
<report:html name=”report1″ reportFileName=”input.raq”
funcBarLocation=”top”
needPageMark=”yes”
generateParamForm=”no”
params=”<%=param.toString()%>”
width=”-1″
userFuncBarElements=”<a href=’javascript:show_print(”B2,B3,B4”);’>打印</a>”
exceptionPage=”/reportJsp/myError2.jsp”
/>
</td></tr>
</table>
报表填报页面previewprint.jsp
部分代码说明:
<%
request.setCharacterEncoding( “GBK” );
String report = request.getParameter( “raq” );
String reportFileHome=Context.getInitCtx().getMainDir();
StringBuffer param=new StringBuffer();
//保证报表名称的完整性
int iTmp = 0;
if( (iTmp = report.lastIndexOf(“.raq”)) <= 0 ){
report = report + “.raq”;
iTmp = 0;
Enumeration paramNames = request.getParameterNames();
if(paramNames!=null){
while(paramNames.hasMoreElements()){
String paramName = (String) paramNames.nextElement();
String paramValue=request.getParameter(paramName);
if(paramValue!=null){
//把参数拼成name=value;name2=value2;…..的形式
param.append(paramName).append(“=”).append(paramValue).append(“;”);
%>
……
<table align=”center” width=”100%” height=”100%”>
<tr><td>
<report:print name=”report1″
reportFileName=”inputPrint.raq”
params=”<%=param.toString()%>”
savePrintSetup=”no”
needSelectPrinter=”no”
width=”800″
height=”1000″
/>
打印模式下发布报表inputPrint.raq该报表接受参数pvalue并在报表模板中解析,并把传递的参数在打印页面中展现。
报表效果展现:
填报页面:
打印页面
可以看出用户即时填报的数据已经在打印预览页面的相应区域显示,通过这种方式实现了数据的暂存,可以将非入库的填报数据在打印页面中精确打印。