相信很多COGNOS开发人员看到这个标题就会感觉很轻松,追溯无非是COGNOS自带的一个下钻的功能,但是这里却是固定的条件:
要求1:A报表显示按月的图表B报表显示按日的明细
2:追溯到B的时候B的开始日期控件和结束日期控件还可以随机选择
设置追溯
在报表Address2中添加提示页面,如下图所示
1处是导入xdate.js库
<script type="text/javascript" src="/iisroot/ewelljs/xdate.js"></script>
2处是div的开始
<div style="display:none">
3处是文本框提示,参数名为year 接收Address1传过来的年编码
4处是文本框提示,参数名为month 接收Address1传过来的月编码
5处是日期提示 参数名为begindate,名称为begindate
6处是日期提示 参数名为enddate,名称为enddate
7处是JS处理主体
<script> function setvalueforriqitishi()//该方法完成在提示页面运行时根据传过来的年份和月份对日期提示(开始/结束)赋值 { var form=getFormWarpRequest();//得到form表单 var year=form._textEditBoxyear.value; var month=form._textEditBoxmonth.value; var day='1'; var datestr=year+'/'+month+'/'+day; var firstDate = new Date(datestr); //以下脚本需要xdate.js脚本支持 firstDate.setDate(1); //第一天 var endDate = new Date(firstDate); endDate.setMonth(firstDate.getMonth()+1); endDate.setDate(0); //alert("第一天:"+new XDate(firstDate).toString('yyyy-MM-dd') +" 最后一天:"+new XDate(endDate).toString('yyyy-MM-dd')); pickerControlbegindate.setValue(new XDate(firstDate).toString('yyyy-MM-dd')); //下面三判断如果是当前月,结束日期提示为当前天 var myDate = new Date(); var nowmonth=myDate.getMonth(); //获取当前月份(2位) if(month!=nowmonth+1) { pickerControlenddate.setValue(new XDate(endDate).toString('yyyy-MM-dd')); } promptButtonFinish(); } function init() { setvalueforriqitishi(); } </script> <body onload="init()"> </body> </div>
address2的页面1
8和9处的参数名一定要和5和6处的参数名保持一致,这样才可以赋值
过滤器
cast([门诊挂号].[日期].[年].[Date_SK].[Date_SK],date)
between
?begindate?
and
?enddate?
简单的这么写就好了
原理:虽然Address2处的必须参数为begindate和enddate,Address1处穿过来的是月份,但是我们可以利用传过来的年份和月份加上js脚本对Address2中的日期提示控件进行 赋值,如果是追溯过来的就查找传过来的整月的数据
反之,如果是用户手工在address中选择的随机日期则按照随机日期进行查询
此处的难点是:Address2追溯完成后还需要按照日进行随机查询,而不是按月,导致了按月过滤和按日过滤的冲突,而上面的方法就解决了这个问题
引入XDate.JS 这个小插件,不知道的百度谷歌吧
代码如下:
var firstDate = new Date();
firstDate.setDate(1); //第一天
var endDate = new Date(firstDate);
endDate.setMonth(firstDate.getMonth()+1);
endDate.setDate(0);
alert("第一天:"+new XDate(firstDate).toString('yyyy-MM-dd')+" 最后一天:"+new XDate(endDate).toString('yyyy-MM-dd'));