1、第一章 需求分析1.1系统分析随着电子计算机的飞速发展,计算机在企事业单位管理的应用已经非常普及,所以利用计算机实现企事业的管理成为必然。工资管理是企事业单位的重要部分,所以有一款专用的计算机工资管理系统是每个企业的需求,本系统就是基于学校教职工工资管理这一信息的管理而设计的,分为系统管理模块、员工管理模块、部门管理模块、工资管理模块。涉及管理员、普通用户两种角色。通过对初始化原型系统进行需求分析、不断修正和改进,直到形成用户满意的可行系统。1.2系统目标网络办公自动化系统是计算机技术和网络迅速发展的一个办公应用解决方案。它的主要目的是实现信息交流和信息共享。提供协同工作的手段,从而提高办公效
2、率,让人们从烦琐的纸质化办公中解脱出来。现在我国许多机关单位的人事管理还停留在纸介质阶段,这样的机制是不能够适应时代发展的。在信息时代,传统的管理方法必然以计算机为基础的信息管理模式所取代,基于这种情况,出现了对工资管理系统的需求。第二章 模块划分根据需求分析,本系统分为系统管理、员工管理、院系管理、工资管理,辅助功能等5个部分,系统模块如图11所示。 教职工工资管理系统 计算器还原数据职工管理系统管理用户管理用户管理修改密码备份数据日历工资信息管理职工工资统计工资计算公式院系管理职工信息管理添加职工信息工资管理院系管理辅助功能各个模块具体说明如下:系统管理:对使用本系统的用户进行管理,登录系
3、统用户可以修改密码,系统管理员对数据进行备份与还原。职工管理:对职工的基本信息进行怎、添、该、删操作。院系管理:显示院系的基本信息。工资管理;工资计算公式,对职工工资进行统计,设置职工工资基本信息。辅助功能: 计算器和日历。提供临时查询与计算。第三章 搭建开发环境对于数据库的系统的开发可以选择多种语言与平台去开发。语言有诸如VFP,Java, C#, C+, VB, PB, .NET, JSP等;对于数据库来说,数据库系统一般由数据库、数据库管理系统(DBMS)、应用系统、数据库管理员和用户构成。DBMS是数据库系统的基础和核心。目前有许多DBMS产品,如DB2、Oracle、Microsof
4、t 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) 编译工具:Vi
5、sual C+ 6.0. VC+6.0编译速度快,可以开发出具有良好的交互功能、兼容性和扩展性的应用程序,程序调试方便,比较适合管理系统的开发。第四章 数据库设计4.1 E-R实体图 E-R实体图为实体-关系图。提供了表示实体型、属性、和联系的方法。用来描述现实世界的概念模型。E-R图是在需求分析的基础上进行的。实体可以使需求分析中抽象出来的名词。根据分析设计结果。有职工、部门、用户、工资等实体。下面为实体结构。职工实体E-R图,如图1-2所示姓名性别编号备注职称 职工学院名联系方式教龄出生日期职位图1-2 职工实体E-R图院系实体E-R图,如图1-3所示院系 学院编号办公电话学院主管学院名
6、图1-3 院系实体E-R图工资实体E-R图,如图1-4所示住房补贴餐费补贴月份保险费员工编号学院名称基本工资工资话费补贴水电费 图1-4 工资实体E-R图用户实体E-R图,如图1-5所示用户 用户类型用户名密码图1-5 用户实体E-R图4.2 设计数据库表表1-1 职工表表1-2 院系表表1-3 工资表 表1-4 用户表第五章 关键代码与主要界面5.1封装数据库类在进行具体的代码编程之前,选择一种好的数据库连接方式是整个代码编程的基础,考虑到该项目包括后台数据库的建立和维护以及前端应用程序的开发两个方面,所以,此应用程序采用被广泛使用的ADO数据库访问技术,并适当的把数据库表的字段封装到相应的
7、类中。使应用程序的各个窗体都能够共享对数据库的操作。而不需要重复编码,使程序更加易于维护,从而将面向对象的思想成功应用于程序设计中。设计数据库类ADOconnection,具体代码如下:class ADOConnection / 定义变量public:/ 添加一个指向Connection对象的指针:_ConnectionPtr m_pConnection;/ 添加一个指向Recordset对象的指针:_RecordsetPtr m_pRecordset;/ 定义方法public:ADOConnection();virtual ADOConnection();/ 初始化连接数据库void OnI
8、nitADOConnection(); / 执行查询_RecordsetPtr& GetRecordSet(_bstr_t bstrSQL);/ 执行SQL语句,Insert Update _variant_tBOOL ExecuteSQL(_bstr_t bstrSQL);/ 断开连接void ExitConnect();/ 执行Execute方法_RecordsetPtr& Execute2(_bstr_t bstrSQL);/初始化连接数据库代码如下:void ADOConnection:OnInitADOConnection()/ 初始化OLE/COM库环境:CoInitialize(
9、NULL);try/ 创建Connection对象m_pConnection.CreateInstance(ADODB.Connection);/ 设置连接字符串,必须是BSTR型或者_bstr_t类型 _bstr_t strConnect = Provider=SQLOLEDB.1; Server=127.0.0.1SQL2005; Database=SalaryMagSy; User ID=sa; Password=287016;/ 打开数据库m_pConnection-Open(strConnect,adModeUnknown);/ 捕捉异常catch(_com_error e)/ 显示
10、错误信息AfxMessageBox(e.Description();5.2设计职工模块员工模块是整个管理系统的基础,员工模块主要实现员工信息的录入、修改删除等操作。员工模块的相应类为Staff类。设计如下:class CStaffpublic:CString staff_id; / 教职工编号CString staff_name; / 姓名CString staff_sex; / 性别CString staff_title; / 职称CString depart_name; / 院系CString staff_position; / 岗位long staff_teach_time; / 教龄C
11、String 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 SqlDel
12、ete(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();/*/添加
13、员工相应的对话框为CAddStaffInfo类对话框,对应的图形界面为图1-6;图1-6 添加教职工信息界面相关的代码为:/ 初始化相关变量BOOL CAddStaffInfo:OnInitDialog() CDialog:OnInitDialog();/ TODO: Add extra initialization here/ 用编辑框中的ID初始化StaffIDStaffID = m_staffID;m_deparCtrl.AddString(信息学院);m_deparCtrl.AddString(机电学院);m_deparCtrl.AddString(建测学院);m_deparCtrl.
14、AddString(资环学院);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(
15、副教授);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 TRU
16、E unless you set the focus to a control/ EXCEPTION: OCX Property Pages should return FALSE/ 确定按钮,插入或修改void CAddStaffInfo:OnAddbtn() / TODO: Add your control notification handler code hereUpdateData(TRUE);if (m_staffID = )MessageBox(请输入编号);return;if (m_staffName = )MessageBox(请输入姓名);return;/将用户输入的数据赋
17、值到对象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,
18、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_tim
19、e = m_teachTime; / 教龄cur.staff_more = m_staffMore; / 备注UpdateData(FALSE);/ 由员工编号是否为空来判断插入还是更新数据if (StaffID = ) /表示插入数据cur.SqlInsert();elsecur.SqlUpdate(m_staffID);/ 由输入的编号判断CDialog:OnOK();接下来设计员工信息管理界面,给系统添加相应的对话框类CStaffInfoMag类,在此对话框中完成相应的添加、删除、修改等功能。这里用到ADO data控件和 DataGrid控件,所以依照步骤为其添加这两个控件,并在对话框
20、类合理的设计,增加添加,删除、修改等按钮。教职工信息管理的相应的界面如图1-7. 图1-7 教职工信息管理相关的代码如:/ 更新数据void CStaffInfoMag:RefreshData()/ 设置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_ti
21、me 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().GetIte
22、m(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().Ge
23、tItem(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.GetColu
24、mns().GetItem(vIndex).SetWidth(300); / 备注/ 添加 void CStaffInfoMag:OnAddbtn() / TODO: Add your control notification handler code hereUpdateData(TRUE);CAddStaffInfo dlg;/ 初始化变量dlg.m_staffID = ; / 编号dlg.m_staffName = ; / 姓名dlg.m_staffPosition = ; / 职位dlg.m_teachTime = 0; / 教龄dlg.m_staffPhone = ; / 电话dlg
25、.m_staffMore = ; / 备注if (dlg.DoModal() = IDOK)RefreshData();/ 修改void CStaffInfoMag:OnModifybtn() / TODO: Add your control notification handler code hereUpdateData(TRUE);if (m_Adodc.GetRecordset().GetEof()MessageBox(请选择要修改的记录!);return;/* 在CDataGrid类中添加和自定义CString GetItem()函数*/ 读取选择教职工的记录CStaff cur;CS
26、tring test = m_DataGrid.GetItem(0);cur.GetInfo(m_DataGrid.GetItem(0);/ 将职工数据读取到编辑对话框中CAddStaffInfo dlg;dlg.m_staffID = m_DataGrid.GetItem(0); / 编号dlg.m_staffName = m_DataGrid.GetItem(1); / 姓名dlg.m_staffSex = m_DataGrid.GetItem(2); / 性别dlg.m_staffTitle = m_DataGrid.GetItem(3); / 职称dlg.m_depart = m_Da
27、taGrid.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
28、.m_birthTime = tm;dlg.m_staffPhone = m_DataGrid.GetItem(8); / 联系电话dlg.m_staffMore = m_DataGrid.GetItem(9); / 备注if (dlg.DoModal() = IDOK)RefreshData();/ 删除void CStaffInfoMag:OnDeletebtn() / TODO: Add your control notification handler code hereif (m_Adodc.GetRecordset().GetEof()MessageBox(请选择要删除的记录!);
29、return;/读取选择学生的记录if (MessageBox(是否删除当前记录?,请确认, MB_YESNO) = IDYES)CStaff cur;cur.SqlDelete(m_DataGrid.GetItem(0);RefreshData();5.3 院系管理模块院系管理模块主要是显示学院的一些基本信息,所以比较简单。其界面如图1-8所示 图1-8 院系管理具体代码与职工管理相似,所以这里就不列举了。5.4工资管理模块工资管理模块式本系统的核心,所以该模块设计的好坏直接影响到用户的使用,由于时间有限,所以本模块这实现了一些基本的功能,更多详细的设计等以后有时间了再去添加,其大体的包括工
30、资计算公式、职工工资统计和职工工资管理三个方面。具体的界面如下图: 图1-10 工资计算公式说明:由于个人所得税这一项计算起来较复杂,所以本系统暂不涉及,在这里只是留一个空缺,待以后添加备用。工资汇总模块如下(不涉及个人所得税): 图1-11 工资汇总表工资管理模块如下: 图1-12 工资明细管理相关代码片段如下:BOOL CWageMagDlg:OnInitDialog() CDialog:OnInitDialog();/ TODO: Add extra initialization here/ 连接数据库ADOConnection m_ADOConnection;m_ADOConnecti
31、on.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_NORMA
32、L);ShowTreeData();/ 绘制表格、选择整行、报表头可以拖曳m_ListCrtl.SetExtendedStyle(LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT | LVS_EX_HEADERDRAGDROP);/风格的设定m_ListCrtl.InsertColumn(0, 职工编号, LVCFMT_CENTER, 80);/列标题的设定m_ListCrtl.InsertColumn(1, 基本工资, LVCFMT_CENTER, 80);m_ListCrtl.InsertColumn(2, 学院名称, LVCFMT_CENTER, 100);
33、m_ListCrtl.InsertColumn(3, 住房补贴, LVCFMT_CENTER, 80);m_ListCrtl.InsertColumn(4, 餐费补贴, LVCFMT_CENTER, 80);m_ListCrtl.InsertColumn(5, 话费补贴, LVCFMT_CENTER, 80);m_ListCrtl.InsertColumn(6, 保险费, LVCFMT_CENTER, 80);m_ListCrtl.InsertColumn(7, 水电费, LVCFMT_CENTER, 60);m_ListCrtl.InsertColumn(8, 月份, LVCFMT_CENT
34、ER, 50);/ 保存按钮禁用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 * 带来左边很多的空格问题CStrin
35、g depart;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 wageM
36、ag);/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* pNM
37、HDR, LRESULT* pResult)/ TODO: Add your control notification handler code here_variant_t va;CString strSQL;HTREEITEM hSelect;hSelect = m_TreeCrtl.GetSelectedItem();CString strName;if(hSelect != m_hParent)strName = m_TreeCrtl.GetItemText(hSelect);if(m_TreeCrtl.GetParentItem(hSelect) = m_hParent)/strSQ
38、L.Format(select wageMag.* from wageMag staff /WHERE wageMag.staff_id = staff.staff_id AND staff.depart_name = %s, strName);/MessageBox(strSQL);/ 选出所有院系相同的记录strSQL.Format(select wageMag.* from wageMag WHERE depart_name = %s, strName);ShowListData(strSQL);*pResult = 0;/ Tree控件结构显示void CWageMagDlg:Show
39、TreeData()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;/ 连接数据库ADOConnection m_ADOConnection;m_ADOC
40、onnection.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);
41、/取得第一列属性名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(); /移动到下条记录m_TreeCrtl.Expand(m_hParent,TVE_EXPAND); / 展开树图CATC
版权声明:以上文章中所选用的图片及文字来源于网络以及用户投稿,由于未联系到知识产权人或未发现有关知识产权的登记,如有知识产权人并不愿意我们使用,如有侵权请立即联系:2622162128@qq.com ,我们立即下架或删除。
Copyright© 2022-2024 www.wodocx.com ,All Rights Reserved |陕ICP备19002583号-1
陕公网安备 61072602000132号 违法和不良信息举报:0916-4228922