壹佰网|ERP100 - 企业信息化知识门户

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 787|回复: 0

只使用一个变量向cognos报表传多参/传数组

[复制链接]
发表于 2012/3/21 00:55:36 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。如果您注册时有任何问题请联系客服QQ: 83569622  。

您需要 登录 才可以下载或查看,没有帐号?注册

x
cognos一值传多参我研究出了很多方案,目前是采用的方式是,在framework中的业务视图的sql中 写类似如下语法 in (#csv( split ( ',', prompt("cporgcd","token","") ))# ),实际上我们的语句比这个复杂得多,但我不能泄密,总之嵌套了很多函数。然后在url后面加p_param=‘1002,1003,1004'的方式,但这种方式有两个明显的缺点,第一如果报表页面上没有引用该维度,参数是不能起到过滤作用的,其二这个参数可能会很长很长,以至于超过最大url长度,并且有可能有宏函数解析出错的风险。
因此决定采用新的方案,这种方案看似简单,实际上解决了一个很棘手的问题,在framework中定义全局过滤器(注意不是在维度的那个页签中的filter,而是整体的filter),定义的方式很简单,直接写 in (?param?)即可,然后在report studio中引入该维度即可,注意要想灵活的让该filter不起作用,可以设置其用途为可选,这样不传参就是代表查询全部,这解决了宏函数和不要用不起作用的问题,并且在访问报表的时候采用post的方式传递参数,这样又解决了url过长的问题,可以说一举两得。
post传参参考如下,
如果通过url拼接字符串的话,太麻烦。还是选择用表单提交。
<form action="http://192.168.1.100/cognos8/cgi-bin/cognos.cgi"
name="frm"  method="post" target="gg">
<input type="hidden" name="b_action" value="xts.run"/>
<input type="hidden" name="m" value="portal/report-viewer.xts"/>
<input type="hidden" name="method" value="execute"/>
<!--<input type="hidden" name="ui.action" value="run"/>
这是保留参数
<input type="hidden" name="ui.tool" value="CognosViewer"/>
-->
<input type="hidden" name="ui.object" value="/content/package[@name='mida']/report[@name='tm']"/>
<input type="hidden" name="p_dfdf" value="a"/>----------传参,我的参数是随便起的。
<input type="hidden" name="run.prompt" value="false"/>------------这个必须写,不然cognos认为参数没有结束,还停留在“提示页面”。有了这段代码就可以直接到结果页面了。
<input type="submit" value="ss">
</form>
如果参数的设置是in,就有点问题。因为在cognos报表中的设置:[列表字段] in ('参数1','参数2','参数3'),可是将:'参数1','参数2','参数3'通过url就不能传给报表。解决:。<input type=’hidden’ name=’p_para’value=’参数1’/>。<input type=’hidden’ name=’p_para’value=’参数2’/>……
首先,没有setParameter方法,只有getParameter,所以一般只区分getAttribute和getParameter的区别。
getAttribute表示从request范围取得设置的属性,必须要先setAttribute设置属性,才能通过getAttribute来取得,设置与取得的为Object对象类型getParameter表示接收参数,参数为页面提交的参数,包括:表单提交的参数、URL重写(就是xxx?id=1中的id)传的参数等,因此这个并没有设置参数的方法(没有setParameter),而且接收参数返回的不是Object,而是String类型
getAttribute表示从request范围取得设置的属性,必须要先setAttribute设置属性,才能通过getAttribute来取得,设置与取得的为Object对象类型 getParameter表示接收参数,参数为页面提交的参数,包括:表单提交的参数、URL重写(就是xxx?id=1中的id)传的参数等,因此这个并没有设置参数的方法(没有setParameter),而且接收参数返回的不是Object,而是String类型
<input type="text" name="arr" value="1" />
<input type="text" name="arr" value="2" />  
<input type="text" name="arr" value="3" />  
string [] arr = request.getParameterValues("arr");


<span style = "display:none;">
<iframe id ="cognosIframe" name="cognosIframe"></iframe>
<form id="cognosForm" target="cognosIframe" action="http://127.0.0.1/cognos8/cgi-bin/cognos.cgi" method="post">
<input type="hidden" name="CAMUsername">
<input type="hidden" name="CAMPassword">
<input type="hidden" name="CAMNamespace" value="dbAuth">
<input type="hidden" name="h_CAM_action" value="logon">
<input type="hidden" name="encoding" value="UTF-8">
<input type="hidden" name="m" value="portal/main.xts">
</form>
<form id="cognosLogout" target="cognosIframe" action="http://127.0.0.1/cognos8/cgi-bin/cognos.cgi" method ="get">
<input type="hidden" name="b_action" value="xts.run">
<input type="hidden" name="m" value="portal/logoff.xts">
<input type="hidden" name="h_CAM_action" value="logoff">
</form>
</span>


Cognos 8.3 + JSP前端集成方案
1.       在报表设计器中,对需要传递参数的字段设置“明细过滤器”。比如:[CompanyName] = ?aa?
2.       回到Cognos门户,找到刚才设置参数的报表,按照下图单击“属性”按钮。
3.       记录本张报表的ID,后面的JSP页面会到,然后单击“查看搜索路径、ID和URL”。
4.       记录本张报表的“搜索路径”。“默认操作URL”是可选的,如果报表不需要条件,直接可以用这个地方访问。
5.       新建一个Java Web项目( .NET,PHP,  ASP,  RoR,Django 等其它web项目都行)。新建一个index.jsp页面,代码如下:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
     <head>
        <title>cogons</title>
        <meta http-equiv="pragma" content="no-cache">
        <meta http-equiv="cache-control" content="no-cache">
        <meta http-equiv="expires" content="0">
        <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
        <meta http-equiv="description" content="This is my page">
        <!--     <link rel="stylesheet" type="text/css" href="styles.css">     -->
     </head>
     <body>

       <form method="post" action="http://localhost:9300/p2pd/servlet/dispatch"
            Target="_blank">
            <p>测试Cognos 8.3 + JSP前端集成参数传递</p>
            <p>Cognos URL:http://localhost:9300/p2pd/servlet/dispatch</p>
            <p>报表名称:order_1</p>
            <p>搜索路径:/content/package[@name='order_detail']/report[@name='order_1']</p>
            <p>传递的参数:p_aa (注意这里必须用 "p_" 做前缀表示是参数,否则无法生效)</p>
            <input type="hidden" name="b_action" value="xts.run" />
            <input type="hidden" name="m" value="portal/report-viewer.xts" />
            <input type="hidden" name="method" value="execute" />
            <input type="hidden" name="prompt" value="false" />
            <input type="hidden" name="run.prompt" value="false" />
            <input type="hidden" name="m_obj"   value="/content/package[@name='order_detail']/report[@name='order_1']" />
            <input type="hidden" name="p_aa" value="Alfreds Futterkiste">
            <input type="submit"     value="提交" />
        </form>
        <br>
     </body>
</html>

10. 下面的是最简单的cognos自动登陆实现文档.在安装过cognos的机器上,如果初始用户名和密码都没有改变,可以实现自动登陆.这里说一句,cognos的技术支持太薄弱了,什么都要用户自己摸索,为什么不开放些,也好有利于自己的发展.
目前cognos被客户批的厉害,估计下面cognos的销售情况会有较大的波动.谁让他不开放的!
<html>
<head>
<title>无标题文档</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<script language="Javascript">
var requestSubmitted = false;
function autosubmit()
{
document.login.submit();
}
</script>
</head>

<body bgcolor="#FFFFFF" text="#000000">
<!-- 这里的action填上http://你的主机名或ip地址/cognos/cgi-bin/login.cgi?" method=POST -->
<form name="login" action="http://localhost/cognos/cgi-bin/login.cgi?" method=POST >
<input type=hidden name=NamespaceTitle value='>
<input type=hidden name=pwdCaseSensitive value='Yes'>
<!-- 这里value的值填上http://你的主机名或ip地址/cognos/cgi-bin/upfcgi.exe?xmlcmd=<GoHome/>,实际中还可以更复杂的链接-->
<input type=hidden name=return_url value='http://localhost/cognos/cgi-bin/upfcgi.exe?xmlcmd=<GoHome/>'>
<input type=hidden name=cancel_url value='http://localhost/cognos/cgi-bin/upfcgi.exe?xmlcmd=<GoHome/>'>
<input type=hidden name=namespace value='default'>
<input type=hidden name=action value='login'>
<input type=hidden name=loginfailed value='1'>
<input type=hidden name=databaseDisplay value='>
<input type=hidden name=guest_url value="">
<!-- 在cognos的登陆脚本中,上面的几个hidden代码是由login.cgi根据服务器运行宏生成的 -->
<!-- 这里的value使用保存过的用户登陆名 -->
<input type="hidden" name="signon" value="administrator">
<!-- 这里的value使用保存过的用户密码 -->
<input type="hidden" name="password" value="">
<!-- 实际使用中,合理利用cookie或其他方法,取得用户在其他地方输入的用户名和密码,发送给login.cgi就可以实现自动登陆了 -->
</form>
<script language="Javascript">autosubmit()</script>
</body>
</html>


<!-- target只认iframe的name,而不是id -->
        <form id="reportForm" target="reportViewer" method="post" action="http://localhost:9300/p2pd/servlet/dispatch">
                                                <input type="hidden" name="b_action" value="cognosViewer"/>
                                                <input type="hidden" name="ui.action" value="run"/>
                                                报表:<input type="text" name="ui.object" value="/content/package[@name='开票收款分析']/report[@name='开票明细']" style="width:400px"/>
                                                <input type="hidden" name="ui.name" value=""/>
                                                <input type="hidden" name="id" value="i5071475710EC4AB69DA8642821DE66DB"/>
                                                <input type="hidden" name="run.outputFormat" value=""/>
                                                <input type="hidden" name="run.prompt" value="false"/>
                                                <input type="hidden" name="cv.header" value="false"/>
                                                <input type="hidden" name="cv.toolbar" value="false"/>
                                                <input type="hidden" name="ui" value="m1m2m4"/>
                                                <input type="hidden" name="cv.toolbar.button.keepThisVersion" value="false"/>
                                                <input type="hidden" name="cv.toolbar.DRILLDOWN" value="false"/>
                                                <input type="hidden" name="cv.toolbar.DRILLUP" value="false"/>
                                                <input type="hidden" name="cv.toolbar.GOTO" value="false"/>
                                                <input type="hidden" name="cv.contextmenu" value="false"/>
                                                <input type="hidden" name="cv.selection" value="false"/>
                                                日期:<input type="text" name="p_date" value=""/>
                                                缴款方式:<input type="text" name="p_aac001" value="105001"/>
                                                </form>
                                                <div id="test" dojoType="unieap.form.Button" label="展现报表" ></div>
                                                <iframe name="reportViewer" src="" frameboder="no" height="90%" width="98%"></iframe>cognos一值传多参我研究出了很多方案,目前是采用的方式是,在framework中的业务视图的sql中 写类似如下语法 in (#csv( split ( ',', prompt("cporgcd","token","") ))# ),实际上我们的语句比这个复杂得多,但我不能泄密,总之嵌套了很多函数。然后在url后面加p_param=‘1002,1003,1004'的方式,但这种方式有两个明显的缺点,第一如果报表页面上没有引用该维度,参数是不能起到过滤作用的,其二这个参数可能会很长很长,以至于超过最大url长度,并且有可能有宏函数解析出错的风险。
因此决定采用新的方案,这种方案看似简单,实际上解决了一个很棘手的问题,在framework中定义全局过滤器(注意不是在维度的那个页签中的filter,而是整体的filter),定义的方式很简单,直接写 in (?param?)即可,然后在report studio中引入该维度即可,注意要想灵活的让该filter不起作用,可以设置其用途为可选,这样不传参就是代表查询全部,这解决了宏函数和不要用不起作用的问题,并且在访问报表的时候采用post的方式传递参数,这样又解决了url过长的问题,可以说一举两得。
post传参参考如下,
如果通过url拼接字符串的话,太麻烦。还是选择用表单提交。
<form action="http://192.168.1.100/cognos8/cgi-bin/cognos.cgi"
name="frm"  method="post" target="gg">
<input type="hidden" name="b_action" value="xts.run"/>
<input type="hidden" name="m" value="portal/report-viewer.xts"/>
<input type="hidden" name="method" value="execute"/>
<!--<input type="hidden" name="ui.action" value="run"/>
这是保留参数
<input type="hidden" name="ui.tool" value="CognosViewer"/>
-->
<input type="hidden" name="ui.object" value="/content/package[@name='mida']/report[@name='tm']"/>
<input type="hidden" name="p_dfdf" value="a"/>----------传参,我的参数是随便起的。
<input type="hidden" name="run.prompt" value="false"/>------------这个必须写,不然cognos认为参数没有结束,还停留在“提示页面”。有了这段代码就可以直接到结果页面了。
<input type="submit" value="ss">
</form>
如果参数的设置是in,就有点问题。因为在cognos报表中的设置:[列表字段] in ('参数1','参数2','参数3'),可是将:'参数1','参数2','参数3'通过url就不能传给报表。解决:。<input type=’hidden’ name=’p_para’value=’参数1’/>。<input type=’hidden’ name=’p_para’value=’参数2’/>……
首先,没有setParameter方法,只有getParameter,所以一般只区分getAttribute和getParameter的区别。
getAttribute表示从request范围取得设置的属性,必须要先setAttribute设置属性,才能通过getAttribute来取得,设置与取得的为Object对象类型getParameter表示接收参数,参数为页面提交的参数,包括:表单提交的参数、URL重写(就是xxx?id=1中的id)传的参数等,因此这个并没有设置参数的方法(没有setParameter),而且接收参数返回的不是Object,而是String类型
getAttribute表示从request范围取得设置的属性,必须要先setAttribute设置属性,才能通过getAttribute来取得,设置与取得的为Object对象类型 getParameter表示接收参数,参数为页面提交的参数,包括:表单提交的参数、URL重写(就是xxx?id=1中的id)传的参数等,因此这个并没有设置参数的方法(没有setParameter),而且接收参数返回的不是Object,而是String类型
<input type="text" name="arr" value="1" />
<input type="text" name="arr" value="2" />  
<input type="text" name="arr" value="3" />  
string [] arr = request.getParameterValues("arr");


<span style = "display:none;">
<iframe id ="cognosIframe" name="cognosIframe"></iframe>
<form id="cognosForm" target="cognosIframe" action="http://127.0.0.1/cognos8/cgi-bin/cognos.cgi" method="post">
<input type="hidden" name="CAMUsername">
<input type="hidden" name="CAMPassword">
<input type="hidden" name="CAMNamespace" value="dbAuth">
<input type="hidden" name="h_CAM_action" value="logon">
<input type="hidden" name="encoding" value="UTF-8">
<input type="hidden" name="m" value="portal/main.xts">
</form>
<form id="cognosLogout" target="cognosIframe" action="http://127.0.0.1/cognos8/cgi-bin/cognos.cgi" method ="get">
<input type="hidden" name="b_action" value="xts.run">
<input type="hidden" name="m" value="portal/logoff.xts">
<input type="hidden" name="h_CAM_action" value="logoff">
</form>
</span>


Cognos 8.3 + JSP前端集成方案
1.       在报表设计器中,对需要传递参数的字段设置“明细过滤器”。比如:[CompanyName] = ?aa?
2.       回到Cognos门户,找到刚才设置参数的报表,按照下图单击“属性”按钮。
3.       记录本张报表的ID,后面的JSP页面会到,然后单击“查看搜索路径、ID和URL”。
4.       记录本张报表的“搜索路径”。“默认操作URL”是可选的,如果报表不需要条件,直接可以用这个地方访问。
5.       新建一个Java Web项目( .NET,PHP,  ASP,  RoR,Django 等其它web项目都行)。新建一个index.jsp页面,代码如下:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
     <head>
        <title>cogons</title>
        <meta http-equiv="pragma" content="no-cache">
        <meta http-equiv="cache-control" content="no-cache">
        <meta http-equiv="expires" content="0">
        <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
        <meta http-equiv="description" content="This is my page">
        <!--     <link rel="stylesheet" type="text/css" href="styles.css">     -->
     </head>
     <body>

       <form method="post" action="http://localhost:9300/p2pd/servlet/dispatch"
            Target="_blank">
            <p>测试Cognos 8.3 + JSP前端集成参数传递</p>
            <p>Cognos URL:http://localhost:9300/p2pd/servlet/dispatch</p>
            <p>报表名称:order_1</p>
            <p>搜索路径:/content/package[@name='order_detail']/report[@name='order_1']</p>
            <p>传递的参数:p_aa (注意这里必须用 "p_" 做前缀表示是参数,否则无法生效)</p>
            <input type="hidden" name="b_action" value="xts.run" />
            <input type="hidden" name="m" value="portal/report-viewer.xts" />
            <input type="hidden" name="method" value="execute" />
            <input type="hidden" name="prompt" value="false" />
            <input type="hidden" name="run.prompt" value="false" />
            <input type="hidden" name="m_obj"   value="/content/package[@name='order_detail']/report[@name='order_1']" />
            <input type="hidden" name="p_aa" value="Alfreds Futterkiste">
            <input type="submit"     value="提交" />
        </form>
        <br>
     </body>
</html>

10. 下面的是最简单的cognos自动登陆实现文档.在安装过cognos的机器上,如果初始用户名和密码都没有改变,可以实现自动登陆.这里说一句,cognos的技术支持太薄弱了,什么都要用户自己摸索,为什么不开放些,也好有利于自己的发展.
目前cognos被客户批的厉害,估计下面cognos的销售情况会有较大的波动.谁让他不开放的!
<html>
<head>
<title>无标题文档</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<script language="Javascript">
var requestSubmitted = false;
function autosubmit()
{
document.login.submit();
}
</script>
</head>

<body bgcolor="#FFFFFF" text="#000000">
<!-- 这里的action填上http://你的主机名或ip地址/cognos/cgi-bin/login.cgi?" method=POST -->
<form name="login" action="http://localhost/cognos/cgi-bin/login.cgi?" method=POST >
<input type=hidden name=NamespaceTitle value='>
<input type=hidden name=pwdCaseSensitive value='Yes'>
<!-- 这里value的值填上http://你的主机名或ip地址/cognos/cgi-bin/upfcgi.exe?xmlcmd=<GoHome/>,实际中还可以更复杂的链接-->
<input type=hidden name=return_url value='http://localhost/cognos/cgi-bin/upfcgi.exe?xmlcmd=<GoHome/>'>
<input type=hidden name=cancel_url value='http://localhost/cognos/cgi-bin/upfcgi.exe?xmlcmd=<GoHome/>'>
<input type=hidden name=namespace value='default'>
<input type=hidden name=action value='login'>
<input type=hidden name=loginfailed value='1'>
<input type=hidden name=databaseDisplay value='>
<input type=hidden name=guest_url value="">
<!-- 在cognos的登陆脚本中,上面的几个hidden代码是由login.cgi根据服务器运行宏生成的 -->
<!-- 这里的value使用保存过的用户登陆名 -->
<input type="hidden" name="signon" value="administrator">
<!-- 这里的value使用保存过的用户密码 -->
<input type="hidden" name="password" value="">
<!-- 实际使用中,合理利用cookie或其他方法,取得用户在其他地方输入的用户名和密码,发送给login.cgi就可以实现自动登陆了 -->
</form>
<script language="Javascript">autosubmit()</script>
</body>
</html>


<!-- target只认iframe的name,而不是id -->
        <form id="reportForm" target="reportViewer" method="post" action="http://localhost:9300/p2pd/servlet/dispatch">
                                                <input type="hidden" name="b_action" value="cognosViewer"/>
                                                <input type="hidden" name="ui.action" value="run"/>
                                                报表:<input type="text" name="ui.object" value="/content/package[@name='开票收款分析']/report[@name='开票明细']" style="width:400px"/>
                                                <input type="hidden" name="ui.name" value=""/>
                                                <input type="hidden" name="id" value="i5071475710EC4AB69DA8642821DE66DB"/>
                                                <input type="hidden" name="run.outputFormat" value=""/>
                                                <input type="hidden" name="run.prompt" value="false"/>
                                                <input type="hidden" name="cv.header" value="false"/>
                                                <input type="hidden" name="cv.toolbar" value="false"/>
                                                <input type="hidden" name="ui" value="m1m2m4"/>
                                                <input type="hidden" name="cv.toolbar.button.keepThisVersion" value="false"/>
                                                <input type="hidden" name="cv.toolbar.DRILLDOWN" value="false"/>
                                                <input type="hidden" name="cv.toolbar.DRILLUP" value="false"/>
                                                <input type="hidden" name="cv.toolbar.GOTO" value="false"/>
                                                <input type="hidden" name="cv.contextmenu" value="false"/>
                                                <input type="hidden" name="cv.selection" value="false"/>
                                                日期:<input type="text" name="p_date" value=""/>
                                                缴款方式:<input type="text" name="p_aac001" value="105001"/>
                                                </form>
                                                <div id="test" dojoType="unieap.form.Button" label="展现报表" ></div>
                                                <iframe name="reportViewer" src="" frameboder="no" height="90%" width="98%"></iframe>
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|Archiver|小黑屋|手机版|壹佰网 ERP100 ( 京ICP备19053597号-2 )

Copyright © 2005-2012 北京海之大网络技术有限责任公司 服务器托管由互联互通
手机:13911575376
网站技术点击发送消息给对方83569622   广告&合作 点击发送消息给对方27675401   点击发送消息给对方634043306   咨询及人才点击发送消息给对方138011526

GMT+8, 2025/11/29 17:26 , Processed in 0.013424 second(s), 14 queries , File On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表