1.1系统分析
随着电子计算机的飞速发展,计算机在企事业单位管理的应用已经非常普及,所以利用计算机实现企事业的管理成为必然。工资管理是企事业单位的重要部分,所以有一款专用的计算机工资管理系统是每个企业的需求,本系统就是基于学校教职工工资管理这一信息的管理而设计的,分为系统管理模块、员工管理模块、部门管理模块、工资管理模块。涉及管理员、普通用户两种角色。通过对初始化原型系统进行需求分析、不断修正和改进,直到形成用户满意的可行系统。
1.2系统目标
网络办公自动化系统是计算机技术和网络迅速发展的一个办公应用解决方案。它的主要目的是实现信息交流和信息共享。提供协同工作的手段,从而提高办公效率,让人们从烦琐的纸质化办公中解脱出来。现在我国许多机关单位的人事管理还停留在纸介质阶段,这样的机制是不能够适应时代发展的。在信息时代,传统的管理方法必然以计算机为基础的信息管理模式所取代,基于这种情况,出现了对工资管理系统的需求。
第二章 模块划分
根据需求分析,本系统分为系统管理、员工管理、院系管理、工资管理,辅助功能等5个部分,系统模块如图1—1所示。 用户管 理
系统管理 职工管理 院系管理 工资管理 辅助功能 教职工工资管理系修改密码 备份数据 还原数据 添加职工信息 职工信息管理 院系管理 1
工资计算公式 职工工资统计 工资信息管理 计算器 日历
各个模块具体说明如下:
系统管理:对使用本系统的用户进行管理,登录系统用户可以修改密码,系统管理员对数据进行备份与还原。
职工管理:对职工的基本信息进行怎、添、该、删操作。 院系管理:显示院系的基本信息。
工资管理;工资计算公式,对职工工资进行统计,设置职工工资基本信息。 辅助功能: 计算器和日历。提供临时查询与计算。
第三章 搭建开发环境
对于数据库的系统的开发可以选择多种语言与平台去开发。语言有诸如VFP,Java, C#, C++, VB, PB, .NET, JSP等;对于数据库来说,数据库系统一般由数据库、数据库管理系统(DBMS)、应用系统、数据库管理员和用户构成。DBMS是数据库系统的基础和核心。目前有许多DBMS产品,如DB2、Oracle、Microsoft SQL Server 、Sybase SQLServer、Informix、MySQL 等,它们在数据库市场上各自占有一席之地。考虑到对VC++还是比较熟悉的,所以这里选用VC++6.0来进行开发。数据库则选择大家常用的Microsoft SQL Server 2005. (1) 操作系统:Windows XP.
(2) 数据库:Microsoft SQL Server 2005. Microsoft SQL Server 2005具
有较好系统的集成性及对日常任务的自动化管理能力,可以提供深入的业务分析统计和监控预测平台。鉴于以上优点,选择SQL 2005作为数据库管理系统。
(3) 编译工具:Visual C++ 6.0. VC++6.0编译速度快,可以开发出具有良
好的交互功能、兼容性和扩展性的应用程序,程序调试方便,比较适合管理系统的开发。
2
第四章 数据库设计
4.1 E-R实体图
E-R实体图为实体-关系图。提供了表示实体型、属性、和联系的方法。用来描述现实世界的概念模型。E-R图是在需求分析的基础上进行的。实体可以使需求分析中抽象出来的名词。根据分析设计结果。有职工、部门、用户、工资等实体。下面为实体结构。
职工实体E-R图,如图1-2所示
图1-2 职工实体E-R图
出生日期 联系方式 学院名 编号 姓名 性别 备注 职工 职称 教龄 职位
院系实体E-R图,如图1-3所示
图1-3 院系实体E-R图
学院名 学院主管 学院编号 办公电话 院系
3
工资实体E-R图,如图1-4所示
水电费 保险费 月份 住房补贴 员工编号 基本工资 学院名称 工资 餐费补贴
话费补贴
图1-4 工资实体E-R图
用户实体E-R图,如图1-5所示
密码 用户名 用户类型 用户
图1-5 用户实体E-R图
4.2 设计数据库表
表1-1 职工表
4
表1-2 院系表
表1-3 工资表
表1-4 用户表
第五章 关键代码与主要界面
5
5.1封装数据库类
在进行具体的代码编程之前,选择一种好的数据库连接方式是整个代码编程的基础,考虑到该项目包括后台数据库的建立和维护以及前端应用程序的开发两个方面,所以,此应用程序采用被广泛使用的ADO数据库访问技术,并适当的把数据库表的字段封装到相应的类中。使应用程序的各个窗体都能够共享对数据库的操作。而不需要重复编码,使程序更加易于维护,从而将面向对象的思想成功应用于程序设计中。
设计数据库类ADOconnection,具体代码如下: class ADOConnection {
// 定义变量
public:
// 定义方法 public:
ADOConnection();
virtual ~ADOConnection(); // 初始化—连接数据库
void OnInitADOConnection(); // 执行查询
_RecordsetPtr& GetRecordSet(_bstr_t bstrSQL); // 执行SQL语句,Insert Update _variant_t BOOL ExecuteSQL(_bstr_t bstrSQL); // 断开连接
void ExitConnect(); // 执行Execute方法
_RecordsetPtr& Execute2(_bstr_t bstrSQL); }
//初始化—连接数据库代码如下:
6
// 添加一个指向Connection对象的指针: _ConnectionPtr m_pConnection; // 添加一个指向Recordset对象的指针: _RecordsetPtr m_pRecordset;
void ADOConnection::OnInitADOConnection() {
// 初始化OLE/COM库环境 ::CoInitialize(NULL);
try {
// 创建Connection对象
m_pConnection.CreateInstance(\"ADODB.Connection\"); // 设置连接字符串,必须是BSTR型或者_bstr_t类型
strConnect
=
\"Provider=SQLOLEDB.1;
User
ID=sa;
Database=SalaryMagSy;
_bstr_t Password=287016;\";
Server=127.0.0.1\\\\SQL2005;
// 打开数据库 }
// 捕捉异常 catch(_com_error e) {
// 显示错误信息
m_pConnection->Open(strConnect,\"\
AfxMessageBox(e.Description()); } }
5.2设计职工模块
员工模块是整个管理系统的基础,员工模块主要实现员工信息的录入、修改删除等操作。
员工模块的相应类为Staff类。设计如下: class CStaff { public:
CString staff_id; // 教职工编号
7
CString staff_name; // 姓名 CString staff_sex; // 性别 CString staff_title; // 职称 CString depart_name; // 院系 CString staff_position; // 岗位 long staff_teach_time; // 教龄 CString staff_birth; // 出生日期 CString staff_phone; // 联系电话 CString staff_more; // 备注 //CString staff_; // 预留照片 public: CStaff();
virtual ~CStaff(); // 数据库操作
void GetInfo(CString paraID); // 根据教职工编号得到其他信息 CString GetName(CString paraID); // 由编号返回姓名 void SqlInsert(); // 插入操作 void SqlUpdate(CString paraID); // 更新操作 void SqlDelete(CString paraID); // 删除操作 };
其中的删除操作代码如下 // 删除指定学生信息
void CStaff::SqlDelete(CString paraId) {
//连接数据库
ADOConnection m_AdoConn;
m_AdoConn.OnInitADOConnection(); //设置DELETE语句 _bstr_t vSQL;
vSQL = \"DELETE FROM staff WHERE staff_id = \" + paraId; //执行DELETE语句
m_AdoConn.ExecuteSQL(vSQL); //断开与数据库的连接 m_AdoConn.ExitConnect(); }//*/
8
添加员工相应的对话框为CAddStaffInfo类对话框,对应的图形界面为 图1-6;
图1-6 添加教职工信息界面
相关的代码为: // 初始化相关变量
BOOL CAddStaffInfo::OnInitDialog() {
CDialog::OnInitDialog();
// TODO: Add extra initialization here
// 用编辑框中的ID初始化StaffID StaffID = m_staffID;
m_deparCtrl.AddString(\"信息学院\"); m_deparCtrl.AddString(\"机电学院\"); m_deparCtrl.AddString(\"建测学院\"); m_deparCtrl.AddString(\"资环学院\");
9
m_deparCtrl.AddString(\"外贸学院\"); m_deparCtrl.AddString(\"文法学院\"); m_deparCtrl.AddString(\"经管学院\"); m_deparCtrl.AddString(\"材化学院\"); m_deparCtrl.AddString(\"理学院\");
m_staffSexCtrl.AddString(\"男\"); m_staffSexCtrl.AddString(\"女\");
m_staffTitleCtrl.AddString(\"助教\"); m_staffTitleCtrl.AddString(\"讲师\"); m_staffTitleCtrl.AddString(\"副教授\"); m_staffTitleCtrl.AddString(\"教授\"); m_staffTitleCtrl.AddString(\"博士生导师\"); m_staffTitleCtrl.AddString(\"院士\");
if (StaffID != \"\") //表示修改数据 {
// 员工编号变灰
GetDlgItem(IDC_ID_EDIT)->EnableWindow(FALSE); } else {
// 默认下拉列表第一项 m_staffSexCtrl.SetCurSel(0); m_staffTitleCtrl.SetCurSel(0); m_deparCtrl.SetCurSel(0); }
return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE }
// 确定按钮,插入或修改
void CAddStaffInfo::OnAddbtn()
10
{
// TODO: Add your control notification handler code here
UpdateData(TRUE);
if (m_staffID == \"\") {
MessageBox(\"请输入编号\"); return; }
if (m_staffName == \"\") {
MessageBox(\"请输入姓名\"); return; }
/////////////////////////////////////////////// //将用户输入的数据赋值到对象cur中,为更新数据库做准备 CStaff cur;
cur.staff_id=m_staffID; // 编号 cur.staff_name=m_staffName; // 姓名
int nIndex = m_staffSexCtrl.SelectString(0, m_staffSex); // 性别 m_staffSexCtrl.GetLBText(nIndex, cur.staff_sex);
int nIndex1 = m_staffTitleCtrl.SelectString(0, m_staffTitle); // 职称 m_staffTitleCtrl.GetLBText(nIndex1, cur.staff_title);
int nIndex2 = m_deparCtrl.SelectString(0, m_depart); // 院系
m_deparCtrl.GetLBText(nIndex2, cur.depart_name);
cur.staff_position=m_staffPosition; // 职位 CTime time = m_birthTime.GetTime();
cur.staff_birth =time.Format(\"%Y-%m-%d\"); // 出生日期
cur.staff_phone = m_staffPhone; // 联系方式 cur.staff_teach_time = m_teachTime; // 教龄
11
cur.staff_more = m_staffMore; // 备注
UpdateData(FALSE);
// 由员工编号是否为空来判断插入还是更新数据 if (StaffID == \"\") //表示插入数据 {
cur.SqlInsert(); } else
cur.SqlUpdate(m_staffID);// 由输入的编号判断 CDialog::OnOK(); }
接下来设计员工信息管理界面,给系统添加相应的对话框类CStaffInfoMag类,在此对话框中完成相应的添加、删除、修改等功能。
这里用到ADO data控件和 DataGrid控件,所以依照步骤为其添加这两个控件,并在对话框类合理的设计,增加添加,删除、修改等按钮。 教职工信息管理的相应的界面如图1-7.
图1-7 教职工信息管理 相关的代码如: // 更新数据
void CStaffInfoMag::RefreshData() {
12
// 设置SELECT语句
CString cSource = \"SELECT staff.staff_id AS 编号, staff.staff_name AS 姓名, staff.staff_sex AS 性别,\"
\"staff.staff_title As 职称, staff.depart_name AS 院系, staff.staff_position AS 职位,\"
\"staff.staff_teach_time AS 教龄, staff_birth As 出生日期, staff_phone AS 联系电话,\"
\"staff.staff_more AS 备注 FROM staff\";
//刷新ADO Data控件的记录源 m_Adodc.SetRecordSource(cSource); m_Adodc.Refresh();
//设置列宽度 _variant_t vIndex; vIndex = long(0);
m_DataGrid.GetColumns().GetItem(vIndex).SetWidth(100); // vIndex = long(1);
m_DataGrid.GetColumns().GetItem(vIndex).SetWidth(100); // vIndex = long(2);
m_DataGrid.GetColumns().GetItem(vIndex).SetWidth(100); // vIndex = long(3);
m_DataGrid.GetColumns().GetItem(vIndex).SetWidth(100); // vIndex = long(4);
m_DataGrid.GetColumns().GetItem(vIndex).SetWidth(150); // vIndex = long(5);
m_DataGrid.GetColumns().GetItem(vIndex).SetWidth(100); // vIndex = long(6);
m_DataGrid.GetColumns().GetItem(vIndex).SetWidth(100); // vIndex = long(7);
m_DataGrid.GetColumns().GetItem(vIndex).SetWidth(150); // vIndex = long(8);
m_DataGrid.GetColumns().GetItem(vIndex).SetWidth(150); // vIndex = long(9);
m_DataGrid.GetColumns().GetItem(vIndex).SetWidth(300); //
13
编号 姓名 性别 职称 院系 职位 教龄 出生日期 联系电话 备注
}
// 添加
void CStaffInfoMag::OnAddbtn() {
// TODO: Add your control notification handler code here UpdateData(TRUE);
CAddStaffInfo dlg; // 初始化变量
dlg.m_staffID = \"\"; // 编号 dlg.m_staffName = \"\"; // 姓名 dlg.m_staffPosition = \"\"; // 职位 dlg.m_teachTime = 0; // 教龄 dlg.m_staffPhone = \"\"; // 电话 dlg.m_staffMore = \"\"; // 备注
if (dlg.DoModal() == IDOK) RefreshData(); } // 修改
void CStaffInfoMag::OnModifybtn() {
// TODO: Add your control notification handler code here
UpdateData(TRUE);
if (m_Adodc.GetRecordset().GetEof()) {
MessageBox(\"请选择要修改的记录!\"); return; }
14
/* 在CDataGrid类中添加和自定义 CString GetItem()函数*/
// 读取选择教职工的记录 CStaff cur;
CString test = m_DataGrid.GetItem(0); cur.GetInfo(m_DataGrid.GetItem(0));
// 将职工数据读取到编辑对话框中 CAddStaffInfo dlg;
dlg.m_staffID = m_DataGrid.GetItem(0); dlg.m_staffSex = m_DataGrid.GetItem(2);
// 编号 // 性别
dlg.m_staffName = m_DataGrid.GetItem(1); // 姓名 dlg.m_staffTitle = m_DataGrid.GetItem(3); // 职称 dlg.m_depart = m_DataGrid.GetItem(4); // 院系 dlg.m_staffPosition = m_DataGrid.GetItem(5); // 职位 dlg.m_teachTime = atol(m_DataGrid.GetItem(6)); // 教龄 // CSring转化为Ctime的成功办法 CString s = m_DataGrid.GetItem(7); COleDateTime time1; time1.ParseDateTime(s); SYSTEMTIME systime;
VariantTimeToSystemTime(time1, &systime); CTime tm(systime); dlg.m_birthTime = tm;
dlg.m_staffPhone = m_DataGrid.GetItem(8); // 联系电话 dlg.m_staffMore = m_DataGrid.GetItem(9); // 备注
if (dlg.DoModal() == IDOK) RefreshData(); } // 删除
15
void CStaffInfoMag::OnDeletebtn() {
// TODO: Add your control notification handler code here if (m_Adodc.GetRecordset().GetEof()) {
MessageBox(\"请选择要删除的记录!\"); return; }
//读取选择学生的记录
if (MessageBox(\"是否删除当前记录?\请确认\{
CStaff cur;
cur.SqlDelete(m_DataGrid.GetItem(0)); RefreshData(); } }
5.3 院系管理模块
院系管理模块主要是显示学院的一些基本信息,所以比较简单。其界面如图1-8所示
图1-8 院系管理
具体代码与职工管理相似,所以这里就不列举了。
16
5.4工资管理模块
工资管理模块式本系统的核心,所以该模块设计的好坏直接影响到用户的使用,由于时间有限,所以本模块这实现了一些基本的功能,更多详细的设计等以后有时间了再去添加,其大体的包括工资计算公式、职工工资统计和职工工资管理三个方面。具体的界面如下图:
图1-10 工资计算公式
说明:由于个人所得税这一项计算起来较复杂,所以本系统暂不涉及,在这里只是留一个空缺,待以后添加备用。
工资汇总模块如下(不涉及个人所得税):
图1-11 工资汇总表 工资管理模块如下:
17
图1-12 工资明细管理
相关代码片段如下:
BOOL CWageMagDlg::OnInitDialog() {
CDialog::OnInitDialog();
// TODO: Add extra initialization here
// 连接数据库
ADOConnection m_ADOConnection;
m_ADOConnection.OnInitADOConnection();
//添加根节点
m_treeImageList.Create(16,16,FALSE,1,0); //创建CImageList控件 //装入ICON资源
HICON hIcon = ::LoadIcon(AfxGetResourceHandle(), MAKEINTRESOURCE(IDI_ICON1));
m_treeImageList.Add(hIcon); //将ICON资源添加到CImageList控件中 //将CImageList控件与Tree控件相关联
m_TreeCrtl.SetImageList(&m_treeImageList, LVSIL_NORMAL);
ShowTreeData();
18
// 绘制表格、选择整行、报表头可以拖曳
m_ListCrtl.SetExtendedStyle(LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT | LVS_EX_HEADERDRAGDROP);//风格的设定
m_ListCrtl.InsertColumn(0, \"职工编号\LVCFMT_CENTER, 80);//列标题的设定
m_ListCrtl.InsertColumn(1, \"基本工资\m_ListCrtl.InsertColumn(2, \"学院名称\m_ListCrtl.InsertColumn(3, \"住房补贴\m_ListCrtl.InsertColumn(4, \"餐费补贴\m_ListCrtl.InsertColumn(5, \"话费补贴\m_ListCrtl.InsertColumn(6, \"保险费\m_ListCrtl.InsertColumn(7, \"水电费\m_ListCrtl.InsertColumn(8, \"月份\
// 保存按钮禁用
GetDlgItem(IDC_SAVEBTN)->EnableWindow(FALSE);//控件的禁用
// 设置Select语句 _bstr_t vSQL;
vSQL = \"SELECT DISTINCT depart_name FROM staff\";
// 执行SQL语句
_RecordsetPtr m_pRecordSet;
m_pRecordSet = m_ADOConnection.GetRecordSet(vSQL);
// 返回各列的值
while(!m_pRecordSet->adoEOF)//记录没有到末尾 {
////////////////////////////////////////////////////////////////////////
// 主要目的是去除由char * 带来左边很多的空格问题 CString depart;
19
depart =
(char*)_bstr_t(m_pRecordSet->GetCollect(_variant_t((long)0))); depart.TrimLeft(); // 去掉左边空格
////////////////////////////////////////////////////////////////////////
//取得第1列的值,从0开始计数
//m_depart.AddString((char*)_bstr_t(m_pRecordSet->GetCollect(_variant_t((long)0))));
m_depart.AddString(depart);
m_pRecordSet->MoveNext(); //移动到下条记录 }
// 函数调用初始化两个控件
ShowListData(\"select * from wageMag\");
//ShowListData(\"select * from wageMag where staff_id like '1101'\");
m_depart.SetCurSel(0);
// 断开与数据库的连接
m_ADOConnection.ExitConnect();
return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE }
// TReeCtrl控件响应函数
void CWageMagDlg::OnClickTree1(NMHDR* pNMHDR, LRESULT* pResult) {
// TODO: Add your control notification handler code here _variant_t va; CString strSQL;
20
HTREEITEM hSelect;
hSelect = m_TreeCrtl.GetSelectedItem(); CString strName;
if(hSelect != m_hParent) {
strName = m_TreeCrtl.GetItemText(hSelect);
if(m_TreeCrtl.GetParentItem(hSelect) == m_hParent) {
//strSQL.Format(\"select wageMag.* from wageMag staff \" //
\"WHERE wageMag.staff_id = staff.staff_id AND
staff.depart_name = '%s'\//MessageBox(strSQL);
// 选出所有院系相同的记录
strSQL.Format(\"select wageMag.* from wageMag WHERE depart_name = '%s'\strName);
ShowListData(strSQL); } }
*pResult = 0; }
// Tree控件结构显示
void CWageMagDlg::ShowTreeData() {
m_TreeCrtl.DeleteAllItems(); HTREEITEM hItem;
TVINSERTSTRUCT tvInsert; tvInsert.hParent = NULL; tvInsert.hInsertAfter = NULL; tvInsert.item.mask = TVIF_TEXT;
tvInsert.item.pszText = _T(\"全部院系\"); m_hParent = m_TreeCrtl.InsertItem(&tvInsert); _variant_t vName;
21
// 连接数据库
ADOConnection m_ADOConnection;
m_ADOConnection.OnInitADOConnection(); try {
// 设置Select语句 _bstr_t vSQL;
vSQL = \"SELECT DISTINCT depart_name FROM staff\";
//执行SELETE语句
_RecordsetPtr m_pRecordset, m_pRecordset1; m_pRecordset = m_ADOConnection.Execute2(vSQL);
// 返回各列的值
while(!m_pRecordset->adoEOF)//记录没有到末尾 {
vName = m_pRecordset->GetCollect(_variant_t((long)0)); //取得第一列属性名
hItem = m_TreeCrtl.InsertItem((char*)_bstr_t(vName), m_hParent);
// 确定部门下面各职工的记录
vSQL = \"SELECT DISTINCT staff_name FROM staff WHERE depart_name = '\"+_bstr_t(vName)+\"'\";
m_pRecordset1 = m_ADOConnection.Execute2(vSQL); while(!m_pRecordset1->adoEOF) {
vName = m_pRecordset1->GetCollect(_variant_t((long)0)); m_TreeCrtl.InsertItem((char*)_bstr_t(vName), hItem); m_pRecordset1->MoveNext(); }
m_pRecordset->MoveNext(); //移动到下条记录 }
22
m_TreeCrtl.Expand(m_hParent,TVE_EXPAND); // 展开树图 }
CATCH_ERROR;
// 断开与数据库的连接
m_ADOConnection.ExitConnect(); }
// 显示列表框控件中的数据
void CWageMagDlg::ShowListData(const CString& sql) {
m_ListCrtl.DeleteAllItems();
// 连接数据库
ADOConnection m_ADOConnection;
m_ADOConnection.OnInitADOConnection(); try {
//SELETE语句由函数传递 _RecordsetPtr m_pRecordset;
m_pRecordset = m_ADOConnection.Execute2((_bstr_t)sql);
int i = 0;
while(!m_pRecordset->adoEOF) {
m_ListCrtl.InsertItem(i,
(char*)_bstr_t(m_pRecordset->GetCollect(_variant_t((long)0)))); m_ListCrtl.SetItemText(i, 1,
(char*)_bstr_t(m_pRecordset->GetCollect(_variant_t((long)1)))); m_ListCrtl.SetItemText(i, 2,
(char*)_bstr_t(m_pRecordset->GetCollect(_variant_t((long)2)))); m_ListCrtl.SetItemText(i, 3,
(char*)_bstr_t(m_pRecordset->GetCollect(_variant_t((long)3))));
23
m_ListCrtl.SetItemText(i, 4,
(char*)_bstr_t(m_pRecordset->GetCollect(_variant_t((long)4)))); m_ListCrtl.SetItemText(i, 5,
(char*)_bstr_t(m_pRecordset->GetCollect(_variant_t((long)5)))); m_ListCrtl.SetItemText(i, 6,
(char*)_bstr_t(m_pRecordset->GetCollect(_variant_t((long)6)))); m_ListCrtl.SetItemText(i, 7,
(char*)_bstr_t(m_pRecordset->GetCollect(_variant_t((long)7)))); m_ListCrtl.SetItemText(i, 8,
(char*)_bstr_t(m_pRecordset->GetCollect(_variant_t((long)8)))); i++;
m_pRecordset->MoveNext(); } }
CATCH_ERROR;
// 断开与数据库的连接
m_ADOConnection.ExitConnect(); } // 添加
void CWageMagDlg::OnAddbtn() {
// TODO: Add your control notification handler code here
m_nFlag = 1; //标记的设定 m_StaffID = \"\"; m_Bwage = 0; m_House = 0; m_Food = 0; m_Phone = 0; m_Insurance = 0; m_Water = 0;
24
m_Month = 1;
GetDlgItem(IDC_SAVEBTN)->EnableWindow(); //控件的恢复
UpdateData(FALSE); } // 修改
void CWageMagDlg::OnUpdatebtn() {
// TODO: Add your control notification handler code here UpdateData(); if(m_StaffID == \"\") {
MessageBox(\"请选择一条记录!\"); return; }
// 员工编号变灰
GetDlgItem(IDC_STAFFID_EDIT)->EnableWindow(FALSE); GetDlgItem(IDC_SAVEBTN)->EnableWindow(); //控件的恢复
m_nFlag = 2; } // 删除
void CWageMagDlg::OnDeletbtn() {
// TODO: Add your control notification handler code here UpdateData(); {
MessageBox(\"请选择一条记录!\"); return ;
25
//标记的设定
//数据的更新
if(m_StaffID == \"\")
}
if(MessageBox(\"确定删除吗?\注意\{
CString strSQL; //定义字符串变量
strSQL.Format(\"delete wageMag where staff_id = '%s'ry {
//m_ADOConnection.ExecuteSQL((_bstr_t)strSQL);
theApp.m_pConnection->Execute((_bstr_t)strSQL, NULL, adCmdText);
MessageBox(\"删除成功!\");
ShowListData(\"select * from wageMag\"); ShowTreeData();
// 断开与数据库的连接
//m_ADOConnection.ExitConnect(); }
CATCH_ERROR; } } // 查询
void CWageMagDlg::OnSearchbtn() {
// TODO: Add your control notification handler code here
CSearchDlg dlg; UpdateData();
if (dlg.DoModal() == IDOK) {
CString strSQL, strID;
26
strID= dlg.m_staffID;
strID.TrimLeft(); // 去掉CString对象左边的空格
strSQL.Format(\"select * from wageMag where staff_id like '%s'\strID);
ShowListData(strSQL);
//ShowListData(\"select * from wageMag where staff_id like 1101\"); // 测试 } } // 保存
void CWageMagDlg::OnSavebtn() {
// TODO: Add your control notification handler code here
UpdateData();
//数据的更新
if(m_StaffID == \"\")
//m_ADOConnection.ExitConnect();
ShowListData(\"select * from wageMag\"); ShowTreeData();
return ; }
// 设置Select语句
CString strID; // 职工编号
CString strSQL,strSQL1, strDep;//定义字符串变量 _bstr_t vSQL; variant_t va;
strID.Format(\"%6s\
vSQL = \"select count(*) FROM staff WHERE staff_id = \"+ strID;
//执行SELETE语句
27
}{
MessageBox(\"职工编号不能为空!\");
_RecordsetPtr m_pRecordset;
//m_pRecordset = m_ADOConnection.Execute2(vSQL);
m_pRecordset = theApp.m_pConnection->Execute(vSQL, NULL, adCmdText);
va = m_pRecordset->GetCollect(_variant_t((long)0));//获取记录的值
if(va.iVal == 0) {
MessageBox(\"没有此教职工!\"); return ; }
int nIndex = m_depart.GetCurSel();//获取选中的索引 m_depart.GetLBText(nIndex, strDep);//获取选中的文本
if(m_nFlag == 1)//插入操作 {
strSQL1.Format(\"insert into wageMag values('%s', %d, '%s', %d, %d, %d, %d, %d, %d)\
m_StaffID, m_Bwage, strDep, m_House, m_Food, m_Phone, m_Insurance, m_Water, m_Month); }
if(m_nFlag == 2)//修改操作 {
//strSQL.Format(\"update wageinfo set wage = %d, date = '%s' where id = %s\m_nWage, strDate, m_strID);
strSQL1.Format(\"update wageMag set staff_bwage = %d, depart_name = '%s',\" \" welfare_house = %d, welfare_food = %d, welfare_phone = %d,\"
\"insurance_fee = %d, water_fee = %d, month = %d where staff_id = '%s'\m_Bwage, strDep, m_House, m_Food, m_Phone, m_Insurance, m_Water, m_Month, m_StaffID); }
28
try {
// 添加或修改记录集
//m_ADOConnection.ExecuteSQL((_bstr_t)strSQL1); // 第一种方法,操作失败的
theApp.m_pConnection->Execute((_bstr_t)strSQL1, NULL, adCmdText); // 第二种方法
GetDlgItem(IDC_SAVEBTN)->EnableWindow(FALSE);//控件的禁用 // 员工编号恢复
GetDlgItem(IDC_STAFFID_EDIT)->EnableWindow();
m_nFlag = -1; //标记的设定 m_StaffID = \"\"; m_Bwage = 0; m_House= 0; m_Food= 0; m_Phone= 0; m_Insurance= 0; m_Water= 0; m_Month = 1;
MessageBox(\"操作成功!\");
// 断开与数据库的连接
CATCH_ERROR;
UpdateData(FALSE); }
// 鼠标单击列表控件将其全部数据显示的编辑框中
void CWageMagDlg::OnItemchangingList1(NMHDR* pNMHDR, LRESULT* pResult) {
29
NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
// TODO: Add your control notification handler code here
int nSelect = pNMListView->iItem; // 获取列表控件的索引
m_StaffID = m_ListCrtl.GetItemText(nSelect, 0); m_Bwage = atoi(m_ListCrtl.GetItemText(nSelect, 1));
GetDlgItem(IDC_COMBO3)->SetWindowText(m_ListCrtl.GetItemText(nSelect, 2));
m_House = atoi(m_ListCrtl.GetItemText(nSelect, 3)); m_Food = atoi(m_ListCrtl.GetItemText(nSelect, 4)); m_Phone = atoi(m_ListCrtl.GetItemText(nSelect, 5)); m_Insurance = atoi(m_ListCrtl.GetItemText(nSelect, 6)); m_Water = atoi(m_ListCrtl.GetItemText(nSelect, 7)); m_Month = atoi(m_ListCrtl.GetItemText(nSelect, 8));
UpdateData(FALSE);
*pResult = 0; }
5.5系统管理模块
系统管理模块包括 用户管理、密码修改、数据备份、数据还原四部分,所以其对应的界面如下.
30
图1-12 用户管理
图1-13 修改密码
图1-14 备份数据库
31
图1-15 还原数据库
//备份数据库代码如下: void CBackupDlg::OnBackup() {
UpdateData(); { }
_ConnectionPtr m_pConnection; try {
// 创建Connection对象
HRESULT hr = m_pConnection.CreateInstance(\"ADODB.Connection\"); // 设置连接字符串,必须是BSTR型或者_bstr_t类型
strConnect
=
\"Provider=SQLOLEDB.1;
User
ID=sa;
Database=SalaryMagSy;
MessageBox(\"请选择路径!\"); return ;
//提示信息
//数据的更新
//条件的判断
if(m_strPath == \"\")
// TODO: Add your control notification handler code here
_bstr_t Password=287016;\";
//连接数据库
Server=127.0.0.1\\\\SQL2005;
// 打开数据库
m_pConnection->Open(strConnect,\"\
32
}
}
CString sql; //定义字符串变量
sql.Format(\"Backup Database SalaryMagSy to Disk = '%s'\m_pConnection->Execute((_bstr_t)sql, NULL, adCmdText);//执行MessageBox(\"备份成功!\"); m_pConnection->Close();
//关闭连接
m_strPath); SQL语句
// 捕捉异常
catch(_com_error e) { }
// 显示错误信息
AfxMessageBox(e.Description());
5.6辅助功能模块。
由于可以由控件直接生成,其截图如下:
图1-16 日历
33
图1-17 计算器
5.7系统的主界面和登录界面
系统的登录界面为:
图1-18 登录界面
相关代码如下:
void CLoginDlg::OnOK() {
//将对话框中编辑框的数据读取到成员变量中 UpdateData(TRUE);
// 没有输入用户名
34
// TODO: Add your control notification handler code here
if(m_User == \"\") { }
// 定义用户信息表变量 CUserInfo User;
// 判断用户是否存在
if(!User.IsExistUser(m_User)) { }
BUser = m_User; // 给静态变量赋值
// 判断密码是否正确
35
MessageBox(\"请输入用户名\信息提示\"); GetDlgItem(IDC_USERNAME)->SetFocus(); return;
count= count+1; if(count < 3) { } else { }
MessageBox(\"重试次数已到,不能再输入用户名和密码,即将退出exit(0); return;
MessageBox(\"用户名不存在,请重新输入!\\"用户名错误\m_User = \"\"; m_Passwd = \"\"; UpdateData(FALSE);
GetDlgItem(IDC_USERNAME)->SetFocus(); return;
MB_ICONINFORMATION);
系统!\用户名错误\
}
User.GetInfo(m_User); if(User.Passwd != m_Passwd) { }
// 关闭对话框 CDialog::OnOK();
count++; if(count < 3) { } else { }
MessageBox(\"重试次数已到,不能再输入用户名和密码,即将退出exit(0); return;
MessageBox(\"用户名或密码错误,请重新输入!\用户名或密码m_User = \"\"; m_Passwd = \"\"; UpdateData(FALSE);
GetDlgItem(IDC_USERNAME)->SetFocus(); return;
错误\
系统!\用户名或密码错误\
系统的主界面如下:
36
图1-19 主界面框架
总结
通过将近一个多月来的数据库课程设计,学到了很多东西,其中不乏艰辛与痛苦,但如今回想起来时快乐的,从选题开始到如今交出一个较功能完善的系统,是多么令人愉快的一件事,看到自己的努力并没有白费,实在是高兴。从选题开始的一无所知到逐步深化理解,不断的总结与深入发掘,你会发现自己的诸多不足,从而从中学到不少未知的知识,当你把这些即得的知识运用到你的程序代码中时,这又是一件令人兴奋的事。通过本次数据库课程设计,确实学到了很多东西,尤其对于自己完全陌生领域的探索与应用,更是提升自身能力的一个很重要方面,不畏惧,勇敢的去克服它,你就会得到前所未有的成就感,你就会发现,哦!原来我也可以!理论来源于实践,当你认为理论知识理所当然时,会时常在实际的实践中碰壁。而在你碰壁的同时,你又会增长自己的见识。总之,由本次课程设计收获很大。
参考文献
[1] 深入体验VC++项目开发:清华大学出版社,2011;
[2] 萨师煊、王珊 数据库系统概论(第四版)高等教育出版社,2006; [3] SQL SERVER 2005 实用教程(第二版)电子工业出版社,2008;
37
因篇幅问题不能全部显示,请点此查看更多更全内容