金蝶K3虽然有地方设置基础数据的查询修改删除权限,如图:
但当数据量多时候,一个一个得勾选,工作量太大了。且每当新增一个物料或者客户都要去设置一遍,工作量大。 故先想到在创建物料或客户时用触发器来自动触发, 但当用户数过多的时候触发器会很慢,拖卡系统。所以决定用定时任务处理。
一、先在物料或者客户上增加一个属性用来标识,我是增加一个所示公司属性,我是增加一个所属公司属性,设置为必填,如图:
二、建两个用户组,对这两个用户组分别设置数据权限,如果有多组权限,就要多建用户组。并让相对赢的用户加入到该用户组。
三、用SQL Server Profiler跟着两个组对应的ID和查询 修改 删除权限的ID,因为每个账套生产的ID不同,所以要跟踪。 我跟踪得到如下语句:
--取消授权
Update Access_t_ICItem Set
FDataAccessView=
SubString(FDataAccessView,1,8)+Convert(binary(1),SubString(FDataAccessView,9,1) & 191)+SubString(FDataAccessView,10,91) ,
FDataAccessEdit=
SubString(FDataAccessEdit,1,8)+Convert(binary(1),SubString(FDataAccessEdit,9,1) & 191)+SubString(FDataAccessEdit,10,91) ,
FDataAccessDelete=
SubString(FDataAccessDelete,1,8)+Convert(binary(1),SubString(FDataAccessDelete,9,1) & 191)+SubString(FDataAccessDelete,10,91)
--授权
Update Access_t_ICItem Set FDataAccessView=
SubString(FDataAccessView,1,8)+Convert(binary(1),SubString(FDataAccessView,9,1) | 64)+SubString(FDataAccessView,10,91) ,
FDataAccessEdit=
SubString(FDataAccessEdit,1,8)+Convert(binary(1),SubString(FDataAccessEdit,9,1) | 64)+SubString(FDataAccessEdit,10,91),
FDataAccessDelete=
SubString(FDataAccessDelete,1,8)+Convert(binary(1),SubString(FDataAccessDelete,9,1) | 64)+SubString(FDataAccessDelete,10,91)
其中FDataAccessView 是查询权限;FDataAccessEdit 是编辑权限;FDataAccessDelete 是删除权限。后面跟的数据是K3代码逻辑生产的。 我现在只要加上where条件 即可
where ( FItemID in (select FItemID from t_ICItem where F_108=2)
or FItemID in (select FParentID from t_ICItem where F_108=2)
or FItemID in ( select FParentID from t_Item where FItemClassID=4 and FItemID in( select FParentID from t_ICItem where F_108=2))
or FItemID in ( select FParentID from t_Item where FItemClassID=4 and FItemID in( select FParentID from t_Item where FItemClassID=4 and FItemID in( select FParentID from t_ICItem where F_108=2)))
or FItemID in ( select FParentID from t_Item where FItemClassID=4 and FItemID in( select FParentID from t_Item where FItemClassID=4 and FItemID in( select FParentID from t_Item where FItemClassID=4 and FItemID in( select FParentID from t_ICItem where F_108=2))))
or FItemID in ( select FParentID from t_Item where FItemClassID=4 and FItemID in( select FParentID from t_Item where FItemClassID=4 and FItemID in( select FParentID from t_Item where FItemClassID=4 and FItemID in( select FParentID from t_Item where FItemClassID=4 and FItemID in( select FParentID from t_ICItem where F_108=2)))))
) and FItemID>0
说明F_108 是我在物料增加属性对应的字段,如果是 对客户设置权限那t_ICItem 就改成 表t_Supplier即可。完整代码入附件
四、把语句放到sqlserver的作业上即可