当前位置:首页 > 技术心得 > 正文内容

金蝶K3:直接SQL报表中进行核算项目数据授权控制的方法

xjtudll5年前 (2022-05-16)技术心得7410

--【第一步】:
--根据核算项目类别ID,查询到对应核算项目的数据授权表及查看、修改、删除的权限字段名和权限掩码
--例如查出客户的数据授权表为Access_t_Organization
--几乎所有的核算项目的查看、修改、删除的权限字段名和权限掩码都是以下这样:
--FDataAccessView:1 FDataAccessEdit:4194304 FDataAccessDelete:65536
--此SQL脚本示例以检查核算项目的查看权限(FDataAccessView)为例
select FAccessTable,* from t_AccessRowData where fclassid=1

--【第二步】:
--根据用户ID获取二进制位权限信息(FAccessUUID)
Select top 1 t1.FUserID,t1.FAccessUUID from t_User t1 where t1.FUserID=16501
and t1.FAccessUUID>0
Union
Select t2.FUserID,t2.FAccessUUID from t_Group t1 left join t_User t2 on
t1.FGroupID=t2.FUserID where t1.FGroupID<>0 and t1.FUserID=16501
and t2.FAccessUUID>0
--【第三步】
--根据上两步查出来的数据权限表(Access_t_Organization)和权限字段名(FDataAccessView)
--以及用户的二进制权限位(FAccessUUID值为:108)
--按照固定的算法,拼接出数据权限关键过滤条件Substring...
DECLARE @ByteNum AS INT
DECLARE @Comp AS INT
DECLARE @AccessUUID AS INT
SET @AccessUUID=108 --此变量值为第二步查出来用户的二进制权限位(FAccessUUID)
SET @ByteNum = floor(@AccessUUID / 8) + 1
SET @Comp = power(2,(7 - ((@AccessUUID + 7) Mod 8)))
Substring(Access_t_Organization.FDataAccessView,@ByteNum,1) & @Comp & <>0
--如果@AccessUUID=108,则计算出来的过滤条件结果为:
Substring(Access_t_Organization.FDataAccessView,14,1) & 16 & <>0
--【第四步】:
--将核算项目物理表(t_Organization)左连接上核算项目数据权限表(Access_t_Organization),
--再拼接上第三步计算出来的关键过滤条件(Substring(Access_t_Organization.FDataAccessView,14,1) & 16 & <>0)
--由于表连接时用了表别名,注意替换过滤条件中的表名(Access_t_Organization)为SQL中使用的表别名(Access_t_Organization1)
--最终形成的数据权限过滤的SQL如下,此SQL查询出的结果即为用户16501具有查看权限的核算项目数据记录:
SELECT t1.FItemID FROM t_Item t1 with(index (uk_Item2))
LEFT JOIN t_Organization x2 ON t1.FItemID = x2.FItemID
Left join Access_t_Organization as Access_t_Organization1 on Access_t_Organization1.FItemID=t1.FItemID
WHERE FItemClassID = 1 --核算项目类别ID
AND t1.FDeleteD=0 --排除掉禁用的核算项目
and ((Substring(Access_t_Organization1.FDataAccessView,14,1) & 16<>0)--过滤出用户16501具有查看权限的记录
or (isnull(t1.FItemID,0)=0)) --没有关联上数据权限表的核算项目默认拥有权限
ORDER BY t1.FNumber

--以上示例为怎么查询出用户16501具有核算项目“客户”查看权限的数据
--而实际编写直接SQL报表时,可把以上语句中的用户16501,直接替换成当前登录用户的关键字:#GetInnerVariable(UserID)#
--另外不同的核算项目,类别ID、核算项目物理表、核算项目数据权限表,需要做相应替换。

扫描二维码推送至手机访问。

版权声明:本文由鸟的天空发布,如需转载请注明出处。

本文链接:http://xjtudll.cn/Exp/645/

标签: 金蝶
分享给朋友:

“金蝶K3:直接SQL报表中进行核算项目数据授权控制的方法” 的相关文章

iPhone下xib转成iPad的xib

iPhone下xib转成iPad的xib

参考文献:http://blog.csdn.net/kmyhy/article/details/7715397 在Xcode 3中,将xib从iPhone版转变为iPad版,通过Create iPad Version菜单。 但在Xcode 4及Xcode5中,这个菜单找不到了。但是可以通过其...

电容主要技术参数

电容主要技术参数

1、标称容值及误差 标称值符合E系列。 2、额定工作电压 电容器中的电介质能够承受的电场强度是有限的,当施加在电容器上的电压超过一定值时,电介质有可能被击穿而损坏。额定工作电压是指,在规定的工作温度范围内,电容器在电路中连续工作而不被击穿的加在电容器上的最大有效值,习惯上叫电容器的耐压。 额定电压通...

SQL Server 2012 自动增长列,值跳跃问题(自增增加1000)【转载】

SQL Server 2012 自动增长列,值跳跃问题(自增增加1000)【转载】

介绍从 SQL Server 2012 版本开始, 当SQL Server 实例重启之后,表格的自动增长列的值会发生跳跃,而具体的跳跃值的大小是根据增长列的数据类型而定的。如果数据类型是 整型(int),那么跳跃值为 1000;如果数据类型为 长整型(bigint),那么跳跃值为 10000。从我们...

金蝶K3新增发货通知单时在“选单号”中找不到此客户的销售订单

金蝶K3新增发货通知单时在“选单号”中找不到此客户的销售订单

问题描述:新增“发货通知单”时在“选单号”项按“F7”没有销售订单可选,这个销售订单确定是没有做发货通知单的,如下图所示: 解决方法:1、找到相应的销售订单,下推可以生成发货通知单。(有些人喜欢用新增的方式而不是下推的方式生成单据)2、试一下了另一个客户使用“新增”的方式可以在选单号中找到销售订单...

运放平衡电阻的作用

运放平衡电阻的作用

运放输入端所接电阻要平衡,目的是使集成运放两输入端的对地直流电阻相等,运放的偏置电流不会产生附加的失调电压。但有些电路对失调电压要求并不高,例如交流音频放大器。有些运放偏置电流很小,即使输入端电阻不平衡也不会对失调电压产生什么影响,这些电路就可以不要求输入端电阻平衡。 以反相放大器来说明平衡电阻的...

windows server 2008R2 初始密码策略:老提示密码不符合策略

参考资料: http://zhidao.baidu.com/link?url=52XEZ-w-pIcmk2S-UkB8V1b9NOHJm3kBPECZHwD6WhT7DxofLXu03UsCFN_DqEJ4KJ6UtlL-b7a4c-yNarXfCa 问题: windows...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。