The Problem
When working with JasperServer, JasperReports, and iReport it is a common problem to perform date calculations. You would usually want to calculate dates to fill parameters when calling sub reports for example. iReport expressions offer a way to do calculations in Java or Groovy. But each calculation, like the definition of a parameter value, must consist of exactly one expression. When trying to define a complex date object, describing the last day of the last month for example, most people find it very difficult, if not impossible, to do this in a single expression. I have seen different suggestions to deal with the situation. Most recommendations seem to go towards doing all date calculation in your SQL query or using an additional Java library. Both ideas help remedy the problem. Both also have drawbacks. SQL based results may force you to design the report around the date calculation, making it harder to unterstand. Additional Java libraries may increase the complexity of your development setup, since each JasperServer instance and each iReport developer needs matching versions of the library. I would like to propose another possibility, that tries to solve the problem doing simple Groovy expressions, and does not require additional libraries.
The Idea
The input for a report usually consists of a date. The date to run the report for. In an ideal solution the report logic calculates all other required dates internally. To do this properly you would usually depend on the Java Calendar class. It turns out however that several function calls are required to do date calculations properly using the Calendar class. Suppose we already have the date to run a report for in the parameter runDate. The following lines of code would calculate the last day of the last month.
Calendar cal = Calendar.getInstance(); cal.set($P{runDate}.getYear()+1900, $P{runDate}.getMonth(), $P{runDate}.getDate()); cal.add(Calendar.MONTH, -1); cal.set(Calendar.DAY_OF_MONTH, cal.getActualMaximum(Calendar.DAY_OF_MONTH)); return cal.getTime();
The problem is of course, that iReport would not allow multiple expressions and a return statement. We need to come up with a way to put all this into a single expression. Don’t worry. It can be done. Let’s do this step by step. First of all we need to convert the local variable cal into an iReport parameter. Just add a parameter of type java.util.Calendar with default value Calendar.getInstance() and ask iReport not to prompt for its value. This is what the parameter definition should look like.
Now we have a calendar object available in our expressions, that can be referenced like any other parameter using $P{cal}. We could rewrite our pseudo code now. Notice how the explicit allocation of the cal object is not necessary any more, saving us one assignment expression.
$P{cal}.set($P{runDate}.getYear()+1900,$P{runDate}.getMonth(),$P{runDate}.getDate()); $P{cal}.add(Calendar.MONTH, -1); $P{cal}.set(Calendar.DAY_OF_MONTH, $P{cal}.getActualMaximum(Calendar.DAY_OF_MONTH)); return $P{cal}.getTime();
Now it is time to have a close look at the documentation for the Calendar class. The add and set methods we use for our calculations do not have a return type. In a boolean context, calls to add and set evaluate to false. We can exploit this fact and put all three calls into a single expression using the logical OR operator ||.
( $P{cal}.set($P{runDate}.getYear()+1900, $P{runDate}.getMonth(), $P{runDate}.getDate()) || $P{cal}.add(Calendar.MONTH, -1) || $P{cal}.set(Calendar.DAY_OF_MONTH, $P{cal}.getActualMaximum(Calendar.DAY_OF_MONTH)) ); return $P{cal}.getTime();
We are almost there. We can use the ? operator to write the entire calculation in a single expression, also avoiding the return statement. Take a minute to read up on the ? operator if you are unsure how it works. We know for a fact that the calendar calculation expression we wrote evaluates to false, because each statement evaluates to false. So a single expression that does the calculation and returns the resulting date looks like the following.
( $P{cal}.set($P{runDate}.getYear()+1900, $P{runDate}.getMonth(), $P{runDate}.getDate()) || $P{cal}.add(Calendar.MONTH, -1) || $P{cal}.set(Calendar.DAY_OF_MONTH, $P{cal}.getActualMaximum(Calendar.DAY_OF_MONTH)) ) ? null : $P{cal}.getTime()
This is it. We are doing a multiline calculation using the Calendar class in a single expression. You should probably put an expression like this into a report variable and use the variable whenever you need it.
Conclusion
The suggested technique solves the problem of doing multiline date calculations without using external libraries, while also keeping your date calculations out of your SQL. The price to pay is getting used to a slightly inconvenient syntax. For me this is usually a small price to pay, especially since the calculations can be encapsulated in iReport variables or parameters. See the example report for details.
Example Report
You may want to download an example report created in iReport 3.7.3, which demonstrates the suggested calculation technique by defining and printing a few date variables.
相关推荐
基于STM8单片机的编程实例,可供参考学习使用,希望对你有所帮助
Matlab遗传优化算法等算法 求解 生鲜配送问题 路径优化 时间窗 新鲜度 损成本 等约束 程序+算法+参考文献
计算机组成原理课程设计任务书 2021-3-1修订版1
单向辐射ugr模型 包含单向辐射电场模,上下表面辐射损耗,能带,q因字。
光伏锂电池储能功率协调控制系统仿真 [1]左侧光伏Boost控制部分:采用扰动观察法来进行MPPT最大功率跟踪,其中可以改变光照和温度模拟环境工况阶跃: [2]锂电池双向Buck_Boost:采用双闭环控制策略,给定负载电压外环,电流内环,通过稳定负载电压从而控制电流进行充放电 [3]负载电压能够稳定在设定值48V,锂离子电池对功率进行功率协调补偿 仿真运行工况模式: (1)当外界光照变弱,光伏输出功率不能满足负载所需功率,储能会放电进行补偿功率 (2)当外界光照变强,光伏输出功率超过负载所需功率,多余的功率储能会充电进行储存
激光熔覆数值模拟 COMSOL仿真 双椭球热源 采用双椭球热源模型,考虑材料热物性参数、相变、马兰戈尼效应、布辛涅斯克近似等,动网格模拟熔覆层,计算瞬态温度场和流场。
multisim学习Multisim2001电路设计及仿真入门与应用附带光盘含大量实例提取方式是百度网盘分享地址
HFI高频注入仿真 直接转矩控制,滑模观测器MATLAB仿真模型
拿来就用的张定友标定法实验报告,特别详细和完整 一、实验目的 3 二、实验器材 3 三、 张正友标定法原理 3 四、实验步骤 4 4.1 整体流程 4 4.2图像采集 4 4.3特征点提取 5 4.4相机标定 5 4.5畸变校正 6 五、 实验结果 6 5.1 内参矩阵K 6 5.2 畸变系数D 7 5.3 外参矩阵 和 7 5.4 标定误差的计算 8 六、实验结论 9 6.1标定结果的准确性与图像数量密切相关 9 6.2标定图像的分布与角度多样性对标定结果的影响 9 6.3重投影误差的评估 9 6.4畸变系数的准确性 9 6.5OpenCV 工具的使用简便性: 9 七、参考文献 10 八、附件 11
内容概要:本篇文章基于 Flask 框架讲解了一个具体的 API 接口实现方法,该接口用于触发特定ID关联的应用程序运行流程(利用Docker容器执行指定的应用Python脚本)。具体地,在接收 POST 请求之后,根据提供的应用ID来检索对应应用程序的相关路径、镜像名称与主脚本的位置等信息,并且尝试将应用程序目录及其相关联的数据目录挂载进一个临时创建出来的docker环境内以运行主要入口脚本,整个执行过程限定在一小时内完成。一旦成功则把结果以 JSON 包的形式发送回客户端,若是出现错误情况,如找不到对应的 App 或者在执行时发生异常或是超出了时限都将给予相应的JSON报错回复。 适用人群:有一定网络编程以及 Flask 框架使用基础的人群,特别是有志于深入研究 Python 网络服务器构建,掌握如何集成外部组件或容器化应用程序来提升业务处理能力的学生或者是工程师。 使用场景及目标:为用户提供一种简易但实用的方式让 Flask Web 应用可以异步地调用位于远端或本地机器上的 Docker 容器内的脚本来开展某些任务,如进行长时间的数据处理作业或是调用第三方工具等。
HFI高频方波注入方案stm32f405 无感FOC控制 直接闭环启动 永磁同步电机无感控制,0速带载启动,堵转保持扭矩 低速HFI, 高速SMO,全速域运行。 基于stm32f405。 高频注入零速启动三步走: 1 .先是高频注入,角度估算收敛。 2.脉冲NS磁极辨识。 3 .角度,速度双闭坏零速启动运行。 包括完整的cubemx配置文件,mdk工程,原理图和开发笔记,初始角度检测仿真,代码全C语言,宏定义选项均有中文注释,方便我植到自己的项目中。 内涵升级版hfi程序和新的foc程序框架,新版hfi程序速度波动更小。
数据来源:基于上市公司公告、年报等相关数据整理计算 数据范围:沪深京上市公司A股,包括主板、中小企业板、创业板、科创板、北京证交所服务板块等 数据详情: https://blog.csdn.net/yushibing717/article/details/144893810 包含六大类数据: 1、上市公司研究报告发布机构关联表20010101-20240929: ReportID [研究报告编码] - 自动生成的一组序列 Title [标题] - 研究报告的标题 DeclareDate [发布日期] - 研报对外发布日期 InstitutionName [发布机构名称] - 如果一个研报对应多个发布机构,分多条录入 2、上市公司研究报告分类关联表20010101-20240929: 3、上市公司研究报告基本信息20010101-20240929 4、上市公司研究报告人员关联表20010101-20240929 5、上市公司研究报告行业关联表20060703-20240929 上市公司研究报告证券关联表20010101-20240929.......
基于STM8单片机的编程实例,可供参考学习使用,希望对你有所帮助
基于STM8单片机的编程实例,可供参考学习使用,希望对你有所帮助
GEC6818 人脸检测
基于STM8单片机的编程实例,可供参考学习使用,希望对你有所帮助
内容概要:本文档是一份详尽的轨道交通信号与控制专业的综合实验指导手册,涵盖了五个主要实验项目,旨在帮助学生深入理解和实践轨道交通领域的关键技术。具体内容包括ZPW-Z000轨道电路信号的FSK调制与解调、机车信号噪声干扰、应答器报文编制与CRC校验。每个实验详细介绍了目的、原理、任务及实验步骤,同时提供了实验报告要求。通过这些实验,学生们能够全面了解和掌握轨道交通信号系统的工作机制和核心技术。 适用人群:高等院校电气与控制工程学院的本科生、研究生,以及从事轨道交通信号与控制系统研究的技术人员。 使用场景及目标:适用于课堂教学、实验课程和研究项目,帮助学生和研究人员掌握轨道电路信号的FSK调制与解调技术,理解噪声对机车信号的影响及应对措施,熟悉应答器报文的设计与CRC校验机制。目标是提高学生的动手能力、实验技能和理论素养,培养他们解决实际问题的能力。 其他说明:该实验手册不仅为学生提供了详细的实验指南,还为教师和实验技术人员提供了一套科学的教学和实验工具,有助于提升教学质量。同时,这些实验也为未来的研究和发展打下了坚实的基础。
基于 OpenCV 和 Angular Velocity 读数的高精度算法,该算法可以从五个不同的视频中重现汽车的方向盘角度。
简易高考志愿填报辅助工具(含源码与说明).zip [资源说明] 1、该项目是团队成员近期最新开发,代码完整,资料齐全,含设计文档等 2、上传的项目源码经过严格测试,功能完善且能正常运行,请放心下载使用! 3、本项目适合计算机相关专业(人工智能、通信工程、自动化、电子信息、物联网等)的高校学生、教师、科研工作者、行业从业者下载使用,可借鉴学习,也可直接作为毕业设计、课程设计、作业、项目初期立项演示等,也适合小白学习进阶,遇到问题不懂就问,欢迎交流。 4、如果基础还行,可以在此代码基础上进行修改,以实现其他功能,也可直接用于毕设、课设、作业等。 5、不懂配置和运行,可远程教学 6、欢迎下载,沟通交流,互相学习,共同进步!