根据输入日期通过位移方式解决包含当月的前几月自定义函数
2012-04-26 15:35
387 查看
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;
}
}
B.调用格式:monthBefore(@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 monthBefore 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 get3MonthBefore(String.valueOf(obj1), Integer.valueOf(String
.valueOf(obj2)));
}
/**
*
*/
public static String get3MonthBefore(String ri, int ts) {
String monthStart = "";
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, 1);
Date d2 = cal.getTime();
monthStart = s.format(d2) + " 00:00:00";// 月初
System.out.println(monthStart);
} catch (Exception e) {
e.printStackTrace();
}
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;
}
}
B.调用格式:monthBefore(@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 monthBefore 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 get3MonthBefore(String.valueOf(obj1), Integer.valueOf(String
.valueOf(obj2)));
}
/**
*
*/
public static String get3MonthBefore(String ri, int ts) {
String monthStart = "";
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, 1);
Date d2 = cal.getTime();
monthStart = s.format(d2) + " 00:00:00";// 月初
System.out.println(monthStart);
} catch (Exception e) {
e.printStackTrace();
}
相关文章推荐
- 根据输入日期通过位移方式解决包含当月的前几月自定义函数
- 根据输入日期通过位移方式解决包含当月的前几月自定义函数
- 根据输入日期通过位移方式解决包含当月的前几月自定义函数
- 根据输入日期通过位移方式解决包含当月的前几月自定义函数 http://reportsoft.blog.hexun.com/75077561_d.html
- 根据输入日期通过位移方式解决包含当月的前几月自定义函数
- 根据输入日期通过位移方式解决包含当月的前几月自定义函数
- 根据参数串构建xml实例(不用foreach对数组遍历的原因是它会包含自定义函数has)
- C#调用C(C++)dll示例教程,包含dll找不到函数入口的解决办法,包含C#dll调用方式不对出错的解决办法
- 编写一个函数,从标准输入读取一列整数, 把这些值存储在一个动态分配的数组中并返回这个数组。 函数通过观察EOF判断输入列表是否结束。 数组的第一个数是数组包含的值的个数, 它的后面就是这些整数值。
- 自己写的日期相加函数(C语言)_根据ORACLE数据库的方式改进版
- MFC项目使用Win7自带语音库(包含COM函数返回 “没有注册类”解决方式)
- 表字段不确定,根据需求动态自定义字段的解决方式
- 关于 CxDateedit中可以输入乱码,导致根据日期查询出错的解决方法
- 按如下函数原型用函数编程解决如下的日期转换问题(要求考虑闰年的问题): 输入某年某月某日,计算并输出它是这一年的第几天。 /* 函数功能: 对给定的某年某月某日,计算它是这一年的第几天 函数参数:
- JavaScript--------通过闭包解决只能取得包含函数中任何变量最后一个值的问题
- JavaScript中通过闭包解决只能取得包含函数中任何变量最后一个值的问题
- 编写一个函数,从标准输入读取一列整数,把这些值存储于一个动态分配的数组中并返回这个数组。函数通过观察EOF判断输入列表是否结束。数组的第一个数是数组包含的值的个数,他的后面就是这些整数值。
- js 根据年月获取当月有多少天_js获取农历日期_及Js其它常用有用函数
- 通过自定义MVC的Controller的Json转换器解决日期序列化格式问题