2009-11-06 89 views
1

我有一个Access应用程序,其中有一个员工表。员工是组织中几个不同级别的一部分。该组织有1个总经理,5个部门负责人,每个部门负责人是几个主管人员,在这些主管人员下面是工作人员。以表格形式表示的组织结构图

根据员工的职位,他们只能访问他们下方的记录。

我想用某种级别的系统来表示组织。我看到的问题是,同一级别上有很多人(例如主管),但他们不应该访问另一个部门的主管记录。我应该如何处理这个问题?

+0

为什么你不概述你正在考虑的方法 - 这可能会产生更多的反应,并将问题带入编程领域(我认为它是无论如何,因为模式设计是应用程序的一部分设计,即使它不涉及任何实际的代码冲击)。 – 2009-11-06 22:08:37

回答

2

一个保持这种分层数据在数据库中的常见的方法只使用一个表,包含字段是这样的:

  1. 用户ID(主键)
  2. 的userName
  3. supervisorId(个体经营指的是另一个userId在同一个表中)
  4. positionCode(可以是简单的1 = lakey,2 = supervisor;或者指向另一个表的位置的外键等)
  5. ...无论您需要为每位员工存储...

然后,您的应用程序使用SQL查询来确定权限。要找出主管'X'(例如,其userId为'3')的员工可以查看,可以查询supervisorId = 3的所有员工。

如果你想要更高级的老板能够看到他们下面的每个人,最简单的方法就是做一个递归搜索。即查询向这位大老板报告的每个人,并为他们每个人查询向他们报告的人,一直到树上。

这有道理吗?你让数据库完成了对所有用户进行排序的工作,因为电脑擅长这种事情。

如果您希望某些人拥有不同的权限,我会在此示例中添加positionCode ...例如,对于有权查看所有员工列表的HR员工,您可能有一个代码“99”。


也许我会让另一些人试图更好地解释它...

+0

你能帮我一下SQL查询吗?你认为这样的事情会起作用吗? SELECT * FROM tblemployee WHERE userId IN(SELECT userId FROM tblemployee WHERE SupervisorId = 3) – zohair 2009-11-09 14:07:50

+0

不确定在那里使用双层查询会发生什么。 要让所有向userId为3的主管报告的员工只需要“SELECT * FROM tblemployee WHERE SupervisorId = 3”。 – ewall 2009-11-09 14:58:24

+0

如果您试图让所有员工都处于高级经理之下...我不相信MS Access可以在SQL中执行真正的递归查询;但是你可以使用VBA代码,我不能在这里为你写信。但想法是这样的:创建一个名为GetAllReports的函数,给它一个你想要检查的主管的ID,让它做以下操作:(1)查询所有主管是你给它的ID的ID,(2)对于找到的每个id,为该id再次运行_itself_并保留结果,并(3)返回从初始查询中收集的所有id以及每次运行GetAllReports时收集到的所有id。 – ewall 2009-11-09 15:01:02