我使用JasperAssistant创建报告。在我的报告中,我在页面区域中有一个特定大小的文本字段。我需要在该文本字段中打印订单号。如果我的订单号不能适合第一页的文本字段,那么我必须打印剩余的后续页脚中的订单号。如何实现这一目标?我尝试了各种选项,如拉伸溢出为true,将重复值打印为false但没有任何效果。
如果您喜欢使用子报告或其他任何内容,请与我联系。
答案 0 :(得分:0)
您可以尝试使用多个变量,例如:
v_ftr_chr_cnt => 560
v_ord_num_len => $F{ORDER_NUM}.length()
v_req_page_cnt => Math.ceil($V{v_ord_num_len}/$V{v_ftr_chr_cnt})
v_mod_page_num => $V{PAGE_NUMBER}-1 % $V{v_req_page_cnt}
v_substr_from => $V{v_mod_page_num}*$V{v_ftr_chr_cnt}+1 // 1, 561, 1021...
v_substr_to => ($V{v_mod_page_num}+1)*$V{v_ftr_chr_cnt} // 560, 1020, 1580...
v_footer => $F{ORDER_NUM}.Substring($V{v_substr_from}, ( $V{v_ord_num_len} >= $V{v_substr_to} ? $V{v_substr_to} : $V{v_ord_num_len}) )
并且在页脚区域中放置了带有此代码的文本:
$V{v_footer}
它看起来很丑,但很简单。如果你试图得到比原始字符串更长的子字符串,你将得到异常,这就是我在子字符串运算符中检查第二个参数的字符串长度的原因。您没有根据订单号的不同长度指定发生的情况,如果页面适合单页,则页脚将在每页上打印整个订单号,如果不合适,则会在多页上打印,如果有更多页面则会发生什么您没有指定的订单号长度......但我猜测事情会变得非常复杂和丑陋:)
修改强>
我已经编辑了代码,它应该涵盖ORDER_NUM比页面总数短的情况,它也只会打印适合第一个报告的部分。我不确定如何在新报告上打印剩余页数。如果您没有使用摘要带,也许您可以将其打印为最后一页并打印其余的订单号。
这将是订单号其余部分的变量:
v_summary_ord_num => $F{ORDER_NUM}.SubString($V{v_ftr_chr_cnt}*($V{PAGE_NUMBER}-1))
这可能适用于摘要带的“打印表达时”,因此如果ORDER NUM不适合以前的页面,则只打印乐队
$V{v_ord_num_len} > $V{v_ftr_chr_cnt}*$V{PAGE_NUMBER}
答案 1 :(得分:0)
Zstipanicev,
感谢您的信息。但是当我试图在JasperAssistant中创建第一个变量时,我得到的错误
所以我只是将变量调整如下&它对我来说很好。
$ P {poNumber} .length()> = 560? $ P {poNumber} .substring(0,560):$ P {poNumber} $ P {poNumber} .length()> = 1020? $ P {poNumber} .substring(560,1020):( $ P {poNumber} .length()> = 560?$ P {poNumber} .substring(560):null)
非常感谢你的帮助。
但是现在我有一个新的要求,即订单号字符串可以大于或小于报告中的总页数。当订单号小于报告页数时,我需要将订单号打印到可以容纳的页数。但是当它们超过报告页数时,在这种情况下,由于我的页脚中的文本字段是固定大小,我需要从字符串中打印那些可以适合每个页面中的文本字段的许多订单。无法打印的剩余订单应转到刚刚在新报表中包含订单号的新报表。那我怎么能实现这个呢?
答案 2 :(得分:0)
我以某种方式找到了如何将那些不符合我的主JasperPrint对象生成的页面数量的订单号添加到新报表中。正如您所说,我们将首先获得所需页面的数量,如下所示
v_req_page_cnt => Math.ceil($ V {v_ord_num_len} / $ V {v_ftr_chr_cnt})
然后我们将通过
获取主报告生成的页数mainReportPageCount = JapserPrint.getPages()。size()
if(v_req_page_cnt> mainReportPageCount)然后生成新报告。然后来自新报告&的getPages()将这些页面添加到主报表中。