数据权限-示例-部门经理查看本部门所有单据权限设置-审批人查看单据权限设置

by 祁宏伟 2014.6.27 15:02

注:脚本执行有风险,对于客户正式环境请在研发指导下执行。

  1. 需求:

    审批流中涉及的部门经理和其他审批人都有采购单表单权限;想通过数据权限的动态视图实现

    1. 创建人自己能看自己的采购单。
    2. 创建人所在部门经理能看对应采购单。
    3. 审批流中需要审批的人有查看单据的权限。

    请问怎么用动态视图条件语句实现?

       

  2. 解决方案:

    需要设置两个权限视图,分别对应 普通用户 视图  与 部门经理 视图。

       

    1.普通用户设置动态视图如下:

    对于本例中,由于产生ID in 这种语句一般会大大影响性能,可以直接将其它行都删除,只保留 采购订单与 采购订单行,及计划行 就足够可以进行权限的控制了。

    默认生成的条件是最完备的条件,但是一般使用不到,并且会影响性能。

           做法:

    先点一下高级修改,然后就可以对Grid中的行进行删除或修改其条件语句。 --适合高级顾问用。

       

       

    具体条件内容设置如下:

       

    详细解释:

    sqlWF_IsAuditor(FlowInstance,GetCurrentUserID())=1 or CreatedBy= GetCurrentUserName() 

    sqlWF_IsAuditor 是在右下角函数 栏中提供的专门为 工作审批流 提供的判断 是否是当前审批人。

             其参数为(  当前单据的流程实例id ,当前用户id )

    分别可以通用左边的单据属性上选择 流程实例 ,和 中间上下文中选择 登陆用户。

       

    CreatedBy= GetCurrentUserName()   是常规的条件,表示当前单据创建人=当前用户名称

    注:由于所有实体单据记录的创建人(CreatedBy) 是以用户名称来记录的,所以,必须要用上下文中的 用户名称 来进行比对。

       

       

    2. 对于部门经理权限设置要求。

             需要看到本部门的所有单据。 所以不能用  单据创建人=当前用户名称

             有两种方式,按需要进行相应设置。

             由于 获取单据的创建人所属部门  这个比较复杂,无法简单的通过选择或者函数提供(函数提供会极大的影响性能) 。

    所以,可以换个思路,尽量简单化的进行处理。

       

             第1种方式:  适合业务匹配的  

    通过单据上的 部门字段来存储 单据创建人所处的部门 的方式。

             如本例: 采购订单上有采购业务员与采购部门,如果创建人就是业务员,那对应的采购部门就是创建人所处的部门,则本问题就比较简单。

    只需要    条件:   采购部门 =  当前业务员部门ID 就可以了。

    如下图:

                       

    sqlWF_IsAuditor(FlowInstance,GetCurrentUserID())=1 or PurDept=  GetCurrentOperatorDept()

    注:  GetCurrentOperatorDept() 是 右栏的一个公共函数。

       

       

    第2种:适合现有客户增加权限功能,顾问有一定技术能力,单据数据量不是特别大

    直接在权限中也可以设置写较为复杂的OQL语句,顾问不会写可以直接照抄,

    其缺点是:会有一定的影响性能。

    详细解释:

             CreatedBy in (select u.Name from UFIDA::U9::Base::UserRole::User u inner join UFIDA::U9::CBO::HR::Operator::Operators op

    on u.Contact = op.Contact and op.Org = GetCurrentOrgID() and op.Dept = GetCurrentOperatorDept())

    表示:

             当前创建人 在 (  选择用户表与业务员进行关联,条件为联系人相等,并且为当前组织并且为业务员的部门=当前操作员的部门 )

       

    CreatedBy 是用户表中用名称 Name ,所以要查用户表,并且通过 Contact联系人进行匹配。

    op.Org = GetCurrentOrgID()   :  业务员的组织必须是当前登陆组织

    op.Dept = GetCurrentOperatorDept()   : 业务员的部门必须是当前操作员(经理)的部门。

       

    最终结果就是: 可以查出当前操作员(经理)所在部门的所有业务员对应的用户创建的单据。

    如果需要将  可以审核的单据也要加上。

    那可以再加上:          or  sqlWF_IsAuditor(FlowInstance,GetCurrentUserID())=1

       

    另说明一下:

    U9的用户与业务员之间的关系存在着复杂性,需要理解并且设置好,否则会影响 权限、审批 等相关 内容。

    用户  —》  联系对象  《—  业务员 。

    也就是在用户与 业务员上都有联系对象字段。

    要确保:  一个用户对应一个联系对象 对应 指定组织的一个业务员。(一般保持通一的编码更好,会使有的地方更简单。

                       业务员是组织相关的,一个联系对象 可以 对象 多个组织下不同业务员。

                        

       

    第3种:弹性域解决方案 - 适合新实施的客户

    如果当前的操作员与采购员及采购部门无关系,不能通过这种方式来进行权限过滤 。

    则可以考虑用弹性域字段来进行扩展一个创建人部门。

    弹性域字段可以使用全局段(私有段),段数据来源功能,就可以不需要手工维护,自动产生相应的值。

       

    增一个段,名称可以为 创建人部门。

    对应的值,可以是一个无档案的字符就可以了。用于存创建人部门编码。

    但如果希望看得更直观,或还有其它用途,也可以考虑用 部门实体 。赋值的时候,仍然是赋编码,用下面的来源定义表达式一样。

       

    段数据来源定义如下:

    注: 为何来源实体选 币种  条件表达式为 Code='C001' ?

             段数据来源本身可以支持从任何实体取值,并且配置段数据来源参数作为条件,非常灵活,但对于本例,不需要从其它实体取值,仅需要用

    函数GetCurrentOperatorDeptCode() 来获取当前用户对应的操作员业务部门编码。

             所以,来源实体和条件,可以是尽量简单的数据表及条件就可以了。用币种 加 Code='C001' 是比较简单的一种方法。

    最终形成的SQL类似如下:

             Select   GetCurrentOperatorDeptCode()  from  币种表  where  Code='C001'

    结果就是  GetCurrentOperatorDeptCode() .

       

    定义完成后,所以新保存的采购订单就会有一个段存储了 创建人部门编码。

    然后:

             权限的条件中就可以如下设置:

    注:

    sqlWF_IsAuditor(FlowInstance,GetCurrentUserID())=1 or  DescFlexField.PrivateDescSeg2 = GetCurrentOperatorDeptCode()

    PrivateDescSeg2  是通过左边的实体扩展字段展开中选出来的。不用手工输入。

    GetCurrentOperatorDeptCode() 是右边的当前业务员部门编码。

    就可以了。

       

       

       

       

Tags:

添加评论



biuquote
微笑得意调皮害羞酷大笑惊讶发呆喜欢可怜尴尬闭嘴噘嘴皱眉伤心抓狂呕吐坏笑漫骂发怒
Loading


RecentComments

评论 RSS

Statistics

989 篇文章
0 个单页
787308 条评论
11 次评分
1396287 次访问
访问统计开始于 2019年12月15日
平均日访问 6811 次
当前 111 人在线