有一张使用日期时间提示控件过滤发货日期的报表。默认情况下,Cognos选择当前日期和午夜十二点做为默认日期和时间。
Report Studio允许我们修改此默认值为一静态值。但是修改后的默认值是硬编码的,也就是写死了的。用户希望时间总是能默认选择日期为报表运行时间的前一天,时间为下午五点。
在此例中,我们将学习如何修改Date Time control的默认值为运行报表的前一天下午五点。
准备工作…
任创建一张按发货日期显示销售数量的报表,并在发货日期上建立过滤。
如何实施…
1. 添加一张prompt page。在prompt page中添加一个Date & Time Prompt,并将其连接到之前建立的Shipment Day filter上。
2. 选中此prompt,并设置器Name属性为shipmentDate。
3. 添加一个HTML项目到页脚的Finish 按钮之后,并定义其代码为:
<script>
function subtractDay ()
{ var dtToday = new Date();
var dtYesterday = new Date( dtToday - 86400000 );
// NOTE 86400000 = 24 hours * 60 (minutes per hour) * 60 (seconds per minute) * 1000 milliseconds per second)
var strYesterday = [dtYesterday.getUTCFullYear(), dtYesterday.
getMonth()+1, dtYesterday.getDate()].join("-");
return strYesterday;
}
function subtractTime ()
{
var Time = "17:00:00.000";
return Time;
}
pickerControlshipmentDate.setValue( subtractDay() );
timePickershipmentDate.setValue( subtractTime() );
</script>
4. 运行并测试报表。我们可以看到默认的日期为前一天,时间为下午五点。
工作原理…
这里我们使用标准JavaScript函数计算出前一天。请注意此时间是基于客户端的时间的。
我们通过使用pickerControl<name>的方式,将计算出的日期和时间应用到提示控件中。
我们还可以类似的计算每个月的第一天,最后一天之类的值。下面是我在网上找的一些常用的计算日期的代码,大家可以借鉴一下。
<script language="JavaScript">
var today = new Date();
var thisYear = today.getYear();
var thisMonth = today.getMonth();
var thisDay = today.getDate();
function rw(s1, s2)
{
document.write("<tr><td>"+s1+"</td><td>"+s2+"</td></tr>");
}
document.write("<table border='1'>");
rw("Today:", today.toDateString());
//Years
var fdly = new Date(thisYear - 1, 0, 1);
rw("First day of last year:", fdly.toDateString());
var ldly = new Date(thisYear, 0, 0);
rw("Last day of last year:", ldly.toDateString());
var fdty = new Date(thisYear, 0, 1);
rw("First day of this year:", fdty.toDateString());
var ldty = new Date(thisYear + 1, 0, 0);
rw("Last day of this year:", ldty.toDateString());
var fdny = new Date(thisYear + 1, 0 ,1);
rw("First day of next year:", fdny.toDateString());
var ldny = new Date(thisYear + 2, 0, 0);
rw("Last day of next year:", ldny.toDateString());
//Months
var fdlm = new Date(thisYear, thisMonth - 1 ,1);
rw("First day of last month:", fdlm.toDateString());
var ldlm = new Date(thisYear, thisMonth, 0);
rw("Last day of last month:", ldlm.toDateString());
rw("Number of days in last month:", ldlm.getDate());
var fdtm = new Date(thisYear, thisMonth, 1);
rw("First day of this month:", fdtm.toDateString());
var ldtm = new Date(thisYear, thisMonth + 1, 0);
rw("Last day of this month:", ldtm.toDateString());
rw("Number of days in this month:", ldtm.getDate());
var fdnm = new Date(thisYear, thisMonth + 1, 1);
rw("First day of next month:", fdnm.toDateString());
var ldnm = new Date(thisYear, thisMonth + 2, 0);
rw("Last day of next month:", ldnm.toDateString());
rw("Number of days in next month:", ldnm.getDate());
document.write("</table>");
</script>
当然我们还可以编写更复杂的脚本,用以计算上一个工作日,而不是仅仅上一天。至于逻辑如何实现,大家可以自己探索。