起步软件技术论坛
搜索
 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 2052|回复: 4

[结贴] “新闻查看模块” 统计有权限阅读知识的人员数量功能...

[复制链接]

15

主题

60

帖子

434

积分

中级会员

Rank: 3Rank: 3

积分
434
QQ
发表于 2014-5-12 09:38:43 | 显示全部楼层 |阅读模式
本帖最后由 inxxin 于 2014-5-12 13:13 编辑

问题场景:
“OA/信息发布管理/新闻管理/新闻查看”源代码中有统计“有权限阅读本知识的人员数量功能”,其中代码2.2部分有点疑惑不知道是否正确,请专家指导,谢谢!

源代码位置:/BIZ/OA/knowledge/logic/action/knowledgeCustom.action.m
action名称:getNoReaderCountAction中的getCanReaders(...)方法

代码设计思路:
1、先过滤出有阅读本知识权限的组织信息,并分类保存到psnIDsorgIDs中;
String orgIDs = "'-'", psnIDs = "'-'";
       String sqlGetRights = "select r.fOrgID, r.fOrgKind from OA_KM_Rights r where r.fKWID ='"+KWID+"' and r.fCanReadKW = 1 ";
       Table table = KSQL.select(sqlGetRights, null, OADataModel, null);
       Iterator<Row> rows = table.iterator();
       while (rows.hasNext()) {
           Row rsRights = rows.next();
           if (!(rsRights.getString("fOrgKind").equalsIgnoreCase("psn"))) {
              orgIDs += ",'"+rsRights.getString("fOrgID")+"'";
           }
           if (rsRights.getString("fOrgKind").equalsIgnoreCase("psn")) {
              psnIDs += ",'"+rsRights.getString("fOrgID")+"'";
           }
       }



2、统计人员
2.1  对于psnIDs中的人员直接到SA-OPPerson中统计即可;
"Select distinct p as sID, p.sName,mainOrg.sFName
    from SA_OPPerson p
        join SA_OPOrg mainOrg
             on p.sMainOrgID = mainOrg   
    where p in ("+psnIDs+") "

2.2  对于orgIDs中的存在的人员信息,必须遍历出每个组织下可能存在的人员;
"Select distinct p as sID, p.sName,mainOrg.sFName   
    from SA_OPPerson p   
         join SA_OPOrg mainOrg
               on p.sMainOrgID = mainOrg  
    where p in
      (   select pm.sPersonID      
              from SA_OPOrg org
                  join SA_OPOrg orgC
                       on orgC.sFID like concat(org.sFID , '%')  
                  join SA_OPOrg pm
                      on orgC = pm.sParent     where org in ("+orgIDs+")
      )  
    orderby mainOrg.sFName, p.sName ";

提出问题?
2.2join SA_OPOrg orgC on orgC.sFIDlike concat(org.sFID , '%')就能够将本组织中子孙组织的信息都连接到,那为什么还需要再次连接SA_OPOrg pm,这样不就重复了吗?是否join一次就可以?

39

主题

1379

帖子

2464

积分

金牌会员

Rank: 6Rank: 6

积分
2464
发表于 2014-5-12 11:18:23 | 显示全部楼层
第二个join是获取满足条件的记录, “org in ("+orgIDs+")”

15

主题

60

帖子

434

积分

中级会员

Rank: 3Rank: 3

积分
434
QQ
 楼主| 发表于 2014-5-12 13:19:43 | 显示全部楼层
本帖最后由 inxxin 于 2014-5-12 13:21 编辑
lixin_justep 发表于 2014-5-12 11:18
第二个join是获取满足条件的记录, “org in ("+orgIDs+")”

版主您好:

1、我前面的提问可能有问题,可能让您误会了;

2、我的问题是在检索  “org in ("+orgIDs+")” 逻辑代码中的子查询中(也就是标题2.2代码)有两次join
     第一次: join SA_OPOrg orgC
                       on orgC.sFID like concat(org.sFID , '%')  

    第二次: join SA_OPOrg pm
                      on orgC = pm.sParent
    我觉得第一次就可完成组织中包含的人员遍历,为什么在子查询中又再次join SA_OPOrg pm?

39

主题

1379

帖子

2464

积分

金牌会员

Rank: 6Rank: 6

积分
2464
发表于 2014-5-13 08:44:44 | 显示全部楼层
inxxin 发表于 2014-5-12 13:19
版主您好:

1、我前面的提问可能有问题,可能让您误会了;

楼主要整体看代码,这里的语句查出来的是某个人所在岗位、部门、机构的全体数据。而不是针对全路径查出的数据。楼主可以按您的想法来查数据,然后和代码中的语句查出的数据比较一下。

15

主题

60

帖子

434

积分

中级会员

Rank: 3Rank: 3

积分
434
QQ
 楼主| 发表于 2014-5-13 11:34:39 | 显示全部楼层
问题解决,结贴,谢谢版主,祝您天天好心情!
高级模式
B Color Image Link Quote Code Smilies |上传

本版积分规则

小黑屋|手机版|X3技术论坛|Justep Inc.    

GMT+8, 2024-5-17 13:35 , Processed in 0.079659 second(s), 23 queries .

Powered by Discuz! X3.4

© 2001-2013 Comsenz Inc.

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