'解决的方法是在模块中新建一个模块,写上下面的函数Public Function f_bit(ByVal a&, ByVal b&, pro$) Select Case pro Case "or", "|" f_bit = a Or b Case "and", "&" f_bit = a And b Case "xor", "^" f_bit = a Xor b End Select End Function
'然后就可以在视图中调用这个函数来实现位运算Select a from 表 Where f_bit(A,2,"&")=2
--还是换种思路吧,增加一个表,来记录权限分配情况,这样就兼顾了效率和通用性的问题.示例: 权限分配表 记录编号 操作员编号 1 1 1 2 1 4 2 2 --查询某个操作员(例如2号操作员)可以操作的记录,就可以用: select * from 记录表 as a where exists(select 1 from 权限分配表 where 操作员编号=2 and 记录编号=a.记录编号)--或者这样查询: select a.* from 记录表 as a inner join 权限分配表 as b on a.记录编号=b.记录编号 and b.操作员编号=2
Select Case pro
Case "or", "|"
f_bit = a Or b
Case "and", "&"
f_bit = a And b
Case "xor", "^"
f_bit = a Xor b
End Select
End Function
使用外部函数是否降低了效率?这样比用 Like 来模拟 是否效率更低实际问题就是要解决 找出某内容在某序列(有限序列) 中的存在记录
需要一种效率较高的查找方法 并且兼容于 SQLSERVER 和 ACCESS
如: 在 一个产品资料列表 中 有一个字段 CheckOut 用来记录 可以记录每个记录的可操作用户
列表,目前有2种设计方法,(用户数为有限序列,并且不大于24 个)方法1: 用Like ,用A,B,C....单字母来代表每个用户ID, 产品表中 建立 CheckOut VarChar(50),不设置索引(因为索引无效)某条数据 可操作用户序列 为 checkout=',A,B,D,' (,分割每个用户)
要查找 A 用户可以操作的数据 则用 Select * from 产品 Where CheckOut Like '%,A,%'方法2: 改用按位AND运算 用户ID 用整数序列 如: 1,2,4,8,16,32,64.......
产品表中 建立 CheckOut Int 设置索引
checkout = 1+2+4要查找 1 用户可以操作的数据 则用 Select * from 产品 Where (Checkout & 1)<>0实验证明 方法2效率最高,但是该方法不能兼容 Access (主要是Access 无位AND运算) ,而方法1 效率太低. 是否有其他方法来实现该目的.另外问一下 1,2,4,8,16,32.... 这种数叫什么序列,有没有学术名称
软件用VB + ADO+ Access/SQLServer 来实现,该方法必须同时可以在Access/SQLserver 中使用
权限分配表
记录编号 操作员编号
1 1
1 2
1 4
2 2
--查询某个操作员(例如2号操作员)可以操作的记录,就可以用:
select * from 记录表 as a
where exists(select 1 from 权限分配表 where 操作员编号=2 and 记录编号=a.记录编号)--或者这样查询:
select a.* from 记录表 as a
inner join 权限分配表 as b on a.记录编号=b.记录编号 and b.操作员编号=2
而且上述语句,在ACCESS和SQL中都是被支持的.当然,维护这个权限分配表可能要比维护一个字段要麻烦一点.
还有没有其他更好的方法?