1、人事管理系统一 设计目标二 功能设计三 数据库设计3.1数据库设计3.1.1 数据库需求分析3.1.2 数据库概念结构设计3.1.3 数据库逻辑结构设计与实现3.2 系统设计3.2.1 系统功能分析3.3.2系统功能模块设计 3.3.2数据流程图3.3 主框架窗口设计3.3.1 菜单的创建3.3.2 工具条的创建3.3.3增加一个状态栏指示器3.4 增加新员工视类的创建3.5 人事变动视类的创建3.6 员工信息查询修改视图类的创建3.7登录对话框的创建3.8 关于对话框的创建四 .系统实现五. 小结六分析及结论七附录1 设计目标人事管理系统,便于公司领导掌握人员的动向,及时调整人才的分配。本系
2、统主要维护新员工资料;详细记录人事变动,包括岗位和部门的调整;员工信息的查询和修改,包括员工个人信息和密码等。根据系统功能的要求,人事管理系统可以分为新员工档案的输入,人事变更,员工档案的修改和查询等模块。2 功能设计企业人事管理系统主要用于员工个人资料的录入,职务变动的记录和管理。使用人事管理系统,便于公司领导掌握人员的动向,及时调整人才的分配。人事管理系统在设计时主要考虑以下几项功能要求: 新员工资料的输入。 人事变动的详细记录,包括岗位和部门的调整。 员工信息的查询和修改,包括员工个人信息等。为了更好的理解该系统和读懂该系统的源码,读者应对以下的知识点有所了解: MS SQL SERVE
3、R 2000数据库操作的基础知识。 ODBC数据源基础知识。 基本的SQL语句,如添加,查询,修改和删除记录语句。 Visual C+界面设计和关于数据库的基础知识。三数据库设计3.1 数据库设计3.1.1 数据库需求分析 根据数据流程图,可以列出以下数据项和数据结构:员工信息:员工号,姓名,年龄,部门,职务,员工编号。 人事变动:记录号,员工,变动和详细描述。 所需的外部数据支持。 部门设置:部门编号,名称等。3.1.2 数据库概念结构设计人事管理系统的E-R图如图3-1所示。人事变动记录员工部门记录编号变动变动-员工归属管理部门编号年龄员工号号号码职位姓名部门 图3-1 人事管理系统E-R
4、图3.1.3 数据库逻辑结构设计与实现 根据系统E-R图,本系统需要有2个数据表分别来存放员工个人信息和人事变动记录。并且需要一个外部数据表(部门信息)的支持。同时部分记录字段要用代码来表示,依次需要3个代码表来分别记录职务和人事变更的代码。最后,设立一个计数器数据表用于实现员工号的自动分配。这7个数据表用Access 2000实现,Access 2000中的设计视图如表所示。其中数据类型的细节应根据具体字段分别设置,如PERSON表的ID字段大小为6,AUTHORITY字段,SEX字段,EDU_LEVEL字段和STATE字段的大小为1,DEPARTMENT字段,JOB字段的大小为3。 员工个
5、人信息表(PERSON)字段名称数据类型说明ID文本员工号NAME文本姓名DEPARTMENT文本所在部门JOB文本职务SPECIALTY文本专业技能REMARK文本备注 职务代码表(JOB)字段名称数据类型说明CODE文本代码DESCRIPTION文本描述 部门信息表(DEPARTMENT)字段名称数据类型说明ID文本部门编号NAME文本部门名称3.2 系统设计3.2.1 系统功能分析人事管理系统主要有以下几项功能要求: 新员工资料的输入。 自动分配员工号。 人事变动的详细记录,包括岗位和部门的调整。 员工信息的查询和修改,包括员工个人信息等。3.2.2 系统功能模块设计根据系统功能的要求,
6、可以将系统分解成几个功能模块来分别设计,功能模块如图3-2所示。人事管理系统新员工档案输入人事变更员工档案查询修改 图3-2 人事管理系统功能模块图3.2.3 数据流程图系统的数据流程图如图3-3所示,所有数据由人事科管理人员输入。 个人信息查询招聘新员工员工辞退岗位调整分配员工号员工信息数据人事变动记录人事科图3-3 人事管理系统数据流程图下面是系统运行时主要界面信息。 人事管理系统“增加新员工”子窗口中,员工号和密码会自动按顺序生成,并且不允许修改。“人事变动”和“员工信息查询修改”子窗口中,须先输入员工号, 确认显示的信息后才可进行相关的修改。产生的3个窗体列在“窗口”菜单下。当鼠标在菜
7、单项上移动时,状态栏中会自动显示菜单项的Prompt属性的内容。“窗口”菜单中的4项功能是标准的窗口排列功能。3.3 主框架窗口设计3.3.1 菜单的创建 用VisualC+6.0的菜单编辑器(Menu Editor)可以会让你方便的创建菜单。在菜单编辑器中打开的设计窗口如图3-6所示。AppWizard创建的程序默认有两个菜单:IDR_MAINFRAME为主框架窗口所用,IDR_TESTTYPE(设应用程序名为Test)为子框架窗口所用。因本例中没有用默认的子框架,所以将IDR_TESTTYPE菜单删去,同时重新编辑IDR_MAINFRAME菜单,菜单属性设置如表3-11所示。 图3-6 菜
8、单编辑器窗口3.3.2 工具条的创建 用Visual C+6.0的工具条编辑器(Toolbar Editor)可以很方便的编辑工具条。本程序创建的工具条如图所示,其中工具条各按钮的ID分别对应相应的菜单项,按从左到右的次序对应的菜单项ID如表3-12所示。表3-12 工具条按钮对应的菜单项ID次序ID1ID_SYSTEM_CONNECT2ID_SYSTEM_DISCONNECT3ID_MANAGE_ADD4ID_MANAGER_CHANGE5ID_MANAGER_SEARCH6ID_WINDOW_CASCADE3.3.3增加一个状态栏指示器在程序中加入一个状态栏指示器以显示登录状态。首先用增加
9、一个资源ID:ID_INDICATOR_LOGIN,然后在MainFrm.cpp中找到indicators变量的定义处,添加此ID至其列表,程序如下:Static UNIT indicators=ID_SEPARATOR, /status line indicatorID_INDICATOR_LOGIN, /登录状态ID_INDICATOR_CAPS,ID_INDICATOR_NUM,ID_INDICATOR_SCRL,;3.4 增加新员工视类的创建首先加入一个新的窗体资源,在Insert Resource对话框中选择Dialog 的 IDD_FORMVIEW项。窗体创建后,在其上添加所需控件
10、,最后的布局如图3-8所示。创建好资源后,为窗体加入一个由CFormView类继承的CAddView封装此窗体资源,然后用Class Wizard为所需控件加入成员变量。主要控件类型、ID和对应的成员变量及说明如表所示。 增加新员工窗体 表1-13 增加新员工窗体控件列表控件类型ID成员变量说明Edit BoxIDC_ADD_EDT_IDm_strID员工号Edit BoxIDC_ADD_EDT_NAMEm_strName姓名Combo BoxIDC_ADD_CMB_DEPARTMENTm_cDepartmentm_strDepartment部门Combo BoxIDC_ADD_CMB_JOB
11、m_cJobm_strJob职务ButtonIDC_ADD_BTN_ADD无“增加”按钮CAddView类需要用到主框架窗口类和加密类,因此需要在cpp文件开头加入以下两行:#include Crypt.h#include MainFrm.h另外,为了使用全局数据库变量db,需要在cpp文件开头加入如下语句:Extern CDatabase db;3.5 人事变动视类的创建首先加入一个新的窗体资源,同样在Insert Resource对话框中选择Dialog的IDD_FORMVIEW项。窗体创建后,在其上添加所需控件,最后的布局如图3-9所示。创建好资源后,为窗体加入一个由CFormView类
12、继承的CChangeView封装此窗体资源,然后用Class Wizard为所需控件加入成员变量。主要控件类型,ID和对应的成员变量及说明如表3-14所示。 图3-9 人事变动输入窗体 表1-14 人事变动窗体控制列表控制类型 ID 成员变量 说明Edit BoxIDC_CHANGE_EDT_IDm_strID员工号Edit BoxIDC_CHANGE_EDT_NAMEm_strName姓名Combo BoxIDC_CHANGE_CMB_DEPARTMENTm_cDepartment部门Combo BoxIDC_CHANGE_CMB_JOBm_cJob职务ButtonIDC_CHANGE_BT
13、N_CHANGE无 “修改”按钮CChangeView中需要加入如下语句包含主框架窗口类:#include MainFrm.h同样,本类也需要加入以下语句引用全局变量db。extern CDatabase db;3.6 员工信息查询修改视图类的创建首先加入一个新的窗体资源,同样在Insert Resourse对话框中选择Dialog的IDD_FORMVIEW项。窗体最后的布局如图 3-10所示。创建好资源后,为窗体加入一个由CFormView类继承的CSearchView封装此窗体资源,然后用Class Wizard为所需控件加入成员变量。主要控件类型,ID和对应的成员变量及说明如表所示。 员
14、工信息查询修改视图表3-15 员工信息查询修改窗体控件列表控制类型 ID 成员变量 说明Edit BoxIDC_SEARCH_EDT_IDm_strID员工号Combo BoxIDC_SEARCH_CMB_DEPARTMENTm_cDepartment部门Combo BoxIDC_SEARCH_CMB_JOBm_cJob职务Edit BoxIDC_SEARCH_EDT_NAMEm_strName姓名ButtonIDC_SEARCH_BTN_CHANGE无“修改员工信息”按钮程序的代码如下:/ chiView.cpp : implementation of the CChiView class/
15、#include stdafx.h#include chi.h#include chiSet.h#include chiDoc.h#include chiView.h#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE = _FILE_;#endif#include Dlgadd.h#include department.h#include post.h#include Dlgdelete.hdepartment *m_depSet;post *m_postSet;/ CChiViewIMPLEMENT_
16、DYNCREATE(CChiView, CRecordView)BEGIN_MESSAGE_MAP(CChiView, CRecordView)/AFX_MSG_MAP(CChiView)ON_BN_CLICKED(IDC_BUTTON1, OnButtonadd)ON_BN_CLICKED(IDC_BUTTON2, OnButtondelete)ON_BN_CLICKED(IDC_BUTTON3, OnButtonedit)ON_BN_CLICKED(IDC_BUTTON4, OnButtonfind)/AFX_MSG_MAP/ Standard printing commandsON_CO
17、MMAND(ID_FILE_PRINT, CRecordView:OnFilePrint)ON_COMMAND(ID_FILE_PRINT_DIRECT, CRecordView:OnFilePrint)ON_COMMAND(ID_FILE_PRINT_PREVIEW, CRecordView:OnFilePrintPreview)END_MESSAGE_MAP()/ CChiView construction/destructionCChiView:CChiView(): CRecordView(CChiView:IDD)/AFX_DATA_INIT(CChiView)m_pSet = NU
18、LL;m_depSet = NULL;m_postSet = NULL;m_number = _T();m_name = _T();m_age = 0;m_post = _T();m_dep = _T();m_depid = _T();/AFX_DATA_INIT/ TODO: add construction code hereCChiView:CChiView()void CChiView:DoDataExchange(CDataExchange* pDX)CRecordView:DoDataExchange(pDX);/AFX_DATA_MAP(CChiView)DDX_Text(pDX
19、, IDC_EDIT11, m_number);DDX_Text(pDX, IDC_EDIT22, m_name);DDX_Text(pDX, IDC_EDIT33, m_age);DDX_Text(pDX, IDC_EDIT44, m_post);DDX_Text(pDX, IDC_EDIT55, m_dep);DDX_Text(pDX, IDC_EDIT66, m_depid);/AFX_DATA_MAPBOOL CChiView:PreCreateWindow(CREATESTRUCT& cs)/ TODO: Modify the Window class or styles here
20、by modifying/ the CREATESTRUCT csreturn CRecordView:PreCreateWindow(cs);void CChiView:OnInitialUpdate()m_pSet = &GetDocument()-m_chiSet;m_depSet = &GetDocument()-m_1;m_postSet = &GetDocument()-m_2;CRecordView:OnInitialUpdate();GetParentFrame()-RecalcLayout();ResizeParentToFit();/ CChiView printingBO
21、OL CChiView:OnPreparePrinting(CPrintInfo* pInfo)/ default preparationreturn DoPreparePrinting(pInfo);void CChiView:OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)/ TODO: add extra initialization before printingvoid CChiView:OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)/ TODO: add cleanup a
22、fter printing/ CChiView diagnostics#ifdef _DEBUGvoid CChiView:AssertValid() constCRecordView:AssertValid();void CChiView:Dump(CDumpContext& dc) constCRecordView:Dump(dc);CChiDoc* CChiView:GetDocument() / non-debug version is inlineASSERT(m_pDocument-IsKindOf(RUNTIME_CLASS(CChiDoc);return (CChiDoc*)m
23、_pDocument;#endif /_DEBUG/ CChiView database supportCRecordset* CChiView:OnGetRecordset()return m_pSet;/ CChiView message handlersvoid CChiView:OnButtonadd() Dlgadd dlg_add;if (dlg_add.DoModal()=IDOK)UpdateData();if (!m_pSet-IsOpen()m_pSet-Open();m_pSet-AddNew();m_pSet-m_son=dlg_add.m_number;m_pSet-
24、m_sname=dlg_add.m_name;m_pSet-m_sage=dlg_add.m_age;m_pSet-Update();m_pSet-Close();if (!m_postSet-IsOpen()m_postSet-Open();m_postSet-AddNew();m_postSet-m_sno=dlg_add.m_number;m_postSet-m_dno=dlg_add.m_depid;m_postSet-m_post=dlg_add.m_post;m_postSet-Update();m_postSet-Close();if (!m_depSet-IsOpen()m_d
25、epSet-Open();m_depSet-AddNew();m_depSet-m_dno=dlg_add.m_depid;m_depSet-m_dname=dlg_add.m_dep;m_depSet-Update();m_depSet-Requery();m_depSet-Close();MessageBox(信息添加成功!);void CChiView:OnButtondelete() int i=0;Dlgdelete dlg_delete;if (dlg_delete.DoModal()=IDOK)UpdateData();if (!m_pSet-IsOpen()m_pSet-Ope
26、n();while(!m_pSet-IsEOF()if (m_pSet-m_son=dlg_delete.m_number)m_pSet-Delete();m_pSet-Requery();m_pSet-Close();i=1;break;elsem_pSet-MoveNext();if (!m_postSet-IsOpen()m_postSet-Open();while (!m_postSet-IsEOF()if (m_postSet-m_sno=dlg_delete.m_number)m_postSet-Delete();m_postSet-Requery();m_postSet-Clos
27、e();m_postSet-MoveNext();if (i)m_postSet-Update();MessageBox(delete successful);elseMessageBox(no message);void CChiView:OnButtonedit() Dlgadd dlg_add;if (dlg_add.DoModal()=IDOK)UpdateData();if (!m_pSet-IsOpen()m_pSet-Open();while (!m_pSet-IsEOF()if (m_pSet-m_son=dlg_add.m_number)m_pSet-Edit();m_pSe
28、t-m_son=dlg_add.m_number;m_pSet-m_sname=dlg_add.m_name;m_pSet-m_sage=dlg_add.m_age; m_pSet-Update();m_pSet-Close();elsem_pSet-MoveNext();if (!m_postSet-IsOpen()m_postSet-Open();while (!m_postSet-IsEOF()if (m_postSet-m_sno=dlg_add.m_number) m_postSet-Edit(); m_postSet-m_sno=dlg_add.m_number; m_postSe
29、t-m_dno=dlg_add.m_depid; m_postSet-m_post=dlg_add.m_post; m_postSet-Update(); m_postSet-Close();elsem_postSet-MoveNext();MessageBox(信息修改成功!);void CChiView:OnButtonfind() int i=0;UpdateData();if (!m_pSet-IsOpen()m_pSet-Open();while (!m_pSet-IsEOF()if (m_pSet-m_son=m_number)m_name=m_pSet-m_sname; m_ag
30、e=m_pSet-m_sage;i=1;break;elsem_pSet-MoveNext();m_pSet-Close();if (!m_postSet-IsOpen()m_postSet-Open();if (i)while (!m_postSet-IsEOF()if (m_postSet-m_sno=m_number)m_post=m_postSet-m_post;m_depid=m_postSet-m_dno;break;elsem_postSet-MoveNext();m_postSet-Close();if (!m_depSet-IsOpen()m_depSet-Open();if
31、 (i)while (!m_depSet-IsEOF()if (m_depSet-m_dno=m_depid)m_dep=m_depSet-m_dname;break;elsem_depSet-MoveNext();m_depSet-Close();UpdateData(FALSE);3.7 登录对话框的创建登录对话框如图3-11所示,包括一个Combo Box、两个Edit Box和两个Button。Combo Box中输入默认ODBC数据源名称“MISDB”。登录和取消按钮的ID分别设置为IDOK和IDCANCEL,即系统默认ID。IDCANCEL采用系统默认的处理,不做另外编程。IDOK
32、需另外编程以登录数据库。为了改变标题“登录人事管理系统”的字体大小,需要改变其ID为IDC_STATIC_LOGINTEXT(默认为IDC_STATIC),为CAboutDlg类加入一个CFont类的成员变量m_font,然后在OnInitialog()函数中做如下处理:登录对话框BOOL CLoginDlg:OnInitDialog() CDialog:OnInitDialog();/ TODO: Add extra initialization here/ 改变登录人事管理系统字体大小LOGFONT LogFont;GetFont()-GetLogFont(&LogFont);LogFon
33、t.lfHeight+=LogFont.lfHeight/2;LogFont.lfWidth+=LogFont.lfWidth/2;m_font.CreateFontIndirect(&LogFont);GetDlgItem(IDC_STATIC_LOGINTEXT)-SetFont(&m_font);return TRUE; / return TRUE unless you set the focus to a control / EXCEPTION: OCX Property Pages should return FALSE“登录”按钮的处理代码如下:void CLoginDlg:OnO
34、K() BOOL bLogin=FALSE;CString strPasswd, strAuthority;UpdateData(); / 更新数据变量if(!db.Open(m_strDSN) return; / 连接数据库CRecordset rs(&db);rs.Open(CRecordset:forwardOnly,select PASSWD, AUTHORITY from PERSON where ID=+m_strUser+);if(!rs.IsEOF()rs.GetFieldValue(PASSWD, strPasswd);rs.GetFieldValue(AUTHORITY,
35、strAuthority);if(strPasswd = CCrypt:Encrypt(m_strPasswd, 123) & strAuthority = 3)bLogin=TRUE; / 已连接elseMessageBox(请重新输入密码。n注意大小写!,密码错误);elseMessageBox(请确认用户名大小写是否正确!,无此用户);rs.Close();if(bLogin) EndDialog(IDOK);else db.Close(); / 关闭数据库3.8 关于对话框的创建App Wizard产生程序框架时自动创建了一个关于对话框。用资源编辑器打开关于对话框,对布局做适当修改,就
36、完成了本例关于对话框的创建,如图3-12所示。图3-12 关于对话框四. 系统实现分模块描述内容主要包括两部分:a 简述该模块功能,给出实现界面。b.简述该模块实现过程,并列出该模块关键代码。模块描述后叙述系统测试内容五小结本章着重描述了不使用文档/视图结构的应用程序的开发,可以实现多个窗口的统一显示和管理,便于在不同功能之间快速的切换。但这种结构也有一定的弊端。如窗口与窗口之间的功能有可能相互影响。尤其在数据库应用程序的开发中,因为使用同一个数据源,这种冲突更加容易发生。如果程序中需要保存一些数据而使用到文档类的话,使用文档/视图结构的MDI结构可以很方便的进行处理,使用MFC强大的文档/视
37、图结构可以使编程变得更加容易。本章也使用了一些技术,如在对话框中不同控件使用不同字体,工具条的控制,状态栏的操作等。这些技术对设计一个良好的用户界面是必不可少的。通过这次实验,我受益良多,MS SQL SERVER 2000数据库操作的基础知识,ODBC数据源基础知识,我都可以掌握。基本的SQL语句,如添加,查询,修改和删除记录语句,我也了解清楚。Visual C+界面设计和关于数据库的基础知识虽然有些复杂,但我还是尽量克服困难,使这次实验完满完成。实验过程虽然有些麻烦,但能完成这次实验我还是很满意的。六分析及结论人事管理系统可以实现功能包括人事信息维护、数据查询、统计报表。 该系统应该提供人
38、事信息的录入(修改)、删除、统计;人事常用的数据查询(包括各种复杂查询);各类人事统计报表的设计、生成、表式的导入和导出、打印;用户账号权限的设置、管理。人事管理一般是对人事基本信息的管理,所以在数据库模式定义中可以将人事基本信息定义在一个表中,这样对数据的增加、修改、删除、查询、统计操作处理起来都相对简单。统计报表的导出可以利用OLE(对象的连接与嵌入)这项成熟的技术来实现。打印功能完全可以根据开发工具自带的属性灵活的实现。用户账号权限的设置、管理可以在数据库中建立一张独立的表来实现,人事系统将根据用户不同的权限设置不同的操作功能。 对于开发工具我选择sql sever 2000。因为Pow
39、erBilder作为一种可视化的、面向对象的快速应用开发(RAD)工具,内置了包括数据窗口在内的多种对象类,可方便的访问数据库,它与Sql Server结合,使开发应用程序这项艰辛的工作就象堆积木那样简单方便。另外,PowerBilder有多个版本以支持多平台,其在某一平台下开发的代码,可容易的移植到另一平台上,只需重新编译即可。因此人事管理系统运行于Windows系统是没有问题的。同时SQL Server 2000使用了工业界最先进的数据结构,能够为要求最苛刻的Web应用和企业应用提供高度的可扩展性和高可靠性。微软提供了许多技术和工具,作为数据库系统的标准集成组件。而且,通过巧妙的设计以及自动调整,自动管理特性,SQL Server 2000使客户可以更快,更容易的享受所用这些最先进的Web和分析技术所带来的好处,能够快速提交应用,从而赢得竞争