金蝶K3用户数据权限之二次开发接入

金蝶K3用户数据权限之二次开发接入

金蝶K3可以设置用户的数据权限,例如业务员对客户信息是敏感的,全部业务员虽然都可以打开销售订单模块,但不是他跟进的客户的订单是无法在序时簿中查看到的。


一、介绍

在金蝶软件内部是可以很容易设置的,启用某一核算项目的数据权限,设置用户的数据权限即可。

软件界面是这样子的:


数据库是这样子的,一个 binary(100) 字段保存了全部用户对此客户是否有数据操作权限:



二、实现

1、浏览权限(一次查询全部用户和客户太多太慢,自己可再修改SP参数按客户查全部用户,或按用户查全部客户)

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
/*
DECLARE @FUserID AS INTEGER
SELECT @FUserID = FUserID FROM dbo.t_User WHERE FName='用户名称'
DECLARE @CustomerId AS INTEGER
SELECT @CustomerId = FItemID FROM dbo.t_Organization WHERE FShortNumber='客户编码'
EXEC K3Plus_用户数据权限_客户_浏览 @FUserID,@CustomerId
*/
-- =============================================
ALTER PROCEDURE K3Plus_用户数据权限_客户_浏览
	@user_FItemId AS INT,
	@organization_FItemId AS INT
AS
BEGIN
	SET NOCOUNT ON;

	--1.用户
	--SELECT * FROM dbo.t_User WHERE FName='ysy' --16404

	--2.查询某个用户的(客户)数据权限
	SELECT  
			t_customer.FItemID    AS '客户ID',
			t_customer.FNumber    AS '客户代码' ,
			t_customer.FName      AS '客户名称' ,
			t_right.UserID        AS '用户ID',
			t_right.UserName      AS '用户名称',
			
			t_u2.FDescription     AS '用户说明',
			t_u2.FForbidden       AS '用户禁用',
			t_u2.FUserTypeID      AS '用户类型ID',
			t_u2.FAccessUUID      AS '用户FAccessUUID',
			t_u2.FEmpID           AS '用户FEmpID',
			
			t_right.FViewAccess   AS '查询权' ,
			t_right.FEditAccess   AS '修改权' ,
			t_right.FDeleteAccess AS '删除权'
			
	FROM    ( SELECT    t_access.FItemID ,   --核算项目(客户)ID
						t_u.FUserID AS 'UserID',     --用户ID
						t_u.FName AS 'UserName' ,      --用户Name

				--
						MIN(t_access.FParentIDX) AS FParentIDX ,
				
				--查看权限  
						( CASE WHEN MAX(SUBSTRING(t_access.FDataAccessView,
												  t_u.FAccessUUID / 8 + 1, 1)
										& POWER(2, 7 - ( t_u.FAccessUUID + 7 ) % 8)) > 0
							   THEN 1
							   ELSE 0
						  END ) AS FViewAccess ,
				         
				--修改权限
						( CASE WHEN MAX(SUBSTRING(t_access.FDataAccessEdit,
												  t_u.FAccessUUID / 8 + 1, 1)
										& POWER(2, 7 - ( t_u.FAccessUUID + 7 ) % 8)) > 0
							   THEN 1
							   ELSE 0
						  END ) AS FEditAccess ,
				  
				--删除权限
						( CASE WHEN MAX(SUBSTRING(t_access.FDataAccessDelete,
												  t_u.FAccessUUID / 8 + 1, 1)
										& POWER(2, 7 - ( t_u.FAccessUUID + 7 ) % 8)) > 0
							   THEN 1
							   ELSE 0
						  END ) AS FDeleteAccess
			  FROM      t_user t_u ,
						Access_t_Organization t_access
						--INNER JOIN dbo.Access_t_Organization t_access ON t_u.FUserID = ( SELECT FUserID FROM dbo.t_User WHERE FName = 'ysy') --16404 -- 用户ID
			  --WHERE     t_u.FUserID = ( SELECT  FUserID FROM    dbo.t_User WHERE   FName = 'ysy') --16404 -- 用户ID
			  WHERE 1=1 
			  AND t_u.FUserID = @user_FItemId  --条件:用户
			  AND t_access.FItemID = @organization_FItemId --条件:客户
			  GROUP BY  t_access.FItemID ,t_u.FUserID,t_u.FName
			) t_right	        
	        
			LEFT JOIN dbo.t_Organization t_customer ON t_right.FItemID = t_customer.FItemID
			LEFT JOIN dbo.t_User t_u2 ON t_right.UserID=t_u2.FUserID --用户(详细)
	WHERE   1 = 1
			AND FNumber IS NOT NULL
			--AND (t_right.FDeleteAccess=1 OR t_right.FEditAccess =1 OR t_right.FViewAccess =1) --不显示无权限的行
	ORDER BY t_customer.FNumber



END
GO


2、修改权限

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
/*
DECLARE @userId AS INT
DECLARE @customerId AS INT
SELECT @userId = FUserID FROM dbo.t_User WHERE FName LIKE '用户名称'
SELECT @customerId = FItemID FROM dbo.t_Organization WHERE FShortNumber LIKE '客户编码'
EXEC K3Plus_用户数据权限_客户_更新 @userId,@customerId,1,1,0
*/
-- =============================================
ALTER PROCEDURE K3Plus_用户数据权限_客户_更新
	@user_FItemId         AS INT,
	@organization_FItemId AS INT,
	@right_view           AS BIT = NULL,
    @right_edit           AS BIT = NULL,
    @right_delete         AS BIT = NULL
AS
BEGIN
	SET NOCOUNT ON;
	
	--1.用户(权限唯一ID标识)
	DECLARE @user_AccessUUID AS INT
	SELECT @user_AccessUUID = FAccessUUID FROM t_User WHERE FUserID = @user_FItemId
	
	--------------------------------------------------------------------------------	
	
	--2.客户(用户老权限data)
	DECLARE @access_dat_view   AS BINARY(100)
	DECLARE @access_dat_edit   AS BINARY(100)
	DECLARE @access_dat_delete AS BINARY(100)
	SELECT 
		@access_dat_view   = FDataAccessView,	
		@access_dat_edit   = FDataAccessEdit,
		@access_dat_delete = FDataAccessDelete
	FROM dbo.Access_t_Organization WHERE FItemID=@organization_FItemId
	
	--------------------------------------------------------------------------------
	
	--3.哪个字节byte	
	DECLARE @byteIndex_view   AS INT --view
	DECLARE @byteIndex_edit   AS INT --edit
	DECLARE @byteIndex_delete AS INT --delete
	SELECT @byteIndex_view   = SUBSTRING(@access_dat_view,  @user_AccessUUID/8+1,1)
	SELECT @byteIndex_edit   = SUBSTRING(@access_dat_edit,  @user_AccessUUID/8+1,1)
	SELECT @byteIndex_delete = SUBSTRING(@access_dat_delete,@user_AccessUUID/8+1,1)
	
	--------------------------------------------------------------------------------
	
	--4.bit位
	DECLARE @bitIndex    AS INT --授权
	DECLARE @bitIndexNot AS INT --取消授权
	SELECT @bitIndex    =   POWER(2,7-(@user_AccessUUID+7)%8)
	SELECT @bitIndexNot = ~(POWER(2,7-(@user_AccessUUID+7)%8))
	
	--bit所在位置
	DECLARE @start_1  AS INT
	DECLARE @offset_1 AS INT
	DECLARE @start_2  AS INT 
	DECLARE @offset_2 AS INT
	SELECT @start_1   = CASE WHEN ( @user_AccessUUID/8+1 ) > 1   THEN                                  1   ELSE 0 END
	SELECT @offset_1  = CASE WHEN ( @user_AccessUUID/8+1 ) > 1   THEN       ( @user_AccessUUID/8+1 ) - 1   ELSE 0 END
	SELECT @start_2   = CASE WHEN ( @user_AccessUUID/8+1 ) < 200 THEN       ( @user_AccessUUID/8+1 ) + 1   ELSE 0 END
	SELECT @offset_2  = CASE WHEN ( @user_AccessUUID/8+1 ) < 200 THEN 200 - ( @user_AccessUUID/8+1 )       ELSE 0 END
	--select @start_1,@offset_1,@start_2,@offset_2
	
	--------------------------------------------------------------------------------	
	
	--5.用户新权限data
	DECLARE @access_dat_view_2   AS BINARY(100)
	DECLARE @access_dat_edit_2   AS BINARY(100)
	DECLARE @access_dat_delete_2 AS BINARY(100)
	
	--5.1.用户新权限(view)
	SELECT @access_dat_view_2 = @access_dat_view --默认用原值不修改(当为null时)
	DECLARE @value_view AS INT
	IF(@right_view=1)        --1则授权(按|位或)
		SELECT @value_view = @byteIndex_view | @bitIndex
	ELSE IF(@right_view=0)   --0则取消授权(按&位与)
		SELECT @value_view = @byteIndex_view & @bitIndexNot
	IF(@right_view=1 OR @right_view=0)
	BEGIN
		SELECT @access_dat_view_2 = 
					SUBSTRING( @access_dat_view,@start_1,@offset_1 ) + 
					CONVERT( BINARY(1),@value_view) + 
					SUBSTRING(@access_dat_view,@start_2,@offset_2)
	END
	
	--5.2.用户新权限(edit)
	SELECT @access_dat_edit_2 = @access_dat_edit --默认用原值不修改(当为null时)
	DECLARE @value_edit AS INT
	IF(@right_edit=1)        --1则授权(按|位或)
		SELECT @value_edit = @byteIndex_edit | @bitIndex
	ELSE IF(@right_edit=0)   --0则取消授权(按&位与)
		SELECT @value_edit = @byteIndex_edit & @bitIndexNot
	IF(@right_edit=1 OR @right_edit=0)
	BEGIN
		SELECT @access_dat_edit_2 = 
				SUBSTRING( @access_dat_edit,@start_1,@offset_1 ) + 
				CONVERT( BINARY(1),@value_edit) + 
				SUBSTRING(@access_dat_edit,@start_2,@offset_2)
	END	
	
	--5.3.用户新权限(delete)
	SELECT @access_dat_delete_2 = @access_dat_delete --默认用原值不修改(当为null时)
	DECLARE @value_delete AS INT
	IF(@right_delete=1)      --1则授权(按|位或)
		SELECT @value_delete = @byteIndex_delete | @bitIndex
	ELSE IF(@right_delete=0) --0则取消授权(按&位与)
		SELECT @value_delete = @byteIndex_delete & @bitIndexNot
	IF(@right_delete=1 OR @right_delete=0)
	BEGIN
		SELECT @access_dat_delete_2 = 
				SUBSTRING( @access_dat_delete,@start_1,@offset_1 ) + 
				CONVERT( BINARY(1),@value_delete) + 
				SUBSTRING(@access_dat_delete,@start_2,@offset_2)
	END
	
	--------------------------------------------------------------------------------
	--9.更新
	UPDATE dbo.Access_t_Organization
	SET 
        FDataAccessView   = @access_dat_view_2,
        FDataAccessEdit   = @access_dat_edit_2,
        FDataAccessDelete = @access_dat_delete_2
	WHERE FItemID = @organization_FItemId
	
END
GO


3、新增客户核算项目时,增加初始数据权限行

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
/*
DECLARE @customerId AS INT
SELECT @customerId = FItemID FROM dbo.t_Organization WHERE FShortNumber LIKE '客户编码'
EXEC K3Plus_用户数据权限_客户_新增 @customerId
*/
-- =============================================
ALTER PROCEDURE K3Plus_用户数据权限_客户_新增
	@organization_FItemId AS INT
AS
BEGIN
	SET NOCOUNT ON;

	--100(max user)
	DECLARE @maxValue INT	
	SELECT TOP 1 @maxValue = FValue FROM t_SystemProfile WHERE FCategory = 'BOS' AND FKey = 'AccessDataNumber'
	--SELECT @maxValue
	
	--新增
	IF NOT EXISTS (SELECT    *
				  FROM      Access_t_Organization
				  WHERE     FItemID = @organization_FItemId ) 
	INSERT  INTO Access_t_Organization
			( FItemID ,
			  FParentIDX ,
			  FDataAccessView ,
			  FDataAccessEdit ,
			  FDataAccessDelete
			)
	VALUES  ( @organization_FItemId ,
			  0 ,
			  CONVERT(VARBINARY(7200), REPLICATE(CHAR(0), 7200)) ,
			  CONVERT(VARBINARY(7200), REPLICATE(CHAR(0), 7200)) ,
			  CONVERT(VARBINARY(7200), REPLICATE(CHAR(0), 7200))
			)
			
	--待遍历的初始权限列表
	DECLARE @tRight AS TABLE(FAccess INT,FAccessUUID INT,FByteNum INT,FBitNo INT)
	INSERT @tRight
	        ( FAccess ,
	          FAccessUUID ,
	          FByteNum ,
	          FBitNo
	        )
	SELECT  t1.FAccess ,
			t2.FAccessUUID ,
			( FAccessUUID / 8 + 1 ) FByteNum ,
			POWER(2, 7 - ( FAccessUUID + 7 ) % 8) FBitNo
	FROM    t_User t2
			LEFT JOIN t_DataTypeRight t1 ON t1.FUserID = t2.FUserID
											AND t1.FType = 1
											AND t1.FClassID = 1
	WHERE   t2.FAccessUUID > 0
			AND ( t1.FAccess & 16 <> 0
				  OR t1.FAccess & 8 <> 0
				  OR t1.FAccess IS NULL
				  --OR t2.FUserID = 16394 --Administrator
				)
	--SELECT * FROM @tRight
	
	----------------------------------------------------------------------
	--使用游标遍历
	DECLARE @FAccess AS INT
	DECLARE @FAccessUUID AS INT
	DECLARE @FByteNum AS INT
	DECLARE @FBitNo AS INT
	
	--声明游标
	DECLARE cur CURSOR READ_ONLY
	FOR SELECT FAccess,FAccessUUID,FByteNum,FBitNo FROM @tRight
	
	--打开游标
	OPEN cur
	
	--读取第1行数据(将值存入变量)
	FETCH NEXT FROM cur 
	INTO @FAccess,@FAccessUUID,@FByteNum,@FBitNo
	
	--用while循环控制游标活动
	WHILE(@@fetch_status=0)
	BEGIN
		--操作
		IF(@FByteNum=1)
		BEGIN		
			UPDATE  t1
			SET     t1.FDataAccessView   =                                                      CONVERT(BINARY(1), SUBSTRING(t1.FDataAccessView,  @FByteNum, 1) | @FBitNo)  + SUBSTRING(t1.FDataAccessView,  @FByteNum + 1, @maxValue - @FByteNum) ,
					t1.FDataAccessEdit   =                                                      CONVERT(BINARY(1), SUBSTRING(t1.FDataAccessEdit,  @FByteNum, 1) | @FBitNo)  + SUBSTRING(t1.FDataAccessEdit,  @FByteNum + 1, @maxValue - @FByteNum) ,
					t1.FDataAccessDelete =                                                      CONVERT(BINARY(1), SUBSTRING(t1.FDataAccessDelete,@FByteNum, 1) | @FBitNo)  + SUBSTRING(t1.FDataAccessDelete,@FByteNum + 1, @maxValue - @FByteNum)
			FROM    Access_t_Organization t1
			WHERE   FItemID = @organization_FItemId
		END
		ELSE IF(@FByteNum>1)
		BEGIN		
			UPDATE  t1
			SET     t1.FDataAccessView   = SUBSTRING(t1.FDataAccessView,   1, @FByteNum - 1) +  CONVERT(BINARY(1), SUBSTRING(t1.FDataAccessView,  @FByteNum, 1) | @FBitNo) + SUBSTRING(t1.FDataAccessView,   @FByteNum + 1, @maxValue - @FByteNum) ,
					t1.FDataAccessEdit   = SUBSTRING(t1.FDataAccessEdit,   1, @FByteNum - 1) +  CONVERT(BINARY(1), SUBSTRING(t1.FDataAccessEdit,  @FByteNum, 1) | @FBitNo) + SUBSTRING(t1.FDataAccessEdit,   @FByteNum + 1, @maxValue - @FByteNum) ,
					t1.FDataAccessDelete = SUBSTRING(t1.FDataAccessDelete, 1, @FByteNum - 1) +  CONVERT(BINARY(1), SUBSTRING(t1.FDataAccessDelete,@FByteNum, 1) | @FBitNo) + SUBSTRING(t1.FDataAccessDelete, @FByteNum + 1, @maxValue - @FByteNum)
			FROM    Access_t_Organization t1
			WHERE   FItemID = @organization_FItemId
		END
		
		
		
		--在循环体内将读取其余行数据(将值存入变量)
		FETCH NEXT FROM cur
		INTO @FAccess,@FAccessUUID,@FByteNum,@FBitNo 
	END
	
	--关闭游标
	CLOSE cur
	
	--删除游标
	DEALLOCATE cur
	
	----------------------------------------------------------------------
	
END
GO




三、完了

此文非全部原创,参考了一个论坛里SQL关于位运算的代码,但已找不到其网址了,故无法转载其网址。












  • 1
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
安装服务器时首先需要在【添加或删除程序】-【添加或删除windows组件】,将应用程序服务器安装上,然后运行资源光盘进行环境检测,检测完后运行安装光盘进行安装K/3。 中间层信任注册: 方法一: 1、新建一个操作系统管理员用户,例如:新增kingdee用户(需加入管理员组); 2、启用来宾用户guest,且guest必需为空密码; 3、注册中间层,选信任方式,输入用户:wilkeny\kingdee,计算机名\用户名格式或手工注册中间层; 4、在进行中间层信任注册之后,依打开【管理工具】-【本地安全策略】-【本地策略】-【安全选项】-网络访问:本地账的共享及安全模式更改为“仅来宾”,帐: 使用空白密码的本地帐只允许进行控制台登录更改为禁用。 5、【本地策略】-用户权限:分配,双击打开【拒绝从网络访问这台计算机】,将列表中的用户清空。 中间层交互式注册: 1、注册中间层,选交互式方式进行注册; 2、在服务器上及客端都新建一个相同的操作系统管理员用户,且密码相同,例如:新增KDUSER用户(需加入管理员组); 3、在进行中间层交互式注册之后,依打开【管理工具】-【本地安全策略】-【本地策略】-【安全选项】-网络访问:本地账的共享及安全模式更改为“经典”,帐: 使用空白密码的本地帐只允许进行控制台登录更改为禁用;账:来宾账状态设置为禁用。4、客端打开远程组件配置进行连中间层服务器即可。 感谢您对金蝶公司的支持! 客端没有服务器。中间层的设置好COM+和DTC,环境检测全部通过了,SQL安装好了。客端远程组件设置成服务器端的IP就OK了
### 回答1: 金蝶K3系列软件是金蝶公司开发的一套企业管理软件系统。而金蝶K3序事薄二次开发视频,则是指关于如何进行金蝶K3序事薄二次开发的视频。 二次开发是在原有软件的基础上进行功能定制和扩展,以满足企业个性化需求的一种开发方式。金蝶K3序事薄是金蝶K3企业管理软件的一部分,主要用于管理企业的序事业务,包括订单管理、生产管理、销售管理、采购管理等等。 金蝶K3序事薄二次开发视频的目的是向用户展示如何利用金蝶K3序事薄进行二次开发,以实现个性化需求。视频通常会介绍一些基本的开发流程和注意事项,比如如何在金蝶K3开发平台上创建项目、如何进行开发和调试、如何进行界面定制等等。 通过观看金蝶K3序事薄二次开发视频,用户可以学习到如何利用金蝶K3开发平台进行二次开发的技巧和方法,进而根据企业实际需求,对金蝶K3序事薄进行定制和扩展。这样,企业可以更好地适应自身的经营需求,提高工作效率和管理水平。 总之,金蝶K3序事薄二次开发视频为用户提供了一个学习和实践的平台,帮助用户了解和掌握金蝶K3序事薄的二次开发技术,从而更好地运用金蝶K3软件系统,并适应企业的发展需求。 ### 回答2: 金蝶K3序事薄是金蝶软件公司开发的一款企业级管理软件,它有着强大的功能和灵活的应用性。而二次开发视频是指针对金蝶K3序事薄进行的二次开发的教学视频。 金蝶K3序事薄是一种常用的企业级管理软件,在企业管理中扮演着重要角色。而二次开发视频的存在则是为了帮助用户更好地使用该软件,并且根据自身需求进行个性化的定制。通过观看二次开发视频,用户可以了解到如何对K3序事薄进行增加、修改、删除等操作,以及如何进行数据导入和导出等功能。 二次开发视频通常包括了软件的基础知识、开发环境的搭建、常用口和编程技巧等内容。通过视频的演示和讲解,用户可以学习到如何使用金蝶提供的开发工具和口进行二次开发,从而使K3序事薄更加符合企业的需求,提高工作效率和管理水平。 金蝶K3序事薄二次开发视频的好处在于帮助用户深入了解软件的功能和特性,学习到如何根据实际需求进行个性化定制,并提供了一些实用的开发技巧和经验。这样的视频教学可以节省用户的学习时间和精力,并且让用户能够快速上手使用二次开发工具。 总而言之,金蝶K3序事薄二次开发视频是为了帮助用户更好地使用该软件、实现个性化需求而提供的教学材料,通过视频的学习,用户可以更好地掌握软件的开发技巧和功能特性,提高企业的管理水平和工作效率。 ### 回答3: 金蝶K3序事薄是一款企业级管理软件,它包含了各种功能模块,以满足企业的日常运营和管理需求。对于一些特定的企业需求,金蝶K3序事薄还支持二次开发,以实现个性化定制和功能扩展。 金蝶K3序事薄二次开发视频是针对这个软件的二次开发过程和方法进行的录像教学。这些视频通常会包含以下内容: 1. 环境搭建:介绍如何配置开发环境,包括安装开发工具、配置开发服务器等。这样可以确保开发者具备顺利进行二次开发的基础条件。 2. 开发基础:介绍金蝶K3序事薄的基本开发框架和原理,包括数据库结构、数据交互方式等。这对于初二次开发的人来说非常重要,可以让他们了解软件内部的运行机制。 3. 功能定制:介绍如何根据企业自身的需求进行功能定制。这包括添加新的功能模块、修改现有功能等。开发者可以通过视频学习具体的开发技术和操作步骤。 4. 报表设计:介绍如何设计和定制符合企业需求的报表。这对于需要定制特定报表的企业来说尤为重要,通过视频可以学会使用报表设计工具、设计报表模板等。 通过观看金蝶K3序事薄二次开发视频,企业可以提高其内部人员的技术能力,实现更高程度的软件定制化,更好地适应企业的特殊需求。视频教学的方式生动直观,使企业能够更快速地学习和掌握二次开发技能,提升自身竞争力。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值