前言
本次软件工程的课程设计我们完成了一个人事管理系统。通过这次课程设计,我们掌握了Microsoft Visual Studio2005和Microsoft Office Access 2003的使用方法和软件设计的方法。这次的课程设计我们实现了人事管理系统的基本数据管理,人事档案管理,数据库管理和系统管理的功能。其中基本数据管理可分为民族档案设置,职工类型设置,文化程度设置,政治面貌设置,部门类别设置,工资类别设置,职称类别设置,职务类别设置这8个部分,人事档案管理可分为人事档案浏览,人事资料查询,人事资料统计这三部分,数据库管理可分为数据库备份和恢复。系统管理可分为用户设置和系统退出。由于时间紧促,还有很多功能没有完成,譬如考试管理和职工的通信录等。通过这次的课程设计,在界面设计上也收获不少,学会了skinplusplus的使用,这使界面的美化变得更容易。我们将继续改进这系统。
本次课程设计的需求分析和数据库设计是2个人共同完成的。
叶伟平(3105007360)完成了基本数据的管理(民族档案设置,职工类型设置,文化程度设置,政治面貌设置,部门类别设置,工资类别设置,职称类别设置,职务类别设置)的功能和系统管理。
叶丙坤(3105007359)主要完成了数据库备份与恢复的功能,人事档案管理(人事档案浏览,人事资料查询,人事资料统计)和用户设置和系统退出的功能和报告的撰写。
广东工业大学课程设计任务书
| 人事管理系统 |
学生学院 | 计算机学院 |
专业班级 | 05计算机软件工程(3)班 |
姓 名 | 叶伟平 |
学 号 | 3105007360 |
这次课程设计采用Microsoft Visual Studio2005作为前台应用程序的设计工具,用Microsoft Office Access 2003作为后台数据库,完成一个人事管理系统。实现的主要功能有基础数据管理(民族档案设置,职工类型设置,文化程度设置,政治面貌设置,部门类别设置,工资类别设置,职称类别设置,职务类别设置),人事档案管理(人事档案浏览,人事资料查询,人事资料统计),数据库管理(数据库的备份与恢复)系统管理(设置用户和退出系统)。
二、课程设计的要求与数据
使用 Microsoft Visual Studio 2005和 Microsoft Office Access 2003完成一个人事管理系统。按照一个企业实际管理中的实际需要实际数据库,选定数据。
1. 独立完成系统的分析、设计、编码、测试工作。
2.完成设计报告的撰写。
序号 | 设计(论文)各阶段名称 | 地点 | 起止日期 |
1 | 选定本次课程设计及报告的研究课题 | 宿舍 | |
2 | 对研究课题进行调查并做出详细的需求分析 | 宿舍 | 日期 |
3 | 收集资料和参考文献 | 图书馆 | 为 |
4 | 认真阅读和学习资料、文献并做出初步构思 | 宿舍 | 一周 |
5 | 制定出整个系统的设计构想、设计思路和方法 | 宿舍 | 左右 |
6 | 进行系统的设计、开发和编写程序代码 | 实验室 | |
7 | 对系统进行测试和系统调试 | 实验室 | |
8 | 完成整个系统的开发并进行系统维护 | 宿舍 | |
9 | 撰写课程设计报告 | 宿舍 | |
10 | 最终完成系统修改、论文撰写和表格填写 | 宿舍 | |
11 | 上交课程设计报告、系统答辩 | 教学楼 | 2008.6.26-2008.6.27 |
五、应收集的资料及主要参考文献
[1].郑阿奇/丁有和. Visual Studio2005教程,北京:机械工业出版社,2006.9
[2].李代平.软件工程.第二版.北京:冶金工业出版社,2006.11
[3].王珊/萨师煊.数据库系统概论.第四版.-北京:高等教育出版社,2006.5
[4].李春葆/曾平.数据库原理与应用,北京:清华大学出版社,2005.
计划完成日期: 2007年6月29日 基层教学单位责任人签章:
主管院长签章:
目 录
1.开发环境和相关技术介绍
1.1开发环境
系统结构:C/S结构
数据库系统:Microsoft Office Access 2003
数据库连接方式:ODBC连接方式
开发工具:Microsoft Visual Studio2005
1.2相关技术介绍
Visual Studio是微软公司推出的开发环境。是目前最流行的Windows 平台应用程序开发环境。目前已经开发到9.0版本,也就是Visual Studio 2008。
Visual Studio可以用来创建 Windows平台下的Windows应用程序和网络应用程序,也可以用来创建网络服务、智能设备应用程序和Office 插件。使用Visual Studio 2005, 专业开发人员能够:使用改进后的可视化设计工具、编程语言和代码编辑器,享受高效率的开发环境;使用集成的可视化数据库设计和报告工具,创建SQL Server 2005解决方案;使用Visual Studio SDK创建可以扩展Visual Studio IDE的工具;专业开发人员喜欢自由的使用.NET Framework 2.0,它是一种稳健的、功能齐备的开发环境,支持创建扩展Visual Studio集成开发环境的工具。
2.需求分析
2.1系统需求和功能
设计一个人事管理系统,使系统满足以下需求和功能
1)根据企业人事管理的需要,对企业以及企业中员工的信息进行添假删除等操作,并能对人事档案进行浏览,对人事资料进行查询,对人事资料进行统计。为企业的人事管理提供一个便利的管理系统。
a系统管理(设置用户和退出系统)。
b基础数据管理(民族档案设置,职工类型设置,文化程度设置,政治面貌设置,部门类别设置,工资类别设置,职称类别设置,职务类别设置)。
c人事档案管理(人事档案浏览,人事资料查询,人事资料统计)。
数据库管理(数据库的备份与恢复)。
2.2数据字典
2.2.1数据项
1)数据项名称: 用户名
简述:用户的名字,没有重复,可以唯一标识每一用户
类型:文本
长度:50
2)数据项名称:用户密码
简述:用户的密码,用来证验登陆的用户是否合法。
类型:文本
长度:50
3)数据项名称:是否管理员
简述:描述是否系统管理员
类型:是/否
取值范围:真/假
……
2.2.2数据结构
1)数据结构名称:用户名和密码信息
组成:用户名,密码,是否管理员
2)数据结构名称:民族档案设置
组成:民族编号,民族名称
3)数据结构名称:职工类型设置
组成:职工类型编号,职工类型名称
4)数据结构名称:文化程度设置
组成:文化程度编号,文化程度名称。
5)数据结构名称:政治面貌设置
组成:政治面貌编号,政治面貌名称
6)数据结构名称:部门类别设置
组成:部门类别编号,部门类别名称
7)数据结构名称:工资类型设置
组成:工资类型编号,工资类型名称
8)数据结构名称:职称类别设置
组成:职称类别编号,职称类别名称。
9)数据结构名称:职务类别设置
组成:职务类别编号,职务类别名称
10)数据结构名称:职工信息
组成:职工编号,职工性别,职工年龄,民族,婚姻状况,家庭电话,电子邮箱,手机,籍贯,地址,毕业学校,职称,入职时间,职称类别,部门类别,职务类别。
11)数据结构名称:职工的家庭成员
组成:编号,员工号,成员姓名,关系,出生日期,工作单位,担任职务,政治面貌
2.3安全性要求
访问数据库时需要输入登陆帐号和密码。在数据库内设有用户表,登陆系统时会要求输入用户帐号和密码。登陆模块根据输入帐号和密码查用户表,查到匹配记录则允许其登陆系统。用户帐号和密码可以在系统中添加和删除。
3.概念结构设计
3.1设计方法和步骤
采用自底而上的设计方法。先自顶向下地进行需求分析,对人事管理系统的需求进行逐步细化;然后再自底而上地设计概念结构,最终将各个局部应用的概念结构集合成为全局概念结构。
3.2概念结构E-R图
通过对局部应用的选择,逐一设计出分E-R图,并对各个分E-R图进行合并,生成初步E-R图,消除不必要的系统冗余,可以得出以下人事管理系统E-R图。
图3.1 人事管理系统的 E-R 图1
图3.12人事管理系统的 E-R 图2
3.2 E-R图的有关实体和联系的说明
说明:对于人事管理系统的 E-R 图1,一个用户可以设置多个民族的情况,一个民族档案能被多个用户设置。一个用户可以设置多个职工类型,一个职工类型能被多个用户设置。其他的类似。
对于图3.12人事管理系统的 E-R 图2,一个用户可以浏览,查询多个职工的档案,一个职工的档案能被多个用户浏览。
4.逻辑设计
4.1 关系模式
由E-R图转换得到的关系模式如下:
用户(用户名,密码,是否管理员)
民族档案设置(民族编号,民族名称)
职工类型设置(职工类型号,职工类型名称)
文化程度设置(文化程度编号,文化程度名称)
政治面貌设置(政治面貌编号,政治面貌名称)
部门类别设置(部门类别编号,部门类别名称)
工资类别设置(工资类别编号,工资类别名称)
职称类别设置( 职称类别编号,职称类别名称)
职务类别设置(职务类别编号,职务类别名称)
职工表(职工编号,职工名,出生日期,年龄,民族,婚姻状况,身份证,家庭电话,电子邮箱,手机,籍贯,地址,毕业学校,所在部门,政治面貌,职称类别,职务类别,工资类别,文化程度)
职工家庭情况(编号,员工工号,成员姓名,关系,出生日期,所在部门,担任职务,政治面貌,手机)
5.逻辑设计
5.1建立数据库
本设计用Microsoft Office Access 2003作为后台数据库,在MS SQL Server 2000中创建一个名为Manager1的数据库,并在其中建立逻辑设计中涉及的表.
5.2建立表
在Access中,可以查看所建立的表,并添加适当测试数据
5.2.1 用户表
表 5.1
5.2.2 民族挡案表
表 5.2
5.2.3职工类型表
表 5.3
5.2.4文化程度表
表 5.4
5.2.5政治面貌表
表 5.5
5.2.6部门类别设置表
表 5.6
5.2.7工资类别表
表 5.7
5.2.8职称类别表
表 5.8
5.2.9职务类别表
5.2.10职工表
5.2.11 职工家庭情况表
6 应用程序设置和代码分析
6.1.配置ODBC数据源和添加skin++皮肤
本系统使用的是当程序运行时自动配置数据源的方法。实现方法如下:
首先在stdafx.h文件中添加 头文件 afxdb.h , #include <afxdb.h>
和数据库API头文件, #include <odbcinst.h>//ODBC数据库API头文件。
然后在manager.cpp 的BOOL CManagerApp::InitInstance() 函数中添加如下代码
SQLConfigDataSource(NULL,ODBC_ADD_DSN,
"Microsoft Access Driver (*.mdb)",
"DSN=Manager1\0"
"Description=Hotel\0"
"FileType=Access\0"
"DBQ=.\\Manager1.mdb\0"
);
添加皮肤
在manager.cpp中添加 #include ".\skins\SkinPlusPlus.h"
在BOOL CManagerApp::InitInstance() 函数中添加
InitializeSkin(_T("XPCorona.ssk"));
6.2人事档案浏览
先建立IDD_PAGE_BASEINFO对话框,之后为此对话框的部分控件建立关联变量,之后再建立IDD_DIALOG_BROWSE对话框,之后为此对话框的部分控件建立关联变量。
添加代码实现人事档案浏览功能
实现这个功能的主要代码如下:
void CBrowseDlg::OnButtonSearch()
{
// TODO: Add your control notification handler code here
UpdateData(TRUE);
if(m_nCondition<0)
{
MessageBox("请选择查询条件!");
m_ctrCondition.SetFocus();
return;
}
if(m_strContent=="")
{
MessageBox("请输入查询内容!");
m_ctrContent.SetFocus();
return;
}
CString strSQL;
if(0==m_nCondition)
{//按部门查询
strSQL.Format("select * from person where dept='%s'",m_strContent);
RefreshData(strSQL);
}
else if(1==m_nCondition)
{//按职工职务查询
strSQL.Format("select * from person where duty='%s'",m_strContent);
RefreshData(strSQL);
}
else if(2==m_nCondition)
{//按职工职称查询
strSQL.Format("select * from person where technical='%s'",m_strContent);
RefreshData(strSQL);
}
else if(3==m_nCondition)
{//按职工类型查询
strSQL.Format("select * from person where isworker='%s'",m_strContent);
RefreshData(strSQL);
}
else if(4==m_nCondition)
{//按工资类别查询
strSQL.Format("select * from person where aboutpay='%s'",m_strContent);
RefreshData(strSQL);
}
else if(5==m_nCondition)
{//按职工性别查询
strSQL.Format("select * from person where sex='%s'",m_strContent);
RefreshData(strSQL);
}
else if(6==m_nCondition)
{//按婚姻状况查询
strSQL.Format("select * from person where ismarry='%s'",m_strContent);
RefreshData(strSQL);
}
else if(7==m_nCondition)
{//按职工民族查询
strSQL.Format("select * from person where folk='%s'",m_strContent);
RefreshData(strSQL);
}
else if(8==m_nCondition)
{//按政治面貌查询
strSQL.Format("select * from person where political='%s'",m_strContent);
RefreshData(strSQL);
}
else if(9==m_nCondition)
{//按文化程度查询
strSQL.Format("select * from person where education='%s'",m_strContent);
RefreshData(strSQL);
}
//设置按钮状态
m_ctrNewBnt.EnableWindow(TRUE);
m_ctrDelBnt.EnableWindow(TRUE);
m_ctrSaveBnt.EnableWindow(FALSE);
m_ctrCancelBnt.EnableWindow(FALSE);
m_bNew = FALSE;
m_ctrModify.EnableWindow(TRUE);
m_BaseInfoDlg.m_ctrID.EnableWindow(FALSE);
}
void CBrowseDlg::OnButtonSearch()
{
// TODO: Add your control notification handler code here
UpdateData(TRUE);
if(m_nCondition<0)
{
MessageBox("请选择查询条件!");
m_ctrCondition.SetFocus();
return;
}
if(m_strContent=="")
{
MessageBox("请输入查询内容!");
m_ctrContent.SetFocus();
return;
}
CString strSQL;
if(0==m_nCondition)
{//按部门查询
strSQL.Format("select * from person where dept='%s'",m_strContent);
RefreshData(strSQL);
}
else if(1==m_nCondition)
{//按职工职务查询
strSQL.Format("select * from person where duty='%s'",m_strContent);
RefreshData(strSQL);
}
else if(2==m_nCondition)
{//按职工职称查询
strSQL.Format("select * from person where technical='%s'",m_strContent);
RefreshData(strSQL);
}
else if(3==m_nCondition)
{//按职工类型查询
strSQL.Format("select * from person where isworker='%s'",m_strContent);
RefreshData(strSQL);
}
else if(4==m_nCondition)
{//按工资类别查询
strSQL.Format("select * from person where aboutpay='%s'",m_strContent);
RefreshData(strSQL);
}
else if(5==m_nCondition)
{//按职工性别查询
strSQL.Format("select * from person where sex='%s'",m_strContent);
RefreshData(strSQL);
}
else if(6==m_nCondition)
{//按婚姻状况查询
strSQL.Format("select * from person where ismarry='%s'",m_strContent);
RefreshData(strSQL);
}
else if(7==m_nCondition)
{//按职工民族查询
strSQL.Format("select * from person where folk='%s'",m_strContent);
RefreshData(strSQL);
}
else if(8==m_nCondition)
{//按政治面貌查询
strSQL.Format("select * from person where political='%s'",m_strContent);
RefreshData(strSQL);
}
else if(9==m_nCondition)
{//按文化程度查询
strSQL.Format("select * from person where education='%s'",m_strContent);
RefreshData(strSQL);
}
//设置按钮状态
m_ctrNewBnt.EnableWindow(TRUE);
m_ctrDelBnt.EnableWindow(TRUE);
m_ctrSaveBnt.EnableWindow(FALSE);
m_ctrCancelBnt.EnableWindow(FALSE);
m_bNew = FALSE;
m_ctrModify.EnableWindow(TRUE);
m_BaseInfoDlg.m_ctrID.EnableWindow(FALSE);
}
6.3人事档案查询
void CSearchDlg::OnButtonSearch()
{
// TODO: Add your control notification handler code here
UpdateData();
CString strSQL;
CString strTemp;
CString strType;
BOOL bNoCondition = TRUE;
//选择是否进行模糊查询
if(m_bType)
strType = " = ";
else
strType = " like ";
//根据查询条件构造SQL语句///
strSQL = "select * from person where ";
if(m_strAboutPay!="")
{
strTemp.Format(" aboutpay %s '%s' ",strType,m_strAboutPay);
if(!bNoCondition)
strSQL += " and ";
strSQL += strTemp;
bNoCondition = FALSE;
}
if(m_strDept!="")
{
strTemp.Format(" dept %s '%s' ",strType,m_strDept);
if(!bNoCondition)
strSQL += " and ";
strSQL += strTemp;
bNoCondition = FALSE;
}
if(m_strDuty!="")
{
strTemp.Format(" duty %s '%s' ",strType,m_strDuty);
if(!bNoCondition)
strSQL += " and ";
strSQL += strTemp;
bNoCondition = FALSE;
}
if(m_strEducation!="")
{
strTemp.Format(" education %s '%s' ",strType,m_strEducation);
if(!bNoCondition)
strSQL += " and ";
strSQL += strTemp;
bNoCondition = FALSE;
}
if(m_strFolk!="")
{
strTemp.Format(" folk %s '%s' ",strType,m_strFolk);
if(!bNoCondition)
strSQL += " and ";
strSQL += strTemp;
bNoCondition = FALSE;
}
if(m_strIsWorker!="")
{
strTemp.Format(" isworker %s '%s' ",strType,m_strIsWorker);
if(!bNoCondition)
strSQL += " and ";
strSQL += strTemp;
bNoCondition = FALSE;
}
if(m_strMarry!="")
{
strTemp.Format(" ismarry %s '%s' ",strType,m_strMarry);
if(!bNoCondition)
strSQL += " and ";
strSQL += strTemp;
bNoCondition = FALSE;
}
if(m_strPolitical!="")
{
strTemp.Format(" political %s '%s' ",strType,m_strPolitical);
if(!bNoCondition)
strSQL += " and ";
strSQL += strTemp;
bNoCondition = FALSE;
}
if(m_strSex!="")
{
strTemp.Format(" sex %s '%s' ",strType,m_strSex);
if(!bNoCondition)
strSQL += " and ";
strSQL += strTemp;
bNoCondition = FALSE;
}
if(m_strTechnical!="")
{
strTemp.Format(" technical %s '%s' ",strType,m_strTechnical);
if(!bNoCondition)
strSQL += " and ";
strSQL += strTemp;
bNoCondition = FALSE;
}
if(m_nAge>0)
{
strTemp.Format(" age = %d ",strType,m_nAge);
if(!bNoCondition)
strSQL += " and ";
strSQL += strTemp;
bNoCondition = FALSE;
}
// MessageBox(strSQL);
if(m_strDept2!="")
{
strTemp.Format(" dept2 %s '%s' ",strType,m_strDept2);
if(!bNoCondition)
strSQL += " and ";
strSQL += strTemp;
bNoCondition = FALSE;
}
if(m_strDept3!="")
{
strTemp.Format(" dept3 %s '%s' ",strType,m_strDept3);
if(!bNoCondition)
strSQL += " and ";
strSQL += strTemp;
bNoCondition = FALSE;
}
if(m_strName!="")
{
strTemp.Format(" name %s '%s' ",strType,m_strName);
if(!bNoCondition)
strSQL += " and ";
strSQL += strTemp;
bNoCondition = FALSE;
}
if(m_strNative!="")
{
strTemp.Format(" native %s '%s' ",strType,m_strNative);
if(!bNoCondition)
strSQL += " and ";
strSQL += strTemp;
bNoCondition = FALSE;
}
if(bNoCondition)
{
strSQL = "select * from person";
}
///
//MessageBox(strSQL);
m_ctrList.DeleteAllItems();
m_ctrList.SetRedraw(FALSE);
if(!m_PersonSet.Open(AFX_DB_USE_DEFAULT_TYPE,strSQL))
{
MessageBox("打开数据库失败!","数据库错误",MB_OK);
return ;
}
char buffer[20];
CString strTime;
int i=0;
if(m_PersonSet.IsEOF())
{
MessageBox("没有符合条件的记录!");
return;
}
while(!m_PersonSet.IsEOF())
{
m_ctrList.InsertItem(i,m_PersonSet.m_ID);
m_ctrList.SetItemText(i,1,m_PersonSet.m_name);
m_ctrList.SetItemText(i,2,m_PersonSet.m_sex);
strTime.Format("%d-%d-%d",m_PersonSet.m_birth.GetYear(),m_PersonSet.m_birth.GetMonth(),m_PersonSet.m_birth.GetDay());
m_ctrList.SetItemText(i,3,strTime);
_itoa(m_PersonSet.m_age,buffer,10);
m_ctrList.SetItemText(i,4,buffer);
m_ctrList.SetItemText(i,5,m_PersonSet.m_ismarry);
m_ctrList.SetItemText(i,6,m_PersonSet.m_duty);
m_ctrList.SetItemText(i,7,m_PersonSet.m_technical);
m_ctrList.SetItemText(i,8,m_PersonSet.m_isworker);
m_ctrList.SetItemText(i,9,m_PersonSet.m_aboutpay);
m_ctrList.SetItemText(i,10,m_PersonSet.m_education);
m_ctrList.SetItemText(i,11,m_PersonSet.m_political);
strTime.Format("%d-%d-%d",m_PersonSet.m_date2.GetYear(),m_PersonSet.m_date2.GetMonth(),m_PersonSet.m_date2.GetDay());
m_ctrList.SetItemText(i,12,strTime);
i++;
m_PersonSet.MoveNext();
}
m_PersonSet.Close();
m_ctrList.SetRedraw(TRUE);
}
6.4人事资料统计
主要代码如下:
void CStatDlg::OnClickList1(NMHDR* pNMHDR, LRESULT* pResult)
{
// TODO: Add your control notification handler code here
CString strSQL;
CString strValue="0";
CDatabase db;
db.Open(_T("Manager1"));
CRecordset recordset(&db);
UpdateData(TRUE);
//获得统计类型
int nType = m_ctrList.GetSelectionMark();
int i=0;
switch(nType)
{
case 0://按性别统计
m_ctrResult.DeleteAllItems();
m_ctrResult.DeleteColumn(1);
m_ctrResult.DeleteColumn(0);
m_ctrResult.InsertColumn(0,"性别");
m_ctrResult.InsertColumn(1,"人数");
m_ctrResult.SetColumnWidth(0,100);
m_ctrResult.SetColumnWidth(1,100);
strSQL="select count(ID) as num ,sex from person group by sex";
//MessageBox(strSQL);
if(!recordset.Open(CRecordset::forwardOnly,strSQL))
{
MessageBox("打开数据库失败!","数据库错误",MB_OK);
return ;
}
while(!recordset.IsEOF())
{
recordset.GetFieldValue("sex",strValue);
m_ctrResult.InsertItem(i,strValue);
recordset.GetFieldValue("num",strValue);
//MessageBox(strValue);
m_ctrResult.SetItemText(i,1,strValue);
i++;
recordset.MoveNext();
}
recordset.Close();
break;
case 1://按年龄统计
m_ctrResult.DeleteAllItems();
m_ctrResult.DeleteColumn(1);
m_ctrResult.DeleteColumn(0);
m_ctrResult.InsertColumn(0,"年龄");
m_ctrResult.InsertColumn(1,"人数");
m_ctrResult.SetColumnWidth(0,100);
m_ctrResult.SetColumnWidth(1,100);
strSQL="select count(ID) as num ,age from person group by age";
if(!recordset.Open(CRecordset::forwardOnly,strSQL))
{
MessageBox("打开数据库失败!","数据库错误",MB_OK);
return ;
}
while(!recordset.IsEOF())
{
recordset.GetFieldValue("age",strValue);
m_ctrResult.InsertItem(i,strValue);
recordset.GetFieldValue("num",strValue);
m_ctrResult.SetItemText(i,1,strValue);
i++;
recordset.MoveNext();
}
recordset.Close();
break;
case 2://按民族统计
m_ctrResult.DeleteAllItems();
m_ctrResult.DeleteColumn(1);
m_ctrResult.DeleteColumn(0);
m_ctrResult.InsertColumn(0,"民族");
m_ctrResult.InsertColumn(1,"人数");
m_ctrResult.SetColumnWidth(0,100);
m_ctrResult.SetColumnWidth(1,100);
strSQL="select count(ID) as num ,folk from person group by folk";
if(!recordset.Open(CRecordset::forwardOnly,strSQL))
{
MessageBox("打开数据库失败!","数据库错误",MB_OK);
return ;
}
while(!recordset.IsEOF())
{
recordset.GetFieldValue("folk",strValue);
m_ctrResult.InsertItem(i,strValue);
recordset.GetFieldValue("num",strValue);
m_ctrResult.SetItemText(i,1,strValue);
i++;
recordset.MoveNext();
}
recordset.Close();
break;
case 3://按籍贯统计
m_ctrResult.DeleteAllItems();
m_ctrResult.DeleteColumn(1);
m_ctrResult.DeleteColumn(0);
m_ctrResult.InsertColumn(0,"籍贯");
m_ctrResult.InsertColumn(1,"人数");
m_ctrResult.SetColumnWidth(0,100);
m_ctrResult.SetColumnWidth(1,100);
strSQL="select count(ID) as num ,native from person group by native";
if(!recordset.Open(CRecordset::forwardOnly,strSQL))
{
MessageBox("打开数据库失败!","数据库错误",MB_OK);
return ;
}
while(!recordset.IsEOF())
{
recordset.GetFieldValue("native",strValue);
m_ctrResult.InsertItem(i,strValue);
recordset.GetFieldValue("num",strValue);
m_ctrResult.SetItemText(i,1,strValue);
i++;
recordset.MoveNext();
}
recordset.Close();
break;
case 4://按职务类别统计
m_ctrResult.DeleteAllItems();
m_ctrResult.DeleteColumn(1);
m_ctrResult.DeleteColumn(0);
m_ctrResult.InsertColumn(0,"职务");
m_ctrResult.InsertColumn(1,"人数");
m_ctrResult.SetColumnWidth(0,100);
m_ctrResult.SetColumnWidth(1,100);
strSQL="select count(ID) as num ,duty from person group by duty";
if(!recordset.Open(CRecordset::forwardOnly,strSQL))
{
MessageBox("打开数据库失败!","数据库错误",MB_OK);
return ;
}
while(!recordset.IsEOF())
{
recordset.GetFieldValue("duty",strValue);
m_ctrResult.InsertItem(i,strValue);
recordset.GetFieldValue("num",strValue);
m_ctrResult.SetItemText(i,1,strValue);
i++;
recordset.MoveNext();
}
recordset.Close();
break;
case 5://按职称类别统计
m_ctrResult.DeleteAllItems();
m_ctrResult.DeleteColumn(1);
m_ctrResult.DeleteColumn(0);
m_ctrResult.InsertColumn(0,"职称");
m_ctrResult.InsertColumn(1,"人数");
m_ctrResult.SetColumnWidth(0,100);
m_ctrResult.SetColumnWidth(1,100);
strSQL="select count(ID) as num ,technical from person group by technical";
if(!recordset.Open(CRecordset::forwardOnly,strSQL))
{
MessageBox("打开数据库失败!","数据库错误",MB_OK);
return;
}
while(!recordset.IsEOF())
{
recordset.GetFieldValue("technical",strValue);
m_ctrResult.InsertItem(i,strValue);
recordset.GetFieldValue("num",strValue);
m_ctrResult.SetItemText(i,1,strValue);
i++;
recordset.MoveNext();
}
recordset.Close();
break;
case 6://按文化程度统计
m_ctrResult.DeleteAllItems();
m_ctrResult.DeleteColumn(1);
m_ctrResult.DeleteColumn(0);
m_ctrResult.InsertColumn(0,"文化程度");
m_ctrResult.InsertColumn(1,"人数");
m_ctrResult.SetColumnWidth(0,100);
m_ctrResult.SetColumnWidth(1,100);
strSQL="select count(ID) as num ,education from person group by education";
if(!recordset.Open(CRecordset::forwardOnly,strSQL))
{
MessageBox("打开数据库失败!","数据库错误",MB_OK);
return ;
}
while(!recordset.IsEOF())
{
recordset.GetFieldValue("education",strValue);
m_ctrResult.InsertItem(i,strValue);
recordset.GetFieldValue("num",strValue);
m_ctrResult.SetItemText(i,1,strValue);
i++;
recordset.MoveNext();
}
recordset.Close();
break;
case 7://按政治面貌统计
m_ctrResult.DeleteAllItems();
m_ctrResult.DeleteColumn(1);
m_ctrResult.DeleteColumn(0);
m_ctrResult.InsertColumn(0,"政治面貌");
m_ctrResult.InsertColumn(1,"人数");
m_ctrResult.SetColumnWidth(0,100);
m_ctrResult.SetColumnWidth(1,100);
strSQL="select count(ID) as num ,political from person group by political";
if(!recordset.Open(CRecordset::forwardOnly,strSQL))
{
MessageBox("打开数据库失败!","数据库错误",MB_OK);
return ;
}
while(!recordset.IsEOF())
{
recordset.GetFieldValue("political",strValue);
m_ctrResult.InsertItem(i,strValue);
recordset.GetFieldValue("num",strValue);
m_ctrResult.SetItemText(i,1,strValue);
i++;
recordset.MoveNext();
}
recordset.Close();
break;
case 8://按所在部门统计
m_ctrResult.DeleteAllItems();
m_ctrResult.DeleteColumn(1);
m_ctrResult.DeleteColumn(0);
m_ctrResult.InsertColumn(0,"部门");
m_ctrResult.InsertColumn(1,"人数");
m_ctrResult.SetColumnWidth(0,100);
m_ctrResult.SetColumnWidth(1,100);
strSQL="select count(ID) as num ,dept from person group by dept";
if(!recordset.Open(CRecordset::forwardOnly,strSQL))
{
MessageBox("打开数据库失败!","数据库错误",MB_OK);
return ;
}
while(!recordset.IsEOF())
{
recordset.GetFieldValue("dept",strValue);
m_ctrResult.InsertItem(i,strValue);
recordset.GetFieldValue("num",strValue);
m_ctrResult.SetItemText(i,1,strValue);
i++;
recordset.MoveNext();
}
recordset.Close();
break;
case 9://按职工类型统计
m_ctrResult.DeleteAllItems();
m_ctrResult.DeleteColumn(1);
m_ctrResult.DeleteColumn(0);
m_ctrResult.InsertColumn(0,"职工类型");
m_ctrResult.InsertColumn(1,"人数");
m_ctrResult.SetColumnWidth(0,100);
m_ctrResult.SetColumnWidth(1,100);
strSQL="select count(ID) as num ,isworker from person group by isworker";
if(!recordset.Open(CRecordset::forwardOnly,strSQL))
{
MessageBox("打开数据库失败!","数据库错误",MB_OK);
return ;
}
while(!recordset.IsEOF())
{
recordset.GetFieldValue("isworker",strValue);
m_ctrResult.InsertItem(i,strValue);
recordset.GetFieldValue("num",strValue);
m_ctrResult.SetItemText(i,1,strValue);
i++;
recordset.MoveNext();
}
recordset.Close();
break;
case 10://按工资类型统计
m_ctrResult.DeleteAllItems();
m_ctrResult.DeleteColumn(1);
m_ctrResult.DeleteColumn(0);
m_ctrResult.InsertColumn(0,"工资类型");
m_ctrResult.InsertColumn(1,"人数");
m_ctrResult.SetColumnWidth(0,100);
m_ctrResult.SetColumnWidth(1,100);
strSQL="select count(ID) as num ,aboutpay from person group by aboutpay";
if(!recordset.Open(CRecordset::forwardOnly,strSQL))
{
MessageBox("打开数据库失败!","数据库错误",MB_OK);
return ;
}
while(!recordset.IsEOF())
{
recordset.GetFieldValue("aboutpay",strValue);
m_ctrResult.InsertItem(i,strValue);
recordset.GetFieldValue("num",strValue);
m_ctrResult.SetItemText(i,1,strValue);
i++;
recordset.MoveNext();
}
recordset.Close();
break;
case 11://按婚姻状况统计
m_ctrResult.DeleteAllItems();
m_ctrResult.DeleteColumn(1);
m_ctrResult.DeleteColumn(0);
m_ctrResult.InsertColumn(0,"婚姻状况");
m_ctrResult.InsertColumn(1,"人数");
m_ctrResult.SetColumnWidth(0,100);
m_ctrResult.SetColumnWidth(1,100);
strSQL="select count(ID) as num ,ismarry from person group by ismarry";
if(!recordset.Open(CRecordset::forwardOnly,strSQL))
{
MessageBox("打开数据库失败!","数据库错误",MB_OK);
return ;
}
while(!recordset.IsEOF())
{
recordset.GetFieldValue("ismarry",strValue);
m_ctrResult.InsertItem(i,strValue);
recordset.GetFieldValue("num",strValue);
m_ctrResult.SetItemText(i,1,strValue);
i++;
recordset.MoveNext();
}
recordset.Close();
break;
default:
return;
}
UpdateData(FALSE);
*pResult = 0;
}
6.5数据库备份以及恢复
代码如下:
void CMainFrame::OnDatabaseBackup()
{
// TODO: Add your command handler code here
if(AfxMessageBox("您确定要备份数据库吗?",MB_OKCANCEL)==IDCANCEL)
{
return;
}
if(CopyFile(".\\manager1.mdb",".\\backup\\manager1.bak",FALSE))
AfxMessageBox("数据库备份成功!");
else
AfxMessageBox("数据库备份失败!");
}
void CMainFrame::OnDatabaseRecover()
{
// TODO: Add your command handler code here
if(AfxMessageBox("还原数据库将覆盖原来的数据库。您确定要还原吗?",MB_OKCANCEL)==IDCANCEL)
{
return;
}
if(CopyFile(".\\backup\\manager1.bak",".\\manager1.mdb",FALSE))
AfxMessageBox("数据库还原成功!");
else
AfxMessageBox("数据库还原失败!");
}
6.6设置用户
主要代码如下:
void CUserDlg::OnOK()
{
UpdateData();
if(m_ctrUser.IsWindowEnabled())
{//增加新用户的输入检查
if(m_strUser=="")
{
MessageBox("请填写用户名!");
m_ctrUser.SetFocus();
return;
}
}
else
{//修改用户信息的输入检查
if(m_strUser=="")
{
MessageBox("请选择一个用户!");
return;
}
}
//限制密码不能为空
if(m_strPass=="")
{
MessageBox("密码不能为空,请输入密码!");
m_ctrPass.SetFocus();
return;
}
//验证密码与确认密码是否一致
if(m_strPass!=m_strRePass)
{
MessageBox("两次输入地密码不一致,请重新输入密码!");
m_ctrPass.SetFocus();
m_strPass = "";
m_strRePass = "";
UpdateData(FALSE);
return;
}
//打开记录集
CString strSQL;
strSQL.Format("select * from password where user='%s'",m_strUser);
if(!m_recordset.Open(AFX_DB_USE_DEFAULT_TYPE,strSQL))
{
MessageBox("打开数据库失败!","数据库错误",MB_OK);
return ;
}
if(m_ctrUser.IsWindowEnabled())
{//增加新用户
//判断用户是否已经存在
if(m_recordset.GetRecordCount()!=0)
{
m_recordset.Close();
MessageBox("该用户已经存在!");
return;
}
m_recordset.AddNew();
m_recordset.m_user = m_strUser;
m_recordset.m_isadmin = m_IsAdmin;
m_recordset.m_passwd = m_strPass;
m_recordset.Update();
MessageBox("用户添加成功!请记住用户名和密码!");
m_recordset.Close();
}
else
{//修改用户信息
//判断用户是否不存在
if(m_recordset.GetRecordCount()==0)
{
m_recordset.Close();
MessageBox("该用户不存在!请更新数据库");
return;
}
m_recordset.Edit();
m_recordset.m_user = m_strUser;
m_recordset.m_passwd = m_strPass;
m_recordset.m_isadmin = m_IsAdmin;
m_recordset.Update();
MessageBox("用户修改成功!请记住用户名和密码!");
m_recordset.Close();
}
m_ctrUser.EnableWindow(FALSE);
//更新用户列表
RefreshData();