`
lc90
  • 浏览: 70392 次
  • 性别: Icon_minigender_2
  • 来自: 北京
社区版块
存档分类
最新评论

参数和宏的极致使用

阅读更多

本文通过一个使用参数和宏结合实现复杂数据权限需求的案例,分享给大家一个经验:不管多么复杂的数据权限业务逻辑,集智数据平台报表系统都可以实现。
应用场景说明
   
某医疗用品制造商使用了润乾集智数据平台来搭建报表管理系统,集智数据平台中用户、组织机构和角色数据保持与客户原有EOS系统数据同步。报表数据从以EOS数据为基础的视图库中抽取。
   
权限控制涉及到了系统权限和较为复杂的数据权限。系统权限中除了基本的组织机构授权和角色权限以处,还衍生出多种角色权限。比如每一用户都关联了一个权限标志位,而权限标志位又分为普通、部门和全部三种。其中普通权限用户只能看到本人及下级人员数据信息,部门权限用户可以看到本部门内容的数据信息,全部权限用户可以看到全部数据信息,无权限过滤。
   
但是该单位的销售职位中存在RSMTSMTSR三种角色,它们存在上下级关系,职位由高到低依次是RSMTSMTSR。并且,TSM有权力跟代理商签订代理协议。TSM可以选择自己跟踪代理协议、分配给TSR跟踪代理协议和自己与TSR同时跟踪代理协议这种跟踪方法。
   
鉴于以上业务事实,客户提出在相关报表中(设为R)要求实现如下业务逻辑:将R分配给用户后,要求根据权限标志位判断出用户能访问的数据范围。同时,当用户登录后,在参数模板中还要求根据sys_UserID筛选出该用户能访问的代理商以及该用户的RSMRSM的显示规则是:当用户权限标志位为普通时,若登录用户为TSR,则显示其上级TSM;若若登录用户为TSM,则显示为自己;若登录用户为RSM,则显示为其下属的所有TSM。当用户权限标志位为部门全部时,则按权限标志位判断规则显示数据。
实现过程
框架
    本实现过程先搭框架,再具体实现,以使读者能够更清晰地理解整个实现过程。
�/SPAN> 查询权限标志位
   
增加一个参数“mapKey”,使用query()查询并返回权限标志位
�/SPAN> 搭建权限标志位逻辑
    Case(mapKey,”
普通权限”,”操作1”,”部门权限”,”操作2”,”全部权限操作3”)
�/SPAN> 实现普通权限时操作1
   
若操作1是查询代理商,则通过sysDistributorsyslicencetsmsharesyspersont_user表之间的关联关系查出代理商并返回。
   
若操作1是查询RSM,则通过syslicencetsmsharsyslicencetsrsharesyspersont_user表之间的关联关系查出RSM并返回。
�/SPAN> 实现部门权限时操作2
   
若操作2是查询代理商,则先通过DistributorAgreementDistributorProductKindsysperson表之间的关联关系构造出一个含有代理商名称、TSM以及TSM所属部门的视图“DistributorAgreement”。然后从DistributorAgreement查出登录人员所在部门的所有代理商并返回。
   
若操作2是查询RSM,则通过sysagreementproductdeptrt_roleuser表之间的关联关系查出RSM并返回。
�/SPAN> 实现全部权限时操作3
   
不进行数据过滤,直接取全量数据即可。
�/SPAN> 将权限标志位逻辑封闭到宏中
 
将宏结果交给数据集�/SPAN>
实例
    在框架基础上,实现实例。
�/SPAN> 查询权限标志位
参数名称 参数类型 值表达式 参数说明
sys_UserID
字符串   集智数据平台传入参数模板的登录用户ID
mapKey
字符串 query2(”mis2datasource”,”select role_id from RT_ROLEUSER where user_id=? and role_id in (3,4,5)”,@sys_UserID) 权限标志位

�/SPAN> 搭建权限标志位逻辑
Case(mapKey,”
普通权限”,”操作1”,”部门权限”,”操作2”,”全部权限操作3”)

�/SPAN> 实现普通权限时操作1
   
若操作1是查询代理商,则:
select DistributorName_C as
代理商中文名称 from sysDistributor where DistributorID in (select distinct DistributorID from syslicencetsmshare where personid in (select personid from sysperson where personname in (select user_name from sjmreport.dbo.t_user where user_id = ‘”+sys_UserID+”‘))) order by DistributorName_C

   
若操作1是查询RSM,则增加一个参数dmgr,以判断登录用户是否是TSM,若返回值为0,说明是TSR,否则为TSM。参数及相关业务逻辑如下:
参数名称 参数类型 值表达式 参数说明
dmgr
整数 query2(”eosreport”,”select count(*) from syslicencetsmshare where personid in (select personid from sysperson where personname in (select user_name from sjmreport.dbo.t_user where user_id = ?))”,@sys_UserID) 判断登录用户是否是TSM,若返回值为0,说明是TSR,否则为TSM
if(dmgr>=1,”select user_name as
经理名 from sjmreport.dbo.t_user where user_id = ‘”+sys_UserID+”‘”,”select personname as 经理名 from sysperson where personid in(select personid from syslicencetsmshare where pk_lictsmshare in(select pk_lictsmshare from syslicencetsrshare where personid in(select personid from sysperson where personname in(select user_name from sjmreport.dbo.t_user where user_id = ‘”+sys_UserID+”‘))))”)

�/SPAN> 实现部门权限时操作2
   
若操作2是查询代理商,则:
SELECT
代理商中文名称 FROM sysagreement where 部门 in(select role_name from sjmreport.dbo.t_role where role_id in(select role_id from sjmreport.dbo.rt_roleuser where user_id=’”+sys_UserID+”‘ and role_id in (22,23,24,25,26,27)))

   
若操作2是查询RSM,则:
select distinct
区域销售经理 as 经理名 from sysagreement where 部门 in(SELECT 部门代码 FROM productdept where 部门ID in(select role_id-21 from sjmreport.dbo.rt_roleuser where user_id=’”+sys_UserID+”‘ and role_id in (22,23,24,25,26,27)))

�/SPAN> 实现全部权限时操作3
   
若操作2是查询代理商,则:
select DistributorName_C as
代理商中文名称 from sysDistributor where DistributorID in (select distinct DistributorID from syslicencetsmshare) order by DistributorName_C
   
若操作2是查询RSM,则:
select distinct
区域销售经理 as 经理名 from sysagreement
�/SPAN> 将权限标志位逻辑封闭到宏中
宏名称 类型 值表达式
代理商 动态宏 case(mapKey, “3″,”select DistributorName_C as 代理商中文名称 from sysDistributor where DistributorID in (select distinct DistributorID from syslicencetsmshare where personid in (select personid from sysperson where personname in (select user_name from sjmreport.dbo.t_user where user_id = ‘”+sys_UserID+”‘))) order by DistributorName_C”,”4″,”SELECT 代理商中文名称 FROM sysagreement where 部门 in(select role_name from sjmreport.dbo.t_role where role_id in(select role_id from sjmreport.dbo.rt_roleuser where user_id=’”+sys_UserID+”‘ and role_id in (22,23,24,25,26,27)))”,”select DistributorName_C as 代理商中文名称 from sysDistributor where DistributorID in (select distinct DistributorID from syslicencetsmshare) order by DistributorName_C”)
TSM
动态宏 case(mapKey, “3″,if(dmgr>=1,”select user_name as 经理名 from sjmreport.dbo.t_user where user_id = ‘”+sys_UserID+”‘”,”select personname as 经理名 from sysperson where personid in(select personid from syslicencetsmshare where pk_lictsmshare in(select pk_lictsmshare from syslicencetsrshare where personid in(select personid from sysperson where personname in(select user_name from sjmreport.dbo.t_user where user_id = ‘”+sys_UserID+”‘))))”),”4″,”select distinct 区域销售经理 as 经理名 from sysagreement where 部门 in(SELECT 部门代码 FROM productdept where 部门ID in(select role_id-21 from sjmreport.dbo.rt_roleuser where user_id=’”+sys_UserID+”‘ and role_id in (22,23,24,25,26,27)))”,”select distinct 区域销售经理 as 经理名 from sysagreement”)

�/SPAN> 将宏结果交给数据集
代理商“TSM”使用复杂SQL数据集封闭即可。

总结
    以上实现案例仅是针对在参数模板中进行数据权限控制的情况。当参数模板中数据传递到报表模板时还需要针对入参匹配数据,真正实现数据权限控制。不过,相对此过程参数模板中的控制就简单多了,不此不再实现。
   
实现以上业务逻辑也实属无奈。当集智数据平台与其它系统共享库表,集智数据平台业务数据结构必须依赖于共享库表时,该案例还是有一定的借鉴意义。
   
这种实现方案能避免就尽量避免,不能避免时,也要相信集智数据平台报表系统能够很好地解决的。

更多了解各种复杂问题的处理,可以参考:让业务用户随时可以自己定义查询报表多级部门角色按不同权限查看不同数据


分享到:
评论

相关推荐

    C语言函数参数和宏参数问题探讨.pdf

    本文将深入探讨函数参数和宏参数的区别及其在使用中的特点。 首先,我们来看函数参数。在C语言中,函数参数分为形式参数(形参)和实际参数(实参)。形参是函数定义时声明的变量,它们在函数体内可用,但超出函数...

    (EPLAN 教程及资料)EPLAN P8的部件库和宏

    宏支持参数化,这意味着在使用宏时,可以根据实际需求调整参数,如电压、电流等,使得设计更加灵活。 在EPLAN P8中,宏不仅可以用于绘制电路图,还可以应用于报表生成、项目结构规划等方面。通过宏,可以实现设计...

    Eplan部件和宏

    每个部件都包含了详细的属性信息,如技术参数、供应商信息、3D模型等,使得设计者可以快速、准确地插入和配置所需的电气元件。Eplan提供的“厂商部件库”是预设的、由各个设备制造商提供的标准部件集合,设计者可以...

    内联函数和宏的区别的分析与总结

    内联函数和宏在C++编程语言中是两种常见的代码优化技术,它们都可以用来替代函数调用,以减少函数调用带来的开销。然而,两者在实现方式、编译过程和功能特性上有着显著的区别。 首先,我们来看内联函数。内联函数...

    sourceinsight使用指和宏样例

    1. **学习资源**:SourceInsight的官方文档是了解其功能和宏编程的首选资料,同时,网络上也有许多教程和社区分享的技巧。 2. **实践应用**:通过实际操作,如设置个性化快捷键、创建和调试宏,来熟悉SourceInsight...

    Fanuc机器人宏指令和宏启动.docx

    Fanuc机器人宏指令和宏启动是其编程系统中的重要特性,能够极大提高工作效率和程序的灵活性。宏定义是将一系列程序指令打包成一个独立的指令,便于调用和执行。宏指令可以在不同场景下启动,包括程序内部调用、手动...

    手册页第5部分标准、环境和宏.pdf

    根据手册页第5部分标准、环境和宏.pdf中的描述,这个软件和相关文档是根据许可协议提供的,包括使用和披露的限制,并受到知识产权法律的保护。用户不能使用、复制、再现、翻译、广播、修改、许可、传输、分布、展示...

    开关电源明纬部件库和宏.edz

    开关电源明纬部件库和宏.edz

    C语言文件操作、预处理器和宏课件.md

    ### C语言文件操作、预处理器和宏课件知识点解析 #### 文件操作 ##### 打开文件 在C语言中,`fopen`函数用于打开一个文件。它接收两个参数:第一个参数是要打开的文件名(通常为字符串),第二个参数是打开方式。...

    Eplan—ABB部件库和宏

    本文将深入探讨"Eplan—ABB部件库和宏"这一主题,旨在帮助用户更好地理解和利用这些资源来提升其在Eplan中的设计效率。 首先,让我们了解什么是部件库。部件库是Eplan的核心组成部分之一,它包含了各种电气元件的...

    C语言常见 预处理和宏

    对于参数化的宏定义,建议在宏定义中使用括号来确保正确的运算顺序: ```c #define SUM(x, y) ((x) + (y)) ``` 如果不使用括号,可能会导致意外的结果。例如,以下宏定义可能导致错误的行为: ```c #define CUBE...

    xlwings自定义函数和宏.rar

    - **参数传递**:xlwings支持参数的双向传递,允许从Excel传递值到Python函数,并将结果返回到Excel。 - **类型转换**:xlwings会自动处理数据类型转换,如将Excel的字符串转换为Python的字符串,数字等。 - **...

    Eplan Schneider Electric P8的厂商部件库和宏.rar

    用户在Eplan P8中导入这些文件后,可以直接使用其中的部件和宏,无需从头开始创建。导入过程通常包括选择正确的文件,然后在软件内进行相应的设置,使得库和宏能够被识别和应用到设计项目中。 为了充分利用这些资源...

    c++中的宏、内联函数和宏的比较

    ### C++中的宏、内联函数和宏的比较 在C++编程中,宏和内联函数是提高代码效率和可读性的两种常见方法。它们各自有着不同的应用场景和特点,了解这些差异对于编写高质量的C++代码至关重要。 #### 宏(Macro) 宏...

    patran参数化建模实例

    - 步骤1:创建变量和宏,定义模型的关键参数和操作序列。 - 步骤2:将变量分配给Patran的具体操作,如几何修改、网格划分等。 - 步骤3:定义期望的分析结果作为输出变量,这些变量将包含在分析中的关键信息。 - ...

    汇编语言程序设计之条件指令和宏指令

    参数的使用使得宏更加灵活,能够接受不同输入并产生相应的输出。宏中的标号处理则允许在宏体内定义局部标号,避免了全局标号冲突的问题。宏嵌套允许在一个宏定义中调用另一个宏,增加代码的复用性。而宏与子程序的...

    microsoft win32程序员参考大全(五)--消息、结构和宏

    在Microsoft Win32 API编程中,消息、结构和宏是构建Windows应用程序不可或缺的元素。本文将深入探讨这些关键概念,帮助你成为一名精通Win32 API的程序员。 首先,我们来了解**消息(Message)**。在Windows操作系统...

    12. code微任务和宏任务.zip

    例如,使用Promise可以更好地组织异步代码,使得代码更加清晰和易于维护。 总的来说,"12. code微任务和宏任务"的学习资源将深入讲解JavaScript的异步模型,帮助开发者掌握如何更有效地管理异步操作,提高代码性能...

Global site tag (gtag.js) - Google Analytics