数据库课程设计人事管理系统_第1页
数据库课程设计人事管理系统_第2页
数据库课程设计人事管理系统_第3页
数据库课程设计人事管理系统_第4页
数据库课程设计人事管理系统_第5页
已阅读5页,还剩38页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

数据库课程设计人事管理系统第一章人事治理系统概述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.功能设计企业人事治理系统要紧用于职员个人资料的录入,职务变动的记录和治理。使用人事治理系统,便于公司领导把握人员的动向,及时调整人才的分配。本系统是公司人事治理信息系统的基础部分,它为其他子系统,如考勤治理系统,工资治理系统和职员培训系统,提供职员的差不多信息。同时为其他系统提供了职员登录的密码认证和权限分配功能。人事治理系统在设计时要紧考虑以下几项功能要求:•新职员资料的输入。•人事变动的详细记录,包括岗位和部门的调整。职员信息的查询和修改,包括职员个人信息和密码等。为了更好的明白得该系统和读明白该系统的源码,读者应对以下的知识点有所了解:MSSQLSERVER2000数据库操作的基础知识。ODBC数据源基础知识。•差不多的SQL语句,如添加,查询,修改和删除记录语句。VisualC++#面设计和关于数据库的基础知识。数据库设计3.1 数据库设计3.1.1数据库需求分析依照数据流程图,能够列出以下数据项和数据结构:职员信息:职员号,密码,权限,姓名,性别,生日,部门,职务,教育程度,专业,通讯地址, ,E-mai1,当前状态和其他。•人事变动:记录号,职员,变动和详细描述。•所需的外部数据支持。•部门设置:部门编号,名称等。3.1.2数据库概念结构设计3.1.3数据库逻辑结构设计与实现依照系统E-R图,本系统需要有2个数据表分别来存放职员个人信息和人事变动记录。同时需要一个外部数据表(部门信息)的支持。同时部分记录字段要用代码来表示,银次需要3个代码表来分别记录教育程度,职务和人事变更的代码。最后,设立一个计数器数据表用于实现职员号的自动分配。这7个数据表用Access2000实现,Access2000中的设计视图如表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-3 L受教育程度代码表(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所示。计数器编号说明P职员编号C人事变更记录编号表3-8计数器设置表3-9 受教育程度代码代码说明0小学

1初中2高中3职高4大本5大专6硕士7博士8博士后表3-10 人事变更代码代码说明0新职员加入1职务变动2辞退3.2系统设计3.2.1系统功能分析人事治理系统要紧有以下几项功能要求:•新职员资料的输入。•自动分配职员号,同时设置初始的用户密码。•人事变动的详细记录,包括岗位和部门的调整。•职员信息的查询和修改,包括职员个人信息和密码等。3.2.2系统功能模块设计依照系统功能的要求,能够将系统分解成几个功能模块来分别设计,功能模块如图3-2所示。

人事治理系统新职职员员人档档事案案变查输更询入修改图3-2 人事治理系统功能模块图3.2.3数据流程图系统的数据流程图如图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断开连g\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_ABOUTi■■ij■■^■■2>i:i■■ij■■^■■2>i:■■^■■2>0^1a|c|s|^|a|m|?|g|IDE_UIMFKAIE(Bitnap)3.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:addmemberinitializationcodeherem_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所示。备注:Edit增加|图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_strTelEditBoxIDC_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++;//计数值加1str.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”;//得到部门IDrs.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,\BIRTHDAYDEPARTMENT,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+"')";//REMARKdb.ExecuteSQL(strSQL);//执行〃猎取人事变动记录号并累加rs.Open(CRecordset::forwardOnly,"selectCOUNTER_VALUEfromCOUNTERwhereID='C'");rs.GetFieldValue("COUNTER_VALUE",str);sscanf(str,"%d",&counter);//猎取计数值rs.Close();//关闭数据集counter++;〃计数值加1str.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+",'"+m_strID+"','"+"0"+"','"+strNow+"','"+”加入公司')";db.ExecuteSQL(strSQL);//ID//PERSON//CHANGE-加入公司代码//RECORD_TIME//DESCRIPTION//重新初始化窗口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("A事变动”);//设置标题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++;//计数器加1str.Format("%d”,counter);//转换为字符串strSQL="updateCOUNTERsetCOUNTER_VALUE="+str+"whereID='C'";//设置SQL语句db.ExecuteSQL(strSQL);//执行//更新职员信息CStringstrDepID,strJobID,strState,strChange;//得到部门IDm_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="insert intoPERSONNEL(ID,PERSON,CHANGE,RECORD_TIME,DESCRIPTION)\values("+str+",'"//ID+m_strID+"','"//PERSON+strChange+"','"//CHANGE+strNow+"','"//RECORD_TIME+m_strDescription+"')”;//DESCRIPTIONdb.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所示。住址:电话;E-mail:图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_strTelButtonIDC_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);//Emailrs.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);//加入Listm_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”;//得到部门IDm_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+"',ADDRESS='"+m_strAddress//ADDRESS+"',TEL=e+m_strTel//TEL+"',EMAIL」”+m_strEmail//EMAIL+"',REMARK='"+m_strMemo//REMARK+"'whereID='"+m_strID+"'”;//条件db.ExecuteSQL(strSQL);//执行}3.8加密类的创建本实例中,为了保证数据库的安全,多处使用了加密算法。加密类创建的目的确实是为了方便在应用程序中引用加密过程,加密类名为CCrypt,在头文件Crypt.h中声明两个静态函数:public:staticCStringEncrypt(CStringS,WORDKey);//加密函数staticCStringDecrypt(CStringS,WORDKey);//解密函数类的实现代码如下:〃常量#defineC152845#defineC222719////////////////////////////////////////////////////////////////////////Construction/Destruction//////////////////////////////////////////////////////////////////////CCrypt::CCrypt(){}CCrypt::~CCrypt(){}CStringCCrypt::Encrypt(CStringS,WORDKey)//加密函数{CStringResult,str;inti,j;Result=S;//初始化结果字符串for(i=0;i<S.GetLength();i++)//依次对字符串中各字符进行操作{Result.SetAt(i,S.GetAt(i)A(Key>>8));//将密钥移位后与字符异或Key=((BYTE)Result.GetAt(i)+Key)*C1+C2;//产生下一个密钥S=Result;//储存结果Result.Empty();//清除结果for(i=0;i<S.GetLength();i++)//对加密结果进行转换{j=(BYTE)S.GetAt(i);//提取字符//将字符转换为两个字母储存str="12";//设置str长度为2str.SetAt(0,65+j/26);str.SetAt(1,65+j%26);Result+=str;}returnResult;}CStringCCrypt::Decrypt(CStringS,WORDKey)//解密函数{CStringResult,str;inti,j;Result.Empty();//清除结果for(i=0;i<S.GetLength()/2;i++)//将字符串两个字母一组进行处理{j=((BYTE)S.GetAt(2*i)-65)*26;j+=(BYTE)S.GetAt(2*i+1)-65;str=T;//设置str长度为1str.SetAt(0,j);Result+=str;//追加字符,还原字符串}S=Result;//储存中间结果for(i=0;i<S.GetLength();i++)//依次对字符串中各字符进

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论