自定义函数解决工作日问题
第28章 自定义函数解决工作日问题
1. 问题概述
报表参数模板在第一次加载进来,查询日期需要有默认值,由于公司正常情况下周六周日是不上班的,需要默认值显示的上一个工作日,如:今天是2011-05-09(星期一),默认值显示为2011-05-06(上周五)
如:今天是2011-05-10(星期二),默认值显示为2011-05-09,
2. 算法及调用规则
A.算法:
1.根据当前日期now()找到昨天lastday()
2.根据昨天,利用自定义函数判断当前是不是工作日, 如果不是工作日就递归查找之前最近的工作日
B:报表参数模板上的用法:
自定义函数的登记:
3. 程序说明
调用格式:workDay();例:workDay(lastday(now()))
package expression;
import java.util.Date;
import java.text.*;
import com.runqian.base4.util.ReportError;
import com.runqian.report4.model.expression.*;
import com.runqian.report4.usermodel.*;
import java.util.Calendar;
public class workDay extends Function {
public Object calculate(Context ctx, boolean inputValue) {
if (this.paramList.size() == 0)
throw new ReportError(“该函数需要一个参数!“);
// 取得计算表达式
Expression exp = (Expression) this.paramList.get(0);
if (exp == null)
throw new ReportError(“包含有无效参数!“);
Object obj = Variant2.getValue(exp.calculate(ctx, inputValue), false,false);
Date date = (Date) obj;
return judgeresult(date);
}
private static String judgeresult(Date date) {
SimpleDateFormat df = new SimpleDateFormat(“yyyy-MM-dd”);
String datestr = df.format(date);
System.out.println(“[昨天:]“+datestr);
Calendar cal = Calendar.getInstance();
cal.setTime(date);
int week = cal.get(Calendar.DAY_OF_WEEK);
System.out.println(“[第]“ + week + “[工作日]“);
// 先判断当天是不是工作日
if (isWorkDay(week)) {
return datestr;
}
// 如果不是工作日就递归查找之前最近的工作日
else {
do {
cal.add(Calendar.DATE, -1);
week = cal.get(Calendar.DAY_OF_WEEK);
} while (!isWorkDay(week));
datestr = df.format(cal.getTime());
return datestr;
}
}
private static boolean isWorkDay(int week) {
if (week == 7 || week == 1) {// 周六日的判断
return false;
} else {
return true;
}
}
}