




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
人事管理系统第一章人事管理系统概述1.1人事管理系统简介1.2公司信息化发展1.3关于人事管理系统的几个误区第二章人事管理系统分析2.1系统初步调查2.2系统可行性分析2.3系统具体调查2.4系统的安全性第三章人事管理系统设计3.1方案设计3.2开发工具选择3.3数据库设计3.3.1人事管理系统的具体调查3.3.2系统逻辑模型的提出3.3.3数据字典3.4数据模块设计图第四章人事管理系统的实现4.1开发环境的选择4.2人事管理系统模块设计举例4.3人事管理系统测试4.4系统运营与维护4.5系统的转换方案第五章开发总结参考文献
1.设计目的使用人事管理系统,便于公司领导掌握人员的动向,及时调整人才的分派。本系统重要维护新员工资料;具体记录人事变动,涉及岗位和部门的调整;员工信息的查询和修改,涉及员工个人信息和密码等;作为公司人事管理信息系统的基础部分,它为其他子系统如考勤管理系统,工资管理系统等,提供员工的基本信息。根据系统功能的规定,人事管理系统可以分为新员工档案的输入,人事变更,员工档案的修改和查询等模块。2.功能设计公司人事管理系统重要用于员工个人资料的录入,职务变动的记录和管理。使用人事管理系统,便于公司领导掌握人员的动向,及时调整人才的分派。本系统是公司人事管理信息系统的基础部分,它为其他子系统,如考勤管理系统,工资管理系统和员工培训系统,提供员工的基本信息。同时为其他系统提供了员工登录的密码认证和权限分派功能。人事管理系统在设计时重要考虑以下几项功能规定:新员工资料的输入。人事变动的具体记录,涉及岗位和部门的调整。员工信息的查询和修改,涉及员工个人信息和密码等。为了更好的理解该系统和读懂该系统的源码,读者应对以下的知识点有所了解:MSSQLSERVER2023数据库操作的基础知识。ODBC数据源基础知识。基本的SQL语句,如添加,查询,修改和删除记录语句。VisualC++界面设计和关于数据库的基础知识。3.数据库设计3.1数据库设计3.1.1数据库需求分析根据数据流程图,可以列出以下数据项和数据结构:员工信息:员工号,密码,权限,姓名,性别,生日,部门,职务,教育限度,专业,通讯地址,电话,E-mail,当前状态和其他。人事变动:记录号,员工,变动和具体描述。所需的外部数据支持。部门设立:部门编号,名称等。。3.1.2数据库概念结构设计3.1.3数据库逻辑结构设计与实现根据系统E-R图,本系统需要有2个数据表分别来存放员工个人信息和人事变动记录。并且需要一个外部数据表(部门信息)的支持。同时部分记录字段要用代码来表达,银次需要3个代码表来分别记录教育限度,职务和人事变更的代码。最后,设立一个计数器数据表用于实现员工号的自动分派。这7个数据表用Access2023实现,Access2023中的设计视图如表3-1~3-7所示。其中数据类型的细节应根据具体字段分别设立,如PERSON表的ID字段大小为6,AUTHORITY字段,SEX字段,EDU_LEVEL字段和STATE字段的大小为1,DEPARTMENT字段,JOB字段的大小为3。表3-1员工个人信息表(PERSON)字段名称数据类型说明ID文本员工号PASSWD文本密码AUTHORITY文本用户权限NAME文本姓名SEX文本性别BIRTHDAY日期/时间生日DEPARTMENT文本所在部门JOB文本职务EDU_LEVEL文本受教育限度SPECIALTY文本专业技能ADDRESS文本家庭住址TEL文本联系电话EMAIL文本电子信箱STATE文本当前状态(T-员工,F-非员工)REMARK文本备注表3-2人事变更登记表(PERSONNEL)字段名称数据类型说明ID数字记录编号PERSON文本员工号CHANGE文本变更代码RECORD_TIME日期/时间记录时间DESCRIPTION备注具体记录表3-3L受教育限度代码表(EDU_LEVE)字段名称数据类型说明CODE文本代码DESCRIPTION文本描述表3-4职务代码表(JOB)字段名称数据类型说明CODE文本代码DESCRIPTION文本描述表3-5人事变动代码表(PERSONNEL_CHANGE)字段名称数据类型说明CODE文本代码DESCRIPTION文本描述表3-6计数器表(COUNTER)字段名称数据类型说明ID文本计数器编号COUNTER_VALUE数字计数值DESCRIPTION文本描述表3-7部门信息表(DEPARTMENT)字段名称数据类型说明ID文本部门编号NAME文本部门名称MANGER文本部门经理INTRO备注简介3.1.4初始数据的输入本例中需要输入的初始数据涉及:部门信息,计数器,受教育限度代码,职务代人事变动代码。部门信息和职务代码可以根据需要设立。计数器和此外的两种代码的设立如表3-8~表3-10所示。表3-8计数器设立计数器编号说明P员工编号C人事变更记录编号表3-9受教育限度代码代码说明0小学1初中2高中3职高4大本5大专6硕士7博士8博士后表3-10人事变更代码代码说明0新员工加入1职务变动2辞退3.2系统设计3.2.1系统功能分析人事管理系统重要有以下几项功能规定:新员工资料的输入。自动分派员工号,并且设立初始的用户密码。人事变动的具体记录,涉及岗位和部门的调整。员工信息的查询和修改,涉及员工个人信息和密码等。系统功能模块设计根据系统功能的规定,可以将系统分解成几个功能模块来分别设计,功能模块如图3-2所示。 人事管理系统人事管理系统新员工档案输入人事变更员工档案查询修改图3-2人事管理系统功能模块图数据流程图系统的数据流程图如图3-3所示,所有数据由人事科管理人员输入。个人信息查询招聘新员工个人信息查询招聘新员工员工辞退岗位调整分派员工号员工信息数据人事变动记录人事科图3-3人事管理系统数据流程图下面是系统运营时重要界面信息。启动程序,一方面出现主框架窗口。但是由于没有登录服务器,大部分菜单项都是不可用的。只有“连接”,“关于”和“退出”菜单可选。单击“连接”菜单和工具条相应按钮会弹出“登陆”窗口,如图3-4所示。登陆界面允许修改ODBC数据源名称,无需重新编译程序。图3-4登录对话框登录后,相关菜单会被激活。此时可以单击菜单或相应的工具条按钮来弹出相应的子框架窗口和视图。在MDI模式下,3个功能窗口可以同时被显示,如图3-5所示。图3-5人事管理系统“增长新员工”子窗口中,员工号和密码会自动按顺序生成,并且不允许修改。“人事变动”和“员工信息查询修改”子窗口中,须先输入员工号,确认显示的信息后才可进行相关的修改。产生的3个窗体列在“窗口”菜单下。当鼠标在菜单项上移动时,状态栏中会自动显示菜单项的Prompt属性的内容。“窗口”菜单中的4项功能是标准的窗口排列功能。3.3生成程序框架在本章中,将使用不支持文档/视图体系(Document/Viewarchitecture)的多文档界面(Multiple-DocumentInterface,MDI)的结构来开发数据库管理程序。MDI结构涉及一个主框架窗口和若干个子框架窗口,子框架窗口可包含文档类和相关的视图,假如使用文档类,MDI文档模板类CMultiDocTemplate将为文档类和视图之间提供方便的联系,可简化编程的工作量。在本实例中不使用文档类,因此没有创建文档模板类的对象,此外实例中还创建了自己的视图以实现相关功能。MDI界面可以方便地在各个子窗口之间切换。典型的MDI结构软件如Microsoft的Office系列软件。在这里,用AppWizard生成程序框架,且手工加入数据库支持。在MFCAppWizard-Step1中选择Multipledocument项,并去掉Document/Viewarchitecturesupport?选项。其余均采用默认配置。这样生成的程序中包含CTestApp(设应用程序名为Test),CMainFrame,CChildFrame,CChildView和CAboutDlg五个类。由于子框架类CChildFrame中自动创建CChildView类,而此类并非所需,因此在程序中将不用CChildFrame和CChildView类,而创建自己的子框架和视图。用ClassWizard创建一个新的子框架类CTheChildFrame,基类为CMDIChildWnd,程序中将用此子框架类包含视图,因程序的功能重要在视图中实现,故无需修改默认创建的CTheChildFrame类。本程序数据库的操作是通过MFC的ODBC类实现的。为了使用ODBC类,需要在stdafx.h中加入#include“afxdb.h”一行。因本程序只需要连接一个数据库,所以定义了一个CDatabase型的全局变量db,一次性的打开和关闭数据库,方便程序的编写。3.4主框架窗口设计3.4.1菜单的创建用VisualC++6.0的菜单编辑器(MenuEditor)可以会让你方便的创建菜单。在菜单编辑器中打开的设计窗口如图3-6所示。AppWizard创建的程序默认有两个菜单:IDR_MAINFRAME为主框架窗口所用,IDR_TESTTYPE(设应用程序名为Test)为子框架窗口所用。因本例中没有用默认的子框架,所以将IDR_TESTTYPE菜单删去,同时重新编辑IDR_MAINFRAME菜单,菜单属性设立如表3-11所示。图3-6菜单编辑器窗口表3-11菜单属性表菜单栏菜单项属性取值(说明)系统Caption&S系统连接IDID_SYSTEM_CONNECTCaption&C连接…\tF2Prompt连接到服务器断开连接IDID_SYSTEM_DISCONNECTCaption&D断开连接\tF3Prompt断开当前连接分割线选中SEPARATOR属性退出IDID_APP_EXITCaption&X退出\tCtl+QPrompt关闭整个应用程序人事管理Caption&M人事管理增长新员工IDID_MANAGE_ADDCaption&A增长新员工Prompt输入新员工的信息人事变动IDID_MANAGE_CHANGECaption&C人事变动Prompt记录员工的职位变动查询修改IDID_MANAGER_SEARCHCaption&S查询修改Prompt查询修改员工信息窗口Caption&W窗口重叠排列IDID_WINDOW_CASCADECaption&C重叠排列Prompt重叠排列窗口水平平铺IDID_WINDOW_TILE_HORZCaption&H水平平铺Prompt水平排列窗口垂直平铺IDID_WINDOW_TILE_VERTCaption&V垂直平铺Prompt垂直排列窗口最小化所有窗口IDID_WINDOW_MINIALLCaption&M最小化所有窗口Prompt将所有窗口最小化帮助Caption&H帮助关于IDID_APP_ABOUTCaption&A关于…\tF1Prompt本程序的说明其中,“退出”、“重叠排序”、“水平平铺”、“垂直平铺”和“关于”菜单项用了系统的标准ID,其功能已由MFC实现,无需此外编程。3.4.2工具条的创建用VisualC++6.0的工具条编辑器(ToolbarEditor)可以很方便的编辑工具条。本程序创建的工具条如图3-7所示,其中工具条各按钮的ID分别相应相应的菜单项,按从左到右的顺序相应的菜单项ID如表3-12所示。表3-12工具条按钮相应的菜单项ID顺序ID1ID_SYSTEM_CONNECT2ID_SYSTEM_DISCONNECT3ID_MANAGE_ADD4ID_MANAGER_CHANGE5ID_MANAGER_SEARCH6ID_WINDOW_CASCADE7ID_WINDOW_TILE_HORZ8ID_WINDOW_TILE_VERT9ID+APP_ABOUT3.4.3增长一个状态栏指示器在程序中加入一个状态栏指示器以显示登录状态。一方面用增长一个资源ID:ID_INDICATOR_LOGIN,然后在MainFrm.cpp中找到indicators变量的定义处,添加此ID至其列表,程序如下:StaticUNITindicators[]={ID_SEPARATOR,//statuslineindicatorID_INDICATOR_LOGIN,//登录状态ID_INDICATOR_CAPS,ID_INDICATOR_NUM,ID_INDICATOR_SCRL,};3.4.4程序相关代码在CmainFrame中定义如下变量。CTheChildFrame*m_pAdd,*m_pChange,*m_pSearch;//指向3个功能子框架窗口BOOLm_bLogin;//登陆状态BOOLm_bltemAdd,m_blItemChange,m_bltemSearch;//菜单项及工具单按钮是否可用为了实现菜单项于工具条按钮的开发与禁用,需要通过ClassWizard假日相应ID的UPDATE_COMMAND_UI解决程序如下:voidCMainFrame::OnUpdateSystemConnect(CCmdUI*pCmdUI){ pCmdUI->Enable(!m_bLogin);//根据登录状态改变菜单项和工具栏相应按钮状态}voidCMainFrame::OnUpdateSystemDisconnect(CCmdUI*pCmdUI){ pCmdUI->Enable(m_bLogin);//根据登录状态改变菜单项和工具栏相应按钮状态}voidCMainFrame::OnUpdateManageAdd(CCmdUI*pCmdUI){ pCmdUI->Enable(m_bItemAdd);//根据m_bItemAdd改变菜单项和工具栏相应按钮状态}voidCMainFrame::OnUpdateManagerSearch(CCmdUI*pCmdUI){ pCmdUI->Enable(m_bItemSearch);//根据m_bItemSearch改变菜单项和工具栏相应按钮状态}voidCMainFrame::OnUpdateManagerChange(CCmdUI*pCmdUI){//根据m_bItemChange改变菜单项和工具栏相应按钮状态pCmdUI->Enable(m_bItemChange);}CMainFrame类的构造函数中需要初始化一些变量。CMainFrame::CMainFrame(){ //TODO:addmemberinitializationcodehere m_bLogin=FALSE;//缺省未登录 m_bItemAdd=FALSE;//"增长新员工"功能缺省为不可用 m_bItemChange=FALSE;//"人事变动"功能缺省为不可用 m_bItemSearch=FALSE;//"查询修改"功能缺省为不可用m_pAdd=m_pChange=m_pSearch=NULL;//初始化为空}各菜单的Command事件解决代码如下:voidCMainFrame::OnSystemConnect(){ CLoginDlgdlg; if(dlg.DoModal()==IDOK)//判断是否通过 { m_bLogin=TRUE;//已登录 m_bItemAdd=TRUE;//开放"增长新员工"功能 m_bItemChange=TRUE;//开放"人事变动"功能 m_bItemSearch=TRUE;//开放"查询修改"功能 //改变状态栏 m_wndStatusBar.SetPaneText(1,"已登录到数据库:"+dlg.m_strDSN); }}voidCMainFrame::OnSystemDisconnect(){ db.Close();//关闭数据库 //关闭所有子框架窗口 if(m_pAdd)m_pAdd->DestroyWindow(); if(m_pChange)m_pChange->DestroyWindow(); if(m_pSearch)m_pSearch->DestroyWindow(); m_bLogin=FALSE;//未登录 m_bItemAdd=FALSE;//严禁"增长新员工"功能 m_bItemChange=FALSE;//严禁"人事变动"功能 m_bItemSearch=FALSE;//严禁"查询修改"功能 //改变状态栏 m_wndStatusBar.SetPaneText(1,"尚未登录数据库!请按F2登录");}voidCMainFrame::OnUpdateSystemConnect(CCmdUI*pCmdUI){ pCmdUI->Enable(!m_bLogin);//根据登录状态改变菜单项和工具栏相应按钮状态}voidCMainFrame::OnUpdateSystemDisconnect(CCmdUI*pCmdUI){ pCmdUI->Enable(m_bLogin);//根据登录状态改变菜单项和工具栏相应按钮状态}voidCMainFrame::OnUpdateManageAdd(CCmdUI*pCmdUI){ pCmdUI->Enable(m_bItemAdd);//根据m_bItemAdd改变菜单项和工具栏相应按钮状态}voidCMainFrame::OnUpdateManagerSearch(CCmdUI*pCmdUI){ pCmdUI->Enable(m_bItemSearch);//根据m_bItemSearch改变菜单项和工具栏相应按钮状态}voidCMainFrame::OnUpdateManagerChange(CCmdUI*pCmdUI){ pCmdUI->Enable(m_bItemChange);//根据m_bItemChange改变菜单项和工具栏相应按钮状态}voidCMainFrame::OnManageAdd(){ //创建新子框架和视 m_pAdd=newCTheChildFrame(); CCreateContextcontext; context.m_pNewViewClass=RUNTIME_CLASS(CAddView); if(!m_pAdd->LoadFrame(IDR_MAINFRAME, WS_OVERLAPPEDWINDOW|FWS_PREFIXTITLE,this,&context))return; m_pAdd->InitialUpdateFrame(NULL,TRUE); m_bItemAdd=FALSE;//严禁"增长新员工"功能}voidCMainFrame::OnManagerChange(){ //创建新子框架和视 m_pChange=newCTheChildFrame(); CCreateContextcontext; context.m_pNewViewClass=RUNTIME_CLASS(CChangeView); if(!m_pChange->LoadFrame(IDR_MAINFRAME, WS_OVERLAPPEDWINDOW|FWS_PREFIXTITLE,this,&context))return; m_pChange->InitialUpdateFrame(NULL,TRUE); m_bItemChange=FALSE;//严禁"人事变动"功能}voidCMainFrame::OnManagerSearch(){ //创建新子框架和视 m_pSearch=newCTheChildFrame(); CCreateContextcontext; context.m_pNewViewClass=RUNTIME_CLASS(CSearchView); if(!m_pSearch->LoadFrame(IDR_MAINFRAME, WS_OVERLAPPEDWINDOW|FWS_PREFIXTITLE,this,&context))return; m_pSearch->InitialUpdateFrame(NULL,TRUE); m_bItemSearch=FALSE;//严禁"查询修改"功能}voidCMainFrame::OnWindowMiniall(){ //最小化所有窗口 if(m_pAdd)m_pAdd->ShowWindow(SW_MINIMIZE); if(m_pChange)m_pChange->ShowWindow(SW_MINIMIZE); if(m_pSearch)m_pSearch->ShowWindow(SW_MINIMIZE);}在程序结束时需关闭数据库,因此需解决CMAinFrame的M_DESTROY消息。voidCMainFrame::OnDestroy(){ CMDIFrameWnd::OnDestroy(); if(db.IsOpen())db.Close();//如数据库未关闭则关闭}3.5增长新员工视类的创建一方面加入一个新的窗体资源,在InsertResource对话框中选择Dialog的IDD_FORMVIEW项。窗体创建后,在其上添加所需控件,最后的布局如图3-8所示。创建好资源后,为窗体加入一个由CFormView类继承的CAddView封装此窗体资源,然后用ClassWizard为所需控件加入成员变量。重要控件类型、ID和相应的成员变量及说明如表3-13所示。图3-8增长新员工窗体表1-13增长新员工窗体控件列表控件类型ID成员变量说明EditBoxIDC_ADD_EDT_IDm_strID员工号EditBoxIDC_ADD_EDT_PASSWODm_strPassword密码EditBoxIDC_ADD_EDT_NAMEm_strName姓名RadioButtonIDC_ADD_RADIO_MALE无性别-男RadioButtonIDC_ADD_RADIO_FEMALE无性别-女EditBoxIDC_ADD_EDT_BIRTHDAYm_strBirthday生日ComboBoxIDC_ADD_CMB_DEPARTMENTm_cDepartmentm_strDepartment部门ComboBoxIDC_ADD_CMB_JOBm_cJobm_strJob职务ComboBoxIDC_ADD_CMB_EDULEVELm_cEdulevelm_strEdulevel受教育水平EditBoxIDC_ADD_EDT_SPECIALTYm_strSpecialty专业EditBoxIDC_ADD_EDT_ADDRESSm_strAddress地址EditBoxIDC_ADD_EDT_TELm_strTel电话EditBoxIDC_ADD_EDT_EMALm_strEmailE-mailEditBoxIDC_ADD_EDT_MEMOm_strMemo备注(Style选Multiline)ButtonIDC_ADD_BTN_ADD无“增长”按钮CAddView类需要用到主框架窗口类和加密类,因此需要在cpp文献开头加入以下两行:#include"Crypt.h"#include"MainFrm.h"此外,为了使用全局数据库变量db,需要在cpp文献开头加入如下语句:ExternCDatabasedb;每次增长新成员时需要先做一些初始化工作,如设立自动生成员工号和密码等,哟个ClassView加入初始化函数Init(),代码如下:voidCAddView::Init(){ //清空成员变量 m_strID=_T(""); m_strPasswd=_T(""); m_strName=_T(""); m_strBirthday=_T(""); m_strDepartment=_T(""); m_cDepartment.SetCurSel(-1); m_strJob=_T(""); m_cJob.SetCurSel(-1); m_strEdulevel=_T(""); m_cEdulevel.SetCurSel(-1); m_strSpecialty=_T(""); m_strAddress=_T(""); m_strTel=_T(""); m_strEmail=_T(""); m_strMemo=_T(""); //生成员工号 CStringstr; intcounter;//用于计数 CRecordsetrs(&db);//数据集 rs.Open(CRecordset::forwardOnly, "selectCOUNTER_VALUEfromCOUNTERwhereID='P'"); rs.GetFieldValue("COUNTER_VALUE",str); sscanf(str,"%d",&counter);//获取计数值 rs.Close(); str.Format("P%05d",counter);//产生标准格式的编号 m_strID=str;//自动产生员工号 m_strPasswd=str;//默认密码为员工号 //设立缺省性别为男 ((CButton*)GetDlgItem(IDC_ADD_RADIO_MALE))->SetCheck(TRUE); UpdateData(FALSE);//更新界面数据}重载CformView的OnInitialUpdate函数如下,其中调整窗口外观,并设立几个ComboBox中的值:voidCAddView::OnInitialUpdate(){ CFormView::OnInitialUpdate(); //使框架窗口大小与视图匹配 GetParentFrame()->RecalcLayout();ResizeParentToFit(FALSE); GetParentFrame()->SetWindowText("增长新员工");//设立标题 CRecordsetrs(&db);//数据集 CStringstr; //设立部门下拉框所取的值为DEPARTMENT表中的值 rs.Open(CRecordset::forwardOnly,"selectNAMEfromDEPARTMENT"); while(!rs.IsEOF()) { rs.GetFieldValue("NAME",str); m_cDepartment.AddString(str); rs.MoveNext(); } rs.Close(); //设立职务下拉框所取的值为JOB表中的值 rs.Open(CRecordset::forwardOnly,"selectDESCRIPTIONfromJOB"); while(!rs.IsEOF()) { rs.GetFieldValue("DESCRIPTION",str); m_cJob.AddString(str); rs.MoveNext(); } rs.Close(); //设立受教育水平下拉框所取的值为EDU_LEVEL表中的值 rs.Open(CRecordset::forwardOnly,"selectDESCRIPTIONfromEDU_LEVEL"); while(!rs.IsEOF()) { rs.GetFieldValue("DESCRIPTION",str); m_cEdulevel.AddString(str); rs.MoveNext(); } rs.Close(); Init();//调用初始化函数}“增长”按钮的COMMAND消息解决如下,其中完毕的记录的添加。voidCAddView::OnAddBtnAdd(){ CStringstr,strSQL; intcounter;//用于计数 CRecordsetrs(&db);//数据集 UpdateData();//更新数据 if(m_strName.IsEmpty())//姓名为空则返回 { AfxMessageBox("姓名不能为空!"); return; }//累加员工编号计数器 rs.Open(CRecordset::forwardOnly, "selectCOUNTER_VALUEfromCOUNTERwhereID='P'"); rs.GetFieldValue("COUNTER_VALUE",str); sscanf(str,"%d",&counter);//获取计数值 rs.Close();//关闭数据集 counter++; //计数值加1 str.Format("%d",counter);//转换为字符串 strSQL="updateCOUNTERsetCOUNTER_VALUE="+str+"whereID='P'";//设立SQL语句 db.ExecuteSQL(strSQL);//执行//增长员工个人信息记录 CStringstrPasswd,strSex,strDepID,strJobID,strEduID; //判断生日是否为空 if(m_strBirthday.IsEmpty())m_strBirthday="1900-1-1";//缺省值 //加密密码 strPasswd=CCrypt::Encrypt(m_strPasswd,123); //判断性别 if(((CButton*)GetDlgItem(IDC_ADD_RADIO_MALE))->GetCheck())strSex="M"; elsestrSex="F"; //得到部门ID rs.Open(CRecordset::forwardOnly, "selectIDfromDEPARTMENTwhereNAME='"+m_strDepartment+"'"); rs.GetFieldValue("ID",strDepID); rs.Close(); //得到职务代码 rs.Open(CRecordset::forwardOnly, "selectCODEfromJOBwhereDESCRIPTION='"+m_strJob+"'"); rs.GetFieldValue("CODE",strJobID); rs.Close(); //得到受教育水平代码 rs.Open(CRecordset::forwardOnly, "selectCODEfromEDU_LEVELwhereDESCRIPTION='"+m_strEdulevel+"'"); rs.GetFieldValue("CODE",strEduID); rs.Close(); //写SQL语句 strSQL="insertintoPERSON(ID,PASSWD,NAME,SEX,\ BIRTHDAY,DEPARTMENT,JOB,EDU_LEVEL,SPECIALTY,\ ADDRESS,TEL,EMAIL,REMARK)\ values('" +m_strID+"','"//ID +strPasswd+"','"//PASSWD +m_strName+"','"//NAME +strSex+"','"//SEX +m_strBirthday+"','"//BIRTHDAY +strDepID+"','"//DEPARTMENT +strJobID+"','"//JOB +strEduID+"','"//EDU_LEVEL +m_strSpecialty+"','"//SPECIALTY +m_strAddress+"','"//ADDRESS +m_strTel+"','"//TEL +m_strEmail+"','"//EMAIL +m_strMemo+"')";//REMARK db.ExecuteSQL(strSQL);//执行//获取人事变动记录号并累加 rs.Open(CRecordset::forwardOnly, "selectCOUNTER_VALUEfromCOUNTERwhereID='C'"); rs.GetFieldValue("COUNTER_VALUE",str); sscanf(str,"%d",&counter);//获取计数值 rs.Close();//关闭数据集 counter++; //计数值加1 str.Format("%d",counter);//转换为字符串 strSQL="updateCOUNTERsetCOUNTER_VALUE="+str+"whereID='C'";//设立SQL语句 db.ExecuteSQL(strSQL);//执行//追加人事变动记录 str.Format("%d",counter);//计数值转换为字符串 CTimetime=CTime::GetCurrentTime(); CStringstrNow=time.Format("%Y-%m-%d%H:%M:%S"); //写SQL语句 strSQL="insertintoPERSONNEL(ID,PERSON,CHANGE,\ RECORD_TIME,DESCRIPTION)\ values(" +str+",'"//ID +m_strID+"','"//PERSON +"0"+"','"//CHANGE-加入公司代码 +strNow+"','"//RECORD_TIME +"加入公司')";//DESCRIPTION db.ExecuteSQL(strSQL);//重新初始化窗口 Init();}窗口关闭时,需要恢复菜单项和工具条按钮状态并清空相应的子框架窗口指针。voidCAddView::OnDestroy(){ CFormView::OnDestroy(); ((CMainFrame*)AfxGetMainWnd())->m_bItemAdd=TRUE;//开放"增长新员工"功能 ((CMainFrame*)AfxGetMainWnd())->m_pAdd=NULL;//清空窗口指针}3.6人事变动视类的创建一方面加入一个新的窗体资源,同样在InsertResource对话框中选择Dialog的IDD_FORMVIEW项。窗体创建后,在其上添加所需控件,最后的布局如图3-9所示。创建好资源后,为窗体加入一个由CFormView类继承的CChangeView封装此窗体资源,然后用ClassWizard为所需控件加入成员变量。重要控件类型,ID和相应的成员变量及说明如表3-14所示。图3-9人事变动输入窗体表1-14人事变动窗体控制列表控制类型ID成员变量说明EditBoxIDC_CHANGE_EDT_IDm_strID员工号RadioButtonIDC_CHANGE_RADIO_JOB无职务变更RadioButtonIDC_CHANGE_RADIO_FIRE无辞职退休DateTimePickerIDC_CHANGE_DATETIMEPICKERm_Time时间EditBoxIDC_CHANGE_EDT_NAMEm_strName姓名ComboBoxIDC_CHANGE_CMB_DEPARTMENTm_cDepartment部门ComboBoxIDC_CHANGE_CMB_JOBm_cJob职务EditBoxIDC_CHANGE_EDT_DESCRIPTIONm_strDescription具体描述ButtonIDC_CHANGE_BTN_CHANGE无“修改”按钮CChangeView中需要加入如下语句包含主框架窗口类:#include"MainFrm.h"同样,本类也需要加入以下语句引用全局变量db。externCDatabasedb;初始化函数代码如下:voidCChangeView::Init(){ //初始化成员变量 m_strID=_T(""); m_Time=CTime::GetCurrentTime(); m_strName=_T(""); m_strDescription=_T(""); m_cDepartment.SetCurSel(-1); m_cJob.SetCurSel(-1); //设立缺省变动情况为职务变更 ((CButton*)GetDlgItem(IDC_CHANGE_RADIO_JOB))->SetCheck(TRUE); UpdateData(FALSE);//更新界面数据}重载CFormView类的OnInitialUpdate()函数如下:voidCChangeView::OnInitialUpdate(){ CFormView::OnInitialUpdate(); //使框架窗口大小与视图匹配 GetParentFrame()->RecalcLayout();ResizeParentToFit(FALSE); GetParentFrame()->SetWindowText("人事变动");//设立标题 CRecordsetrs(&db);//数据集 CStringstr; //设立部门下拉框所取的值为DEPARTMENT表中的值 rs.Open(CRecordset::forwardOnly,"selectNAMEfromDEPARTMENT"); while(!rs.IsEOF()) { rs.GetFieldValue("NAME",str); m_cDepartment.AddString(str); rs.MoveNext(); } rs.Close(); //设立职务下拉框所取的值为JOB表中的值 rs.Open(CRecordset::forwardOnly,"selectDESCRIPTIONfromJOB"); while(!rs.IsEOF()) { rs.GetFieldValue("DESCRIPTION",str); m_cJob.AddString(str); rs.MoveNext(); } rs.Close(); Init();//调用初始化函数}当员工号编辑框中输入改变时,需要检索员工信息以显示。用ClassWizard加入解决IDC_CHANGE_EDT-ID的EN_CHANGE消息的函数,代码如下:voidCChangeView::OnChangeChangeEdtId(){ UpdateData();//更新数据 CRecordsetrs(&db); CStringstrDep,strJob; rs.Open(CRecordset::forwardOnly, "selectNAME,DEPARTMENT,JOBfromPERSONwhereID='"+m_strID+"'"); if(!rs.IsEOF())//非空则获取员工信息 { rs.GetFieldValue("NAME",m_strName);//名字 rs.GetFieldValue("DEPARTMENT",strDep);//部门编号 rs.GetFieldValue("JOB",strJob);//职务代码 rs.Close(); if(!strDep.IsEmpty()) { rs.Open(CRecordset::forwardOnly, "selectNAMEfromDEPARTMENTwhereID='"+strDep+"'"); rs.GetFieldValue("NAME",strDep);//部门名称 rs.Close(); } if(!strJob.IsEmpty()) { rs.Open(CRecordset::forwardOnly, "selectDESCRIPTIONfromJOBwhereCODE='"+strJob+"'"); rs.GetFieldValue("DESCRIPTION",strJob);//职务名称 rs.Close(); } UpdateData(FALSE);//更新数据 m_cDepartment.SelectString(-1,strDep); m_cJob.SelectString(-1,strJob); m_bExist=TRUE;//该员工存在 } else//否则清空员工信息 { rs.Close(); m_strName.Empty(); m_cDepartment.SetCurSel(-1); m_cJob.SetCurSel(-1); UpdateData(FALSE);//更新数据 m_bExist=FALSE;//该员工不存在 }}单击“修改”按钮时,添加人事变动记录。voidCChangeView::OnChangeBtnChange(){ CRecordsetrs(&db); CStringstr,strSQL; intcounter; if(!m_bExist)//该员工号不存在 { MessageBox("请确认员工号!","输入错误"); return; } UpdateData();//更新数据//获取人事变动记录号并累加 rs.Open(CRecordset::forwardOnly, "selectCOUNTER_VALUEfromCOUNTERwhereID='C'"); rs.GetFieldValue("COUNTER_VALUE",str); sscanf(str,"%d",&counter);//获取计数值 rs.Close();//关闭数据集 counter++;//计数器加1 str.Format("%d",counter);//转换为字符串 strSQL="updateCOUNTERsetCOUNTER_VALUE="+str+"whereID='C'";//设立SQL语句 db.ExecuteSQL(strSQL);//执行//更新员工信息 CStringstrDepID,strJobID,strState,strChange; //得到部门ID m_cDepartment.GetWindowText(str); rs.Open(CRecordset::forwardOnly, "selectIDfromDEPARTMENTwhereNAME='"+str+"'"); rs.GetFieldValue("ID",strDepID); rs.Close(); //得到职务代码 m_cJob.GetWindowText(str); rs.Open(CRecordset::forwardOnly, "selectCODEfromJOBwhereDESCRIPTION='"+str+"'"); rs.GetFieldValue("CODE",strJobID); rs.Close(); if(((CButton*)GetDlgItem(IDC_CHANGE_RADIO_FIRE))->GetCheck()) { strState="F"; strChange="2";//辞退 } else { strState="T"; strChange="1";//职务变动 } strSQL="updatePERSONsetSTATE='"+strState+"'," +"DEPARTMENT='"+strDepID+"'," +"JOB='"+strJobID+"'"; db.ExecuteSQL(strSQL);//执行//追加人事变动记录 str.Format("%d",counter);//计数值转换为字符串 CStringstrNow=m_Time.Format("%Y-%m-%d%H:%M:%S"); //写SQL语句 strSQL="insertintoPERSONNEL(ID,PERSON,CHANGE,RECORD_TIME,DESCRIPTION)\ values(" +str+",'"//ID +m_strID+"','"//PERSON +strChange+"','"//CHANGE +strNow+"','"//RECORD_TIME +m_strDescription+"')";//DESCRIPTION db.ExecuteSQL(strSQL);//重新初始化窗口 Init();}窗口关闭时需要进行一定的状态修改,解决WM_DESTROY消息。voidCChangeView::OnDestroy(){ CFormView::OnDestroy(); ((CMainFrame*)AfxGetMainWnd())->m_bItemChange=TRUE;//开放"人事变动"功能" ((CMainFrame*)AfxGetMainWnd())->m_pChange=NULL;//清空窗口指针}3.7员工信息查询修改视图类的创建一方面加入一个新的窗体资源,同样在InsertResourse对话框中选择Dialog的IDD_FORMVIEW项。窗体最后的布局如图3-10所示。创建好资源后,为窗体加入一个由CFormView类继承的CSearchView封装此窗体资源,然后用ClassWizard为所需控件加入成员变量。重要控件类型,ID和相应的成员变量及说明如表3-15所示。图3-10员工信息查询修改视图表3-15员工信息查询修改窗体控件列表控制类型ID成员变量说明EditBoxIDC_SEARCH_EDT_IDm_strID员工号ComboBoxIDC_SEARCH_CMB_DEPARTMENTm_cDepartment部门ComboBoxIDC_SEARCH_CMB_JOBm_cJob职务ComboBoxIDC_SEARCH_CMB_EDULEVELm_cEdulevel受教育水平EditBoxIDC_SEARCH_EDT_SPECIALTYm_strSpecialty专业EditBoxIDC_SEARCH_EDT_MEMOm_strMemo备注EditBoxIDC_SEARCH_EDT_PASSWDm_strPasswd密码ButtonIDC_SEARCH_BTN_CHGPASSWD无“修改密码”按钮RadioButtonIDC_SEARCH_RADIO_MALE无性别-男RadioButtonIDC_SEARCH_RADIO_FEMALE无性别-女EditBoxIDC_SEARCH_EDT_NAMEm_strName姓名EditBoxIDC_SEARCH_EDT_BIRTHDAYm_strBirthday生日EditBoxIDC_SEARCH_EDT_ADDRESSm_strAddress住址EditBoxIDC_SEARCH_EDT_TELm_strTel电话ButtonIDC_SEARCH_BTN_CHANGE无“修改员工信息”按钮ListControlIDC_SEARCH_LISTm_cList人事变动列表CSearchView中需要加入如下语句包含主框架窗口类和加密类:#include"MainFrm.h"#include"Crypt.h"同样,本类也需要加入一下语句引用全局变量db:externCDatabasedb;初始化函数代码如下:voidCSearchView::Init(){ //清空成员变量 m_strID=_T(""); m_strSpecialty=_T(""); m_strMemo=_T(""); m_strPasswd=_T(""); m_strName=_T(""); m_strBirthday=_T(""); m_strAddress=_T(""); m_strTel=_T(""); m_strEmail=_T(""); UpdateData(FALSE);//更新界面数据}重载CFormView类的OnInitialUpdate()函数如下:voidCSearchView::OnInitialUpdate(){ CFormView::OnInitialUpdate(); //给m_cList加入网格 DWORDstyle=m_cList.GetExtendedStyle(); m_cList.SetExtendedStyle(style|LVS_EX_GRIDLINES); //使框架窗口大小与视图匹配 GetParentFrame()->RecalcLayout();ResizeParentToFit(FALSE); GetParentFrame()->SetWindowText("员工信息查询修改");//设立标题 CRecordsetrs(&db);//数据集 CStringstr; //设立部门下拉框所取的值为DEPARTMENT表中的值 rs.Open(CRecordset::forwardOnly,"selectNAMEfromDEPARTMENT"); while(!rs.IsEOF()) { rs.GetFieldValue("NAME",str); m_cDepartment.AddString(str); rs.MoveNext(); } rs.Close(); //设立职务下拉框所取的值为JOB表中的值 rs.Open(CRecordset::forwardOnly,"selectDESCRIPTIONfromJOB"); while(!rs.IsEOF()) { rs.GetFieldValue("DESCRIPTION",str); m_cJob.AddString(str); rs.MoveNext(); } rs.Close(); //设立受教育水平下拉框所取的值为EDU_LEVEL表中的值 rs.Open(CRecordset::forwardOnly,"selectDESCRIPTIONfromEDU_LEVEL"); while(!rs.IsEOF()) { rs.GetFieldValue("DESCRIPTION",str); m_cEdulevel.AddString(str); rs.MoveNext(); } rs.Close(); //添加List控件的列 m_cList.InsertColumn(0,"记录编号",LVCFMT_LEFT,100); m_cList.InsertColumn(1,"记录时间",LVCFMT_LEFT,100); m_cList.InsertColumn(2,"具体描述",LVCFMT_LEFT,215); Init();//调用初始化函数}当“员工号”编辑框中输入员工号时,执行一下代码:voidCSearchView::OnChangeSearchEdtId(){ UpdateData();//更新数据 m_cList.DeleteAllItems();//清空列表框 CRecordsetrs(&db); CStringstrDep,strJob,strEdulevel,strSex; rs.Open(CRecordset::forwardOnly, "select*fromPERSONwhereID='"+m_strID+"'"); if(!rs.IsEOF())//非空则获取员工信息 { rs.GetFieldValue("NAME",m_strName);//名字 rs.GetFieldValue("DEPARTMENT",strDep);//部门编号 rs.GetFieldValue("JOB",strJob);//职务代码 rs.GetFieldValue("EDU_LEVEL",strEdulevel);//受教育水平 rs.GetFieldValue("SPECIALTY",m_strSpecialty);//专业 rs.GetFieldValue("REMARK",m_strMemo);//备注 rs.GetFieldValue("BIRTHDAY",m_strBirthday);//生日 m_strBirthday=m_strBirthday.Left(10);//取日期部分 rs.GetFieldValue("ADDRESS",m_strAddress);//住址 rs.GetFieldValue("TEL",m_strTel);//电话 rs.GetFieldValue("EMAIL",m_strEmail);//Email rs.GetFieldValue("SEX",strSex);//性别 rs.Close(); //得到部门名称 if(!strDep.IsEmpty()) { rs.Open(CRecordset::forwardOnly, "selectNAMEfromDEPARTMENTwhereID='"+strDep+"'"); rs.GetFieldValue("NAME",strDep);//部门名称 rs.Close(); } //得到职务名称 if(!strJob.IsEmpty()) { rs.Open(CRecordset::forwardOnly, "selectDESCRIPTIONfromJOBwhereCODE='"+strJob+"'"); rs.GetFieldValue("DESCRIPTION",strJob);//职务名称 rs.Close(); } //得到教育水平描述 if(!strEdulevel.IsEmpty()) { rs.Open(CRecordset::forwardOnly, "selectDESCRIPTIONfromEDU_LEVELwhereCODE='" +strEdulevel+"'"); rs.GetFieldValue("DESCRIPTION",strEdulevel);//教育水平描述 rs.Close(); } //设立性别选框 if(strSex=="M")((CButton*)GetDlgItem(IDC_SEARCH_RADIO_MALE))->SetCheck(TRUE); else((CButton*)GetDlgItem(IDC_SEARCH_RADIO_FEMALE)) ->SetCheck(TRUE); UpdateData(FALSE);//更新数据 m_cDepartment.SelectString(-1,strDep); m_cJob.SelectString(-1,strJob); m_cEdulevel.SelectString(-1,strEdulevel); //更新列表框数据 inti=0; CStringstr1,str2,str3; rs.Open(CRecordset::forwardOnly, "selectID,RECORD_TIME,DESCRIPTIONfromPERSONNEL\ wherePERSON='"+m_strID+"'"); while(!rs.IsEOF()) { //得到数据 rs.GetFieldValue("ID",str1); rs.GetFieldValue("RECORD_TIME",str2);str2=str2.Left(10);//只取日期 rs.GetFieldValue("DESCRIPTION",str3); //加入List m_cList.InsertItem(i,""); m_cList.SetItemText(i,0,str1); m_cList.SetItemText(i,1,str2); m_cList.SetItemText(i,2,str3); i++; rs.MoveNext();//移动记录 } rs.Close(); m_bExist=TRUE;//该员工存在 } else//否则清空员工信息 { rs.Close(); m_strSpecialty=_T(""); m_strMemo=_T(""); m_strPasswd=_T(""); m_strName=_T(""); m_strBirthday=_T(""); m_strAddress=_T(""); m_strTel=_T(""); m_strEmail=_T(""); m_cDepartment.SetCurSel(-1); m_cJob.SetCurSel(-1); m_cEdulevel.SetCurSel(-1); UpdateData(FALSE);//更新数据 ((CButton*)GetDlgItem(IDC_SEARCH_RADIO_MALE))->SetCheck(FALSE); ((CButton*)GetDlgItem(IDC_SEARCH_RADIO_FEMALE))->SetCheck(FALSE); m_bExist=FALSE;//该员工不存在 }}单击“修改”按钮时执行以下代码:voidCSearchView::OnSearchBtnChgpasswd(){ if(!m_bExist)//该员工号不存在 { AfxMessageBox("该员工号不存在"); return; } UpdateData();//更新数据 CStringstr,strSQL; str=CCrypt::Encrypt(m_strPasswd,123);//加密 strSQL="updatePERSONsetPASSWD='"+str+"'";//写SQL语句 db.ExecuteSQL(strSQL);//执行}单击“修改员工信息”按钮时执行以下代码:voidCSearchView::OnSearchBtnChange(){ if(!m_bExist)//该员工号不存在 { AfxMessageBox("该员工号不存在"); return; } UpdateData();//更新数据//修改员工个人信息记录 CStringstr,strSex,strDepID,strJobID,strEduID,strSQL; CRecordsetrs(&db); //判断性别 if(((CButton*)GetDlgItem(IDC_SEARCH_RADIO_MALE))->GetCheck())strSex="M"; elsestrSex="F"; //得到部门ID m_cDepartment.GetWindowText(str); if(!str.IsEmpty())//不空 { rs.Open(CRecordset::forwardOnly, "selectIDfromDEPARTMENTwhereNAME='"+str+"'"); rs.GetFieldValue("ID",strDepID); rs.Close(); } //得到职务代码 m_cJob.GetWindowText(str); if(!str.IsEmpty())//不空 { rs.Open(CRecordset::forwardOnly, "selectCODEfromJOBwhereDESCRIPTION='"+str+"'"); rs.GetFieldValue("CODE",strJobID); rs.Close(); } //得到受教育水平代码 m_cEdulevel.GetWindowText(str); if(!str.IsEmpty())//不空 { rs.Open(CRecordset::forwardOnly, "selectCODEfromEDU_LEVELwhereDESCRIPTION='"+str+"'"); rs.GetFieldValue("CODE",strEduID); rs.Close(); } //写SQL语句 strSQL="updatePERSONset\ NAME='"+m_strName//NAME +"',SEX='"+strSex//SEX +"',BIRTHDAY='"+m_strBirthday//BIRTHDAY +"',DEPARTMENT='"+strDepID//DEPARTMENT +"',JOB='"+strJobID//JOB +"',EDU_LEVEL='"+strEduID//EDU_LEVEL +"',SPECIALTY='"+m_strSpecialty//SPECIALTY +"',AD
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 技术服务合同示范文本2025年
- 四年级数学(小数加减运算)计算题专项练习与答案
- 2025年房屋屋顶防水补漏与修缮工程合同
- 二零二五年度标识标牌企业社会责任履行合同
- 2025年度青年创业公寓单间转租合同
- 2025版房地产市场调控贷款合同
- 二零二五年面包砖电商平台促销活动合作协议
- 2025电子商务合同法律适用与合同监管合同
- 二零二五年度特种货车转让及特种运输服务协议书
- 二零二五年度出境领队旅游目的地特色文化体验合同
- 急诊医学科管理制度
- 中医骨伤科学讲课课件
- 2025年物业经理职业考试复习试卷及答案
- 房屋买卖合同纠纷仲裁协议范本
- 2025年湖北省公务员录用考试《行测》真题及答案解析
- 公司设计能力体系构建与成果展示
- 柴油发电机组维护保养方案
- DB63-T 2035-2022 草原生态修复工程效益监测及评估规范
- 2025昌都市辅警考试试卷真题
- 中煤矿建集团总部招聘笔试题库2025
- 《增值税法与实务》课件
评论
0/150
提交评论