interboy
作者interboy·2010-04-11 22:07
软件开发工程师·北京中电普华信息技术有限公司

利用JavaScript实现Cognos报表排序

字数 10922阅读 10559评论 86赞 33

Cognos的排序做的实在是不怎么地,这两天借着比赛一时兴起,利用JavaScript实现了个排序的方法,个人感觉用起来比较方便,所以特地和大家分享一下。(需要结合视频教程一起看

首先来说一下排序的方法,思路如下:增加一个数据项,该数据项根据参数进行判断,显示那个数据项的数据。然后将新增的数据项拖到列表中进行排序。再利用JavaScript将参数传递过去,实现排序。
开发界面如下:

其中排序初始化HTML为核心代码,如下:
<script type="text/javascript">
    var cvObject = eval("oCV" + getObjectName());
    var lastSelected;
    function getObjectName()
    {
        return document.getElementById("cv.id").value;
    }
    function getRVContent()
    {
        var objName = getObjectName();
        return  eval("document.getElementById('RVContent" + objName + "');");
    }
    function initSort(sortTableId)
    {
        /*说明:若报表中有提交操作的组件,比如完成button或自动提交的组件,则保持注释,若无,则将注释内容打开。这个很重要
        cvObject.preProcessControlArray = [];
        cvObject.gbPromptRequestSubmitted = false;
        cvObject.bCanFinish = true;
        cvObject.bNextPage = true;
        cvObject.pageNavigationObserverArray = [];
        cvObject.rangeObserverArray = [];
        cvObject.multipleObserverArray = [];
        cvObject.datePickerObserverArray = [];
        cvObject.hasPromptKeyDown = false;
        */
        initSortColumn(getSortTable(sortTableId, getRVContent()));

    }

    function getSortTable(sortTableId, rvContent)
    {
        var sortTable;
        var tables = rvContent.getElementsByTagName("table");
        for (var i = 0; i < tables.length; i++)
        {
            if (tables[i].getAttribute("LID") == sortTableId)
            {
                sortTable = tables[i];
                break;
            }
        }
        return sortTable;
    }
    function initSortColumn(sortTable)
    {
        var headRow = sortTable.tBodies[0].rows[0];
        var divs,ascendDiv,descendDiv,cell;
        var sortType = document.getElementById("sort_Type").value;
        var sortColumn = document.getElementById("sort_Column").value;
        for (var i = 0; i < headRow.cells.length; i++)
        {
            cell = headRow.cells[i];
            divs = cell.getElementsByTagName("DIV");
            for (var j = 0; j < divs.length; j++)
            {
                if (divs[j].getAttribute("sortcolumn") != null)
                {
                    divs[j].style.float="left";
                    if (divs[j].getAttribute("sortcolumn") == sortColumn)
                    {
                        if (sortType == 1)
                        {
                            ascendDiv = "<div onclick = "sortColumn(1,'" + divs[j].getAttribute("sortcolumn") + "')" class="sortColumAscendOver"></div>";
                            descendDiv = "<div onclick = "sortColumn(-1,'" + divs[j].getAttribute("sortcolumn") + "')" class="sortColumDescendOut"></div>";
                        } else
                        {
                            ascendDiv = "<div onclick = "sortColumn(1,'" + divs[j].getAttribute("sortcolumn") + "')" class="sortColumAscendOut"></div>";
                            descendDiv = "<div onclick = "sortColumn(-1,'" + divs[j].getAttribute("sortcolumn") + "')" class="sortColumDescendOver"></div>";
                        }
                    } else
                    {
                        ascendDiv = "<div onclick = "sortColumn(1,'" + divs[j].getAttribute("sortcolumn") + "')" class="sortColumAscendOut"></div>";
                        descendDiv = "<div onclick = "sortColumn(-1,'" + divs[j].getAttribute("sortcolumn") + "')" class="sortColumDescendOut"></div>";
                    }
                    divs[j].innerHTML = ascendDiv + descendDiv;
                    break;
                }
            }
        }
    }
    function sortColumn(sortType, sortColumn)
    {
        var oRequest = new CCognosViewerRequest("forward");
        oRequest.addParameter("p_sortType", sortType);
        oRequest.addParameter("p_sortColumn", sortColumn);
        cvObject.submitPromptValues(oRequest);
    }
    initSort("列表1");
</script>
<style type="text/css">
    .sortColumAscendOver {
        width: 20px;
        height: 20px;
        background-image: url( "../pat/images/sortAscending.gif" );
        background-position: center;
        background-repeat: no-repeat;
        float:right;
        cursor: pointer;
    }

    .sortColumAscendOut {
        width: 20px;
        height: 20px;
        background-image: url( "../pat/images/sortAscending_disabled.gif" );
        background-position: center;
        background-repeat: no-repeat;
        float:right;
        cursor: pointer;
    }

    .sortColumDescendOver {
        width: 20px;
        height: 20px;
        background-image: url( "../pat/images/sortDescending.gif" );
        background-position: center;
        background-repeat: no-repeat;
        float:right;
        cursor: pointer;
    }

    .sortColumDescendOut {
        width: 20px;
        height: 20px;
        background-image: url( "../pat/images/sortDescending_disabled.gif" );
        background-position: center;
        background-repeat: no-repeat;
        float:right;
        cursor: pointer;
    }
</style>

其中排序参数内容如下:

'<input type="hidden" id="sort_Type" name="sort_Type" value="'+ParamValue('sortType')+'"/><input type="hidden"  id="sort_Column" name="sort_Column" value="'+ParamValue('sortColumn')+'"/>'

使用报表表达式来获取传递过来的参数值,其中

sortTyp表示升序还是降序

sortColumn表示要进行排序的字段

排序标记内容如下:

<DIV sortcolumn="CURRENT_EMPLOYEE_NUMBER"> </DIV>

其中sortcolumn表示该排序针对的字段是CURRENT_EMPLOYEE_NUMBER,根据需要增加排序的字段。

排序的最终效果如下图:

排序操作的视频教程
或者访问我的参赛作品附件中包含操作视频和教程

如果觉得我的文章对您有用,请点赞。您的支持将鼓励我继续创作!

33

添加新评论86 条评论

king292531king292531软件开发工程师软通
2017-01-04 10:50
谢谢楼主分享,解决了报表的一个常用问题
cognossulirongcognossulirong软件开发工程师新大陆软件工程有限公司
2014-12-22 11:45
学习一下
h123220063h123220063研发工程师leadzone
2014-11-21 09:24
刚刚了解 cognos  学习了
yanzi1234yanzi1234软件开发工程师xxxxxxx
2014-01-15 16:34
用的10.2.1排序图片不显示,也不能排序
a1dd112a1dd112其它武汉华信数据系统有限公司
2014-01-06 17:31
我试了下结果sortColumn()方法不起作用,然后改成将两个值付给值提示就可以了。。。
zhangxiaolangzhangxiaolang软件开发工程师fa
2013-09-01 20:34
学习了
xihuazhoujinxihuazhoujin软件开发工程师xihuadaxue
2013-04-19 14:03
牛人就是不一样!钻研出来的成果就是强悍!
xihuazhoujinxihuazhoujin软件开发工程师xihuadaxue
2013-04-18 23:21
牛人就是不一样!转眼出来的成果就是强悍!
xihuazhoujinxihuazhoujin软件开发工程师xihuadaxue
2013-04-18 23:20
高科技般的帖子丫丫!!
whzj04whzj04软件开发工程师HHJJ
2013-01-06 17:23
过了那么久,就是不知道C10能用不?
飞天磊飞天磊软件开发工程师pactera
2012-11-19 19:07
请问一下,为什么我现在排序无效果呢,都是按照你的代码进行的,版本是8.3的版本
Notes_chenlongNotes_chenlong软件开发工程师everlasting
2012-10-30 17:32
强人很多呀,可你的视频下载不了呀。
pjlopjlo数据库管理员银行
2012-10-28 22:08
视频不让看啊
Li123QingLi123Qing项目经理南京鹏德软件开发有限公司
2012-10-12 17:42
视频看不了,级别不够啊。
zhonghanquanzhonghanquan业务部门经理信和汇诚
2012-03-07 10:14
高手,你好,我用你写的JS放到HTML项里,但是读不到sortAscending.gif、sortAscending_disabled.gif、sortDescending.gif、sortDescending_disabled.gif这四个图片,后来用谷歌浏览器打开报表,查看代码,提示function getObjectName()
    {
        return document.getElementById("cv.id").value;
    }
这个方法有问题,错误是Uncarght TpyeError:Cannot read property 'value' of null,请问这个是什么原因引起的呢?
zhonghanquanzhonghanquan业务部门经理信和汇诚
2012-03-06 15:04
高手,我现在的权限还不够,看不了,但是很想学习一下,怎么办?请问能否放宽权限,谢谢了!
xixixixi软件开发工程师CIB
2011-12-22 23:48
的确是不错
maqiangalan666maqiangalan666软件开发工程师IT公司
2011-12-02 17:18
好强啊

2011-11-15 15:34
interboy真的很强啊
伊逸伊逸BI开发工程师华为
2011-10-22 19:32
学习中~
drf661drf661软件开发工程师ABC
2011-10-09 16:53
为什么要限制级别,这是为什么
drf661drf661软件开发工程师ABC
2011-10-09 16:24
版主真好,真正的无私的
okey7kokey7k软件开发工程师软通
2011-10-09 14:50
东东不错。好好,看看
jinxin1206jinxin1206软件开发工程师chuanyou
2011-09-21 13:30
牛人,我也试下

2011-08-20 12:53
牛人啊,太高手了
freeeasyfreeeasy软件开发工程师广州市方唯电子科技有限公司
2011-07-26 12:49
不错
paulxia39paulxia39软件开发工程师teamsun
2011-07-07 11:16
这样写的,排序图表永远在单元格的右边,不知道怎么改呢?
我把style中的float改为none也不行,麻烦interboy帮忙看一下啊。。。

2011-04-14 10:03
可以联系QQ吗?

2011-03-02 23:17
您好:  oRequest.addParameter("p_sortType", sortType);
        oRequest.addParameter("p_sortColumn", sortColumn);我用这个两个函数 好像没有赋值,我点击排序图片 只提交没有变化,您有什么好的建议,谢谢???
zidonghuadbjzidonghuadbj其它董宝俊
2011-02-14 11:17
试试
leo86leo86项目经理jftt
2010-12-09 10:36
在8.4版本下是否能很好的支持啊
paulxia39paulxia39软件开发工程师teamsun
2010-11-17 10:35
interboy: 把HTML项目放到页脚处。这样每页都会生成
十分感谢,先试试去
apple_ynnapple_ynn软件开发工程师中科软科技股份有限公司
2010-11-15 10:23
能人—强人
interboyinterboy软件开发工程师北京中电普华信息技术有限公司
2010-11-11 18:23
paulxia39: 麻烦问一下,我用的貌似也是这段代码,但是当有多页时,只要最后一页显示排序的HTML选项,前面都没有,是为什么呢?
把HTML项目放到页脚处。这样每页都会生成
paulxia39paulxia39软件开发工程师teamsun
2010-11-11 14:26
麻烦问一下,我用的貌似也是这段代码,但是当有多页时,只要最后一页显示排序的HTML选项,前面都没有,是为什么呢?
MailandMailand学生IBM
2010-10-29 04:48
学习了
MonkillyMonkilly其他 IBM Dalian Global Delivery Company Limited
2010-10-25 14:12
高手很敬业啊,希望能多指教,QQ1042796180
interboyinterboy软件开发工程师北京中电普华信息技术有限公司
2010-09-26 13:17
lingxue3769: 好像对非数值字段不能排序,会报错。
不知大侠你怎么解决的
这个目前只能针对数值字段进行排序,我正在弄字符排序,弄好了过段时间就传上来
yvigmmwfnyvigmmwfn项目经理test
2010-09-17 08:42
不错,先试试,说不定以后会用得上。
liufangliufang专业技术支持人员太极计算机股份有限公司
2010-09-09 10:26
学习一下
gpic01gpic01其它gpic
2010-08-26 23:04
很强大。
小牛小牛商业智能工程师自由职业
2010-08-23 10:01
知道了,谢谢LZ了
interboyinterboy软件开发工程师北京中电普华信息技术有限公司
2010-08-22 11:24
小牛: 这个例子很好,但是如果换做 交叉表好像就不能用了,不知道有什么办法解决这个问题啊
没有办法,因为交叉表的列是根据其成员扩展出来的,抛开JS那段不说,光排序就不能实现
interboyinterboy软件开发工程师北京中电普华信息技术有限公司
2010-08-22 11:22
wuty: 请问高手,如果有分页的话该怎么实现呢?因我用你这个代码当没有分页的情况下那没有问题,但在有分页的时候,当点击到一下页再点击排序时就会自动跳转到第一页了?如何能让
分页的话就把那个HTML项目放到页脚处就可以了

2010-08-20 14:58
请问高手,如果有分页的话该怎么实现呢?因我用你这个代码当没有分页的情况下那没有问题,但在有分页的时候,当点击到一下页再点击排序时就会自动跳转到第一页了?如何能让它记住当前的页号并能进行翻页显示?
还发现一个奇怪的问题就是,对于存在分页的情况,如果我不修改每页的记录数小于20的话,排序就无效了
请高手一定给出答案 谢谢!!
小牛小牛商业智能工程师自由职业
2010-08-18 17:07
这个例子很好,但是如果换做 交叉表好像就不能用了,不知道有什么办法解决这个问题啊

2010-08-18 16:06
学习中……

2010-08-18 11:16
好像对非数值字段不能排序,会报错。
不知大侠你怎么解决的

2010-08-09 14:34
另外,非数值的字段好像排序不了吧,因为你是将数值的字段*?排序类型?进行排序的。。。

2010-08-09 14:24
interboy: 你先看一下第一期我的参赛报表的排序视频,就知道如何排序,也就知道sortColumn和sortType如何排序了。算不算内部机制不好说,但是sortColumn和sortType是我设置的参数
我也看了下Cognos的JavaScript源代码了,大概知道你是怎么实现排序的。这想法不错,有点创意。另外,你知不知道怎么样设置默认排序的字段,我不想要在提示页面输入参数啊,也就是设置默认的排序字段sortColumn和排序类型sortType,我想要一来就按照某个字段排序,或者不排序,我找不到方法。。。
interboyinterboy软件开发工程师北京中电普华信息技术有限公司
2010-08-07 08:40
sysuzzj: function sortColumn(sortType, sortColumn)
    {
        var oRequest = new CCognosViewerRequest("forward");
        oRequest.addParameter(&q
你先看一下第一期我的参赛报表的排序视频,就知道如何排序,也就知道sortColumn和sortType如何排序了。算不算内部机制不好说,但是sortColumn和sortType是我设置的参数名,不是固定的。
我的javascript函数是通过查看页面源文件分析得出的,没有关于那些函数的文档,目前论坛资料下载区里有些关于js的文档我觉得不错,你可以去找找
http://www.cognoschina.net/club/thread-2139-1-2.html
还有一个reportstudio cookbook没找到了,你自己搜搜

2010-08-06 15:58
function sortColumn(sortType, sortColumn)
    {
        var oRequest = new CCognosViewerRequest("forward");
        oRequest.addParameter("p_sortType", sortType);
        oRequest.addParameter("p_sortColumn", sortColumn);
        cvObject.submitPromptValues(oRequest);
    }

从我想知道怎么提交一个带参数sortColumn和sortType的request就能够排序呢,难道Cognos内部机制本身就是根据2个这样名字的参数对数据库获取过来的数据进行排序吗? 另外,想问下你怎么会了解Cognos的那些JavaScript函数,有没有那方面的学习资料可以分享下呢,我在网上逛了大半天,没看到相关资料。谢谢
cogcog软件开发工程师太极计算机股份有限公司
2010-07-15 15:18
没想到,这里面还能支持javascript,学习一下,谢啦

2010-07-14 13:48
不错,很强大。
麦语鸿音麦语鸿音业务咨询顾问AAS
2010-07-01 17:08
学习了,不错!!
interboyinterboy软件开发工程师北京中电普华信息技术有限公司
2010-06-24 13:47
daxia1520: sort_type是需要在列表表头增加的!
怎么增加啊,好像您没写清楚。是否可以给我个完整的啊?谢谢,我的QQ:154148554
你可以下载我一期的报表,打开看一下,公司上网不方便
daxia1520daxia1520交互工程师aa
2010-06-24 10:52
sort_type是需要在列表表头增加的!
怎么增加啊,好像您没写清楚。是否可以给我个完整的啊?谢谢,我的QQ:154148554
interboyinterboy软件开发工程师北京中电普华信息技术有限公司
2010-06-23 20:17
daxia1520: 我用的是8.4的
        var sortType = document.getElementById("sort_Type").value;
sort_Type 没有啊 ,急,谢谢
sort_type是需要在列表表头增加的!
daxia1520daxia1520交互工程师aa
2010-06-23 17:08
我用的是8.4的
        var sortType = document.getElementById("sort_Type").value;
sort_Type 没有啊 ,急,谢谢
lianghai0lianghai0
2010-06-13 09:32
买了 下不下来 我狂晕
lsyijtlsyijt工程师lsyijt
2010-05-26 19:39
几年不写代码,根本不会写了,确实变回初级了,呵呵~~
interboyinterboy软件开发工程师北京中电普华信息技术有限公司
2010-05-26 18:15
lsyijt: 问题搞定了,追踪了一下js执行,发现两个隐含对象没找到,于是把两个html控件倒了个顺序,没问题了, 呵呵~~~
,看来你对JS不是初级啊,哈哈
lsyijtlsyijt工程师lsyijt
2010-05-26 12:51
问题搞定了,追踪了一下js执行,发现两个隐含对象没找到,于是把两个html控件倒了个顺序,没问题了, 呵呵~~~
lsyijtlsyijt工程师lsyijt
2010-05-26 12:34
多谢楼主!!! 试了好久,终于可以点击字段图片排序了,可是仍然有个问题:当通过url传递参数打开报表时(或者在RS里设置了默认参数值),报表页面有错,提示对象找不到,排序图片也没有显示。当人为选择参数进入报表就没有问题。我对html和js的认识很初级,盼楼主指点,多谢!

2010-05-12 10:19
上面代码说 ie5以上就可以,我现在用的是ie 7
interboyinterboy软件开发工程师北京中电普华信息技术有限公司
2010-05-11 18:27
markman: JavaScript写的确实不错!
3Q
interboyinterboy软件开发工程师北京中电普华信息技术有限公司
2010-05-11 18:20
wangzhongfeilov: 对了,cognos 实现 报表行列冻结,论坛上那段css 代码你用过没
我试了一下,不好用啊,添加后,点报表运行,运行不了啊。
没试过,建议你在IE6上试
interboyinterboy软件开发工程师北京中电普华信息技术有限公司
2010-05-11 18:19
lijun4017: 你好,这个js非常好用,我在cognos connection里面用的时候没有任何问题,但是当我把报表通过URL嵌入到一个外部的web程序的时候(通过frameset),初始化的时候没有问题,在点
图片不显示肯定是路径的问题,你可能是通过cgi方式访问的,你确认一下相对路径下图片是否存在
z_ywz_yw
2010-05-11 16:06
学习了
lijun4017lijun4017软件开发工程师5173
2010-05-10 14:06
你好,这个js非常好用,我在cognos connection里面用的时候没有任何问题,但是当我把报表通过URL嵌入到一个外部的web程序的时候(通过frameset),初始化的时候没有问题,在点下某个字段的排序以后,发现排序的那些图片都不显示了(排序点击还是正常能够点到),盼回复

2010-05-10 11:55
对了,cognos 实现 报表行列冻结,论坛上那段css 代码你用过没
我试了一下,不好用啊,添加后,点报表运行,运行不了啊。

2010-05-10 11:54
我的版本是  8.3的。
interboyinterboy软件开发工程师北京中电普华信息技术有限公司
2010-05-08 09:50
wangzhongfeilov: return document.getElementById("cv.id").value  缺少对象
cv.id 从哪里得到的?
可能你的版本不是8.3的吧
interboyinterboy软件开发工程师北京中电普华信息技术有限公司
2010-05-08 09:49
recall: 高手啊!请问要研究report studio里用到的JavaScript,应该从哪些方面学起呢?
JavaScript和reportStudio没关系,就是普通HTML页面的脚本
markmanmarkman其他bb
2010-04-30 17:18
JavaScript写的确实不错!

2010-04-30 09:16
学习

2010-04-29 10:40
请问要研究report studio里用到的JavaScript

2010-04-28 10:26
我的版本也是8.2的,看来要研究一下了。纯粘贴是不行了!
recallrecall软件架构设计师NTT DATA
2010-04-27 14:01
高手啊!请问要研究report studio里用到的JavaScript,应该从哪些方面学起呢?

2010-04-23 18:29
return document.getElementById("cv.id").value  缺少对象
cv.id 从哪里得到的?
阿莱阿莱软件开发工程师科东
2010-04-23 17:51
这个排序仿照做了下,结果发现过滤条件不好使啦555555咋回事丫?
interboyinterboy软件开发工程师北京中电普华信息技术有限公司
2010-04-22 20:40
光风霁月: return document.getElementById("cv.id").value;
提示缺少对象,我的是8.2,请问这和版本有关系吗
我这个是8.3版本的
光风霁月光风霁月软件开发工程师soft
2010-04-22 15:42
return document.getElementById("cv.id").value;
提示缺少对象,我的是8.2,请问这和版本有关系吗
yiyun_stoneyiyun_stone
2010-04-15 11:46
牛人,向你学习
vanluckervanlucker学生uts
2010-04-12 19:27
学习了!
lzhua_maillzhua_mail数据库管理员联想股份有限公司
2010-04-12 16:07
经典啊太好了
Ctrl+Enter 发表

作者其他文章

相关问题

相关资料

X社区推广