从员工数据库生成组织结构图






3.23/5 (18投票s)
2004年7月24日
6分钟阅读

266390

14380
使用 ASP 和 Microsoft Excel 从员工数据库生成组织结构图
引言
本文介绍了一个简单的程序,用于从您的员工数据库表中生成组织结构图。它根据员工之间的层级关系绘制图表。
背景
由于我们需要生成这种图表,我们尝试使用网络上任何现成且免费共享的工具,但都没有找到。最终,我们找到了一个合理的解决方案,现在与您分享。
使用的工具
- 数据库:Microsoft Access(或 SQL Server 或 Oracle)
- 服务器端:Active Server Pages
- 客户端:HTML
- 客户端脚本:JavaScript / VB Script
- 表示层:Microsoft Excel(用于生成图表)
方法论
为了解释这种方法,让我们以一个具有以下层级关系的示例员工数据库为例:
表 1
职级 | 描述 | 职位 | 直接上司 |
1 | 高层管理 | 部门总经理 (DGH) | --无-- |
2 | 部门主管 | 副部门主管 (DDH) | 部门总经理 (DGH) |
3 | 科长 | SH | 副部门主管 (DDH) |
4 | 工程师 | DE | SH |
4 | 制图员 | DM | SH |
所有 DE 和 DM 都将向各自的 SH 汇报。同样,所有 SH 都将向各自的 DDH 汇报。请注意,SH 下有两个类别的员工(DE 和 DM)。
对于这个示例数据库,组织结构图可以绘制成:
- 精确的倒置树状结构,显示相同职级的员工在同一行(参见下面的图 1),或者
- 通过将相同职级和职位的员工分组在一个标题块下,形成部分倒置树状结构(参见下面的图 2)


步骤 1: 从现有员工数据库表中,我们需要生成一个或多个表/视图来表示这种层级模型。它可能看起来像这样:
员工 ID(仅代表最低职级的员工) | Designation | 直接上司 | 下一级上司 | 下下一级上司 | …… | 高层管理 |
DE1 | DE | SH1 | DDH1 | 部门总经理 (DGH) | ||
DE2 | DE | SH1 | DDH1 | 部门总经理 (DGH) | ||
DE3 | DE | SH2 | DDH1 | 部门总经理 (DGH) | ||
DE4 | DE | SH3 | DDH2 | 部门总经理 (DGH) | ||
DM1 | DM | SH1 | DDH1 | 部门总经理 (DGH) | ||
DM2 | DM | SH2 | DDH1 | 部门总经理 (DGH) | ||
…………… |
注释
- 请参考示例 Microsoft Access 数据库 (dbOrganizationChart.mdb),其中包含表 (
tblOrganizationChart
)。 - 在此表中,我们使用了一个名为
CADRE
的附加字段,该字段可用于在同一组内对员工进行排序。
步骤 2: 为了将相关员工分组在每个部门/组下,我们必须使用 ORDER BY
子句,从所需的最高职级到所需的最低职级进行排序。例如:
SELECT * from tablename ORDER BY DGH, DDH, SH
步骤 3a: 现在,我们需要将每个职级的数据整理成包含员工详细信息的数组形式。例如:
DGH_List={DGH}
DDH_List ={DDH1, DDH2} ordered by DGH, EmpID
SH_List = {SH1, SH2, SH3} ordered by DGH, DDH, EmpID
DE_List = {DE1, DE2, DE3, DE4,DE5} ordered by DGH, DDH, SH, EmpID
DM_List = {DM1, DM2, DM3} ordered by DGH, DDH, SH, EmpID
步骤 3b: 现在,我们需要获取每个职级下每个领导的直接员工数量,以数组形式。例如:
No_DDH_Under_DGH={2} (i.e.) {(DDH1,DDH2)}
No_SH_Under_DDH = {2, 1} (i.e.) {(SH1,SH2),SH3}
No_DE_Under_SH = {2, 1, 2} (i.e.) {(DE1,DE2),DE3,(DE4,DE5)}
No_DM_Under_SH = {1, 1, 1} (i.e.) {DM1,DM2,DM3}
步骤 4: 现在,我们需要确定每个实体的位置(行位置和列位置)。如上所述,我们可以通过图 1 和图 2 所示的两种方式进行。但是,我们下面将只讨论图 2 所采用的方法。
当我们想要更精确地打印图表时,我们可以将该组中同级别(通常是最低级别)的员工在一个列中上下放置,并将其姓名连接到一个代表他们的标题 (DE/DM)。这个标题将反过来正确连接到其直接上司。对于这种情况,我们可以按照以下方式分配行和列位置(参见图 2*):
行位置
对于不属于最低职级的员工,其行位置就是该职位的职级(参见表 1)。对于最低职级分组员工的标题,其行位置与最低职级相同。现在,对于每个组中的员工,行位置可以从标题开始递增 '+1'。
列位置
根据上述示例中的层级结构,每个科长(SH)将拥有两类员工,即 DE 和 DM。为了正确表示,SH 将位于 DE 和 DM 之间,即每个 SH 将占据 3 (=2+1) 列。因此,我们对 SH 的列位置使用了公式 (3x-1),其中 'x' 就是 SH 数组中的位置。显然,DE 和 DM 的列位置将分别位于 SH 位置的左侧和右侧,即我们可以将“DE 列位置 = SHposition-1”和“DM 列位置 = SHposition+1”。一旦获得 SH 的列位置,其上级职级的列位置将与其下属员工列位置的平均值相同。
可以理解,如果向 SH 级别汇报的类别有 'n' 个,则将占据 'n+1' 个位置,并且 SH 位置可以表示为 '(n+1)*x-1'。因此,直接下属位置可以分别向左和向右。
注释
- 将所有这些行位置和列位置存储在数组中。.
- 在给定的示例代码中,我们演示了步骤 4 的第二种方法。
示例:从步骤 3a 和 3b,
DDH_List = {DDH1, DDH2, .....} | No_SH_Under_DDH = {2, 1} |
SH_List = {SH1, SH2, SH3,......} | No_DE_Under_SH = {3, 2, 3}, No_DM_Under_SH = {2, 0, 4} |
因此,SH 的列位置使用上面解释的公式 (3x-1)(此处 X 取值 {1,2,3},因为我们有 {SH1, SH2, SH3})
Col_SH = {3*1-1, 3*2-1, 3*3-1} = {2,5,8}
DEs are Col_DE(Title) = {2-1, 5-1, 8-1} = {1, 4, 7}
DMs are Col_DM(Title) = {2+1, 5+1, 8+1} = {3, 6, 9}
DDHs are Col_DDH = {(2+5)/2, 8/1} = {3.5, 8}
DGH is Col_DGH = {(3.5+8)/2} = {5.75}

步骤 5: 现在我们已经准备好所有员工职级的所有数组,我们只需要将这些数组传递给 Excel 宏,以绘制矩形和连接线。
使用 Excel 宏绘制矩形和连接线
我们需要将上述所有数组作为参数传递给宏,以便绘制组织结构图。
- 根据行位置和列位置绘制矩形。同时,我们将命名矩形,以便以后可以连接它们。
- 将数组中的文本数据(员工姓名等)添加到相应的矩形中。
- 创建形状连接器,并将其两端正确连接到矩形上。
请参考宏,获取完成上述任务的详细代码。但是,请允许我补充一点,ShapeRectangle
接受五个参数 (Shape,LEFT,TOP,WIDTH,HEIGHT)
。我们使用 PositionWidth
来确定矩形的位置(左和上),而使用 BoxWidth
和 Box Height
来确定矩形的大小(宽度和高度)。
如何运行此示例项目
将 *_SRC.ZIP 文件中的所有文件复制到虚拟目录(使用 IIS 或 PWS 创建),并在浏览器中运行 OrganizationCreate.asp 文件
- https:///NAMEofVIRTUALDIRECTORY/OrganizationCreate.asp (本地计算机)
- http://NAMEofVIRTUALDIRECTORY/OrganizationCreate.asp (远程计算机)
重要提示
在生成输出之前,请按如下所述更改 Internet 安全设置。在 Internet 浏览器中,转到“工具”菜单 -> “Internet 选项” -> “安全”选项卡 -> (选择 - 本地 Intranet) -> “自定义级别”,然后按以下步骤操作:
- 如果您有权签署 ActiveX 控件,请启用“对标记为可安全执行脚本的 ActiveX 控件执行脚本”。
- 否则,如果您没有签署此控件的权限,请启用选项“初始化并运行未标记为安全的 ActiveX 控件”。
致谢
我们衷心感谢 T.G.Bhaskar 先生(计算机化副处长)、S.MallikarjunaRao 先生、A.Subhasree 女士、S.Md.Saleem 先生和 R.Ugandhar 先生提供的支持。
我们欢迎读者提出任何改进本文的建议。