根据输入日期通过位移方式解决包含当月的前几月自定义函数 http://reportsoft.blog.hexun.com/75077561_d.html

来源:互联网 发布:单片机编程思路 编辑:程序博客网 时间:2024/06/09 19:23
我顶字号:

1. 需求概述
A.报表里通常会用到同期比,上年同期比。对有些零售行业的报表可能要求比较高一些,对包含当月的前3,6,12个月的一些同期比,比上年同期等,因此数据的处理和计算起来常规的同期比就更复杂一些。由于会根据当前输入的日期去定位前3,6,12个月的范围, 润乾报表内置的lastmonth只能解决上个月,多个月则需要多层嵌套,这似乎不是较好的实现方法。

B.通过业务逻辑分析,可以得出通过自定义函数利用位移的方式来满足这种数据计算应该会比较方便。

C.对当前月,前3,6,12月范围内的数据进行统计,去年前3,6,12月范围内的数据进行统计,和当前年的进行上年同期比,如图:

整个报表设计预览效果图如下:

样例左半部分:

样例右半部分:

2. 算法实现及调用规则
A.思路:
1.根据当前输入的日期,通过JAVA内置日期函数进行调整,找到要返回前几月的月初,和月末,精确到时分秒.
2.用法:monthBefore(@arg1, -3),monthAfter(@arg1, -3)
如输入arg1为: 2010-09-04,返回结果为:
2010-06-01 00:00:00
2010-06-30 23:59:59

支持正负位移,-3代表包含当月的前3月的条件,前多少月以此类推,通过位移的方式实现比较方便.避免多层嵌套的麻烦.

 

B:报表设计参数模板上的用法:

自定义函数的登记:

3. 程序说明

A.调用格式:monthAfter(@arg1, -3),返回前几月的月末,精确到时分秒.

package expression;

import java.text.SimpleDateFormat;

import java.util.Calendar;

import java.util.Date;

import com.runqian.base4.util.ReportError;

import com.runqian.report4.model.expression.Expression;

import com.runqian.report4.model.expression.Function;

import com.runqian.report4.model.expression.Variant2;

import com.runqian.report4.usermodel.Context;

 

public class monthAfter extends Function {

    /**

     * 解决前3月,6月,12月,月末问题

     */

    public Object calculate(Context ctx, boolean inputValue) {

       if (this.paramList.size() == 0)

           throw new ReportError("该函数需要两个参数!");

       // 取得计算表达式

       Expression exp1 = (Expression) this.paramList.get(0);

       if (exp1 == null)

           throw new ReportError("包含有无效参数!");

       Object obj1 = Variant2.getValue(exp1.calculate(ctx, inputValue),false,

              false);

       Expression exp2 = (Expression) this.paramList.get(1);

       if (exp2 == null)

           throw new ReportError("包含有无效参数!");

       Object obj2 = Variant2.getValue(exp2.calculate(ctx, inputValue),false,

              false);

 

       return get3MonthAfter(String.valueOf(obj1), Integer.valueOf(String

              .valueOf(obj2)));

    }

 

    public static String get3MonthAfter(String ri, int ts) {

       String monthEnd = "";

       try {

           Calendar cal = Calendar.getInstance();

           SimpleDateFormat s = new SimpleDateFormat("yyyy-MM-dd");

           Date d1 = s.parse(ri);

           cal.setTime(d1);

           cal.add(Calendar.MONTH, ts);

           cal.set(Calendar.DATE, cal.getActualMaximum(Calendar.DAY_OF_MONTH));

           Date d2 = cal.getTime();

           monthEnd = s.format(d2) + " 23:59:59";// 月末

           System.out.println(monthEnd);

 

       } catch (Exception e) {

           e.printStackTrace();

       }

       return monthEnd;

 

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 死刑犯被执行后发现被冤枉的怎么办 觉得老公对自己不够关心体贴怎么办 孕期老公不知道关心不体贴怎么办? 中国和伊朗做贸易美国制裁怎么办 土地被村民霸占村长解决不了怎么办 村支书霸占群众选举村长的票怎么办 苹果手机自带的音乐软件删了怎么办 不小心把手机系统软件删了怎么办 佳能打印机打相片是打不全怎么办 卖家说我寄回去的包是假的怎么办 辞职后原单位没把档案给转出怎么办 天下行以租代购要起诉我怎么办 顺丰收件人电话地址都写错了怎么办 领导问任务完不成怎么办怎么回答 我和我老婆感情出现问题了怎么办 手机坏了手机浏览器里照片怎么办 不小心把电脑ie浏览器删了怎么办 华为手机自带浏览器中病毒了怎么办 手机打开浏览器提示中病毒了怎么办 手机卸载了浏览器和软件商店怎么办 房东在我租房期间贴房子出租怎么办 额头上毛孔大 还有些黑怎么办 孩子学跳舞老师压的疼怎么办 步步高点读机电池坏了怎么办 电脑连接受限制或无连接怎么办 电脑无线网受限制或无连接怎么办 电脑网络受限制或无连接怎么办 3 证书报考大专证书丢了怎么办 广工期末考试被老师警告了怎么办 我在农村不当队长我能力不够怎么办 我在农村不当队长我当代表怎么办 北京本地人社保中间断了一年怎么办 我想把大哥的孩子带出国要怎么办 美国有亲戚想让孩子出国怎么办 连接温控器的线断了怎么办 植发后好多原生发都脱落了怎么办 4岁宝宝支体能力差怎么办 当与游客发生矛盾时员工怎么办 顾客与同事发生矛盾你该怎么办 当一个人犯下的过错难以原谅怎么办 开车把别人撞成植物人了该怎么办