cancel
Showing results for 
Search instead for 
Did you mean: 

关于WEBI的二次开发

former_member197088
Participant
0 Kudos

目前老板需求使用BW的数据源,在其他数据库里建立权限对应表对数据进行权限管理。

已经确定了使用WEBI来进行二次开发,建立登录界面。

输入账号密码后进入界面,里面是用户能够看到的所有报表的超链接,点击超链接后弹窗相关的对象条件,部分条件是权限限制内的。

需要哪些SDK,目前进度做到了界面登录到指定页面,超链的创建需要一次能够取到权限下所有的WEBI文档,这些如何做到?

求大神解答下,谢谢。

Accepted Solutions (1)

Accepted Solutions (1)

xiaoping_zheng
Employee
Employee
0 Kudos

我的理解是贵公司的需求是,完成登陆后得到一个该用户所有权限能看到的webi一览的超链接吧。

其实在写代码的时候,直接执行CMS查询

select * from CI_INFOOBJECTS where SI_KIND = 'Webi'"

就可以了,如果是管理员便会返回所有的webi,而如果用户没那么多权限,则这个query只能返回他所有的能看到的webi的列表。

具体可参考下面的简易的code:

<%@ page contentType="text/html; charset=UTF-8" %>

<%@ page import="com.crystaldecisions.sdk.exception.SDKException"%>
<%@ page import="com.crystaldecisions.sdk.framework.ISessionMgr"%>
<%@ page import="com.crystaldecisions.sdk.occa.infostore.*"%>
<%@ page import="com.crystaldecisions.sdk.occa.pluginmgr.*"%>
<%@ page import="com.crystaldecisions.sdk.plugin.CeProgID"%>
<%@ page import="com.crystaldecisions.sdk.plugin.desktop.user.*"%>
<%@ page import="com.crystaldecisions.sdk.properties.*"%>
<%@ page import="java.util.*"%>
<%@ page import="java.io.*"%>
<%@ page import="java.text.*"%>
<%@ page import="com.crystaldecisions.sdk.exception.*,                com.crystaldecisions.sdk.framework.*,
             com.crystaldecisions.sdk.occa.infostore.*,                            com.crystaldecisions.sdk.plugin.CeKind,
                            com.crystaldecisions.sdk.plugin.desktop.folder.*,                            java.util.*"%>

<%  try  {  

    String systemName = "localhost:6400";  
    String userName = request.getParameter("user");   
    String password = request.getParameter("pwd");   
    String authType = "secEnterprise";   
   
    IEnterpriseSession enterpriseSession=null;  
    ISessionMgr enterpriseSessionMgr = CrystalEnterprise.getSessionMgr();   
    enterpriseSession = enterpriseSessionMgr.logon(userName, password, systemName, authType);
    IInfoStore infostore = (IInfoStore)enterpriseSession.getService("InfoStore");   
   
    IInfoObjects iwebi = infostore.query("select * from CI_INFOOBJECTS where SI_KIND = 'Webi'");

out.println("User is: " + userName + "<br><br>");

for (int i=0; i<iwebi.getResultSize(); i++){
     out.println("<a href='https://answers.sap.com/BOE/OpenDocument/opendoc/openDocument.jsp?iDocID=" + ((IInfoObject)iwebi.get(i)).getID() + "'>" + ((IInfoObject)iwebi.get(i)).getTitle() + "</a><br>"); 
}

enterpriseSession.logoff();
   
    } catch(SDKException e)  {}  %>

former_member197088
Participant
0 Kudos

谢谢啦,我试试看

former_member197088
Participant
0 Kudos

已经通过TOKEN登陆到相关的URL,想请教下应该怎样取出不同用户权限下的报表呢?

xiaoping_zheng
Employee
Employee
0 Kudos

我上面的代码可以实现的是,比如你使用用户A登陆,那么就会返回A用户有权限的所有webi报表。如果用B用户登陆,就会返回B用户所有权限的报表。

如果期望的是用管理员登陆,得到一个包含所有用户以及其所有权限的报表的列表,只用管理员的一个session恐怕不易实现,我感觉一个可以采用的办法是,遍历所有用户,使它们分别使用类似的代码登陆一次,得到各自的列表,再把它们整合到一起,这样应该可以实现吧。

former_member197088
Participant
0 Kudos

谢谢了,问题都解决了。本来有大量超链的,用SI_INSTANCE = 0就解决了。

xiaoping_zheng
Employee
Employee
0 Kudos

恩,看了你的描述,我也怀疑是重复的报表应该是报表和它的实例重复了。那么就确实如您所说的,加上SI_INSTANCE=0就把所有实例过滤掉只留报表本身了。

former_member197088
Participant
0 Kudos

是的,不过上面的代码存在一个问题,session不是动态的,每次查看是当时储存的静态session的权限,而报表的超链显示权限又是TOKEN的权限。要做到登陆什么账号就用什么权限就必须有变量session,正在折腾这个,这个有什么好的其他办法么?

Answers (0)